[5/6] windowscodecs: Add support for adding trasparent color to generated palettes.

Dmitry Timoshkov dmitry at baikal.ru
Sun Jul 22 22:47:57 CDT 2012


---
 dlls/windowscodecs/palette.c       | 82 ++++++++++++++++++++-----------
 dlls/windowscodecs/tests/palette.c | 98 ++++++++++++++++++++++++++++----------
 2 files changed, 128 insertions(+), 52 deletions(-)

diff --git a/dlls/windowscodecs/palette.c b/dlls/windowscodecs/palette.c
index 803a138..62c7907 100644
--- a/dlls/windowscodecs/palette.c
+++ b/dlls/windowscodecs/palette.c
@@ -133,13 +133,13 @@ static WICColor *generate_gray256_palette(UINT *count)
     return entries;
 }
 
-static WICColor *generate_halftone8_palette(UINT *count)
+static WICColor *generate_halftone8_palette(UINT *count, BOOL add_transparent)
 {
     WICColor *entries;
     UINT i;
 
-    *count = 16;
-    entries = HeapAlloc(GetProcessHeap(), 0, 16 * sizeof(WICColor));
+    *count = add_transparent ? 17 : 16;
+    entries = HeapAlloc(GetProcessHeap(), 0, *count * sizeof(WICColor));
     if (!entries) return NULL;
 
     for (i = 0; i < 8; i++)
@@ -157,16 +157,20 @@ static WICColor *generate_halftone8_palette(UINT *count)
         entries[i] = 0xff000000;
         entries[i] |= halftone[i-8];
     }
+
+    if (add_transparent)
+        entries[i] = 0;
+
     return entries;
 }
 
-static WICColor *generate_halftone27_palette(UINT *count)
+static WICColor *generate_halftone27_palette(UINT *count, BOOL add_transparent)
 {
     WICColor *entries;
     UINT i;
 
-    *count = 28;
-    entries = HeapAlloc(GetProcessHeap(), 0, 28 * sizeof(WICColor));
+    *count = add_transparent ? 29 : 28;
+    entries = HeapAlloc(GetProcessHeap(), 0, *count * sizeof(WICColor));
     if (!entries) return NULL;
 
     for (i = 0; i < 27; i++)
@@ -178,17 +182,20 @@ static WICColor *generate_halftone27_palette(UINT *count)
         entries[i] |= halftone_values[(i/9)%3] << 16;
     }
 
-    entries[i] = 0xffc0c0c0;
+    entries[i++] = 0xffc0c0c0;
+    if (add_transparent)
+        entries[i] = 0;
+
     return entries;
 }
 
-static WICColor *generate_halftone64_palette(UINT *count)
+static WICColor *generate_halftone64_palette(UINT *count, BOOL add_transparent)
 {
     WICColor *entries;
     UINT i;
 
-    *count = 72;
-    entries = HeapAlloc(GetProcessHeap(), 0, 72 * sizeof(WICColor));
+    *count = add_transparent ? 73 : 72;
+    entries = HeapAlloc(GetProcessHeap(), 0, *count * sizeof(WICColor));
     if (!entries) return NULL;
 
     for (i = 0; i < 64; i++)
@@ -207,16 +214,20 @@ static WICColor *generate_halftone64_palette(UINT *count)
         entries[i] = 0xff000000;
         entries[i] |= halftone[i-64];
     }
+
+    if (add_transparent)
+        entries[i] = 0;
+
     return entries;
 }
 
-static WICColor *generate_halftone125_palette(UINT *count)
+static WICColor *generate_halftone125_palette(UINT *count, BOOL add_transparent)
 {
     WICColor *entries;
     UINT i;
 
-    *count = 126;
-    entries = HeapAlloc(GetProcessHeap(), 0, 126 * sizeof(WICColor));
+    *count = add_transparent ? 127 : 126;
+    entries = HeapAlloc(GetProcessHeap(), 0, *count * sizeof(WICColor));
     if (!entries) return NULL;
 
     for (i = 0; i < 125; i++)
@@ -228,17 +239,20 @@ static WICColor *generate_halftone125_palette(UINT *count)
         entries[i] |= halftone_values[(i/25)%5] << 16;
     }
 
