Merge pull request #19181 from guilhermefelipecgs/fix_memory_leak
Fix memory leak in set_custom_mouse_cursor
This commit is contained in:
commit
daa136784d
3 changed files with 17 additions and 5 deletions
|
@ -1546,7 +1546,7 @@ void OS_OSX::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, c
|
|||
|
||||
image = texture->get_data();
|
||||
|
||||
NSBitmapImageRep *imgrep = [[[NSBitmapImageRep alloc]
|
||||
NSBitmapImageRep *imgrep = [[NSBitmapImageRep alloc]
|
||||
initWithBitmapDataPlanes:NULL
|
||||
pixelsWide:int(texture_size.width)
|
||||
pixelsHigh:int(texture_size.height)
|
||||
|
@ -1556,7 +1556,7 @@ void OS_OSX::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, c
|
|||
isPlanar:NO
|
||||
colorSpaceName:NSDeviceRGBColorSpace
|
||||
bytesPerRow:int(texture_size.width) * 4
|
||||
bitsPerPixel:32] autorelease];
|
||||
bitsPerPixel:32];
|
||||
|
||||
ERR_FAIL_COND(imgrep == nil);
|
||||
uint8_t *pixels = [imgrep bitmapData];
|
||||
|
@ -1588,16 +1588,20 @@ void OS_OSX::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, c
|
|||
|
||||
image->unlock();
|
||||
|
||||
NSImage *nsimage = [[[NSImage alloc] initWithSize:NSMakeSize(texture_size.width, texture_size.height)] autorelease];
|
||||
NSImage *nsimage = [[NSImage alloc] initWithSize:NSMakeSize(texture_size.width, texture_size.height)];
|
||||
[nsimage addRepresentation:imgrep];
|
||||
|
||||
NSCursor *cursor = [[NSCursor alloc] initWithImage:nsimage hotSpot:NSMakePoint(p_hotspot.x, p_hotspot.y)];
|
||||
|
||||
[cursors[p_shape] release];
|
||||
cursors[p_shape] = cursor;
|
||||
|
||||
if (p_shape == CURSOR_ARROW) {
|
||||
[cursor set];
|
||||
}
|
||||
|
||||
[imgrep release];
|
||||
[nsimage release];
|
||||
} else {
|
||||
// Reset to default system cursor
|
||||
cursors[p_shape] = NULL;
|
||||
|
|
|
@ -2081,7 +2081,7 @@ void OS_Windows::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shap
|
|||
UINT size = sizeof(UINT) * image_size;
|
||||
|
||||
// Create the BITMAP with alpha channel
|
||||
COLORREF *buffer = (COLORREF *)malloc(sizeof(COLORREF) * image_size);
|
||||
COLORREF *buffer = (COLORREF *)memalloc(sizeof(COLORREF) * image_size);
|
||||
|
||||
image->lock();
|
||||
for (UINT index = 0; index < image_size; index++) {
|
||||
|
@ -2108,6 +2108,8 @@ void OS_Windows::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shap
|
|||
GetMaskBitmaps(bitmap, clrTransparent, hAndMask, hXorMask);
|
||||
|
||||
if (NULL == hAndMask || NULL == hXorMask) {
|
||||
memfree(buffer);
|
||||
DeleteObject(bitmap);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -2132,6 +2134,9 @@ void OS_Windows::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shap
|
|||
if (hXorMask != NULL) {
|
||||
DeleteObject(hXorMask);
|
||||
}
|
||||
|
||||
memfree(buffer);
|
||||
DeleteObject(bitmap);
|
||||
} else {
|
||||
// Reset to default system cursor
|
||||
cursors[p_shape] = NULL;
|
||||
|
|
|
@ -2463,7 +2463,7 @@ void OS_X11::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, c
|
|||
cursor_image->yhot = p_hotspot.y;
|
||||
|
||||
// allocate memory to contain the whole file
|
||||
cursor_image->pixels = (XcursorPixel *)malloc(size);
|
||||
cursor_image->pixels = (XcursorPixel *)memalloc(size);
|
||||
|
||||
image->lock();
|
||||
|
||||
|
@ -2489,6 +2489,9 @@ void OS_X11::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, c
|
|||
if (p_shape == CURSOR_ARROW) {
|
||||
XDefineCursor(x11_display, x11_window, cursors[p_shape]);
|
||||
}
|
||||
|
||||
memfree(cursor_image->pixels);
|
||||
XcursorImageDestroy(cursor_image);
|
||||
} else {
|
||||
// Reset to default system cursor
|
||||
if (img[p_shape]) {
|
||||
|
|
Loading…
Reference in a new issue