diff --git a/src/Camera.c b/src/Camera.c index 6cd659242..55f8a77c3 100644 --- a/src/Camera.c +++ b/src/Camera.c @@ -43,9 +43,9 @@ static void PerspectiveCamera_CentreMousePosition(void) { int cenX = topLeft.X + Game.Width / 2; int cenY = topLeft.Y + Game.Height / 2; - Window_SetScreenCursorPos(cenX, cenY); + Cursor_SetScreenPos(cenX, cenY); /* Fixes issues with large DPI displays on Windows >= 8.0. */ - cam_prev = Window_GetScreenCursorPos(); + cam_prev = Cursor_GetScreenPos(); } static void PerspectiveCamera_RegrabMouse(void) { @@ -109,7 +109,7 @@ static void PerspectiveCamera_UpdateMouse(void) { if (screen->HandlesAllInput) { cam_delta.X = 0; cam_delta.Y = 0; } else if (Window_Focused) { - pos = Window_GetScreenCursorPos(); + pos = Cursor_GetScreenPos(); cam_delta.X = pos.X - cam_prev.X; cam_delta.Y = pos.Y - cam_prev.Y; PerspectiveCamera_CentreMousePosition(); } diff --git a/src/Deflate.c b/src/Deflate.c index bfa49330c..54919e05c 100644 --- a/src/Deflate.c +++ b/src/Deflate.c @@ -1125,7 +1125,7 @@ static ReturnCode Zip_ReadLocalFileHeader(struct ZipState* state, struct ZipEntr ReturnCode res; if ((res = Stream_Read(stream, header, sizeof(header)))) return res; - method = Stream_GetU16_LE(&header[4]); + method = Stream_GetU16_LE(&header[4]); compressedSize = Stream_GetU32_LE(&header[14]); uncompressedSize = Stream_GetU32_LE(&header[18]); @@ -1139,6 +1139,7 @@ static ReturnCode Zip_ReadLocalFileHeader(struct ZipState* state, struct ZipEntr path = String_Init(pathBuffer, pathLen, pathLen); if ((res = Stream_Read(stream, pathBuffer, pathLen))) return res; + state->_curEntry = entry; if (!state->SelectEntry(&path)) return 0; /* local file may have extra data before actual data (e.g. ZIP64) */ @@ -1182,6 +1183,7 @@ static ReturnCode Zip_ReadCentralDirectory(struct ZipState* state) { if (state->_usedEntries >= ZIP_MAX_ENTRIES) return ZIP_ERR_TOO_MANY_ENTRIES; entry = &state->Entries[state->_usedEntries++]; + entry->CRC32 = Stream_GetU32_LE(&header[12]); entry->CompressedSize = Stream_GetU32_LE(&header[16]); entry->UncompressedSize = Stream_GetU32_LE(&header[20]); entry->LocalHeaderOffset = Stream_GetU32_LE(&header[38]); diff --git a/src/Deflate.h b/src/Deflate.h index 1d6d29381..b6e1abe52 100644 --- a/src/Deflate.h +++ b/src/Deflate.h @@ -114,8 +114,8 @@ struct ZLibState { struct DeflateState Base; uint32_t Adler32; }; CC_API void ZLib_MakeStream(struct Stream* stream, struct ZLibState* state, struct Stream* underlying); /* Minimal data needed to describe an entry in a .zip archive. */ -struct ZipEntry { uint32_t CompressedSize, UncompressedSize, LocalHeaderOffset; }; -#define ZIP_MAX_ENTRIES 2048 +struct ZipEntry { uint32_t CompressedSize, UncompressedSize, LocalHeaderOffset, CRC32; }; +#define ZIP_MAX_ENTRIES 1024 struct ZipState; /* Stores state for reading and processing entries in a .zip archive. */ @@ -138,6 +138,8 @@ struct ZipState { int _totalEntries; /* (internal) Offset to central directory entries. */ uint32_t _centralDirBeg; + /* (internal) Current entry being processed. */ + struct ZipEntry* _curEntry; /* Data for each entry in the .zip archive. */ struct ZipEntry Entries[ZIP_MAX_ENTRIES]; }; diff --git a/src/Gui.c b/src/Gui.c index c26cfe7ad..3754d1a7c 100644 --- a/src/Gui.c +++ b/src/Gui.c @@ -270,7 +270,7 @@ void Gui_CalcCursorVisible(void) { if (vis == gui_cursorVisible) return; gui_cursorVisible = vis; - Window_SetCursorVisible(vis); + Cursor_SetVisible(vis); if (Window_Focused) Camera.Active->RegrabMouse(); } diff --git a/src/Resources.c b/src/Resources.c index 7dcd61523..e8b32b6f0 100644 --- a/src/Resources.c +++ b/src/Resources.c @@ -279,52 +279,35 @@ static ReturnCode ZipPatcher_FixupLocalFile(struct Stream* s, struct ResourceTex return s->Seek(s, dataEnd); } -static ReturnCode ZipPatcher_WriteData(struct Stream* s, struct ResourceTexture* tex, const uint8_t* data, uint32_t len) { +static ReturnCode ZipPatcher_WriteData(struct Stream* dst, struct ResourceTexture* tex, const uint8_t* data, uint32_t len) { ReturnCode res; tex->Size = len; tex->Crc32 = Utils_CRC32(data, len); - res = ZipPatcher_LocalFile(s, tex); + res = ZipPatcher_LocalFile(dst, tex); if (res) return res; - return Stream_Write(s, data, len); + return Stream_Write(dst, data, len); } -/*static ReturnCode ZipPatcher_WriteStream(struct Stream* s, struct ResourceTexture* tex, struct Stream* src) { +static ReturnCode ZipPatcher_WriteZipEntry(struct Stream* src, struct ResourceTexture* tex, struct ZipState* state) { uint8_t tmp[2048]; uint32_t read; + struct Stream* dst = state->Obj; ReturnCode res; - if ((res = ZipPatcher_LocalFile(s, tex))) return res; + + tex->Size = state->_curEntry->UncompressedSize; + tex->Crc32 = state->_curEntry->CRC32; + res = ZipPatcher_LocalFile(dst, tex); + if (res) return res; for (;;) { res = src->Read(src, tmp, sizeof(tmp), &read); if (res) return res; if (!read) break; - if ((res = Stream_Write(s, tmp, read))) return res; + if ((res = Stream_Write(dst, tmp, read))) return res; } - return ZipPatcher_FixupLocalFile(s, tex); -}*/ -static ReturnCode ZipPatcher_WriteStream(struct Stream* s, struct ResourceTexture* tex, struct Stream* src) { - uint8_t tmp[2048]; - uint32_t read; - struct Stream crc32; - ReturnCode res; - - res = ZipPatcher_LocalFile(s, tex); - if (res) return res; - Stream_WriteonlyCrc32(&crc32, s); - - for (tex->Size = 0; ; tex->Size += read) { - res = src->Read(src, tmp, sizeof(tmp), &read); - if (res) return res; - if (!read) break; - - res = Stream_Write(&crc32, tmp, read); - if (res) return res; - } - - tex->Crc32 = crc32.Meta.CRC32.CRC32 ^ 0xFFFFFFFFUL; - return ZipPatcher_FixupLocalFile(s, tex); + return 0; } static ReturnCode ZipPatcher_WritePng(struct Stream* s, struct ResourceTexture* tex, Bitmap* src) { @@ -367,7 +350,6 @@ static bool ClassicPatcher_SelectEntry(const String* path ) { static ReturnCode ClassicPatcher_ProcessEntry(const String* path, struct Stream* data, struct ZipState* state) { static const String guiClassicPng = String_FromConst("gui_classic.png"); - struct Stream* s = state->Obj; struct ResourceTexture* entry; String name; @@ -381,7 +363,7 @@ static ReturnCode ClassicPatcher_ProcessEntry(const String* path, struct Stream* if (String_CaselessEqualsConst(&name, "gui.png")) name = guiClassicPng; entry = Resources_FindTex(&name); - return ZipPatcher_WriteStream(s, entry, data); + return ZipPatcher_WriteZipEntry(data, entry, state); } static ReturnCode ClassicPatcher_ExtractFiles(struct Stream* s) { @@ -467,7 +449,6 @@ static ReturnCode ModernPatcher_MakeAnimations(struct Stream* s, struct Stream* } static ReturnCode ModernPatcher_ProcessEntry(const String* path, struct Stream* data, struct ZipState* state) { - struct Stream* s = state->Obj; struct ResourceTexture* entry; struct TilePatch* tile; String name; @@ -478,11 +459,12 @@ static ReturnCode ModernPatcher_ProcessEntry(const String* path, struct Stream* Utils_UNSAFE_GetFilename(&name); entry = Resources_FindTex(&name); - return ZipPatcher_WriteStream(s, entry, data); + return ZipPatcher_WriteZipEntry(data, entry, state); } if (String_CaselessEqualsConst(path, "assets/minecraft/textures/blocks/fire_layer_1.png")) { - return ModernPatcher_MakeAnimations(s, data); + struct Stream* dst = state->Obj; + return ModernPatcher_MakeAnimations(dst, data); } tile = ModernPatcher_GetTile(path); diff --git a/src/Widgets.c b/src/Widgets.c index 75fd08b05..eb20ab015 100644 --- a/src/Widgets.c +++ b/src/Widgets.c @@ -546,7 +546,7 @@ static void TableWidget_MoveCursorToSelected(struct TableWidget* w) { topLeft = Window_PointToScreen(0, 0); x += topLeft.X; y += topLeft.Y; - Window_SetScreenCursorPos(x, y); + Cursor_SetScreenPos(x, y); } static void TableWidget_MakeBlockDesc(String* desc, BlockID block) { diff --git a/src/Window.c b/src/Window.c index 9bb25d3c5..eb0bd0fc9 100644 --- a/src/Window.c +++ b/src/Window.c @@ -10,7 +10,7 @@ Rect2D Window_Bounds; Size2D Window_ClientSize; static bool win_cursorVisible = true; -bool Window_GetCursorVisible(void) { return win_cursorVisible; } +bool Cursor_GetVisible(void) { return win_cursorVisible; } void Window_CreateSimple(int width, int height) { struct DisplayDevice* device = &DisplayDevice_Default; @@ -567,14 +567,14 @@ void Window_ProcessEvents(void) { } } -Point2D Window_GetScreenCursorPos(void) { +Point2D Cursor_GetScreenPos(void) { POINT point; GetCursorPos(&point); Point2D p = { point.x, point.y }; return p; } -void Window_SetScreenCursorPos(int x, int y) { +void Cursor_SetScreenPos(int x, int y) { SetCursorPos(x, y); } -void Window_SetCursorVisible(bool visible) { +void Cursor_SetVisible(bool visible) { win_cursorVisible = visible; ShowCursor(visible ? 1 : 0); } @@ -1335,7 +1335,7 @@ Point2D Window_PointToScreen(int x, int y) { return p; } -Point2D Window_GetScreenCursorPos(void) { +Point2D Cursor_GetScreenPos(void) { Window rootW, childW; Point2D root, child; unsigned int mask; @@ -1344,25 +1344,26 @@ Point2D Window_GetScreenCursorPos(void) { return root; } -void Window_SetScreenCursorPos(int x, int y) { +void Cursor_SetScreenPos(int x, int y) { XWarpPointer(win_display, None, win_rootWin, 0, 0, 0, 0, x, y); XFlush(win_display); /* TODO: not sure if XFlush call is necessary */ } -static Cursor win_blankCursor; -void Window_SetCursorVisible(bool visible) { +void Cursor_SetVisible(bool visible) { + static Cursor blankCursor; win_cursorVisible = visible; + if (visible) { XUndefineCursor(win_display, win_handle); } else { - if (!win_blankCursor) { + if (!blankCursor) { char data = 0; XColor col = { 0 }; - Pixmap pixmap = XCreateBitmapFromData(win_display, win_handle, &data, 1, 1); - win_blankCursor = XCreatePixmapCursor(win_display, pixmap, pixmap, &col, &col, 0, 0); + Pixmap pixmap = XCreateBitmapFromData(win_display, win_handle, &data, 1, 1); + blankCursor = XCreatePixmapCursor(win_display, pixmap, pixmap, &col, &col, 0, 0); XFreePixmap(win_display, pixmap); } - XDefineCursor(win_display, win_handle, win_blankCursor); + XDefineCursor(win_display, win_handle, blankCursor); } } @@ -2305,7 +2306,7 @@ Point2D Window_PointToScreen(int x, int y) { return p; } -Point2D Window_GetScreenCursorPos(void) { +Point2D Cursor_GetScreenPos(void) { HIPoint point; Point2D p; /* NOTE: HIGetMousePosition is OSX 10.5 or later */ @@ -2316,7 +2317,7 @@ Point2D Window_GetScreenCursorPos(void) { return p; } -void Window_SetScreenCursorPos(int x, int y) { +void Cursor_SetScreenPos(int x, int y) { CGPoint point; point.x = x; point.y = y; @@ -2325,7 +2326,7 @@ void Window_SetScreenCursorPos(int x, int y) { CGAssociateMouseAndMouseCursorPosition(1); } -void Window_SetCursorVisible(bool visible) { +void Cursor_SetVisible(bool visible) { win_cursorVisible = visible; if (visible) { CGDisplayShowCursor(CGMainDisplayID()); diff --git a/src/Window.h b/src/Window.h index b8881d26f..c768c01de 100644 --- a/src/Window.h +++ b/src/Window.h @@ -94,15 +94,15 @@ Point2D Window_PointToClient(int x, int y); Point2D Window_PointToScreen(int x, int y); /* Gets the position of the cursor in screen coordinates. */ -Point2D Window_GetScreenCursorPos(void); +Point2D Cursor_GetScreenPos(void); /* Sets the position of the cursor in screen coordinates. */ -void Window_SetScreenCursorPos(int x, int y); +void Cursor_SetScreenPos(int x, int y); /* Whether the cursor is visible when over this window. */ -bool Window_GetCursorVisible(void); +bool Cursor_GetVisible(void); /* Sets whether the cursor is visible when over this window. */ /* NOTE: You MUST BE VERY CAREFUL with this! OS typically uses a counter for visibility, so setting invisible multiple times means you must then set visible multiple times. */ -void Window_SetCursorVisible(bool visible); +void Cursor_SetVisible(bool visible); /* Shows a dialog box window. */ CC_API void Window_ShowDialog(const char* title, const char* msg);