-    entries[i] = 0xffc0c0c0;
+    entries[i++] = 0xffc0c0c0;
+    if (add_transparent)
+        entries[i] = 0;
+
     return entries;
 }
 
-static WICColor *generate_halftone216_palette(UINT *count)
+static WICColor *generate_halftone216_palette(UINT *count, BOOL add_transparent)
 {
     WICColor *entries;
     UINT i;
 
-    *count = 224;
-    entries = HeapAlloc(GetProcessHeap(), 0, 224 * sizeof(WICColor));
+    *count = add_transparent ? 225 : 224;
+    entries = HeapAlloc(GetProcessHeap(), 0, *count * sizeof(WICColor));
     if (!entries) return NULL;
 
     for (i = 0; i < 216; i++)
@@ -257,16 +271,20 @@ static WICColor *generate_halftone216_palette(UINT *count)
         entries[i] = 0xff000000;
         entries[i] |= halftone[i-216];
     }
+
+    if (add_transparent)
+        entries[i] = 0;
+
     return entries;
 }
 
-static WICColor *generate_halftone252_palette(UINT *count)
+static WICColor *generate_halftone252_palette(UINT *count, BOOL add_transparent)
 {
     WICColor *entries;
     UINT i;
 
-    *count = 252;
-    entries = HeapAlloc(GetProcessHeap(), 0, 252 * sizeof(WICColor));
+    *count = add_transparent ? 253 : 252;
+    entries = HeapAlloc(GetProcessHeap(), 0, *count * sizeof(WICColor));
     if (!entries) return NULL;
 
     for (i = 0; i < 252; i++)
@@ -278,10 +296,14 @@ static WICColor *generate_halftone252_palette(UINT *count)
         entries[i] |= halftone_values_g[(i/6)%7] << 8;
         entries[i] |= halftone_values_rb[(i/42)%6] << 16;
     }
+
+    if (add_transparent)
+        entries[i] = 0;
+
     return entries;
 }
 
-static WICColor *generate_halftone256_palette(UINT *count)
+static WICColor *generate_halftone256_palette(UINT *count, BOOL add_transparent)
 {
     WICColor *entries;
     UINT i;
@@ -299,6 +321,10 @@ static WICColor *generate_halftone256_palette(UINT *count)
         entries[i] |= halftone_values_gr[(i/4)%8] << 8;
         entries[i] |= halftone_values_gr[(i/32)%8] << 16;
     }
+
+    if (add_transparent)
+        entries[255] = 0;
+
     return entries;
 }
 
@@ -342,37 +368,37 @@ static HRESULT WINAPI PaletteImpl_InitializePredefined(IWICPalette *iface,
         break;
 
     case WICBitmapPaletteTypeFixedHalftone8:
-        colors = generate_halftone8_palette(&count);
+        colors = generate_halftone8_palette(&count, add_transparent);
         if (!colors) return E_OUTOFMEMORY;
         break;
 
     case WICBitmapPaletteTypeFixedHalftone27:
-        colors = generate_halftone27_palette(&count);
+        colors = generate_halftone27_palette(&count, add_transparent);
         if (!colors) return E_OUTOFMEMORY;
         break;
 
     case WICBitmapPaletteTypeFixedHalftone64:
-        colors = generate_halftone64_palette(&count);
+        colors = generate_halftone64_palette(&count, add_transparent);
         if (!colors) return E_OUTOFMEMORY;
         break;
 
     case WICBitmapPaletteTypeFixedHalftone125:
-        colors = generate_halftone125_palette(&count);
+        colors = generate_halftone125_palette(&count, add_transparent);
         if (!colors) return E_OUTOFMEMORY;
         break;
 
     case WICBitmapPaletteTypeFixedHalftone216:
-        colors = generate_halftone216_palette(&count);
+        colors = generate_halftone216_palette(&count, add_transparent);
         if (!colors) return E_OUTOFMEMORY;
         break;
 
     case WICBitmapPaletteTypeFixedHalftone252:
-        colors = generate_halftone252_palette(&count);
+        colors = generate_halftone252_palette(&count, add_transparent);
         if (!colors) return E_OUTOFMEMORY;
         break;
 
     case WICBitmapPaletteTypeFixedHalftone256:
-        colors = generate_halftone256_palette(&count);
+        colors = generate_halftone256_palette(&count, add_transparent);
         if (!colors) return E_OUTOFMEMORY;
         break;
 
diff --git a/dlls/windowscodecs/tests/palette.c b/dlls/windowscodecs/tests/palette.c
index ce29b6b..5a8c808 100644
--- a/dlls/windowscodecs/tests/palette.c
+++ b/dlls/windowscodecs/tests/palette.c
@@ -176,11 +176,14 @@ static void generate_gray256_palette(DWORD *entries, UINT count)
     }
 }
 
