Author: dchapyshev Date: Sun May 4 14:41:25 2008 New Revision: 33277
URL: http://svn.reactos.org/svn/reactos?rev=33277&view=rev Log: - Synchronize with wine head
Modified: trunk/reactos/dll/win32/gdiplus/brush.c trunk/reactos/dll/win32/gdiplus/customlinecap.c trunk/reactos/dll/win32/gdiplus/font.c trunk/reactos/dll/win32/gdiplus/gdiplus.spec trunk/reactos/dll/win32/gdiplus/graphics.c trunk/reactos/dll/win32/gdiplus/graphicspath.c trunk/reactos/dll/win32/gdiplus/image.c trunk/reactos/dll/win32/gdiplus/matrix.c trunk/reactos/dll/win32/gdiplus/stringformat.c
Modified: trunk/reactos/dll/win32/gdiplus/brush.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/gdiplus/brush.c?r... ============================================================================== --- trunk/reactos/dll/win32/gdiplus/brush.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/gdiplus/brush.c [iso-8859-1] Sun May 4 14:41:25 2008 @@ -131,21 +131,53 @@ return Ok; }
+GpStatus WINGDIPAPI GdipCreateLineBrushI(GDIPCONST GpPoint* startpoint, + GDIPCONST GpPoint* endpoint, ARGB startcolor, ARGB endcolor, + GpWrapMode wrap, GpLineGradient **line) +{ + GpPointF stF; + GpPointF endF; + + if(!startpoint || !endpoint) + return InvalidParameter; + + stF.X = (REAL)startpoint->X; + stF.Y = (REAL)startpoint->Y; + endF.X = (REAL)endpoint->X; + endF.X = (REAL)endpoint->Y; + + return GdipCreateLineBrush(&stF, &endF, startcolor, endcolor, wrap, line); +} + +GpStatus WINGDIPAPI GdipCreateLineBrushFromRect(GDIPCONST GpRectF* rect, + ARGB startcolor, ARGB endcolor, LinearGradientMode mode, GpWrapMode wrap, + GpLineGradient **line) +{ + GpPointF start, end; + + if(!line || !rect) + return InvalidParameter; + + start.X = rect->X; + start.Y = rect->Y; + end.X = rect->X + rect->Width; + end.Y = rect->Y + rect->Height; + + return GdipCreateLineBrush(&start, &end, startcolor, endcolor, wrap, line); +} + GpStatus WINGDIPAPI GdipCreateLineBrushFromRectI(GDIPCONST GpRect* rect, ARGB startcolor, ARGB endcolor, LinearGradientMode mode, GpWrapMode wrap, GpLineGradient **line) { - GpPointF start, end; - - if(!line || !rect) - return InvalidParameter; - - start.X = (REAL) rect->X; - start.Y = (REAL) rect->Y; - end.X = (REAL) (rect->X + rect->Width); - end.Y = (REAL) (rect->Y + rect->Height); - - return GdipCreateLineBrush(&start, &end, startcolor, endcolor, wrap, line); + GpRectF rectF; + + rectF.X = (REAL) rect->X; + rectF.Y = (REAL) rect->Y; + rectF.Width = (REAL) rect->Width; + rectF.Height = (REAL) rect->Height; + + return GdipCreateLineBrushFromRect(&rectF, startcolor, endcolor, mode, wrap, line); }
GpStatus WINGDIPAPI GdipCreatePathGradient(GDIPCONST GpPointF* points, @@ -191,6 +223,34 @@ (*grad)->focus.Y = 0.0;
return Ok; +} + +GpStatus WINGDIPAPI GdipCreatePathGradientI(GDIPCONST GpPoint* points, + INT count, GpWrapMode wrap, GpPathGradient **grad) +{ + GpPointF *pointsF; + GpStatus ret; + INT i; + + if(!points || !grad) + return InvalidParameter; + + if(count <= 0) + return OutOfMemory; + + pointsF = GdipAlloc(sizeof(GpPointF) * count); + if(!pointsF) + return OutOfMemory; + + for(i = 0; i < count; i++){ + pointsF[i].X = (REAL)points[i].X; + pointsF[i].Y = (REAL)points[i].Y; + } + + ret = GdipCreatePathGradient(pointsF, count, wrap, grad); + GdipFree(pointsF); + + return ret; }
/* FIXME: path gradient brushes not truly supported (drawn as solid brushes) */ @@ -428,6 +488,25 @@ return Ok; }
+GpStatus WINGDIPAPI GdipGetPathGradientCenterPointI(GpPathGradient *grad, + GpPoint *point) +{ + GpStatus ret; + GpPointF ptf; + + if(!point) + return InvalidParameter; + + ret = GdipGetPathGradientCenterPoint(grad,&ptf); + + if(ret == Ok){ + point->X = roundr(ptf.X); + point->Y = roundr(ptf.Y); + } + + return ret; +} + GpStatus WINGDIPAPI GdipGetPathGradientFocusScales(GpPathGradient *grad, REAL *x, REAL *y) { @@ -563,6 +642,20 @@ return Ok; }
+GpStatus WINGDIPAPI GdipSetPathGradientCenterPointI(GpPathGradient *grad, + GpPoint *point) +{ + GpPointF ptf; + + if(!point) + return InvalidParameter; + + ptf.X = (REAL)point->X; + ptf.Y = (REAL)point->Y; + + return GdipSetPathGradientCenterPoint(grad,&ptf); +} + GpStatus WINGDIPAPI GdipSetPathGradientFocusScales(GpPathGradient *grad, REAL x, REAL y) { @@ -657,6 +750,29 @@ GpStatus WINGDIPAPI GdipSetLineColors(GpLineGradient *brush, ARGB color1, ARGB color2) { + if(!brush) + return InvalidParameter; + + brush->startcolor = color1; + brush->endcolor = color2; + + return Ok; +} + +GpStatus WINGDIPAPI GdipGetLineColors(GpLineGradient *brush, ARGB *colors) +{ + if(!brush || !colors) + return InvalidParameter; + + colors[0] = brush->startcolor; + colors[1] = brush->endcolor; + + return Ok; +} + +GpStatus WINGDIPAPI GdipSetLineLinearBlend(GpLineGradient *brush, REAL focus, + REAL scale) +{ static int calls;
if(!(calls++)) @@ -665,8 +781,8 @@ return NotImplemented; }
-GpStatus WINGDIPAPI GdipSetLineLinearBlend(GpLineGradient *brush, REAL focus, - REAL scale) +GpStatus WINGDIPAPI GdipSetLinePresetBlend(GpLineGradient *brush, + GDIPCONST ARGB *blend, GDIPCONST REAL* positions, INT count) { static int calls;
@@ -676,8 +792,8 @@ return NotImplemented; }
-GpStatus WINGDIPAPI GdipSetLinePresetBlend(GpLineGradient *brush, - GDIPCONST ARGB *blend, GDIPCONST REAL* positions, INT count) +GpStatus WINGDIPAPI GdipSetLineTransform(GpLineGradient *brush, + GDIPCONST GpMatrix *matrix) { static int calls;
@@ -687,13 +803,33 @@ return NotImplemented; }
-GpStatus WINGDIPAPI GdipSetLineTransform(GpLineGradient *brush, - GDIPCONST GpMatrix *matrix) -{ - static int calls; - - if(!(calls++)) - FIXME("not implemented\n"); - - return NotImplemented; -} +GpStatus WINGDIPAPI GdipGetLineRect(GpLineGradient *brush, GpRectF *rect) +{ + if(!brush || !rect) + return InvalidParameter; + + rect->X = (brush->startpoint.X < brush->endpoint.X ? brush->startpoint.X: brush->endpoint.X); + rect->Y = (brush->startpoint.Y < brush->endpoint.Y ? brush->startpoint.Y: brush->endpoint.Y); + + rect->Width = fabs(brush->startpoint.X - brush->endpoint.X); + rect->Height = fabs(brush->startpoint.Y - brush->endpoint.Y); + + return Ok; +} + +GpStatus WINGDIPAPI GdipGetLineRectI(GpLineGradient *brush, GpRect *rect) +{ + GpRectF rectF; + GpStatus ret; + + ret = GdipGetLineRect(brush, &rectF); + + if(ret == Ok){ + rect->X = roundr(rectF.X); + rect->Y = roundr(rectF.Y); + rect->Width = roundr(rectF.Width); + rect->Height = roundr(rectF.Height); + } + + return ret; +}
Modified: trunk/reactos/dll/win32/gdiplus/customlinecap.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/gdiplus/customlin... ============================================================================== --- trunk/reactos/dll/win32/gdiplus/customlinecap.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/gdiplus/customlinecap.c [iso-8859-1] Sun May 4 14:41:25 2008 @@ -184,3 +184,13 @@
return NotImplemented; } + +GpStatus WINGDIPAPI GdipGetCustomLineCapBaseCap(GpCustomLineCap *customCap, GpLineCap *baseCap) +{ + if(!customCap || !baseCap) + return InvalidParameter; + + *baseCap = customCap->cap; + + return Ok; +}
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] Sun May 4 14:41:25 2008 @@ -88,6 +88,24 @@ return Ok; }
+GpStatus WINGDIPAPI GdipCreateFontFromDC(HDC hdc, GpFont **font) +{ + HFONT hfont; + LOGFONTW lfw; + + if(!font) + return InvalidParameter; + + hfont = (HFONT)GetCurrentObject(hdc, OBJ_FONT); + if(!hfont) + return GenericError; + + if(!GetObjectW(hfont, sizeof(LOGFONTW), &lfw)) + return GenericError; + + return GdipCreateFontFromLogfontW(hdc, &lfw, font); +} + /* FIXME: use graphics */ GpStatus WINGDIPAPI GdipGetLogFontW(GpFont *font, GpGraphics *graphics, LOGFONTW *lfw) @@ -99,3 +117,16 @@
return Ok; } + +GpStatus WINGDIPAPI GdipCloneFont(GpFont *font, GpFont **cloneFont) +{ + if(!font || !cloneFont) + return InvalidParameter; + + *cloneFont = GdipAlloc(sizeof(GpFont)); + if(!*cloneFont) return OutOfMemory; + + **cloneFont = *font; + + return Ok; +}
Modified: trunk/reactos/dll/win32/gdiplus/gdiplus.spec URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/gdiplus/gdiplus.s... ============================================================================== --- trunk/reactos/dll/win32/gdiplus/gdiplus.spec [iso-8859-1] (original) +++ trunk/reactos/dll/win32/gdiplus/gdiplus.spec [iso-8859-1] Sun May 4 14:41:25 2008 @@ -1,9 +1,9 @@ @ stdcall GdipAddPathArc(ptr long long long long long long) -@ stub GdipAddPathArcI -@ stub GdipAddPathBezier +@ stdcall GdipAddPathArcI(ptr long long long long long long) +@ stdcall GdipAddPathBezier(ptr long long long long long long long long) @ stdcall GdipAddPathBezierI(ptr long long long long long long long long) @ stdcall GdipAddPathBeziers(ptr ptr long) -@ stub GdipAddPathBeziersI +@ stdcall GdipAddPathBeziersI(ptr ptr long) @ stub GdipAddPathClosedCurve2 @ stub GdipAddPathClosedCurve2I @ stub GdipAddPathClosedCurve @@ -15,10 +15,10 @@ @ stub GdipAddPathCurve @ stub GdipAddPathCurveI @ stdcall GdipAddPathEllipse(ptr long long long long) -@ stub GdipAddPathEllipseI +@ stdcall GdipAddPathEllipseI(ptr long long long long) @ stdcall GdipAddPathLine2(ptr ptr long) -@ stub GdipAddPathLine2I -@ stub GdipAddPathLine +@ stdcall GdipAddPathLine2I(ptr ptr long) +@ stdcall GdipAddPathLine(ptr long long long long) @ stdcall GdipAddPathLineI(ptr long long long long) @ stdcall GdipAddPathPath(ptr ptr long) @ stub GdipAddPathPie @@ -50,7 +50,7 @@ @ stub GdipCloneBitmapAreaI @ stdcall GdipCloneBrush(ptr ptr) @ stdcall GdipCloneCustomLineCap(ptr ptr) -@ stub GdipCloneFont +@ stdcall GdipCloneFont(ptr ptr) @ stub GdipCloneFontFamily @ stub GdipCloneImage @ stub GdipCloneImageAttributes @@ -58,7 +58,7 @@ @ stdcall GdipClonePath(ptr ptr) @ stdcall GdipClonePen(ptr ptr) @ stub GdipCloneRegion -@ stub GdipCloneStringFormat +@ stdcall GdipCloneStringFormat(ptr ptr) @ stdcall GdipClosePathFigure(ptr) @ stdcall GdipClosePathFigures(ptr) @ stub GdipCombineRegionPath @@ -86,9 +86,9 @@ @ stub GdipCreateEffect @ stub GdipCreateFont @ stub GdipCreateFontFamilyFromName -@ stub GdipCreateFontFromDC -@ stdcall GdipCreateFontFromLogfontA(ptr ptr ptr) -@ stdcall GdipCreateFontFromLogfontW(ptr ptr ptr) +@ stdcall GdipCreateFontFromDC(long ptr) +@ stdcall GdipCreateFontFromLogfontA(long ptr ptr) +@ stdcall GdipCreateFontFromLogfontW(long ptr ptr) @ stdcall GdipCreateFromHDC2(long long ptr) @ stdcall GdipCreateFromHDC(long ptr) @ stdcall GdipCreateFromHWND(long ptr) @@ -99,14 +99,14 @@ @ stub GdipCreateHatchBrush @ stdcall GdipCreateImageAttributes(ptr) @ stdcall GdipCreateLineBrush(ptr ptr long long long ptr) -@ stub GdipCreateLineBrushFromRect +@ stdcall GdipCreateLineBrushFromRect(ptr long long long long ptr) @ stdcall GdipCreateLineBrushFromRectI(ptr long long long long ptr) @ stub GdipCreateLineBrushFromRectWithAngle @ stub GdipCreateLineBrushFromRectWithAngleI -@ stub GdipCreateLineBrushI +@ stdcall GdipCreateLineBrushI(ptr ptr long long long ptr) @ stdcall GdipCreateMatrix2(long long long long long long ptr) @ stdcall GdipCreateMatrix3(ptr ptr ptr) -@ stub GdipCreateMatrix3I +@ stdcall GdipCreateMatrix3I(ptr ptr ptr) @ stdcall GdipCreateMatrix(ptr) @ stdcall GdipCreateMetafileFromEmf(ptr long ptr) @ stub GdipCreateMetafileFromFile @@ -114,11 +114,11 @@ @ stdcall GdipCreateMetafileFromWmf(ptr long ptr ptr) @ stub GdipCreateMetafileFromWmfFile @ stdcall GdipCreatePath2(ptr ptr long long ptr) -@ stub GdipCreatePath2I +@ stdcall GdipCreatePath2I(ptr ptr long long ptr) @ stdcall GdipCreatePath(long ptr) @ stdcall GdipCreatePathGradient(ptr long long ptr) @ stdcall GdipCreatePathGradientFromPath(ptr ptr) -@ stub GdipCreatePathGradientI +@ stdcall GdipCreatePathGradientI(ptr long long ptr) @ stdcall GdipCreatePathIter(ptr ptr) @ stdcall GdipCreatePen1(long long long ptr) @ stdcall GdipCreatePen2(ptr long long ptr) @@ -164,15 +164,15 @@ @ stub GdipDrawClosedCurve @ stub GdipDrawClosedCurveI @ stdcall GdipDrawCurve2(ptr ptr ptr long long) -@ stub GdipDrawCurve2I +@ stdcall GdipDrawCurve2I(ptr ptr ptr long long) @ stub GdipDrawCurve3 @ stub GdipDrawCurve3I -@ stub GdipDrawCurve -@ stub GdipDrawCurveI +@ stdcall GdipDrawCurve(ptr ptr ptr long) +@ stdcall GdipDrawCurveI(ptr ptr ptr long) @ stub GdipDrawDriverString @ stub GdipDrawEllipse @ stub GdipDrawEllipseI -@ stub GdipDrawImage +@ stdcall GdipDrawImage(ptr ptr long long) @ stub GdipDrawImageFX @ stdcall GdipDrawImageI(ptr ptr long long) @ stub GdipDrawImagePointRect @@ -180,9 +180,9 @@ @ stub GdipDrawImagePoints @ stub GdipDrawImagePointsI @ stdcall GdipDrawImagePointsRect(ptr ptr ptr long long long long long long ptr ptr ptr) -@ stub GdipDrawImagePointsRectI -@ stub GdipDrawImageRect -@ stub GdipDrawImageRectI +@ stdcall GdipDrawImagePointsRectI(ptr ptr ptr long long long long long long ptr ptr ptr) +@ stdcall GdipDrawImageRect(ptr ptr long long long long) +@ stdcall GdipDrawImageRectI(ptr ptr long long long long) @ stdcall GdipDrawImageRectRect(ptr ptr long long long long long long long long long ptr long ptr) @ stdcall GdipDrawImageRectRectI(ptr ptr long long long long long long long long long ptr long ptr) @ stdcall GdipDrawLine(ptr ptr long long long long) @@ -191,13 +191,13 @@ @ stdcall GdipDrawLinesI(ptr ptr ptr long) @ stdcall GdipDrawPath(ptr ptr ptr) @ stdcall GdipDrawPie(ptr ptr long long long long long long) -@ stub GdipDrawPieI -@ stub GdipDrawPolygon -@ stub GdipDrawPolygonI -@ stub GdipDrawRectangle +@ stdcall GdipDrawPieI(ptr ptr long long long long long long) +@ stdcall GdipDrawPolygon(ptr ptr ptr long) +@ stdcall GdipDrawPolygonI(ptr ptr ptr long) +@ stdcall GdipDrawRectangle(ptr ptr long long long long) @ stdcall GdipDrawRectangleI(ptr ptr long long long long) @ stdcall GdipDrawRectangles(ptr ptr ptr long) -@ stub GdipDrawRectanglesI +@ stdcall GdipDrawRectanglesI(ptr ptr ptr long) @ stdcall GdipDrawString(ptr ptr long ptr ptr ptr ptr) @ stub GdipEmfToWmfBits @ stub GdipEndContainer @@ -217,19 +217,19 @@ @ stub GdipFillClosedCurve2I @ stub GdipFillClosedCurve @ stub GdipFillClosedCurveI -@ stub GdipFillEllipse -@ stub GdipFillEllipseI +@ stdcall GdipFillEllipse(ptr ptr long long long long) +@ stdcall GdipFillEllipseI(ptr ptr long long long long) @ stdcall GdipFillPath(ptr ptr ptr) @ stdcall GdipFillPie(ptr ptr long long long long long long) -@ stub GdipFillPieI +@ stdcall GdipFillPieI(ptr ptr long long long long long long) @ stub GdipFillPolygon2 @ stub GdipFillPolygon2I @ stdcall GdipFillPolygon(ptr ptr ptr long long) @ stdcall GdipFillPolygonI(ptr ptr ptr long long) @ stdcall GdipFillRectangle(ptr ptr long long long long) @ stdcall GdipFillRectangleI(ptr ptr long long long long) -@ stub GdipFillRectangles -@ stub GdipFillRectanglesI +@ stdcall GdipFillRectangles(ptr ptr ptr long) +@ stdcall GdipFillRectanglesI(ptr ptr ptr long) @ stub GdipFillRegion @ stdcall GdipFindFirstImageItem(ptr ptr) @ stub GdipFindNextImageItem @@ -249,15 +249,15 @@ @ stub GdipGetClipBoundsI @ stdcall GdipGetCompositingMode(ptr ptr) @ stdcall GdipGetCompositingQuality(ptr ptr) -@ stub GdipGetCustomLineCapBaseCap +@ stdcall GdipGetCustomLineCapBaseCap(ptr ptr) @ stdcall GdipGetCustomLineCapBaseInset(ptr ptr) @ stub GdipGetCustomLineCapStrokeCaps @ stub GdipGetCustomLineCapStrokeJoin @ stub GdipGetCustomLineCapType @ stub GdipGetCustomLineCapWidthScale @ stub GdipGetDC -@ stub GdipGetDpiX -@ stub GdipGetDpiY +@ stdcall GdipGetDpiX(ptr ptr) +@ stdcall GdipGetDpiY(ptr ptr) @ stub GdipGetEffectParameterSize @ stub GdipGetEffectParameters @ stub GdipGetEmHeight @@ -302,12 +302,12 @@ @ stdcall GdipGetInterpolationMode(ptr ptr) @ stub GdipGetLineBlend @ stub GdipGetLineBlendCount -@ stub GdipGetLineColors +@ stdcall GdipGetLineColors(ptr ptr) @ stdcall GdipGetLineGammaCorrection(ptr ptr) @ stub GdipGetLinePresetBlend @ stub GdipGetLinePresetBlendCount -@ stub GdipGetLineRect -@ stub GdipGetLineRectI +@ stdcall GdipGetLineRect(ptr ptr) +@ stdcall GdipGetLineRectI(ptr ptr) @ stub GdipGetLineSpacing @ stub GdipGetLineTransform @ stub GdipGetLineWrapMode @@ -329,7 +329,7 @@ @ stub GdipGetPathGradientBlendCount @ stub GdipGetPathGradientCenterColor @ stdcall GdipGetPathGradientCenterPoint(ptr ptr) -@ stub GdipGetPathGradientCenterPointI +@ stdcall GdipGetPathGradientCenterPointI(ptr ptr) @ stdcall GdipGetPathGradientFocusScales(ptr ptr ptr) @ stdcall GdipGetPathGradientGammaCorrection(ptr ptr) @ stub GdipGetPathGradientPath @@ -344,10 +344,10 @@ @ stub GdipGetPathGradientWrapMode @ stub GdipGetPathLastPoint @ stdcall GdipGetPathPoints(ptr ptr long) -@ stub GdipGetPathPointsI +@ stdcall GdipGetPathPointsI(ptr ptr long) @ stdcall GdipGetPathTypes(ptr ptr long) @ stdcall GdipGetPathWorldBounds(ptr ptr ptr ptr) -@ stub GdipGetPathWorldBoundsI +@ stdcall GdipGetPathWorldBoundsI(ptr ptr ptr ptr) @ stdcall GdipGetPenBrushFill(ptr ptr) @ stdcall GdipGetPenColor(ptr ptr) @ stub GdipGetPenCompoundArray @@ -418,8 +418,8 @@ @ stub GdipIsEmptyRegion @ stub GdipIsEqualRegion @ stub GdipIsInfiniteRegion -@ stub GdipIsMatrixEqual -@ stub GdipIsMatrixIdentity +@ stdcall GdipIsMatrixEqual(ptr ptr ptr) +@ stdcall GdipIsMatrixIdentity(ptr ptr) @ stub GdipIsMatrixInvertible @ stub GdipIsOutlineVisiblePathPoint @ stdcall GdipIsOutlineVisiblePathPointI(ptr long long ptr ptr ptr) @@ -447,7 +447,7 @@ @ stub GdipMultiplyPathGradientTransform @ stub GdipMultiplyPenTransform @ stub GdipMultiplyTextureTransform -@ stub GdipMultiplyWorldTransform +@ stdcall GdipMultiplyWorldTransform(ptr ptr long) @ stub GdipNewInstalledFontCollection @ stub GdipNewPrivateFontCollection @ stdcall GdipPathIterCopyData(ptr ptr ptr ptr long long) @@ -551,7 +551,7 @@ @ stub GdipSetPathGradientBlend @ stdcall GdipSetPathGradientCenterColor(ptr long) @ stdcall GdipSetPathGradientCenterPoint(ptr ptr) -@ stub GdipSetPathGradientCenterPointI +@ stdcall GdipSetPathGradientCenterPointI(ptr ptr) @ stdcall GdipSetPathGradientFocusScales(ptr long long) @ stdcall GdipSetPathGradientGammaCorrection(ptr long) @ stub GdipSetPathGradientLinearBlend @@ -604,7 +604,7 @@ @ stub GdipStringFormatGetGenericTypographic @ stub GdipTestControl @ stdcall GdipTransformMatrixPoints(ptr ptr long) -@ stub GdipTransformMatrixPointsI +@ stdcall GdipTransformMatrixPointsI(ptr ptr long) @ stdcall GdipTransformPath(ptr ptr) @ stub GdipTransformPoints @ stub GdipTransformPointsI @@ -619,8 +619,8 @@ @ stub GdipTranslateRegionI @ stub GdipTranslateTextureTransform @ stdcall GdipTranslateWorldTransform(ptr long long long) -@ stub GdipVectorTransformMatrixPoints -@ stub GdipVectorTransformMatrixPointsI +@ stdcall GdipVectorTransformMatrixPoints(ptr ptr long) +@ stdcall GdipVectorTransformMatrixPointsI(ptr ptr long) @ stub GdipWarpPath @ stub GdipWidenPath @ stub GdipWindingModeOutline
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] Sun May 4 14:41:25 2008 @@ -1006,6 +1006,37 @@ return retval; }
+GpStatus WINGDIPAPI GdipDrawCurve(GpGraphics *graphics, GpPen *pen, + GDIPCONST GpPointF *points, INT count) +{ + return GdipDrawCurve2(graphics,pen,points,count,1.0); +} + +GpStatus WINGDIPAPI GdipDrawCurveI(GpGraphics *graphics, GpPen *pen, + GDIPCONST GpPoint *points, INT count) +{ + GpPointF *pointsF; + GpStatus ret; + INT i; + + if(!points || count <= 0) + return InvalidParameter; + + pointsF = GdipAlloc(sizeof(GpPointF)*count); + if(!pointsF) + return OutOfMemory; + + for(i = 0; i < count; i++){ + pointsF[i].X = (REAL)points[i].X; + pointsF[i].Y = (REAL)points[i].Y; + } + + ret = GdipDrawCurve(graphics,pen,pointsF,count); + GdipFree(pointsF); + + return ret; +} + /* Approximates cardinal spline with Bezier curves. */ GpStatus WINGDIPAPI GdipDrawCurve2(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points, INT count, REAL tension) @@ -1059,6 +1090,37 @@ return retval; }
+GpStatus WINGDIPAPI GdipDrawCurve2I(GpGraphics *graphics, GpPen *pen, + GDIPCONST GpPoint *points, INT count, REAL tension) +{ + GpPointF *pointsF; + GpStatus ret; + INT i; + + if(!points || count <= 0) + return InvalidParameter; + + pointsF = GdipAlloc(sizeof(GpPointF)*count); + if(!pointsF) + return OutOfMemory; + + for(i = 0; i < count; i++){ + pointsF[i].X = (REAL)points[i].X; + pointsF[i].Y = (REAL)points[i].Y; + } + + ret = GdipDrawCurve2(graphics,pen,pointsF,count,tension); + GdipFree(pointsF); + + return ret; +} + +GpStatus WINGDIPAPI GdipDrawImage(GpGraphics *graphics, GpImage *image, REAL x, REAL y) +{ + /* IPicture::Render uses LONG coords */ + return GdipDrawImageI(graphics,image,roundr(x),roundr(y)); +} + GpStatus WINGDIPAPI GdipDrawImageI(GpGraphics *graphics, GpImage *image, INT x, INT y) { @@ -1100,7 +1162,7 @@ srcx, srcy, srcwidth, srcheight, srcUnit, imageAttributes, callback, callbackData);
- if(!graphics || !image || !points || !imageAttributes || count != 3) + if(!graphics || !image || !points || count != 3) return InvalidParameter;
if(srcUnit == UnitInch) @@ -1139,6 +1201,27 @@ return Ok; }
+GpStatus WINGDIPAPI GdipDrawImagePointsRectI(GpGraphics *graphics, GpImage *image, + GDIPCONST GpPoint *points, INT count, INT srcx, INT srcy, INT srcwidth, + INT srcheight, GpUnit srcUnit, GDIPCONST GpImageAttributes* imageAttributes, + DrawImageAbort callback, VOID * callbackData) +{ + GpPointF pointsF[3]; + INT i; + + if(!points || count!=3) + return InvalidParameter; + + for(i = 0; i < count; i++){ + pointsF[i].X = (REAL)points[i].X; + pointsF[i].Y = (REAL)points[i].Y; + } + + return GdipDrawImagePointsRect(graphics, image, pointsF, count, (REAL)srcx, (REAL)srcy, + (REAL)srcwidth, (REAL)srcheight, srcUnit, imageAttributes, + callback, callbackData); +} + GpStatus WINGDIPAPI GdipDrawImageRectRect(GpGraphics *graphics, GpImage *image, REAL dstx, REAL dsty, REAL dstwidth, REAL dstheight, REAL srcx, REAL srcy, REAL srcwidth, REAL srcheight, GpUnit srcUnit, @@ -1177,6 +1260,31 @@ srcwidth, srcheight, srcUnit, imageAttributes, callback, callbackData); }
+GpStatus WINGDIPAPI GdipDrawImageRect(GpGraphics *graphics, GpImage *image, + REAL x, REAL y, REAL width, REAL height) +{ + RectF bounds; + GpUnit unit; + GpStatus ret; + + if(!graphics || !image) + return InvalidParameter; + + ret = GdipGetImageBounds(image, &bounds, &unit); + if(ret != Ok) + return ret; + + return GdipDrawImageRectRect(graphics, image, x, y, width, height, + bounds.X, bounds.Y, bounds.Width, bounds.Height, + unit, NULL, NULL, NULL); +} + +GpStatus WINGDIPAPI GdipDrawImageRectI(GpGraphics *graphics, GpImage *image, + INT x, INT y, INT width, INT height) +{ + return GdipDrawImageRect(graphics, image, (REAL)x, (REAL)y, (REAL)width, (REAL)height); +} + GpStatus WINGDIPAPI GdipDrawLine(GpGraphics *graphics, GpPen *pen, REAL x1, REAL y1, REAL x2, REAL y2) { @@ -1308,8 +1416,14 @@ return Ok; }
-GpStatus WINGDIPAPI GdipDrawRectangleI(GpGraphics *graphics, GpPen *pen, INT x, - INT y, INT width, INT height) +GpStatus WINGDIPAPI GdipDrawPieI(GpGraphics *graphics, GpPen *pen, INT x, + INT y, INT width, INT height, REAL startAngle, REAL sweepAngle) +{ + return GdipDrawPie(graphics,pen,(REAL)x,(REAL)y,(REAL)width,(REAL)height,startAngle,sweepAngle); +} + +GpStatus WINGDIPAPI GdipDrawRectangle(GpGraphics *graphics, GpPen *pen, REAL x, + REAL y, REAL width, REAL height) { INT save_state; GpPointF ptf[4]; @@ -1338,6 +1452,12 @@ return Ok; }
+GpStatus WINGDIPAPI GdipDrawRectangleI(GpGraphics *graphics, GpPen *pen, INT x, + INT y, INT width, INT height) +{ + return GdipDrawRectangle(graphics,pen,(REAL)x,(REAL)y,(REAL)width,(REAL)height); +} + GpStatus WINGDIPAPI GdipDrawRectangles(GpGraphics *graphics, GpPen *pen, GDIPCONST GpRectF* rects, INT count) { @@ -1378,6 +1498,33 @@ GdipFree(pti);
return Ok; +} + +GpStatus WINGDIPAPI GdipDrawRectanglesI(GpGraphics *graphics, GpPen *pen, + GDIPCONST GpRect* rects, INT count) +{ + GpRectF *rectsF; + GpStatus ret; + INT i; + + if(!rects || count<=0) + return InvalidParameter; + + rectsF = GdipAlloc(sizeof(GpRectF) * count); + if(!rectsF) + return OutOfMemory; + + for(i = 0;i < count;i++){ + rectsF[i].X = (REAL)rects[i].X; + rectsF[i].Y = (REAL)rects[i].Y; + rectsF[i].Width = (REAL)rects[i].Width; + rectsF[i].Height = (REAL)rects[i].Height; + } + + ret = GdipDrawRectangles(graphics, pen, rectsF, count); + GdipFree(rectsF); + + return ret; }
GpStatus WINGDIPAPI GdipDrawString(GpGraphics *graphics, GDIPCONST WCHAR *string, @@ -1535,6 +1682,41 @@ return Ok; }
+GpStatus WINGDIPAPI GdipFillEllipse(GpGraphics *graphics, GpBrush *brush, REAL x, + REAL y, REAL width, REAL height) +{ + INT save_state; + GpPointF ptf[2]; + POINT pti[2]; + + if(!graphics || !brush) + return InvalidParameter; + + ptf[0].X = x; + ptf[0].Y = y; + ptf[1].X = x + width; + ptf[1].Y = y + height; + + save_state = SaveDC(graphics->hdc); + EndPath(graphics->hdc); + SelectObject(graphics->hdc, brush->gdibrush); + SelectObject(graphics->hdc, GetStockObject(NULL_PEN)); + + transform_and_round_points(graphics, pti, ptf, 2); + + Ellipse(graphics->hdc, pti[0].x, pti[0].y, pti[1].x, pti[1].y); + + RestoreDC(graphics->hdc, save_state); + + return Ok; +} + +GpStatus WINGDIPAPI GdipFillEllipseI(GpGraphics *graphics, GpBrush *brush, INT x, + INT y, INT width, INT height) +{ + return GdipFillEllipse(graphics,brush,(REAL)x,(REAL)y,(REAL)width,(REAL)height); +} + GpStatus WINGDIPAPI GdipFillPath(GpGraphics *graphics, GpBrush *brush, GpPath *path) { INT save_state; @@ -1585,6 +1767,12 @@ RestoreDC(graphics->hdc, save_state);
return Ok; +} + +GpStatus WINGDIPAPI GdipFillPieI(GpGraphics *graphics, GpBrush *brush, INT x, + INT y, INT width, INT height, REAL startAngle, REAL sweepAngle) +{ + return GdipFillPie(graphics,brush,(REAL)x,(REAL)y,(REAL)width,(REAL)height,startAngle,sweepAngle); }
GpStatus WINGDIPAPI GdipFillPolygon(GpGraphics *graphics, GpBrush *brush, @@ -1732,6 +1920,50 @@ RestoreDC(graphics->hdc, save_state);
return Ok; +} + +GpStatus WINGDIPAPI GdipFillRectangles(GpGraphics *graphics, GpBrush *brush, GDIPCONST GpRectF *rects, + INT count) +{ + GpStatus ret; + INT i; + + if(!rects) + return InvalidParameter; + + for(i = 0; i < count; i++){ + ret = GdipFillRectangle(graphics, brush, rects[i].X, rects[i].Y, rects[i].Width, rects[i].Height); + if(ret != Ok) return ret; + } + + return Ok; +} + +GpStatus WINGDIPAPI GdipFillRectanglesI(GpGraphics *graphics, GpBrush *brush, GDIPCONST GpRect *rects, + INT count) +{ + GpRectF *rectsF; + GpStatus ret; + INT i; + + if(!rects || count <= 0) + return InvalidParameter; + + rectsF = GdipAlloc(sizeof(GpRectF)*count); + if(!rectsF) + return OutOfMemory; + + for(i = 0; i < count; i++){ + rectsF[i].X = (REAL)rects[i].X; + rectsF[i].Y = (REAL)rects[i].Y; + rectsF[i].X = (REAL)rects[i].Width; + rectsF[i].Height = (REAL)rects[i].Height; + } + + ret = GdipFillRectangles(graphics,brush,rectsF,count); + GdipFree(rectsF); + + return ret; }
/* FIXME: Compositing mode is not used anywhere except the getter/setter. */ @@ -2122,3 +2354,85 @@
return NotImplemented; } + +GpStatus WINGDIPAPI GdipDrawPolygon(GpGraphics *graphics,GpPen *pen,GDIPCONST GpPointF *points, + INT count) +{ + INT save_state; + POINT *pti; + + if(!graphics || !pen || count<=0) + return InvalidParameter; + + pti = GdipAlloc(sizeof(POINT) * count); + + save_state = prepare_dc(graphics, pen); + SelectObject(graphics->hdc, GetStockObject(NULL_BRUSH)); + + transform_and_round_points(graphics, pti, (GpPointF*)points, count); + Polygon(graphics->hdc, pti, count); + + restore_dc(graphics, save_state); + GdipFree(pti); + + return Ok; +} + +GpStatus WINGDIPAPI GdipDrawPolygonI(GpGraphics *graphics,GpPen *pen,GDIPCONST GpPoint *points, + INT count) +{ + GpStatus ret; + GpPointF *ptf; + INT i; + + if(count<=0) return InvalidParameter; + ptf = GdipAlloc(sizeof(GpPointF) * count); + + for(i = 0;i < count; i++){ + ptf[i].X = (REAL)points[i].X; + ptf[i].Y = (REAL)points[i].Y; + } + + ret = GdipDrawPolygon(graphics,pen,ptf,count); + GdipFree(ptf); + + return ret; +} + +GpStatus WINGDIPAPI GdipGetDpiX(GpGraphics *graphics, REAL* dpi) +{ + if(!graphics || !dpi) + return InvalidParameter; + + *dpi = (REAL)GetDeviceCaps(graphics->hdc, LOGPIXELSX); + + return Ok; +} + +GpStatus WINGDIPAPI GdipGetDpiY(GpGraphics *graphics, REAL* dpi) +{ + if(!graphics || !dpi) + return InvalidParameter; + + *dpi = (REAL)GetDeviceCaps(graphics->hdc, LOGPIXELSY); + + return Ok; +} + +GpStatus WINGDIPAPI GdipMultiplyWorldTransform(GpGraphics *graphics, GDIPCONST GpMatrix *matrix, + GpMatrixOrder order) +{ + GpMatrix m; + GpStatus ret; + + if(!graphics || !matrix) + return InvalidParameter; + + m = *(graphics->worldtrans); + + ret = GdipMultiplyMatrix(&m, (GpMatrix*)matrix, order); + if(ret == Ok) + *(graphics->worldtrans) = m; + + return ret; +}
Modified: trunk/reactos/dll/win32/gdiplus/graphicspath.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/gdiplus/graphicsp... ============================================================================== --- trunk/reactos/dll/win32/gdiplus/graphicspath.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/gdiplus/graphicspath.c [iso-8859-1] Sun May 4 14:41:25 2008 @@ -97,8 +97,14 @@ return Ok; }
-GpStatus WINGDIPAPI GdipAddPathBezierI(GpPath *path, INT x1, INT y1, INT x2, - INT y2, INT x3, INT y3, INT x4, INT y4) +GpStatus WINGDIPAPI GdipAddPathArcI(GpPath *path, INT x1, INT y1, INT x2, + INT y2, REAL startAngle, REAL sweepAngle) +{ + return GdipAddPathArc(path,(REAL)x1,(REAL)y1,(REAL)x2,(REAL)y2,startAngle,sweepAngle); +} + +GpStatus WINGDIPAPI GdipAddPathBezier(GpPath *path, REAL x1, REAL y1, REAL x2, + REAL y2, REAL x3, REAL y3, REAL x4, REAL y4) { INT old_count;
@@ -110,14 +116,14 @@
old_count = path->pathdata.Count;
- path->pathdata.Points[old_count].X = (REAL) x1; - path->pathdata.Points[old_count].Y = (REAL) y1; - path->pathdata.Points[old_count + 1].X = (REAL) x2; - path->pathdata.Points[old_count + 1].Y = (REAL) y2; - path->pathdata.Points[old_count + 2].X = (REAL) x3; - path->pathdata.Points[old_count + 2].Y = (REAL) y3; - path->pathdata.Points[old_count + 3].X = (REAL) x4; - path->pathdata.Points[old_count + 3].Y = (REAL) y4; + path->pathdata.Points[old_count].X = x1; + path->pathdata.Points[old_count].Y = y1; + path->pathdata.Points[old_count + 1].X = x2; + path->pathdata.Points[old_count + 1].Y = y2; + path->pathdata.Points[old_count + 2].X = x3; + path->pathdata.Points[old_count + 2].Y = y3; + path->pathdata.Points[old_count + 3].X = x4; + path->pathdata.Points[old_count + 3].Y = y4;
path->pathdata.Types[old_count] = (path->newfigure ? PathPointTypeStart : PathPointTypeLine); @@ -131,6 +137,13 @@ return Ok; }
+GpStatus WINGDIPAPI GdipAddPathBezierI(GpPath *path, INT x1, INT y1, INT x2, + INT y2, INT x3, INT y3, INT x4, INT y4) +{ + return GdipAddPathBezier(path,(REAL)x1,(REAL)y1,(REAL)x2,(REAL)y2,(REAL)x3,(REAL)y3, + (REAL)x4,(REAL)y4); +} + GpStatus WINGDIPAPI GdipAddPathBeziers(GpPath *path, GDIPCONST GpPointF *points, INT count) { @@ -156,6 +169,31 @@ path->pathdata.Count += count;
return Ok; +} + +GpStatus WINGDIPAPI GdipAddPathBeziersI(GpPath *path, GDIPCONST GpPoint *points, + INT count) +{ + GpPointF *ptsF; + GpStatus ret; + INT i; + + if(!points || ((count - 1) % 3)) + return InvalidParameter; + + ptsF = GdipAlloc(sizeof(GpPointF) * count); + if(!ptsF) + return OutOfMemory; + + for(i = 0; i < count; i++){ + ptsF[i].X = (REAL)points[i].X; + ptsF[i].Y = (REAL)points[i].Y; + } + + ret = GdipAddPathBeziers(path, ptsF, count); + GdipFree(ptsF); + + return ret; }
GpStatus WINGDIPAPI GdipAddPathEllipse(GpPath *path, REAL x, REAL y, REAL width, @@ -188,6 +226,12 @@ return Ok; }
+GpStatus WINGDIPAPI GdipAddPathEllipseI(GpPath *path, INT x, INT y, INT width, + INT height) +{ + return GdipAddPathEllipse(path,(REAL)x,(REAL)y,(REAL)width,(REAL)height); +} + GpStatus WINGDIPAPI GdipAddPathLine2(GpPath *path, GDIPCONST GpPointF *points, INT count) { @@ -217,7 +261,31 @@ return Ok; }
-GpStatus WINGDIPAPI GdipAddPathLineI(GpPath *path, INT x1, INT y1, INT x2, INT y2) +GpStatus WINGDIPAPI GdipAddPathLine2I(GpPath *path, GDIPCONST GpPoint *points, INT count) +{ + GpPointF *pointsF; + INT i; + GpStatus stat; + + if(count <= 0) + return InvalidParameter; + + pointsF = GdipAlloc(sizeof(GpPointF) * count); + if(!pointsF) return OutOfMemory; + + for(i = 0;i < count; i++){ + pointsF[i].X = (REAL)points[i].X; + pointsF[i].Y = (REAL)points[i].Y; + } + + stat = GdipAddPathLine2(path, pointsF, count); + + GdipFree(pointsF); + + return stat; +} + +GpStatus WINGDIPAPI GdipAddPathLine(GpPath *path, REAL x1, REAL y1, REAL x2, REAL y2) { INT old_count;
@@ -229,10 +297,10 @@
old_count = path->pathdata.Count;
- path->pathdata.Points[old_count].X = (REAL) x1; - path->pathdata.Points[old_count].Y = (REAL) y1; - path->pathdata.Points[old_count + 1].X = (REAL) x2; - path->pathdata.Points[old_count + 1].Y = (REAL) y2; + path->pathdata.Points[old_count].X = x1; + path->pathdata.Points[old_count].Y = y1; + path->pathdata.Points[old_count + 1].X = x2; + path->pathdata.Points[old_count + 1].Y = y2;
path->pathdata.Types[old_count] = (path->newfigure ? PathPointTypeStart : PathPointTypeLine); @@ -242,6 +310,11 @@ path->pathdata.Count += 2;
return Ok; +} + +GpStatus WINGDIPAPI GdipAddPathLineI(GpPath *path, INT x1, INT y1, INT x2, INT y2) +{ + return GdipAddPathLine(path, (REAL)x1, (REAL)y1, (REAL)x2, (REAL)y2); }
GpStatus WINGDIPAPI GdipAddPathPath(GpPath *path, GDIPCONST GpPath* addingPath, @@ -373,6 +446,27 @@ return Ok; }
+GpStatus WINGDIPAPI GdipCreatePath2I(GDIPCONST GpPoint* points, + GDIPCONST BYTE* types, INT count, GpFillMode fill, GpPath **path) +{ + GpPointF *ptF; + GpStatus ret; + INT i; + + ptF = GdipAlloc(sizeof(GpPointF)*count); + + for(i = 0;i < count; i++){ + ptF[i].X = (REAL)points[i].X; + ptF[i].Y = (REAL)points[i].Y; + } + + ret = GdipCreatePath2(ptF, types, count, fill, path); + + GdipFree(ptF); + + return ret; +} + GpStatus WINGDIPAPI GdipDeletePath(GpPath *path) { if(!path) @@ -406,6 +500,29 @@ memcpy(points, path->pathdata.Points, path->pathdata.Count * sizeof(GpPointF));
return Ok; +} + +GpStatus WINGDIPAPI GdipGetPathPointsI(GpPath *path, GpPoint* points, INT count) +{ + GpStatus ret; + GpPointF *ptf; + INT i; + + if(count <= 0) + return InvalidParameter; + + ptf = GdipAlloc(sizeof(GpPointF)*count); + if(!ptf) return OutOfMemory; + + ret = GdipGetPathPoints(path,ptf,count); + if(ret == Ok) + for(i = 0;i < count;i++){ + points[i].X = roundr(ptf[i].X); + points[i].Y = roundr(ptf[i].Y); + }; + GdipFree(ptf); + + return ret; }
GpStatus WINGDIPAPI GdipGetPathTypes(GpPath *path, BYTE* types, INT count) @@ -506,6 +623,24 @@ return Ok; }
+GpStatus WINGDIPAPI GdipGetPathWorldBoundsI(GpPath* path, GpRect* bounds, + GDIPCONST GpMatrix *matrix, GDIPCONST GpPen *pen) +{ + GpStatus ret; + GpRectF boundsF; + + ret = GdipGetPathWorldBounds(path,&boundsF,matrix,pen); + + if(ret == Ok){ + bounds->X = roundr(boundsF.X); + bounds->Y = roundr(boundsF.Y); + bounds->Width = roundr(boundsF.Width); + bounds->Height = roundr(boundsF.Height); + } + + return ret; +} + GpStatus WINGDIPAPI GdipGetPointCount(GpPath *path, INT *count) { if(!path)
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] Sun May 4 14:41:25 2008 @@ -759,6 +759,7 @@ IPicture_get_Handle(pic, &hbm); IPicture_get_CurDC(pic, &hdc);
+ ZeroMemory(&bmi, sizeof(bmi)); bmch = (BITMAPCOREHEADER*) (&bmi.bmiHeader); bmch->bcSize = sizeof(BITMAPCOREHEADER);
Modified: trunk/reactos/dll/win32/gdiplus/matrix.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/gdiplus/matrix.c?... ============================================================================== --- trunk/reactos/dll/win32/gdiplus/matrix.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/gdiplus/matrix.c [iso-8859-1] Sun May 4 14:41:25 2008 @@ -89,6 +89,23 @@ return Ok; }
+GpStatus WINGDIPAPI GdipCreateMatrix3I(GDIPCONST GpRect *rect, GDIPCONST GpPoint *pt, + GpMatrix **matrix) +{ + GpRectF rectF; + GpPointF ptF; + + rectF.X = (REAL)rect->X; + rectF.Y = (REAL)rect->Y; + rectF.Width = (REAL)rect->Width; + rectF.Height = (REAL)rect->Height; + + ptF.X = (REAL)pt->X; + ptF.Y = (REAL)pt->Y; + + return GdipCreateMatrix3(&rectF, &ptF, matrix); +} + GpStatus WINGDIPAPI GdipCloneMatrix(GpMatrix *matrix, GpMatrix **clone) { if(!matrix || !clone) @@ -242,6 +259,33 @@ return Ok; }
+GpStatus WINGDIPAPI GdipTransformMatrixPointsI(GpMatrix *matrix, GpPoint *pts, INT count) +{ + GpPointF *ptsF; + GpStatus ret; + INT i; + + ptsF = GdipAlloc(sizeof(GpPointF) * count); + if(!ptsF) + return OutOfMemory; + + for(i = 0; i < count; i++){ + ptsF[i].X = (REAL)pts[i].X; + ptsF[i].Y = (REAL)pts[i].Y; + } + + ret = GdipTransformMatrixPoints(matrix, ptsF, count); + + if(ret == Ok) + for(i = 0; i < count; i++){ + pts[i].X = roundr(ptsF[i].X); + pts[i].Y = roundr(ptsF[i].Y); + } + GdipFree(ptsF); + + return ret; +} + GpStatus WINGDIPAPI GdipTranslateMatrix(GpMatrix *matrix, REAL offsetX, REAL offsetY, GpMatrixOrder order) { @@ -264,3 +308,82 @@
return Ok; } + +GpStatus WINGDIPAPI GdipVectorTransformMatrixPoints(GpMatrix *matrix, GpPointF *pts, INT count) +{ + REAL x, y; + INT i; + + if(!matrix || !pts) + return InvalidParameter; + + for(i = 0; i < count; i++) + { + x = pts[i].X; + y = pts[i].Y; + + pts[i].X = x * matrix->matrix[0] + y * matrix->matrix[2]; + pts[i].Y = x * matrix->matrix[1] + y * matrix->matrix[3]; + } + + return Ok; +} + +GpStatus WINGDIPAPI GdipVectorTransformMatrixPointsI(GpMatrix *matrix, GpPoint *pts, INT count) +{ + GpPointF *ptsF; + GpStatus ret; + INT i; + + ptsF = GdipAlloc(sizeof(GpPointF) * count); + if(!ptsF) + return OutOfMemory; + + for(i = 0; i < count; i++){ + ptsF[i].X = (REAL)pts[i].X; + ptsF[i].Y = (REAL)pts[i].Y; + } + + ret = GdipVectorTransformMatrixPoints(matrix, ptsF, count); + /* store back */ + if(ret == Ok) + for(i = 0; i < count; i++){ + pts[i].X = roundr(ptsF[i].X); + pts[i].Y = roundr(ptsF[i].Y); + } + GdipFree(ptsF); + + return ret; +} + +GpStatus WINGDIPAPI GdipIsMatrixEqual(GDIPCONST GpMatrix *matrix, GDIPCONST GpMatrix *matrix2, + BOOL *result) +{ + if(!matrix || !matrix2 || !result) + return InvalidParameter; + /* based on single array member of GpMatrix */ + *result = (memcmp(matrix->matrix, matrix2->matrix, sizeof(GpMatrix)) == 0); + + return Ok; +} + +GpStatus WINGDIPAPI GdipIsMatrixIdentity(GDIPCONST GpMatrix *matrix, BOOL *result) +{ + GpMatrix *e; + GpStatus ret; + BOOL isIdentity; + + if(!matrix || !result) + return InvalidParameter; + + ret = GdipCreateMatrix(&e); + if(ret != Ok) return ret; + + ret = GdipIsMatrixEqual(matrix, e, &isIdentity); + if(ret == Ok) + *result = isIdentity; + + GdipFree(e); + + return ret; +}
Modified: trunk/reactos/dll/win32/gdiplus/stringformat.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/gdiplus/stringfor... ============================================================================== --- trunk/reactos/dll/win32/gdiplus/stringformat.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/gdiplus/stringformat.c [iso-8859-1] Sun May 4 14:41:25 2008 @@ -152,3 +152,18 @@
return Ok; } + +GpStatus WINGDIPAPI GdipCloneStringFormat(GDIPCONST GpStringFormat *format, GpStringFormat **newFormat) +{ + if(!format || !newFormat) + return InvalidParameter; + + *newFormat = GdipAlloc(sizeof(GpStringFormat)); + if(!*newFormat) return OutOfMemory; + + **newFormat = *format; + + TRACE("%p %p\n",format,newFormat); + + return Ok; +}