From fbebc94718ddb9daefb245401df8acf3422310ff Mon Sep 17 00:00:00 2001 From: Vincent Wei Date: Fri, 1 Sep 2023 10:01:11 +0800 Subject: [PATCH] use GAL_RefSurface() in CreateMemDCFromSurface() --- src/gui/menu.c | 2 +- src/include/internals.h | 4 +--- src/include/newgal.h | 5 +++++ src/kernel/desktop-procs.c | 4 ++-- src/kernel/desktop.c | 2 +- src/newgdi/gdi.c | 24 +++++++++++++++++------- src/newgdi/shared-surface.c | 7 +------ 7 files changed, 28 insertions(+), 20 deletions(-) diff --git a/src/gui/menu.c b/src/gui/menu.c index 4168c03c..722ea70d 100644 --- a/src/gui/menu.c +++ b/src/gui/menu.c @@ -2185,7 +2185,7 @@ static int create_memdc_for_menu (TRACKMENUINFO* ptmi) return -1; } - ptmi->dc = CreateMemDCFromSurface (surf); + ptmi->dc = __mg_create_memdc_for_surface (surf); if (ptmi->dc == HDC_INVALID) { GAL_FreeSurface (surf); return -1; diff --git a/src/include/internals.h b/src/include/internals.h index 0c7079e6..1e03863f 100644 --- a/src/include/internals.h +++ b/src/include/internals.h @@ -958,9 +958,7 @@ BOOL gui_LoadIconRes(HDC hdc, const char* rdr_name, char* file); void gui_WndRect(HWND hWnd, PRECT prc); void gui_WndClientRect(HWND hWnd, PRECT prc); -/* Undisclosed APIs */ -HDC CreateMemDCFromSurface (struct GAL_Surface* surface); -struct GAL_Surface* GetSurfaceFromDC (HDC hdc); +HDC __mg_create_memdc_for_surface (struct GAL_Surface* surface); /* Since 5.0.0 */ #ifdef _MGRM_PROCESSES diff --git a/src/include/newgal.h b/src/include/newgal.h index 70f05d59..3d0b0083 100644 --- a/src/include/newgal.h +++ b/src/include/newgal.h @@ -583,6 +583,11 @@ GAL_Surface *GAL_CreateRGBSurface GAL_Surface *GAL_CreateRGBSurfaceFrom (void *pixels, int width, int height, int depth, int pitch, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask); +/* Since 5.2.0 */ +static GAL_Surface *GAL_RefSurface (GAL_Surface *surface) { + surface->refcount++; + return surface; +} void GAL_FreeSurface (GAL_Surface *surface); typedef struct REQ_HWSURFACE { diff --git a/src/kernel/desktop-procs.c b/src/kernel/desktop-procs.c index 21988d4d..7067aaac 100644 --- a/src/kernel/desktop-procs.c +++ b/src/kernel/desktop-procs.c @@ -848,7 +848,7 @@ static int srvAllocZOrderNode (int cli, HWND hwnd, HWND main_win, } if (surf) { - memdc = CreateMemDCFromSurface (surf); + memdc = __mg_create_memdc_for_surface (surf); if (memdc == HDC_INVALID) { if (cli > 0) { GAL_FreeSurface (surf); @@ -1003,7 +1003,7 @@ static int srvMoveWindow (int cli, int idx_znode, const RECT* rcWin, } if (surf) { - memdc = CreateMemDCFromSurface (surf); + memdc = __mg_create_memdc_for_surface (surf); if (memdc == HDC_INVALID) { if (cli > 0) { GAL_FreeSurface (surf); diff --git a/src/kernel/desktop.c b/src/kernel/desktop.c index 867f199c..153be360 100644 --- a/src/kernel/desktop.c +++ b/src/kernel/desktop.c @@ -1614,7 +1614,7 @@ static int srvStartTrackPopupMenu (int cli, const RECT* rc, HWND ptmi, } if (surf) { - memdc = CreateMemDCFromSurface (surf); + memdc = __mg_create_memdc_for_surface (surf); if (memdc == HDC_INVALID) { GAL_FreeSurface (surf); _WRN_PRINTF("failed to create memory dc for znode\n"); diff --git a/src/newgdi/gdi.c b/src/newgdi/gdi.c index 767cbc29..a521e801 100644 --- a/src/newgdi/gdi.c +++ b/src/newgdi/gdi.c @@ -3346,8 +3346,7 @@ HDC GUIAPI CreateMemDCEx (int width, int height, int depth, DWORD flags, return (HDC)pmem_dc; } -/* Since 5.0.0; exported as API since 5.2.0 */ -HDC GUIAPI CreateMemDCFromSurface (HSURF surface) +static HDC create_memdc_from_surface(HSURF surface, BOOL take_owner) { PDC pmem_dc = NULL; @@ -3360,7 +3359,10 @@ HDC GUIAPI CreateMemDCFromSurface (HSURF surface) pmem_dc->DataType = TYPE_HDC; pmem_dc->DCType = TYPE_MEMDC; pmem_dc->bInUse = TRUE; - pmem_dc->surface = surface; + if (take_owner) + pmem_dc->surface = surface; + else + pmem_dc->surface = GAL_RefSurface(surface); dc_InitDC (pmem_dc, HWND_NULL, FALSE); @@ -3384,14 +3386,22 @@ HDC GUIAPI CreateMemDCFromSurface (HSURF surface) return (HDC)pmem_dc; } +/* Since 5.2.0 */ +HDC GUIAPI CreateMemDCFromSurface (HSURF surface) +{ + return create_memdc_from_surface(surface, FALSE); +} + +HDC __mg_create_memdc_for_surface (HSURF surface) +{ + return create_memdc_from_surface(surface, TRUE); +} + HSURF GUIAPI GetSurfaceFromDC (HDC hdc) { PDC pdc; pdc = dc_HDC2PDC(hdc); - if (pdc) - return pdc->surface; - - return NULL; + return pdc->surface; } HDC GUIAPI CreateSubMemDC (HDC parent, int off_x, int off_y, diff --git a/src/newgdi/shared-surface.c b/src/newgdi/shared-surface.c index b952e79a..acd715e5 100644 --- a/src/newgdi/shared-surface.c +++ b/src/newgdi/shared-surface.c @@ -289,12 +289,7 @@ int GUIAPI GetSharedSurfaceFDByName(const char *name, HSURF GUIAPI AttachToSharedSurface(GHANDLE video, int fd, size_t map_size, DWORD flags) { - HSURF surf = GAL_AttachSharedRGBSurface(video, fd, map_size, flags, TRUE); - if (surf) { - surf->refcount++; - } - - return surf; + return GAL_AttachSharedRGBSurface(video, fd, map_size, flags, TRUE); } const char *GUIAPI GetSharedSurfaceInfo(HSURF surf, int *fd,