-static void generate_halftone8_palette(DWORD *entries, UINT count)
+static void generate_halftone8_palette(DWORD *entries, UINT count, BOOL add_transparent)
 {
     UINT i;
 
-    assert(count == 16);
+    if (add_transparent)
+        ok(count == 17, "expected 17, got %u\n", count);
+    else
+        ok(count == 16, "expected 16, got %u\n", count);
 
     for (i = 0; i < 8; i++)
     {
@@ -197,14 +200,20 @@ static void generate_halftone8_palette(DWORD *entries, UINT count)
         entries[i] = 0xff000000;
         entries[i] |= halftone[i-8];
     }
+
+    if (add_transparent)
+        entries[i] = 0;
 }
 
-static void generate_halftone27_palette(DWORD *entries, UINT count)
+static void generate_halftone27_palette(DWORD *entries, UINT count, BOOL add_transparent)
 {
     static const BYTE halftone_values[4] = { 0x00,0x80,0xff };
     UINT i;
 
-    assert(count == 28);
+    if (add_transparent)
+        ok(count == 29, "expected 29, got %u\n", count);
+    else
+        ok(count == 28, "expected 28, got %u\n", count);
 
     for (i = 0; i < 27; i++)
     {
@@ -214,15 +223,20 @@ static void generate_halftone27_palette(DWORD *entries, UINT count)
         entries[i] |= halftone_values[(i/9)%3] << 16;
     }
 
-    entries[i] = 0xffc0c0c0;
+    entries[i++] = 0xffc0c0c0;
+    if (add_transparent)
+        entries[i] = 0;
 }
 
-static void generate_halftone64_palette(DWORD *entries, UINT count)
+static void generate_halftone64_palette(DWORD *entries, UINT count, BOOL add_transparent)
 {
     static const BYTE halftone_values[4] = { 0x00,0x55,0xaa,0xff };
     UINT i;
 
-    assert(count == 72);
+    if (add_transparent)
+        ok(count == 73, "expected 73, got %u\n", count);
+    else
+        ok(count == 72, "expected 72, got %u\n", count);
 
     for (i = 0; i < 64; i++)
     {
@@ -239,14 +253,20 @@ static void generate_halftone64_palette(DWORD *entries, UINT count)
         entries[i] = 0xff000000;
         entries[i] |= halftone[i-64];
     }
+
+    if (add_transparent)
+        entries[i] = 0;
 }
 
-static void generate_halftone125_palette(DWORD *entries, UINT count)
+static void generate_halftone125_palette(DWORD *entries, UINT count, BOOL add_transparent)
 {
-    static const BYTE halftone_values[5] = { 0x00,0x40,0x80,0xbf,0xff };
+    static const BYTE halftone_values[5] = { 0x00, 0x40, 0x80, 0xbf, 0xff };
     UINT i;
 
-    assert(count == 126);
+    if (add_transparent)
+        ok(count == 127, "expected 127, got %u\n", count);
+    else
+        ok(count == 126, "expected 126, got %u\n", count);
 
     for (i = 0; i < 125; i++)
     {
@@ -256,15 +276,20 @@ static void generate_halftone125_palette(DWORD *entries, UINT count)
         entries[i] |= halftone_values[(i/25)%5] << 16;
     }
 
-    entries[i] = 0xffc0c0c0;
+    entries[i++] = 0xffc0c0c0;
+    if (add_transparent)
+        entries[i] = 0;
 }
 
