Module: wine Branch: master Commit: 44c57121ea017adfc16def03ca8f3799bebc040f URL: http://source.winehq.org/git/wine.git/?a=commit;h=44c57121ea017adfc16def03ca...
Author: Vincent Povirk vincent@codeweavers.com Date: Thu Jul 7 11:30:06 2011 -0500
gdiplus: Implement GetDC for metafiles.
---
dlls/gdiplus/gdiplus_private.h | 2 ++ dlls/gdiplus/graphics.c | 36 +++++++++++++++++++++++++----------- dlls/gdiplus/metafile.c | 30 ++++++++++++++++++++++++++++++ dlls/gdiplus/tests/metafile.c | 6 +++--- 4 files changed, 60 insertions(+), 14 deletions(-)
diff --git a/dlls/gdiplus/gdiplus_private.h b/dlls/gdiplus/gdiplus_private.h index 9cae489..d6888d9 100644 --- a/dlls/gdiplus/gdiplus_private.h +++ b/dlls/gdiplus/gdiplus_private.h @@ -52,6 +52,8 @@ extern REAL convert_unit(REAL logpixels, GpUnit unit) DECLSPEC_HIDDEN; extern GpStatus graphics_from_image(GpImage *image, GpGraphics **graphics) DECLSPEC_HIDDEN;
extern GpStatus METAFILE_GetGraphicsContext(GpMetafile* metafile, GpGraphics **result) DECLSPEC_HIDDEN; +extern GpStatus METAFILE_GetDC(GpMetafile* metafile, HDC *hdc) DECLSPEC_HIDDEN; +extern GpStatus METAFILE_ReleaseDC(GpMetafile* metafile, HDC hdc) DECLSPEC_HIDDEN; extern GpStatus METAFILE_GraphicsDeleted(GpMetafile* metafile) DECLSPEC_HIDDEN;
extern void calc_curve_bezier(CONST GpPointF *pts, REAL tension, REAL *x1, diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c index be25653..1e3f946 100644 --- a/dlls/gdiplus/graphics.c +++ b/dlls/gdiplus/graphics.c @@ -5311,6 +5311,8 @@ static const COLORREF DC_BACKGROUND_KEY = 0x0c0b0d;
GpStatus WINGDIPAPI GdipGetDC(GpGraphics *graphics, HDC *hdc) { + GpStatus stat=Ok; + TRACE("(%p, %p)\n", graphics, hdc);
if(!graphics || !hdc) @@ -5319,13 +5321,16 @@ GpStatus WINGDIPAPI GdipGetDC(GpGraphics *graphics, HDC *hdc) if(graphics->busy) return ObjectBusy;
- if (!graphics->hdc || + if (graphics->image && graphics->image->type == ImageTypeMetafile) + { + stat = METAFILE_GetDC((GpMetafile*)graphics->image, hdc); + } + else if (!graphics->hdc || (graphics->image && graphics->image->type == ImageTypeBitmap && ((GpBitmap*)graphics->image)->format & PixelFormatAlpha)) { /* Create a fake HDC and fill it with a constant color. */ HDC temp_hdc; HBITMAP hbitmap; - GpStatus stat; GpRectF bounds; BITMAPINFOHEADER bmih; int i; @@ -5374,22 +5379,26 @@ GpStatus WINGDIPAPI GdipGetDC(GpGraphics *graphics, HDC *hdc) *hdc = graphics->hdc; }
- graphics->busy = TRUE; + if (stat == Ok) + graphics->busy = TRUE;
- return Ok; + return stat; }
GpStatus WINGDIPAPI GdipReleaseDC(GpGraphics *graphics, HDC hdc) { - TRACE("(%p, %p)\n", graphics, hdc); + GpStatus stat=Ok;
- if(!graphics || !hdc) - return InvalidParameter; + TRACE("(%p, %p)\n", graphics, hdc);
- if((graphics->hdc != hdc && graphics->temp_hdc != hdc) || !(graphics->busy)) + if(!graphics || !hdc || !graphics->busy) return InvalidParameter;
- if (graphics->temp_hdc == hdc) + if (graphics->image && graphics->image->type == ImageTypeMetafile) + { + stat = METAFILE_ReleaseDC((GpMetafile*)graphics->image, hdc); + } + else if (graphics->temp_hdc == hdc) { DWORD* pos; int i; @@ -5416,10 +5425,15 @@ GpStatus WINGDIPAPI GdipReleaseDC(GpGraphics *graphics, HDC hdc) graphics->temp_hdc = NULL; graphics->temp_hbitmap = NULL; } + else if (hdc != graphics->hdc) + { + stat = InvalidParameter; + }
- graphics->busy = FALSE; + if (stat == Ok) + graphics->busy = FALSE;
- return Ok; + return stat; }
GpStatus WINGDIPAPI GdipGetClip(GpGraphics *graphics, GpRegion *region) diff --git a/dlls/gdiplus/metafile.c b/dlls/gdiplus/metafile.c index 3d26b5c..3e79eb7 100644 --- a/dlls/gdiplus/metafile.c +++ b/dlls/gdiplus/metafile.c @@ -297,6 +297,36 @@ GpStatus METAFILE_GetGraphicsContext(GpMetafile* metafile, GpGraphics **result) return stat; }
+GpStatus METAFILE_GetDC(GpMetafile* metafile, HDC *hdc) +{ + if (metafile->metafile_type == MetafileTypeEmfPlusOnly || metafile->metafile_type == MetafileTypeEmfPlusDual) + { + EmfPlusRecordHeader *record; + GpStatus stat; + + stat = METAFILE_AllocateRecord(metafile, sizeof(EmfPlusRecordHeader), (void**)&record); + if (stat != Ok) + return stat; + + record->Type = EmfPlusRecordTypeGetDC; + record->Flags = 0; + + METAFILE_WriteRecords(metafile); + } + + *hdc = metafile->record_dc; + + return Ok; +} + +GpStatus METAFILE_ReleaseDC(GpMetafile* metafile, HDC hdc) +{ + if (hdc != metafile->record_dc) + return InvalidParameter; + + return Ok; +} + GpStatus METAFILE_GraphicsDeleted(GpMetafile* metafile) { GpStatus stat; diff --git a/dlls/gdiplus/tests/metafile.c b/dlls/gdiplus/tests/metafile.c index c85de00..1a0da15 100644 --- a/dlls/gdiplus/tests/metafile.c +++ b/dlls/gdiplus/tests/metafile.c @@ -278,9 +278,9 @@ static void test_empty(void) static const emfplus_record getdc_records[] = { {0, EMR_HEADER}, {0, EmfPlusRecordTypeHeader}, - {1, EmfPlusRecordTypeGetDC}, - {1, EMR_CREATEBRUSHINDIRECT}, - {1, EMR_SELECTOBJECT}, + {0, EmfPlusRecordTypeGetDC}, + {0, EMR_CREATEBRUSHINDIRECT}, + {0, EMR_SELECTOBJECT}, {0, EMR_RECTANGLE}, {0, EMR_SELECTOBJECT}, {0, EMR_DELETEOBJECT},