windowscodecs: Add support for adding trasparent color to generated palettes.

oldstable
Dmitry Timoshkov 2012-07-23 12:47:57 +09:00 committed by Alexandre Julliard
parent 0be2718baa
commit 106e7fb589
2 changed files with 128 additions and 52 deletions

View File

@ -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;

View File

@ -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++)
{