-static void generate_halftone216_palette(DWORD *entries, UINT count)
+static void generate_halftone216_palette(DWORD *entries, UINT count, BOOL add_transparent)
 {
     static const BYTE halftone_values[6] = { 0x00,0x33,0x66,0x99,0xcc,0xff };
     UINT i;
 
-    assert(count == 224);
+    if (add_transparent)
+        ok(count == 225, "expected 225, got %u\n", count);
+    else
+        ok(count == 224, "expected 224, got %u\n", count);
 
     for (i = 0; i < 216; i++)
     {
@@ -281,15 +306,21 @@ static void generate_halftone216_palette(DWORD *entries, UINT count)
         entries[i] = 0xff000000;
         entries[i] |= halftone[i-216];
     }
+
+    if (add_transparent)
+        entries[i] = 0;
 }
 
-static void generate_halftone252_palette(DWORD *entries, UINT count)
+static void generate_halftone252_palette(DWORD *entries, UINT count, BOOL add_transparent)
 {
     static const BYTE halftone_values_rb[6] = { 0x00,0x33,0x66,0x99,0xcc,0xff };
     static const BYTE halftone_values_g[7] = { 0x00,0x2b,0x55,0x80,0xaa,0xd5,0xff };
     UINT i;
 
-    assert(count == 252);
+    if (add_transparent)
+        ok(count == 253, "expected 253, got %u\n", count);
+    else
+        ok(count == 252, "expected 252, got %u\n", count);
 
     for (i = 0; i < 252; i++)
     {
@@ -298,9 +329,12 @@ static void generate_halftone252_palette(DWORD *entries, UINT count)
         entries[i] |= halftone_values_g[(i/6)%7] << 8;
         entries[i] |= halftone_values_rb[(i/42)%6] << 16;
     }
+
+    if (add_transparent)
+        entries[i] = 0;
 }
 
-static void generate_halftone256_palette(DWORD *entries, UINT count)
+static void generate_halftone256_palette(DWORD *entries, UINT count, BOOL add_transparent)
 {
     static const BYTE halftone_values_b[4] = { 0x00,0x55,0xaa,0xff };
     static const BYTE halftone_values_gr[8] = { 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff };
@@ -315,6 +349,9 @@ static void generate_halftone256_palette(DWORD *entries, UINT count)
         entries[i] |= halftone_values_gr[(i/4)%8] << 8;
         entries[i] |= halftone_values_gr[(i/32)%8] << 16;
     }
+
+    if (add_transparent)
+        entries[255] = 0;
 }
 
 static void test_predefined_palette(void)
@@ -325,20 +362,33 @@ static void test_predefined_palette(void)
         BOOL is_bw, is_gray;
         UINT count;
         WICColor color[256];
