gdiplus: Implement color remapping.

This commit is contained in:
Vincent Povirk 2010-04-15 15:24:25 -05:00 committed by Alexandre Julliard
parent bb9c1878c3
commit 4247247787
2 changed files with 32 additions and 2 deletions

View File

@ -1995,7 +1995,8 @@ GpStatus WINGDIPAPI GdipDrawImagePointsRect(GpGraphics *graphics, GpImage *image
else else
return NotImplemented; return NotImplemented;
if (ptf[1].Y != ptf[0].Y || ptf[2].X != ptf[0].X) if (imageAttributes ||
ptf[1].Y != ptf[0].Y || ptf[2].X != ptf[0].X)
use_software = 1; use_software = 1;
else if (graphics->image && graphics->image->type == ImageTypeBitmap) else if (graphics->image && graphics->image->type == ImageTypeBitmap)
{ {
@ -2084,6 +2085,35 @@ GpStatus WINGDIPAPI GdipDrawImagePointsRect(GpGraphics *graphics, GpImage *image
GdipDeleteMatrix(dst_to_src); GdipDeleteMatrix(dst_to_src);
if (imageAttributes)
{
if (imageAttributes->colorremaptables[ColorAdjustTypeBitmap].enabled ||
imageAttributes->colorremaptables[ColorAdjustTypeDefault].enabled)
{
const struct color_remap_table *table;
if (imageAttributes->colorremaptables[ColorAdjustTypeBitmap].enabled)
table = &imageAttributes->colorremaptables[ColorAdjustTypeBitmap];
else
table = &imageAttributes->colorremaptables[ColorAdjustTypeDefault];
for (x=dst_area.left; x<dst_area.right; x++)
for (y=dst_area.top; y<dst_area.bottom; y++)
{
ARGB *src_color;
src_color = (ARGB*)(data + stride * (y - dst_area.top) + sizeof(ARGB) * (x - dst_area.left));
for (i=0; i<table->mapsize; i++)
{
if (*src_color == table->colormap[i].oldColor.Argb)
{
*src_color = table->colormap[i].newColor.Argb;
break;
}
}
}
}
}
stat = alpha_blend_pixels(graphics, dst_area.left, dst_area.top, stat = alpha_blend_pixels(graphics, dst_area.left, dst_area.top,
data, dst_area.right - dst_area.left, dst_area.bottom - dst_area.top, stride); data, dst_area.right - dst_area.left, dst_area.bottom - dst_area.top, stride);

View File

@ -1879,7 +1879,7 @@ static void test_remaptable(void)
stat = GdipBitmapGetPixel(bitmap2, 0, 0, &color); stat = GdipBitmapGetPixel(bitmap2, 0, 0, &color);
expect(Ok, stat); expect(Ok, stat);
todo_wine ok(color_match(0xffff00ff, color, 1), "Expected ffff00ff, got %.8x\n", color); ok(color_match(0xffff00ff, color, 1), "Expected ffff00ff, got %.8x\n", color);
GdipDeleteGraphics(graphics); GdipDeleteGraphics(graphics);
GdipDisposeImage((GpImage*)bitmap1); GdipDisposeImage((GpImage*)bitmap1);