Alexandre Julliard : gdi32: Move the 16-bit DIB pointer support to gdi16.c.
Alexandre Julliard
julliard at winehq.org
Mon Sep 28 11:54:34 CDT 2009
Module: wine
Branch: master
Commit: 29d68b3fa77c2a55d3f82d839beba8fdbd91afc1
URL: http://source.winehq.org/git/wine.git/?a=commit;h=29d68b3fa77c2a55d3f82d839beba8fdbd91afc1
Author: Alexandre Julliard <julliard at winehq.org>
Date: Sat Sep 26 13:50:37 2009 +0200
gdi32: Move the 16-bit DIB pointer support to gdi16.c.
---
dlls/gdi32/bitmap.c | 10 -----
dlls/gdi32/gdi16.c | 89 ++++++++++++++++++++++++++++------------------
dlls/gdi32/gdi_private.h | 1 -
3 files changed, 54 insertions(+), 46 deletions(-)
diff --git a/dlls/gdi32/bitmap.c b/dlls/gdi32/bitmap.c
index f4c48c6..609cc9c 100644
--- a/dlls/gdi32/bitmap.c
+++ b/dlls/gdi32/bitmap.c
@@ -292,7 +292,6 @@ HBITMAP WINAPI CreateBitmapIndirect( const BITMAP *bmp )
bmpobj->bitmap.bmBits = NULL;
bmpobj->funcs = NULL;
bmpobj->dib = NULL;
- bmpobj->segptr_bits = 0;
bmpobj->color_table = NULL;
bmpobj->nb_colors = 0;
@@ -657,15 +656,6 @@ static BOOL BITMAP_DeleteObject( HGDIOBJ handle )
VirtualFree(dib->dsBm.bmBits, 0L, MEM_RELEASE );
}
HeapFree(GetProcessHeap(), 0, dib);
- bmp->dib = NULL;
- if (bmp->segptr_bits)
- { /* free its selector array */
- WORD sel = SELECTOROF(bmp->segptr_bits);
- WORD count = (GetSelectorLimit16(sel) / 0x10000) + 1;
- int i;
-
- for (i = 0; i < count; i++) FreeSelector16(sel + (i << __AHSHIFT));
- }
HeapFree(GetProcessHeap(), 0, bmp->color_table);
}
return HeapFree( GetProcessHeap(), 0, bmp );
diff --git a/dlls/gdi32/gdi16.c b/dlls/gdi32/gdi16.c
index 5fd779e..ee829e1 100644
--- a/dlls/gdi32/gdi16.c
+++ b/dlls/gdi32/gdi16.c
@@ -26,6 +26,7 @@
#include "wownt32.h"
#include "wine/wingdi16.h"
#include "gdi_private.h"
+#include "wine/list.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(gdi);
@@ -222,6 +223,57 @@ static INT CALLBACK enum_font_callback( const LOGFONTW *plf,
return LOWORD(ret);
}
+struct dib_segptr_bits
+{
+ struct list entry;
+ HBITMAP16 bmp;
+ WORD sel;
+ WORD count;
+};
+
+static struct list dib_segptr_list = LIST_INIT( dib_segptr_list );
+
+static SEGPTR alloc_segptr_bits( HBITMAP bmp, void *bits32 )
+{
+ DIBSECTION dib;
+ unsigned int i, size;
+ struct dib_segptr_bits *bits;
+
+ if (!(bits = HeapAlloc( GetProcessHeap(), 0, sizeof(*bits) ))) return 0;
+
+ GetObjectW( bmp, sizeof(dib), &dib );
+ size = dib.dsBm.bmHeight * dib.dsBm.bmWidthBytes;
+
+ /* calculate number of sel's needed for size with 64K steps */
+ bits->bmp = HBITMAP_16( bmp );
+ bits->count = (size + 0xffff) / 0x10000;
+ bits->sel = AllocSelectorArray16( bits->count );
+
+ for (i = 0; i < bits->count; i++)
+ {
+ SetSelectorBase(bits->sel + (i << __AHSHIFT), (DWORD)bits32 + i * 0x10000);
+ SetSelectorLimit16(bits->sel + (i << __AHSHIFT), size - 1); /* yep, limit is correct */
+ size -= 0x10000;
+ }
+ list_add_head( &dib_segptr_list, &bits->entry );
+ return MAKESEGPTR( bits->sel, 0 );
+}
+
+static void free_segptr_bits( HBITMAP16 bmp )
+{
+ unsigned int i;
+ struct dib_segptr_bits *bits;
+
+ LIST_FOR_EACH_ENTRY( bits, &dib_segptr_list, struct dib_segptr_bits, entry )
+ {
+ if (bits->bmp != bmp) continue;
+ for (i = 0; i < bits->count; i++) FreeSelector16( bits->sel + (i << __AHSHIFT) );
+
+ list_remove( &bits->entry );
+ HeapFree( GetProcessHeap(), 0, bits );
+ return;
+ }
+}
/***********************************************************************
* SetBkColor (GDI.1)
@@ -1125,6 +1177,7 @@ BOOL16 WINAPI DeleteDC16( HDC16 hdc )
*/
BOOL16 WINAPI DeleteObject16( HGDIOBJ16 obj )
{
+ if (GetObjectType( HGDIOBJ_32(obj) ) == OBJ_BITMAP) free_segptr_bits( obj );
return DeleteObject( HGDIOBJ_32(obj) );
}
@@ -3623,40 +3676,6 @@ HBITMAP16 WINAPI CreateDIBSection16 (HDC16 hdc, const BITMAPINFO *bmi, UINT16 us
HBITMAP hbitmap;
hbitmap = CreateDIBSection( HDC_32(hdc), bmi, usage, &bits32, section, offset );
- if (hbitmap)
- {
- BITMAPOBJ *bmp = GDI_GetObjPtr(hbitmap, OBJ_BITMAP);
- if (bmp && bmp->dib && bits32)
- {
- const BITMAPINFOHEADER *bi = &bmi->bmiHeader;
- LONG width, height;
- WORD planes, bpp;
- DWORD compr, size;
- INT width_bytes;
- WORD count, sel;
- int i;
-
- DIB_GetBitmapInfo(bi, &width, &height, &planes, &bpp, &compr, &size);
-
- height = height >= 0 ? height : -height;
- width_bytes = DIB_GetDIBWidthBytes(width, bpp);
-
- if (!size || (compr != BI_RLE4 && compr != BI_RLE8)) size = width_bytes * height;
-
- /* calculate number of sel's needed for size with 64K steps */
- count = (size + 0xffff) / 0x10000;
- sel = AllocSelectorArray16(count);
-
- for (i = 0; i < count; i++)
- {
- SetSelectorBase(sel + (i << __AHSHIFT), (DWORD)bits32 + i * 0x10000);
- SetSelectorLimit16(sel + (i << __AHSHIFT), size - 1); /* yep, limit is correct */
- size -= 0x10000;
- }
- bmp->segptr_bits = MAKESEGPTR( sel, 0 );
- if (bits16) *bits16 = bmp->segptr_bits;
- }
- if (bmp) GDI_ReleaseObj( hbitmap );
- }
+ if (hbitmap && bits32 && bits16) *bits16 = alloc_segptr_bits( hbitmap, bits32 );
return HBITMAP_16(hbitmap);
}
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index a637a98..f0248c9 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -343,7 +343,6 @@ typedef struct tagBITMAPOBJ
const DC_FUNCTIONS *funcs; /* DC function table */
/* For device-independent bitmaps: */
DIBSECTION *dib;
- SEGPTR segptr_bits; /* segptr to DIB bits */
RGBQUAD *color_table; /* DIB color table if <= 8bpp */
UINT nb_colors; /* number of colors in table */
} BITMAPOBJ;
More information about the wine-cvs
mailing list