+        BOOL add_transparent;
     } td[] =
     {
         { WICBitmapPaletteTypeFixedBW, 1, 1, 2, { 0xff000000, 0xffffffff } },
+        { WICBitmapPaletteTypeFixedBW, 1, 1, 2, { 0xff000000, 0xffffffff }, 1 },
         { WICBitmapPaletteTypeFixedGray4, 0, 1, 4,
           { 0xff000000, 0xff555555, 0xffaaaaaa, 0xffffffff } },
+        { WICBitmapPaletteTypeFixedGray4, 0, 1, 4,
+          { 0xff000000, 0xff555555, 0xffaaaaaa, 0xffffffff }, 1 },
         { WICBitmapPaletteTypeFixedGray16, 0, 1, 16, { 0 } },
+        { WICBitmapPaletteTypeFixedGray16, 0, 1, 16, { 0 }, 1 },
         { WICBitmapPaletteTypeFixedGray256, 0, 1, 256, { 0 } },
+        { WICBitmapPaletteTypeFixedGray256, 0, 1, 256, { 0 }, 1 },
         { WICBitmapPaletteTypeFixedHalftone8, 0, 0, 16, { 0 } },
+        { WICBitmapPaletteTypeFixedHalftone8, 0, 0, 17, { 0 }, 1 },
         { WICBitmapPaletteTypeFixedHalftone27, 0, 0, 28, { 0 } },
+        { WICBitmapPaletteTypeFixedHalftone27, 0, 0, 29, { 0 }, 1 },
         { WICBitmapPaletteTypeFixedHalftone64, 0, 0, 72, { 0 } },
+        { WICBitmapPaletteTypeFixedHalftone64, 0, 0, 73, { 0 }, 1 },
         { WICBitmapPaletteTypeFixedHalftone125, 0, 0, 126, { 0 } },
+        { WICBitmapPaletteTypeFixedHalftone125, 0, 0, 127, { 0 }, 1 },
         { WICBitmapPaletteTypeFixedHalftone216, 0, 0, 224, { 0 } },
+        { WICBitmapPaletteTypeFixedHalftone216, 0, 0, 225, { 0 }, 1 },
         { WICBitmapPaletteTypeFixedHalftone252, 0, 0, 252, { 0 } },
+        { WICBitmapPaletteTypeFixedHalftone252, 0, 0, 253, { 0 }, 1 },
         { WICBitmapPaletteTypeFixedHalftone256, 0, 0, 256, { 0 } },
+        { WICBitmapPaletteTypeFixedHalftone256, 0, 0, 256, { 0 }, 1 }
     };
     IWICImagingFactory *factory;
     IWICPalette *palette;
@@ -357,7 +407,7 @@ static void test_predefined_palette(void)
         hr = IWICImagingFactory_CreatePalette(factory, &palette);
         ok(hr == S_OK, "%u: CreatePalette error %#x\n", i, hr);
 
-        hr = IWICPalette_InitializePredefined(palette, td[i].type, FALSE);
+        hr = IWICPalette_InitializePredefined(palette, td[i].type, td[i].add_transparent);
         ok(hr == S_OK, "%u: InitializePredefined error %#x\n", i, hr);
 
         bret = -1;
@@ -394,19 +444,19 @@ static void test_predefined_palette(void)
             else if (td[i].type == WICBitmapPaletteTypeFixedGray256)
                 generate_gray256_palette(td[i].color, td[i].count);
             else if (td[i].type == WICBitmapPaletteTypeFixedHalftone8)
-                generate_halftone8_palette(td[i].color, td[i].count);
+                generate_halftone8_palette(td[i].color, td[i].count, td[i].add_transparent);
             else if (td[i].type == WICBitmapPaletteTypeFixedHalftone27)
-                generate_halftone27_palette(td[i].color, td[i].count);
+                generate_halftone27_palette(td[i].color, td[i].count, td[i].add_transparent);
             else if (td[i].type == WICBitmapPaletteTypeFixedHalftone64)
-                generate_halftone64_palette(td[i].color, td[i].count);
+                generate_halftone64_palette(td[i].color, td[i].count, td[i].add_transparent);
             else if (td[i].type == WICBitmapPaletteTypeFixedHalftone125)
-                generate_halftone125_palette(td[i].color, td[i].count);
+                generate_halftone125_palette(td[i].color, td[i].count, td[i].add_transparent);
             else if (td[i].type == WICBitmapPaletteTypeFixedHalftone216)
-                generate_halftone216_palette(td[i].color, td[i].count);
+                generate_halftone216_palette(td[i].color, td[i].count, td[i].add_transparent);
             else if (td[i].type == WICBitmapPaletteTypeFixedHalftone252)
-                generate_halftone252_palette(td[i].color, td[i].count);
+                generate_halftone252_palette(td[i].color, td[i].count, td[i].add_transparent);
             else if (td[i].type == WICBitmapPaletteTypeFixedHalftone256)
-                generate_halftone256_palette(td[i].color, td[i].count);
+                generate_halftone256_palette(td[i].color, td[i].count, td[i].add_transparent);
 
             for (j = 0; j < count; j++)
             {
-- 
1.7.11.2




More information about the wine-patches mailing list