gdiplus: Implement ResetWorldTransform metafile playback/recording.
Signed-off-by: Vincent Povirk <vincent@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
1816698f82
commit
a65718a3e7
|
@ -91,6 +91,7 @@ extern GpStatus METAFILE_FillRectangles(GpMetafile* metafile, GpBrush* brush,
|
||||||
GDIPCONST GpRectF* rects, INT count) DECLSPEC_HIDDEN;
|
GDIPCONST GpRectF* rects, INT count) DECLSPEC_HIDDEN;
|
||||||
extern GpStatus METAFILE_SetPageTransform(GpMetafile* metafile, GpUnit unit, REAL scale) DECLSPEC_HIDDEN;
|
extern GpStatus METAFILE_SetPageTransform(GpMetafile* metafile, GpUnit unit, REAL scale) DECLSPEC_HIDDEN;
|
||||||
extern GpStatus METAFILE_ScaleWorldTransform(GpMetafile* metafile, REAL sx, REAL sy, MatrixOrder order) DECLSPEC_HIDDEN;
|
extern GpStatus METAFILE_ScaleWorldTransform(GpMetafile* metafile, REAL sx, REAL sy, MatrixOrder order) DECLSPEC_HIDDEN;
|
||||||
|
extern GpStatus METAFILE_ResetWorldTransform(GpMetafile* metafile) DECLSPEC_HIDDEN;
|
||||||
extern GpStatus METAFILE_GraphicsDeleted(GpMetafile* metafile) DECLSPEC_HIDDEN;
|
extern GpStatus METAFILE_GraphicsDeleted(GpMetafile* metafile) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
extern void calc_curve_bezier(const GpPointF *pts, REAL tension, REAL *x1,
|
extern void calc_curve_bezier(const GpPointF *pts, REAL tension, REAL *x1,
|
||||||
|
|
|
@ -5128,6 +5128,8 @@ GpStatus WINGDIPAPI GdipResetClip(GpGraphics *graphics)
|
||||||
|
|
||||||
GpStatus WINGDIPAPI GdipResetWorldTransform(GpGraphics *graphics)
|
GpStatus WINGDIPAPI GdipResetWorldTransform(GpGraphics *graphics)
|
||||||
{
|
{
|
||||||
|
GpStatus stat;
|
||||||
|
|
||||||
TRACE("(%p)\n", graphics);
|
TRACE("(%p)\n", graphics);
|
||||||
|
|
||||||
if(!graphics)
|
if(!graphics)
|
||||||
|
@ -5136,6 +5138,13 @@ GpStatus WINGDIPAPI GdipResetWorldTransform(GpGraphics *graphics)
|
||||||
if(graphics->busy)
|
if(graphics->busy)
|
||||||
return ObjectBusy;
|
return ObjectBusy;
|
||||||
|
|
||||||
|
if (graphics->image && graphics->image->type == ImageTypeMetafile) {
|
||||||
|
stat = METAFILE_ResetWorldTransform((GpMetafile*)graphics->image);
|
||||||
|
|
||||||
|
if (stat != Ok)
|
||||||
|
return stat;
|
||||||
|
}
|
||||||
|
|
||||||
return GdipSetMatrixElements(&graphics->worldtrans, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0);
|
return GdipSetMatrixElements(&graphics->worldtrans, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -586,6 +586,28 @@ GpStatus METAFILE_ScaleWorldTransform(GpMetafile* metafile, REAL sx, REAL sy, Ma
|
||||||
return Ok;
|
return Ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GpStatus METAFILE_ResetWorldTransform(GpMetafile* metafile)
|
||||||
|
{
|
||||||
|
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 = EmfPlusRecordTypeResetWorldTransform;
|
||||||
|
record->Flags = 0;
|
||||||
|
|
||||||
|
METAFILE_WriteRecords(metafile);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Ok;
|
||||||
|
}
|
||||||
|
|
||||||
GpStatus METAFILE_ReleaseDC(GpMetafile* metafile, HDC hdc)
|
GpStatus METAFILE_ReleaseDC(GpMetafile* metafile, HDC hdc)
|
||||||
{
|
{
|
||||||
if (hdc != metafile->record_dc)
|
if (hdc != metafile->record_dc)
|
||||||
|
@ -935,6 +957,12 @@ GpStatus WINGDIPAPI GdipPlayMetafileRecord(GDIPCONST GpMetafile *metafile,
|
||||||
|
|
||||||
return METAFILE_PlaybackUpdateWorldTransform(real_metafile);
|
return METAFILE_PlaybackUpdateWorldTransform(real_metafile);
|
||||||
}
|
}
|
||||||
|
case EmfPlusRecordTypeResetWorldTransform:
|
||||||
|
{
|
||||||
|
GdipSetMatrixElements(real_metafile->world_transform, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0);
|
||||||
|
|
||||||
|
return METAFILE_PlaybackUpdateWorldTransform(real_metafile);
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
FIXME("Not implemented for record type %x\n", recordType);
|
FIXME("Not implemented for record type %x\n", recordType);
|
||||||
return NotImplemented;
|
return NotImplemented;
|
||||||
|
|
|
@ -1273,6 +1273,8 @@ static const emfplus_record worldtransform_records[] = {
|
||||||
{0, EmfPlusRecordTypeFillRects},
|
{0, EmfPlusRecordTypeFillRects},
|
||||||
{0, EmfPlusRecordTypeScaleWorldTransform},
|
{0, EmfPlusRecordTypeScaleWorldTransform},
|
||||||
{0, EmfPlusRecordTypeFillRects},
|
{0, EmfPlusRecordTypeFillRects},
|
||||||
|
{0, EmfPlusRecordTypeResetWorldTransform},
|
||||||
|
{0, EmfPlusRecordTypeFillRects},
|
||||||
{0, EmfPlusRecordTypeEndOfFile},
|
{0, EmfPlusRecordTypeEndOfFile},
|
||||||
{0, EMR_EOF},
|
{0, EMR_EOF},
|
||||||
{0}
|
{0}
|
||||||
|
@ -1352,6 +1354,26 @@ static void test_worldtransform(void)
|
||||||
stat = GdipDeleteBrush(brush);
|
stat = GdipDeleteBrush(brush);
|
||||||
expect(Ok, stat);
|
expect(Ok, stat);
|
||||||
|
|
||||||
|
/* reset transform */
|
||||||
|
stat = GdipResetWorldTransform(graphics);
|
||||||
|
expect(Ok, stat);
|
||||||
|
|
||||||
|
stat = GdipGetWorldTransform(graphics, transform);
|
||||||
|
expect(Ok, stat);
|
||||||
|
|
||||||
|
stat = GdipIsMatrixIdentity(transform, &identity);
|
||||||
|
expect(Ok, stat);
|
||||||
|
expect(TRUE, identity);
|
||||||
|
|
||||||
|
stat = GdipCreateSolidFill((ARGB)0xff00ffff, (GpSolidFill**)&brush);
|
||||||
|
expect(Ok, stat);
|
||||||
|
|
||||||
|
stat = GdipFillRectangle(graphics, brush, 1.0, 0.0, 1.0, 1.0);
|
||||||
|
expect(Ok, stat);
|
||||||
|
|
||||||
|
stat = GdipDeleteBrush(brush);
|
||||||
|
expect(Ok, stat);
|
||||||
|
|
||||||
stat = GdipDeleteMatrix(transform);
|
stat = GdipDeleteMatrix(transform);
|
||||||
expect(Ok, stat);
|
expect(Ok, stat);
|
||||||
|
|
||||||
|
@ -1382,6 +1404,10 @@ static void test_worldtransform(void)
|
||||||
expect(Ok, stat);
|
expect(Ok, stat);
|
||||||
expect(0xff00ff00, color);
|
expect(0xff00ff00, color);
|
||||||
|
|
||||||
|
stat = GdipBitmapGetPixel(bitmap, 30, 10, &color);
|
||||||
|
expect(Ok, stat);
|
||||||
|
expect(0xff00ffff, color);
|
||||||
|
|
||||||
stat = GdipDeleteGraphics(graphics);
|
stat = GdipDeleteGraphics(graphics);
|
||||||
expect(Ok, stat);
|
expect(Ok, stat);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue