From 757e7cb40dae84f79b4d43de7f37df917dbff085 Mon Sep 17 00:00:00 2001
From: Andreas Mohr <andi@rhlx01.fht-esslingen.de>
Date: Wed, 8 May 2002 00:20:40 +0000
Subject: [PATCH] Replace SELECTOR_AllocBlock and SELECTOR_FreeBlock with
 standard Win16 selector calls.

---
 memory/selector.c |  6 +++---
 objects/bitmap.c  |  9 ++++++++-
 objects/dib.c     | 12 +++++++++++-
 3 files changed, 22 insertions(+), 5 deletions(-)

diff --git a/memory/selector.c b/memory/selector.c
index 0e741b696ba..f70b1f600b0 100644
--- a/memory/selector.c
+++ b/memory/selector.c
@@ -161,15 +161,15 @@ static void SELECTOR_SetEntries( WORD sel, const void *base, DWORD size, unsigne
     WORD i, count;
 
     wine_ldt_set_base( &entry, base );
-    wine_ldt_set_limit( &entry, size - 1 );
-    wine_ldt_set_flags( &entry, flags );
     /* Make sure base and limit are not 0 together if the size is not 0 */
-    if (!base && size == 1) wine_ldt_set_limit( &entry, 1 );
+    wine_ldt_set_limit( &entry, (!base && size == 1) ? 1 : size - 1 );
+    wine_ldt_set_flags( &entry, flags );
     count = (size + 0xffff) / 0x10000;
     for (i = 0; i < count; i++)
     {
         wine_ldt_set_entry( sel + (i << __AHSHIFT), &entry );
         wine_ldt_set_base( &entry, wine_ldt_get_base(&entry) + 0x10000 );
+        /* yep, Windows sets limit like that, not 64K sel units */
         wine_ldt_set_limit( &entry, wine_ldt_get_limit(&entry) - 0x10000 );
     }
 }
diff --git a/objects/bitmap.c b/objects/bitmap.c
index 6ef032d3e2b..57ee54cb5c9 100644
--- a/objects/bitmap.c
+++ b/objects/bitmap.c
@@ -443,7 +443,14 @@ BOOL BITMAP_DeleteObject( HBITMAP16 hbitmap, BITMAPOBJ * bmp )
         }
         HeapFree(GetProcessHeap(), 0, dib);
         bmp->dib = NULL;
-        if (bmp->segptr_bits) SELECTOR_FreeBlock( SELECTOROF(bmp->segptr_bits) );
+        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));
+        }
     }
     return GDI_FreeObject( hbitmap, bmp );
 }
diff --git a/objects/dib.c b/objects/dib.c
index 764fbf8d049..39c5c59caf9 100644
--- a/objects/dib.c
+++ b/objects/dib.c
@@ -895,7 +895,17 @@ HBITMAP16 WINAPI CreateDIBSection16 (HDC16 hdc, BITMAPINFO *bmi, UINT16 usage,
             INT size  = (bi->biSizeImage && bi->biCompression != BI_RGB) ?
                          bi->biSizeImage : width_bytes * height;
 
-            WORD sel = SELECTOR_AllocBlock( bits32, size, WINE_LDT_FLAGS_DATA );
+            /* calculate number of sel's needed for size with 64K steps */
+            WORD count = (size + 0xffff) / 0x10000;
+            WORD sel = AllocSelectorArray16(count);
+            int i;
+
+            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;
         }
-- 
GitLab