Author: akhaldi Date: Sat Sep 27 12:59:00 2014 New Revision: 64340
URL: http://svn.reactos.org/svn/reactos?rev=64340&view=rev Log: [GDIPLUS] * Sync with Wine 1.7.27. CORE-8540
Modified: trunk/reactos/dll/win32/gdiplus/font.c trunk/reactos/dll/win32/gdiplus/graphics.c trunk/reactos/dll/win32/gdiplus/image.c trunk/reactos/dll/win32/gdiplus/imageattributes.c trunk/reactos/media/doc/README.WINE
Modified: trunk/reactos/dll/win32/gdiplus/font.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/gdiplus/font.c?re... ============================================================================== --- trunk/reactos/dll/win32/gdiplus/font.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/gdiplus/font.c [iso-8859-1] Sat Sep 27 12:59:00 2014 @@ -1506,7 +1506,7 @@
if (!EnumFontFamiliesExW(hdc, &lfw, add_font_proc, (LPARAM)fontCollection, 0)) { - ReleaseDC(0, hdc); + DeleteDC(hdc); return OutOfMemory; }
@@ -1634,7 +1634,7 @@ if (!EnumFontFamiliesExW(hdc, &lfw, add_font_proc, (LPARAM)&installedFontCollection, 0)) { free_installed_fonts(); - ReleaseDC(0, hdc); + DeleteDC(hdc); return OutOfMemory; }
Modified: trunk/reactos/dll/win32/gdiplus/graphics.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/gdiplus/graphics.... ============================================================================== --- trunk/reactos/dll/win32/gdiplus/graphics.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/gdiplus/graphics.c [iso-8859-1] Sat Sep 27 12:59:00 2014 @@ -589,30 +589,47 @@ } }
-static ARGB transform_color(ARGB color, const ColorMatrix *matrix) -{ - REAL val[5], res[4]; +static BOOL round_color_matrix(const ColorMatrix *matrix, int values[5][5]) +{ + /* Convert floating point color matrix to int[5][5], return TRUE if it's an identity */ + BOOL identity = TRUE; + int i, j; + + for (i=0; i<4; i++) + for (j=0; j<5; j++) + { + if (matrix->m[j][i] != (i == j ? 1.0 : 0.0)) + identity = FALSE; + values[j][i] = gdip_round(matrix->m[j][i] * 256.0); + } + + return identity; +} + +static ARGB transform_color(ARGB color, int matrix[5][5]) +{ + int val[5], res[4]; int i, j; unsigned char a, r, g, b;
- val[0] = ((color >> 16) & 0xff) / 255.0; /* red */ - val[1] = ((color >> 8) & 0xff) / 255.0; /* green */ - val[2] = (color & 0xff) / 255.0; /* blue */ - val[3] = ((color >> 24) & 0xff) / 255.0; /* alpha */ - val[4] = 1.0; /* translation */ + val[0] = ((color >> 16) & 0xff); /* red */ + val[1] = ((color >> 8) & 0xff); /* green */ + val[2] = (color & 0xff); /* blue */ + val[3] = ((color >> 24) & 0xff); /* alpha */ + val[4] = 255; /* translation */
for (i=0; i<4; i++) { - res[i] = 0.0; + res[i] = 0;
for (j=0; j<5; j++) - res[i] += matrix->m[j][i] * val[j]; - } - - a = min(max(floorf(res[3]*255.0), 0.0), 255.0); - r = min(max(floorf(res[0]*255.0), 0.0), 255.0); - g = min(max(floorf(res[1]*255.0), 0.0), 255.0); - b = min(max(floorf(res[2]*255.0), 0.0), 255.0); + res[i] += matrix[j][i] * val[j]; + } + + a = min(max(res[3] / 256, 0), 255); + r = min(max(res[0] / 256, 0), 255); + g = min(max(res[1] / 256, 0), 255); + b = min(max(res[2] / 256, 0), 255);
return (a << 24) | (r << 16) | (g << 8) | b; } @@ -699,28 +716,41 @@ attributes->colormatrices[ColorAdjustTypeDefault].enabled) { const struct color_matrix *colormatrices; + int color_matrix[5][5]; + int gray_matrix[5][5]; + BOOL identity;
if (attributes->colormatrices[type].enabled) colormatrices = &attributes->colormatrices[type]; else colormatrices = &attributes->colormatrices[ColorAdjustTypeDefault];
- for (x=0; x<width; x++) - for (y=0; y<height; y++) + identity = round_color_matrix(&colormatrices->colormatrix, color_matrix); + + if (colormatrices->flags == ColorMatrixFlagsAltGray) + identity = (round_color_matrix(&colormatrices->graymatrix, gray_matrix) && identity); + + if (!identity) + { + for (x=0; x<width; x++) { - ARGB *src_color; - src_color = (ARGB*)(data + stride * y + sizeof(ARGB) * x); - - if (colormatrices->flags == ColorMatrixFlagsDefault || - !color_is_gray(*src_color)) + for (y=0; y<height; y++) { - *src_color = transform_color(*src_color, &colormatrices->colormatrix); - } - else if (colormatrices->flags == ColorMatrixFlagsAltGray) - { - *src_color = transform_color(*src_color, &colormatrices->graymatrix); + ARGB *src_color; + src_color = (ARGB*)(data + stride * y + sizeof(ARGB) * x); + + if (colormatrices->flags == ColorMatrixFlagsDefault || + !color_is_gray(*src_color)) + { + *src_color = transform_color(*src_color, color_matrix); + } + else if (colormatrices->flags == ColorMatrixFlagsAltGray) + { + *src_color = transform_color(*src_color, gray_matrix); + } } } + } }
if (attributes->gamma_enabled[type] || @@ -1989,6 +2019,24 @@ rect->Y = 0; rect->Width = GetDeviceCaps(graphics->hdc, HORZRES); rect->Height = GetDeviceCaps(graphics->hdc, VERTRES); + } + + if (graphics->hdc && + (GetMapMode(graphics->hdc) != MM_TEXT || GetGraphicsMode(graphics->hdc) != GM_COMPATIBLE)) + { + POINT points[2]; + + points[0].x = rect->X; + points[0].y = rect->Y; + points[1].x = rect->X + rect->Width; + points[1].y = rect->Y + rect->Height; + + DPtoLP(graphics->hdc, points, sizeof(points)/sizeof(points[0])); + + rect->X = min(points[0].x, points[1].x); + rect->Y = min(points[0].y, points[1].y); + rect->Width = abs(points[1].x - points[0].x); + rect->Height = abs(points[1].y - points[0].y); }
return stat; @@ -2835,6 +2883,7 @@ else if (image->type == ImageTypeBitmap) { GpBitmap* bitmap = (GpBitmap*)image; + BOOL do_resampling = FALSE; BOOL use_software = FALSE;
TRACE("graphics: %.2fx%.2f dpi, fmt %#x, scale %f, image: %.2fx%.2f dpi, fmt %#x, color %08x\n", @@ -2843,12 +2892,14 @@ graphics->scale, image->xres, image->yres, bitmap->format, imageAttributes ? imageAttributes->outside_color : 0);
- if (imageAttributes || graphics->alpha_hdc || - (graphics->image && graphics->image->type == ImageTypeBitmap) || - ptf[1].Y != ptf[0].Y || ptf[2].X != ptf[0].X || + if (ptf[1].Y != ptf[0].Y || ptf[2].X != ptf[0].X || ptf[1].X - ptf[0].X != srcwidth || ptf[2].Y - ptf[0].Y != srcheight || srcx < 0 || srcy < 0 || srcx + srcwidth > bitmap->width || srcy + srcheight > bitmap->height) + do_resampling = TRUE; + + if (imageAttributes || graphics->alpha_hdc || do_resampling || + (graphics->image && graphics->image->type == ImageTypeBitmap)) use_software = TRUE;
if (use_software) @@ -2859,7 +2910,7 @@ int i, x, y, src_stride, dst_stride; GpMatrix dst_to_src; REAL m11, m12, m21, m22, mdx, mdy; - LPBYTE src_data, dst_data; + LPBYTE src_data, dst_data, dst_dyn_data=NULL; BitmapData lockeddata; InterpolationMode interpolation = graphics->interpolation; PixelOffsetMode offset_mode = graphics->pixeloffset; @@ -2904,22 +2955,25 @@ stat = GdipInvertMatrix(&dst_to_src); if (stat != Ok) return stat;
- dst_data = GdipAlloc(sizeof(ARGB) * (dst_area.right - dst_area.left) * (dst_area.bottom - dst_area.top)); - if (!dst_data) return OutOfMemory; - - dst_stride = sizeof(ARGB) * (dst_area.right - dst_area.left); - - get_bitmap_sample_size(interpolation, imageAttributes->wrap, - bitmap, srcx, srcy, srcwidth, srcheight, &src_area); + if (do_resampling) + { + get_bitmap_sample_size(interpolation, imageAttributes->wrap, + bitmap, srcx, srcy, srcwidth, srcheight, &src_area); + } + else + { + /* Make sure src_area is equal in size to dst_area. */ + src_area.X = srcx + dst_area.left - pti[0].x; + src_area.Y = srcy + dst_area.top - pti[0].y; + src_area.Width = dst_area.right - dst_area.left; + src_area.Height = dst_area.bottom - dst_area.top; + }
TRACE("src_area: %d x %d\n", src_area.Width, src_area.Height);
src_data = GdipAlloc(sizeof(ARGB) * src_area.Width * src_area.Height); if (!src_data) - { - GdipFree(dst_data); return OutOfMemory; - } src_stride = sizeof(ARGB) * src_area.Width;
/* Read the bits we need from the source bitmap into an ARGB buffer. */ @@ -2938,7 +2992,6 @@ if (stat != Ok) { GdipFree(src_data); - GdipFree(dst_data); return stat; }
@@ -2946,40 +2999,57 @@ src_area.Width, src_area.Height, src_stride, ColorAdjustTypeBitmap);
- /* Transform the bits as needed to the destination. */ - GdipTransformMatrixPoints(&dst_to_src, dst_to_src_points, 3); - - x_dx = dst_to_src_points[1].X - dst_to_src_points[0].X; - x_dy = dst_to_src_points[1].Y - dst_to_src_points[0].Y; - y_dx = dst_to_src_points[2].X - dst_to_src_points[0].X; - y_dy = dst_to_src_points[2].Y - dst_to_src_points[0].Y; - - for (x=dst_area.left; x<dst_area.right; x++) + if (do_resampling) { - for (y=dst_area.top; y<dst_area.bottom; y++) + /* Transform the bits as needed to the destination. */ + dst_data = dst_dyn_data = GdipAlloc(sizeof(ARGB) * (dst_area.right - dst_area.left) * (dst_area.bottom - dst_area.top)); + if (!dst_data) { - GpPointF src_pointf; - ARGB *dst_color; - - src_pointf.X = dst_to_src_points[0].X + x * x_dx + y * y_dx; - src_pointf.Y = dst_to_src_points[0].Y + x * x_dy + y * y_dy; - - dst_color = (ARGB*)(dst_data + dst_stride * (y - dst_area.top) + sizeof(ARGB) * (x - dst_area.left)); - - if (src_pointf.X >= srcx && src_pointf.X < srcx + srcwidth && src_pointf.Y >= srcy && src_pointf.Y < srcy+srcheight) - *dst_color = resample_bitmap_pixel(&src_area, src_data, bitmap->width, bitmap->height, &src_pointf, - imageAttributes, interpolation, offset_mode); - else - *dst_color = 0; + GdipFree(src_data); + return OutOfMemory; + } + + dst_stride = sizeof(ARGB) * (dst_area.right - dst_area.left); + + GdipTransformMatrixPoints(&dst_to_src, dst_to_src_points, 3); + + x_dx = dst_to_src_points[1].X - dst_to_src_points[0].X; + x_dy = dst_to_src_points[1].Y - dst_to_src_points[0].Y; + y_dx = dst_to_src_points[2].X - dst_to_src_points[0].X; + y_dy = dst_to_src_points[2].Y - dst_to_src_points[0].Y; + + for (x=dst_area.left; x<dst_area.right; x++) + { + for (y=dst_area.top; y<dst_area.bottom; y++) + { + GpPointF src_pointf; + ARGB *dst_color; + + src_pointf.X = dst_to_src_points[0].X + x * x_dx + y * y_dx; + src_pointf.Y = dst_to_src_points[0].Y + x * x_dy + y * y_dy; + + dst_color = (ARGB*)(dst_data + dst_stride * (y - dst_area.top) + sizeof(ARGB) * (x - dst_area.left)); + + if (src_pointf.X >= srcx && src_pointf.X < srcx + srcwidth && src_pointf.Y >= srcy && src_pointf.Y < srcy+srcheight) + *dst_color = resample_bitmap_pixel(&src_area, src_data, bitmap->width, bitmap->height, &src_pointf, + imageAttributes, interpolation, offset_mode); + else + *dst_color = 0; + } } } - - GdipFree(src_data); + else + { + dst_data = src_data; + dst_stride = src_stride; + }
stat = alpha_blend_pixels(graphics, dst_area.left, dst_area.top, dst_data, dst_area.right - dst_area.left, dst_area.bottom - dst_area.top, dst_stride);
- GdipFree(dst_data); + GdipFree(src_data); + + GdipFree(dst_dyn_data);
return stat; }
Modified: trunk/reactos/dll/win32/gdiplus/image.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/gdiplus/image.c?r... ============================================================================== --- trunk/reactos/dll/win32/gdiplus/image.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/gdiplus/image.c [iso-8859-1] Sat Sep 27 12:59:00 2014 @@ -1369,6 +1369,8 @@
if(!filename || !bitmap) return InvalidParameter; + + *bitmap = NULL;
stat = GdipCreateStreamOnFile(filename, GENERIC_READ, &stream);
@@ -2928,6 +2930,8 @@ if (!filename || !image) return InvalidParameter;
+ *image = NULL; + stat = GdipCreateStreamOnFile(filename, GENERIC_READ, &stream);
if (stat != Ok)
Modified: trunk/reactos/dll/win32/gdiplus/imageattributes.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/gdiplus/imageattr... ============================================================================== --- trunk/reactos/dll/win32/gdiplus/imageattributes.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/gdiplus/imageattributes.c [iso-8859-1] Sat Sep 27 12:59:00 2014 @@ -270,11 +270,10 @@ if(!imageAttr || type >= ColorAdjustTypeCount) return InvalidParameter;
- memset(&imageAttr->colorkeys[type], 0, sizeof(imageAttr->colorkeys[type])); memset(&imageAttr->colormatrices[type], 0, sizeof(imageAttr->colormatrices[type])); - memset(&imageAttr->colorremaptables[type], 0, sizeof(imageAttr->colorremaptables[type])); - memset(&imageAttr->gamma_enabled[type], 0, sizeof(imageAttr->gamma_enabled[type])); - memset(&imageAttr->gamma[type], 0, sizeof(imageAttr->gamma[type])); - - return Ok; -} + GdipSetImageAttributesColorKeys(imageAttr, type, FALSE, 0, 0); + GdipSetImageAttributesRemapTable(imageAttr, type, FALSE, 0, NULL); + GdipSetImageAttributesGamma(imageAttr, type, FALSE, 0.0); + + return Ok; +}
Modified: trunk/reactos/media/doc/README.WINE URL: http://svn.reactos.org/svn/reactos/trunk/reactos/media/doc/README.WINE?rev=6... ============================================================================== --- trunk/reactos/media/doc/README.WINE [iso-8859-1] (original) +++ trunk/reactos/media/doc/README.WINE [iso-8859-1] Sat Sep 27 12:59:00 2014 @@ -75,7 +75,7 @@ reactos/dll/win32/faultrep # Synced to Wine-1.7.17 reactos/dll/win32/fltlib # Synced to Wine-1.7.27 reactos/dll/win32/fusion # Synced to Wine-1.7.27 -reactos/dll/win32/gdiplus # Synced to Wine-1.7.17 +reactos/dll/win32/gdiplus # Synced to Wine-1.7.27 reactos/dll/win32/hhctrl.ocx # Synced to Wine-1.7.17 reactos/dll/win32/hlink # Synced to Wine-1.7.17 reactos/dll/win32/hnetcfg # Synced to Wine-1.7.17