mirror of
https://github.com/encounter/SDL.git
synced 2025-12-18 01:15:24 +00:00
Small stack allocations fall back to malloc if they're unexpectedly large.
This commit is contained in:
@@ -187,6 +187,7 @@ Cocoa_InitModes(_THIS)
|
||||
CGDisplayErr result;
|
||||
CGDirectDisplayID *displays;
|
||||
CGDisplayCount numDisplays;
|
||||
SDL_bool isstack;
|
||||
int pass, i;
|
||||
|
||||
result = CGGetOnlineDisplayList(0, NULL, &numDisplays);
|
||||
@@ -194,11 +195,11 @@ Cocoa_InitModes(_THIS)
|
||||
CG_SetError("CGGetOnlineDisplayList()", result);
|
||||
return;
|
||||
}
|
||||
displays = SDL_stack_alloc(CGDirectDisplayID, numDisplays);
|
||||
displays = SDL_small_alloc(CGDirectDisplayID, numDisplays, &isstack);
|
||||
result = CGGetOnlineDisplayList(numDisplays, displays, &numDisplays);
|
||||
if (result != kCGErrorSuccess) {
|
||||
CG_SetError("CGGetOnlineDisplayList()", result);
|
||||
SDL_stack_free(displays);
|
||||
SDL_small_free(displays, isstack);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -260,7 +261,7 @@ Cocoa_InitModes(_THIS)
|
||||
SDL_free(display.name);
|
||||
}
|
||||
}
|
||||
SDL_stack_free(displays);
|
||||
SDL_small_free(displays, isstack);
|
||||
}}
|
||||
|
||||
int
|
||||
|
||||
@@ -901,7 +901,8 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||
case WM_TOUCH:
|
||||
if (data->videodata->GetTouchInputInfo && data->videodata->CloseTouchInputHandle) {
|
||||
UINT i, num_inputs = LOWORD(wParam);
|
||||
PTOUCHINPUT inputs = SDL_stack_alloc(TOUCHINPUT, num_inputs);
|
||||
SDL_bool isstack;
|
||||
PTOUCHINPUT inputs = SDL_small_alloc(TOUCHINPUT, num_inputs, &isstack);
|
||||
if (data->videodata->GetTouchInputInfo((HTOUCHINPUT)lParam, num_inputs, inputs, sizeof(TOUCHINPUT))) {
|
||||
RECT rect;
|
||||
float x, y;
|
||||
@@ -909,7 +910,7 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||
if (!GetClientRect(hwnd, &rect) ||
|
||||
(rect.right == rect.left && rect.bottom == rect.top)) {
|
||||
if (inputs) {
|
||||
SDL_stack_free(inputs);
|
||||
SDL_small_free(inputs, isstack);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -943,7 +944,7 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||
}
|
||||
}
|
||||
}
|
||||
SDL_stack_free(inputs);
|
||||
SDL_small_free(inputs, isstack);
|
||||
|
||||
data->videodata->CloseTouchInputHandle((HTOUCHINPUT)lParam);
|
||||
return 0;
|
||||
@@ -954,17 +955,19 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
UINT i;
|
||||
HDROP drop = (HDROP) wParam;
|
||||
SDL_bool isstack;
|
||||
UINT count = DragQueryFile(drop, 0xFFFFFFFF, NULL, 0);
|
||||
for (i = 0; i < count; ++i) {
|
||||
SDL_bool isstack;
|
||||
UINT size = DragQueryFile(drop, i, NULL, 0) + 1;
|
||||
LPTSTR buffer = SDL_stack_alloc(TCHAR, size);
|
||||
LPTSTR buffer = SDL_small_alloc(TCHAR, size, &isstack);
|
||||
if (buffer) {
|
||||
if (DragQueryFile(drop, i, buffer, size)) {
|
||||
char *file = WIN_StringToUTF8(buffer);
|
||||
SDL_SendDropFile(data->window, file);
|
||||
SDL_free(file);
|
||||
}
|
||||
SDL_stack_free(buffer);
|
||||
SDL_small_free(buffer, isstack);
|
||||
}
|
||||
}
|
||||
SDL_SendDropComplete(data->window);
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
int WIN_CreateWindowFramebuffer(_THIS, SDL_Window * window, Uint32 * format, void ** pixels, int *pitch)
|
||||
{
|
||||
SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
|
||||
SDL_bool isstack;
|
||||
size_t size;
|
||||
LPBITMAPINFO info;
|
||||
HBITMAP hbm;
|
||||
@@ -41,7 +42,7 @@ int WIN_CreateWindowFramebuffer(_THIS, SDL_Window * window, Uint32 * format, voi
|
||||
|
||||
/* Find out the format of the screen */
|
||||
size = sizeof(BITMAPINFOHEADER) + 256 * sizeof (RGBQUAD);
|
||||
info = (LPBITMAPINFO)SDL_stack_alloc(Uint8, size);
|
||||
info = (LPBITMAPINFO)SDL_small_alloc(Uint8, size, &isstack);
|
||||
if (!info) {
|
||||
return SDL_OutOfMemory();
|
||||
}
|
||||
@@ -85,7 +86,7 @@ int WIN_CreateWindowFramebuffer(_THIS, SDL_Window * window, Uint32 * format, voi
|
||||
|
||||
data->mdc = CreateCompatibleDC(data->hdc);
|
||||
data->hbm = CreateDIBSection(data->hdc, info, DIB_RGB_COLORS, pixels, NULL, 0);
|
||||
SDL_stack_free(info);
|
||||
SDL_small_free(info, isstack);
|
||||
|
||||
if (!data->hbm) {
|
||||
return WIN_SetError("Unable to create DIB");
|
||||
|
||||
@@ -97,6 +97,7 @@ WIN_CreateCursor(SDL_Surface * surface, int hot_x, int hot_y)
|
||||
LPVOID pixels;
|
||||
LPVOID maskbits;
|
||||
size_t maskbitslen;
|
||||
SDL_bool isstack;
|
||||
ICONINFO ii;
|
||||
|
||||
SDL_zero(bmh);
|
||||
@@ -112,7 +113,7 @@ WIN_CreateCursor(SDL_Surface * surface, int hot_x, int hot_y)
|
||||
bmh.bV4BlueMask = 0x000000FF;
|
||||
|
||||
maskbitslen = ((surface->w + (pad - (surface->w % pad))) / 8) * surface->h;
|
||||
maskbits = SDL_stack_alloc(Uint8,maskbitslen);
|
||||
maskbits = SDL_small_alloc(Uint8,maskbitslen);
|
||||
if (maskbits == NULL) {
|
||||
SDL_OutOfMemory();
|
||||
return NULL;
|
||||
@@ -129,7 +130,7 @@ WIN_CreateCursor(SDL_Surface * surface, int hot_x, int hot_y)
|
||||
ii.hbmColor = CreateDIBSection(hdc, (BITMAPINFO*)&bmh, DIB_RGB_COLORS, &pixels, NULL, 0);
|
||||
ii.hbmMask = CreateBitmap(surface->w, surface->h, 1, 1, maskbits);
|
||||
ReleaseDC(NULL, hdc);
|
||||
SDL_stack_free(maskbits);
|
||||
SDL_small_free(maskbits, isstack);
|
||||
|
||||
SDL_assert(surface->format->format == SDL_PIXELFORMAT_ARGB8888);
|
||||
SDL_assert(surface->pitch == surface->w * 4);
|
||||
|
||||
@@ -380,10 +380,11 @@ WIN_CreateWindowFrom(_THIS, SDL_Window * window, const void *data)
|
||||
HWND hwnd = (HWND) data;
|
||||
LPTSTR title;
|
||||
int titleLen;
|
||||
SDL_bool isstack;
|
||||
|
||||
/* Query the title from the existing window */
|
||||
titleLen = GetWindowTextLength(hwnd);
|
||||
title = SDL_stack_alloc(TCHAR, titleLen + 1);
|
||||
title = SDL_small_alloc(TCHAR, titleLen + 1, &isstack);
|
||||
if (title) {
|
||||
titleLen = GetWindowText(hwnd, title, titleLen);
|
||||
} else {
|
||||
@@ -393,7 +394,7 @@ WIN_CreateWindowFrom(_THIS, SDL_Window * window, const void *data)
|
||||
window->title = WIN_StringToUTF8(title);
|
||||
}
|
||||
if (title) {
|
||||
SDL_stack_free(title);
|
||||
SDL_small_free(title, isstack);
|
||||
}
|
||||
|
||||
if (SetupWindowData(_this, window, hwnd, GetParent(hwnd), SDL_FALSE) < 0) {
|
||||
@@ -443,14 +444,15 @@ WIN_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon)
|
||||
BYTE *icon_bmp;
|
||||
int icon_len, mask_len, y;
|
||||
SDL_RWops *dst;
|
||||
SDL_bool isstack;
|
||||
|
||||
/* Create temporary buffer for ICONIMAGE structure */
|
||||
mask_len = (icon->h * (icon->w + 7)/8);
|
||||
icon_len = 40 + icon->h * icon->w * sizeof(Uint32) + mask_len;
|
||||
icon_bmp = SDL_stack_alloc(BYTE, icon_len);
|
||||
icon_bmp = SDL_small_alloc(BYTE, icon_len, &isstack);
|
||||
dst = SDL_RWFromMem(icon_bmp, icon_len);
|
||||
if (!dst) {
|
||||
SDL_stack_free(icon_bmp);
|
||||
SDL_small_free(icon_bmp, isstack);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -481,7 +483,7 @@ WIN_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon)
|
||||
hicon = CreateIconFromResource(icon_bmp, icon_len, TRUE, 0x00030000);
|
||||
|
||||
SDL_RWclose(dst);
|
||||
SDL_stack_free(icon_bmp);
|
||||
SDL_small_free(icon_bmp, isstack);
|
||||
|
||||
/* Set the icon for the window */
|
||||
SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM) hicon);
|
||||
|
||||
Reference in New Issue
Block a user