- Sync gdiplus with Wine head

svn path=/trunk/; revision=39601
This commit is contained in:
Dmitry Chapyshev 2009-02-14 08:14:34 +00:00
parent 5896c03e49
commit 98ff856933
8 changed files with 379 additions and 25 deletions

View file

@ -373,6 +373,29 @@ GpStatus WINGDIPAPI GdipGetFontUnit(GpFont *font, Unit *unit)
return Ok;
}
/*******************************************************************************
* GdipGetLogFontA [GDIPLUS.@]
*/
GpStatus WINGDIPAPI GdipGetLogFontA(GpFont *font, GpGraphics *graphics,
LOGFONTA *lfa)
{
GpStatus status;
LOGFONTW lfw;
TRACE("(%p, %p, %p)\n", font, graphics, lfa);
status = GdipGetLogFontW(font, graphics, &lfw);
if(status != Ok)
return status;
memcpy(lfa, &lfw, FIELD_OFFSET(LOGFONTA,lfFaceName) );
if(!MultiByteToWideChar(CP_ACP, 0, lfa->lfFaceName, -1, lfw.lfFaceName, LF_FACESIZE))
return GenericError;
return Ok;
}
/*******************************************************************************
* GdipGetLogFontW [GDIPLUS.@]
*/

View file

@ -76,7 +76,7 @@
@ stdcall GdipCreateBitmapFromGdiDib(ptr ptr ptr)
@ stdcall GdipCreateBitmapFromGraphics(long long ptr ptr)
@ stdcall GdipCreateBitmapFromHBITMAP(long long ptr)
@ stub GdipCreateBitmapFromHICON
@ stdcall GdipCreateBitmapFromHICON(long ptr)
@ stdcall GdipCreateBitmapFromResource(long wstr ptr)
@ stdcall GdipCreateBitmapFromScan0(long long long long ptr ptr)
@ stdcall GdipCreateBitmapFromStream(ptr ptr)
@ -245,8 +245,8 @@
@ stdcall GdipGetCellAscent(ptr long ptr)
@ stdcall GdipGetCellDescent(ptr long ptr)
@ stdcall GdipGetClip(ptr ptr)
@ stub GdipGetClipBounds
@ stub GdipGetClipBoundsI
@ stdcall GdipGetClipBounds(ptr ptr)
@ stdcall GdipGetClipBoundsI(ptr ptr)
@ stdcall GdipGetCompositingMode(ptr ptr)
@ stdcall GdipGetCompositingQuality(ptr ptr)
@ stdcall GdipGetCustomLineCapBaseCap(ptr ptr)
@ -311,7 +311,7 @@
@ stdcall GdipGetLineSpacing(ptr long ptr)
@ stub GdipGetLineTransform
@ stdcall GdipGetLineWrapMode(ptr ptr)
@ stub GdipGetLogFontA
@ stdcall GdipGetLogFontA(ptr ptr ptr)
@ stdcall GdipGetLogFontW(ptr ptr ptr)
@ stdcall GdipGetMatrixElements(ptr ptr)
@ stub GdipGetMetafileDownLevelRasterizationLimit
@ -507,7 +507,7 @@
@ stdcall GdipSetAdjustableArrowCapMiddleInset(ptr long)
@ stdcall GdipSetAdjustableArrowCapWidth(ptr long)
@ stdcall GdipSetClipGraphics(ptr ptr long)
@ stub GdipSetClipHrgn
@ stdcall GdipSetClipHrgn(ptr long long)
@ stdcall GdipSetClipPath(ptr ptr long)
@ stdcall GdipSetClipRect(ptr long long long long long)
@ stdcall GdipSetClipRectI(ptr long long long long long)
@ -609,8 +609,8 @@
@ stdcall GdipTransformPoints(ptr long long ptr long)
@ stdcall GdipTransformPointsI(ptr long long ptr long)
@ stdcall GdipTransformRegion(ptr ptr)
@ stub GdipTranslateClip
@ stub GdipTranslateClipI
@ stdcall GdipTranslateClip(ptr long long)
@ stdcall GdipTranslateClipI(ptr long long)
@ stdcall GdipTranslateLineTransform(ptr long long long)
@ stdcall GdipTranslateMatrix(ptr long long long)
@ stub GdipTranslatePathGradientTransform

View file

@ -2375,18 +2375,39 @@ GpStatus WINGDIPAPI GdipFillRectanglesI(GpGraphics *graphics, GpBrush *brush, GD
return ret;
}
/*****************************************************************************
* GdipFillRegion [GDIPLUS.@]
*/
GpStatus WINGDIPAPI GdipFillRegion(GpGraphics* graphics, GpBrush* brush,
GpRegion* region)
{
INT save_state;
GpStatus status;
HRGN hrgn;
TRACE("(%p, %p, %p)\n", graphics, brush, region);
if (!(graphics && brush && region))
return InvalidParameter;
if(graphics->busy)
return ObjectBusy;
FIXME("(%p, %p, %p): stub\n", graphics, brush, region);
status = GdipGetRegionHRgn(region, graphics, &hrgn);
if(status != Ok)
return status;
return NotImplemented;
save_state = SaveDC(graphics->hdc);
EndPath(graphics->hdc);
SelectObject(graphics->hdc, GetStockObject(NULL_PEN));
FillRgn(graphics->hdc, hrgn, brush->gdibrush);
RestoreDC(graphics->hdc, save_state);
DeleteObject(hrgn);
return Ok;
}
GpStatus WINGDIPAPI GdipFlush(GpGraphics *graphics, GpFlushIntention intention)
@ -2405,6 +2426,38 @@ GpStatus WINGDIPAPI GdipFlush(GpGraphics *graphics, GpFlushIntention intention)
return NotImplemented;
}
/*****************************************************************************
* GdipGetClipBounds [GDIPLUS.@]
*/
GpStatus WINGDIPAPI GdipGetClipBounds(GpGraphics *graphics, GpRectF *rect)
{
TRACE("(%p, %p)\n", graphics, rect);
if(!graphics)
return InvalidParameter;
if(graphics->busy)
return ObjectBusy;
return GdipGetRegionBounds(graphics->clip, graphics, rect);
}
/*****************************************************************************
* GdipGetClipBoundsI [GDIPLUS.@]
*/
GpStatus WINGDIPAPI GdipGetClipBoundsI(GpGraphics *graphics, GpRect *rect)
{
TRACE("(%p, %p)\n", graphics, rect);
if(!graphics)
return InvalidParameter;
if(graphics->busy)
return ObjectBusy;
return GdipGetRegionBoundsI(graphics->clip, graphics, rect);
}
/* FIXME: Compositing mode is not used anywhere except the getter/setter. */
GpStatus WINGDIPAPI GdipGetCompositingMode(GpGraphics *graphics,
CompositingMode *mode)
@ -3057,6 +3110,29 @@ GpStatus WINGDIPAPI GdipTranslateWorldTransform(GpGraphics *graphics, REAL dx,
return GdipTranslateMatrix(graphics->worldtrans, dx, dy, order);
}
/*****************************************************************************
* GdipSetClipHrgn [GDIPLUS.@]
*/
GpStatus WINGDIPAPI GdipSetClipHrgn(GpGraphics *graphics, HRGN hrgn, CombineMode mode)
{
GpRegion *region;
GpStatus status;
TRACE("(%p, %p, %d)\n", graphics, hrgn, mode);
if(!graphics)
return InvalidParameter;
status = GdipCreateRegionHrgn(hrgn, &region);
if(status != Ok)
return status;
status = GdipSetClipRegion(graphics, region, mode);
GdipDeleteRegion(region);
return status;
}
GpStatus WINGDIPAPI GdipSetClipPath(GpGraphics *graphics, GpPath *path, CombineMode mode)
{
TRACE("(%p, %p, %d)\n", graphics, path, mode);
@ -3318,3 +3394,35 @@ HPALETTE WINGDIPAPI GdipCreateHalftonePalette(void)
return NULL;
}
/*****************************************************************************
* GdipTranslateClip [GDIPLUS.@]
*/
GpStatus WINGDIPAPI GdipTranslateClip(GpGraphics *graphics, REAL dx, REAL dy)
{
TRACE("(%p, %.2f, %.2f)\n", graphics, dx, dy);
if(!graphics)
return InvalidParameter;
if(graphics->busy)
return ObjectBusy;
return GdipTranslateRegion(graphics->clip, dx, dy);
}
/*****************************************************************************
* GdipTranslateClipI [GDIPLUS.@]
*/
GpStatus WINGDIPAPI GdipTranslateClipI(GpGraphics *graphics, INT dx, INT dy)
{
TRACE("(%p, %d, %d)\n", graphics, dx, dy);
if(!graphics)
return InvalidParameter;
if(graphics->busy)
return ObjectBusy;
return GdipTranslateRegion(graphics->clip, (REAL)dx, (REAL)dy);
}

View file

@ -723,6 +723,17 @@ GpStatus WINGDIPAPI GdipAddPathPie(GpPath *path, REAL x, REAL y, REAL width, REA
if(!path)
return InvalidParameter;
/* on zero width/height only start point added */
if(width <= 1e-7 || height <= 1e-7){
if(!lengthen_path(path, 1))
return OutOfMemory;
path->pathdata.Points[0].X = x + width / 2.0;
path->pathdata.Points[0].Y = y + height / 2.0;
path->pathdata.Types[0] = PathPointTypeStart | PathPointTypeCloseSubpath;
path->pathdata.Count = 1;
return InvalidParameter;
}
count = arc2polybezier(NULL, x, y, width, height, startAngle, sweepAngle);
if(count == 0)

View file

@ -18,6 +18,8 @@
#include <stdarg.h>
#define NONAMELESSUNION
#include "windef.h"
#include "winbase.h"
#include "winuser.h"
@ -429,6 +431,50 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromGraphics(INT width, INT height,
return ret;
}
GpStatus WINGDIPAPI GdipCreateBitmapFromHICON(HICON hicon, GpBitmap** bitmap)
{
HICON icon_copy;
ICONINFO iinfo;
PICTDESC desc;
TRACE("%p, %p\n", hicon, bitmap);
if(!bitmap || !GetIconInfo(hicon, &iinfo))
return InvalidParameter;
*bitmap = GdipAlloc(sizeof(GpBitmap));
if(!*bitmap) return OutOfMemory;
icon_copy = CreateIconIndirect(&iinfo);
if(!icon_copy){
GdipFree(*bitmap);
return InvalidParameter;
}
desc.cbSizeofstruct = sizeof(PICTDESC);
desc.picType = PICTYPE_ICON;
desc.u.icon.hicon = icon_copy;
if(OleCreatePictureIndirect(&desc, &IID_IPicture, TRUE,
(LPVOID*) &((*bitmap)->image.picture)) != S_OK){
DestroyIcon(icon_copy);
GdipFree(*bitmap);
return GenericError;
}
(*bitmap)->format = PixelFormat32bppARGB;
(*bitmap)->image.type = ImageTypeBitmap;
(*bitmap)->image.flags = ImageFlagsNone;
(*bitmap)->width = ipicture_pixel_width((*bitmap)->image.picture);
(*bitmap)->height = ipicture_pixel_height((*bitmap)->image.picture);
DeleteObject(iinfo.hbmColor);
DeleteObject(iinfo.hbmMask);
return Ok;
}
GpStatus WINGDIPAPI GdipCreateBitmapFromScan0(INT width, INT height, INT stride,
PixelFormat format, BYTE* scan0, GpBitmap** bitmap)
{

View file

@ -567,15 +567,58 @@ GpStatus WINGDIPAPI GdipCreateRegionRgnData(GDIPCONST BYTE *data, INT size, GpRe
return NotImplemented;
}
/******************************************************************************
* GdipCreateRegionHrgn [GDIPLUS.@]
*/
GpStatus WINGDIPAPI GdipCreateRegionHrgn(HRGN hrgn, GpRegion **region)
{
FIXME("(%p, %p): stub\n", hrgn, region);
union {
RGNDATA data;
char buf[sizeof(RGNDATAHEADER) + sizeof(RECT)];
} rdata;
DWORD size;
GpRectF rectf;
GpPath *path;
GpStatus stat;
if(!hrgn || !region)
TRACE("(%p, %p)\n", hrgn, region);
if(!region || !(size = GetRegionData(hrgn, 0, NULL)))
return InvalidParameter;
*region = NULL;
return NotImplemented;
if(size > sizeof(RGNDATAHEADER) + sizeof(RECT)){
FIXME("Only simple rect regions supported.\n");
*region = NULL;
return NotImplemented;
}
if(!GetRegionData(hrgn, sizeof(rdata), &rdata.data))
return GenericError;
/* return empty region */
if(IsRectEmpty(&rdata.data.rdh.rcBound)){
stat = GdipCreateRegion(region);
if(stat == Ok)
GdipSetEmpty(*region);
return stat;
}
rectf.X = (REAL)rdata.data.rdh.rcBound.left;
rectf.Y = (REAL)rdata.data.rdh.rcBound.top;
rectf.Width = (REAL)rdata.data.rdh.rcBound.right - rectf.X;
rectf.Height = (REAL)rdata.data.rdh.rcBound.bottom - rectf.Y;
stat = GdipCreatePath(FillModeAlternate, &path);
if(stat != Ok)
return stat;
GdipAddPathRectangle(path, rectf.X, rectf.Y, rectf.Width, rectf.Height);
stat = GdipCreateRegionPath(path, region);
GdipDeletePath(path);
return stat;
}
GpStatus WINGDIPAPI GdipDeleteRegion(GpRegion *region)
@ -591,18 +634,66 @@ GpStatus WINGDIPAPI GdipDeleteRegion(GpRegion *region)
return Ok;
}
/*****************************************************************************
* GdipGetRegionBounds [GDIPLUS.@]
*/
GpStatus WINGDIPAPI GdipGetRegionBounds(GpRegion *region, GpGraphics *graphics, GpRectF *rect)
{
FIXME("(%p, %p, %p): stub\n", region, graphics, rect);
HRGN hrgn;
RECT r;
GpStatus status;
return NotImplemented;
TRACE("(%p, %p, %p)\n", region, graphics, rect);
if(!region || !graphics || !rect)
return InvalidParameter;
status = GdipGetRegionHRgn(region, graphics, &hrgn);
if(status != Ok)
return status;
/* infinite */
if(!hrgn){
rect->X = rect->Y = -(REAL)(1 << 22);
rect->Width = rect->Height = (REAL)(1 << 23);
return Ok;
}
if(!GetRgnBox(hrgn, &r)){
DeleteObject(hrgn);
return GenericError;
}
rect->X = r.left;
rect->Y = r.top;
rect->Width = r.right - r.left;
rect->Height = r.bottom - r.top;
return Ok;
}
/*****************************************************************************
* GdipGetRegionBoundsI [GDIPLUS.@]
*/
GpStatus WINGDIPAPI GdipGetRegionBoundsI(GpRegion *region, GpGraphics *graphics, GpRect *rect)
{
FIXME("(%p, %p, %p): stub\n", region, graphics, rect);
GpRectF rectf;
GpStatus status;
return NotImplemented;
TRACE("(%p, %p, %p)\n", region, graphics, rect);
if(!rect)
return InvalidParameter;
status = GdipGetRegionBounds(region, graphics, &rectf);
if(status == Ok){
rect->X = roundr(rectf.X);
rect->Y = roundr(rectf.X);
rect->Width = roundr(rectf.Width);
rect->Height = roundr(rectf.Height);
}
return status;
}
static inline void write_dword(DWORD* location, INT* offset, const DWORD write)
@ -963,12 +1054,39 @@ GpStatus WINGDIPAPI GdipIsEmptyRegion(GpRegion *region, GpGraphics *graphics, BO
return Ok;
}
/*****************************************************************************
* GdipIsEqualRegion [GDIPLUS.@]
*/
GpStatus WINGDIPAPI GdipIsEqualRegion(GpRegion *region, GpRegion *region2, GpGraphics *graphics,
BOOL *res)
{
FIXME("(%p, %p, %p, %p): stub\n", region, region2, graphics, res);
HRGN hrgn1, hrgn2;
GpStatus stat;
return NotImplemented;
TRACE("(%p, %p, %p, %p)\n", region, region2, graphics, res);
if(!region || !region2 || !graphics || !res)
return InvalidParameter;
stat = GdipGetRegionHRgn(region, graphics, &hrgn1);
if(stat != Ok)
return stat;
stat = GdipGetRegionHRgn(region2, graphics, &hrgn2);
if(stat != Ok){
DeleteObject(hrgn1);
return stat;
}
*res = EqualRgn(hrgn1, hrgn2);
/* one of GpRegions is infinite */
if(*res == ERROR)
*res = (!hrgn1 && !hrgn2);
DeleteObject(hrgn1);
DeleteObject(hrgn2);
return Ok;
}
/*****************************************************************************
@ -1027,16 +1145,54 @@ GpStatus WINGDIPAPI GdipTransformRegion(GpRegion *region, GpMatrix *matrix)
return NotImplemented;
}
/* Translates GpRegion elements with specified offsets */
static void translate_region_element(region_element* element, REAL dx, REAL dy)
{
INT i;
switch(element->type)
{
case RegionDataEmptyRect:
case RegionDataInfiniteRect:
return;
case RegionDataRect:
element->elementdata.rect.X += dx;
element->elementdata.rect.Y += dy;
return;
case RegionDataPath:
for(i = 0; i < element->elementdata.pathdata.path->pathdata.Count; i++){
element->elementdata.pathdata.path->pathdata.Points[i].X += dx;
element->elementdata.pathdata.path->pathdata.Points[i].Y += dy;
}
return;
default:
translate_region_element(element->elementdata.combine.left, dx, dy);
translate_region_element(element->elementdata.combine.right, dx, dy);
return;
}
}
/*****************************************************************************
* GdipTranslateRegion [GDIPLUS.@]
*/
GpStatus WINGDIPAPI GdipTranslateRegion(GpRegion *region, REAL dx, REAL dy)
{
FIXME("(%p, %f, %f): stub\n", region, dx, dy);
TRACE("(%p, %f, %f)\n", region, dx, dy);
return NotImplemented;
if(!region)
return InvalidParameter;
translate_region_element(&region->node, dx, dy);
return Ok;
}
/*****************************************************************************
* GdipTranslateRegionI [GDIPLUS.@]
*/
GpStatus WINGDIPAPI GdipTranslateRegionI(GpRegion *region, INT dx, INT dy)
{
FIXME("(%p, %d, %d): stub\n", region, dx, dy);
TRACE("(%p, %d, %d)\n", region, dx, dy);
return NotImplemented;
return GdipTranslateRegion(region, (REAL)dx, (REAL)dy);
}

View file

@ -284,9 +284,12 @@ GpStatus WINGDIPAPI GdipSetStringFormatTrimming(GpStringFormat *format,
return Ok;
}
GpStatus WINGDIPAPI GdipSetStringFormatFlags(GDIPCONST GpStringFormat *format, INT flags)
GpStatus WINGDIPAPI GdipSetStringFormatFlags(GpStringFormat *format, INT flags)
{
FIXME("format (%p) flags (%d)\n", format, flags);
if(!format)
return InvalidParameter;
format->attr = flags;
return Ok;
}

View file

@ -49,6 +49,7 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromFileICM(GDIPCONST WCHAR*,GpBitmap**);
GpStatus WINGDIPAPI GdipCreateBitmapFromGdiDib(GDIPCONST BITMAPINFO*,VOID*,GpBitmap**);
GpStatus WINGDIPAPI GdipCreateBitmapFromGraphics(INT,INT,GpGraphics*,GpBitmap**);
GpStatus WINGDIPAPI GdipCreateBitmapFromHBITMAP(HBITMAP, HPALETTE, GpBitmap**);
GpStatus WINGDIPAPI GdipCreateBitmapFromHICON(HICON, GpBitmap**);
GpStatus WINGDIPAPI GdipCreateBitmapFromResource(HINSTANCE,GDIPCONST WCHAR*,GpBitmap**);
GpStatus WINGDIPAPI GdipCreateBitmapFromScan0(INT,INT,INT,PixelFormat,BYTE*,
GpBitmap**);
@ -189,6 +190,8 @@ GpStatus WINGDIPAPI GdipFillRectangles(GpGraphics*,GpBrush*,GDIPCONST GpRectF*,I
GpStatus WINGDIPAPI GdipFillRectanglesI(GpGraphics*,GpBrush*,GDIPCONST GpRect*,INT);
GpStatus WINGDIPAPI GdipFillRegion(GpGraphics*,GpBrush*,GpRegion*);
GpStatus WINGDIPAPI GdipGetClip(GpGraphics*,GpRegion*);
GpStatus WINGDIPAPI GdipGetClipBounds(GpGraphics*,GpRectF*);
GpStatus WINGDIPAPI GdipGetClipBoundsI(GpGraphics*,GpRect*);
GpStatus WINGDIPAPI GdipGetCompositingMode(GpGraphics*,CompositingMode*);
GpStatus WINGDIPAPI GdipGetCompositingQuality(GpGraphics*,CompositingQuality*);
GpStatus WINGDIPAPI GdipGetDC(GpGraphics*,HDC*);
@ -221,6 +224,7 @@ GpStatus WINGDIPAPI GdipRestoreGraphics(GpGraphics*,GraphicsState);
GpStatus WINGDIPAPI GdipRotateWorldTransform(GpGraphics*,REAL,GpMatrixOrder);
GpStatus WINGDIPAPI GdipSaveGraphics(GpGraphics*,GraphicsState*);
GpStatus WINGDIPAPI GdipScaleWorldTransform(GpGraphics*,REAL,REAL,GpMatrixOrder);
GpStatus WINGDIPAPI GdipSetClipHrgn(GpGraphics*,HRGN,CombineMode);
GpStatus WINGDIPAPI GdipSetClipPath(GpGraphics*,GpPath*,CombineMode);
GpStatus WINGDIPAPI GdipSetClipRect(GpGraphics*,REAL,REAL,REAL,REAL,CombineMode);
GpStatus WINGDIPAPI GdipSetClipRectI(GpGraphics*,INT,INT,INT,INT,CombineMode);
@ -239,6 +243,8 @@ GpStatus WINGDIPAPI GdipTransformPoints(GpGraphics*, GpCoordinateSpace, GpCoordi
GpPointF *, INT);
GpStatus WINGDIPAPI GdipTransformPointsI(GpGraphics*, GpCoordinateSpace, GpCoordinateSpace,
GpPoint *, INT);
GpStatus WINGDIPAPI GdipTranslateClip(GpGraphics*,REAL,REAL);
GpStatus WINGDIPAPI GdipTranslateClipI(GpGraphics*,INT,INT);
GpStatus WINGDIPAPI GdipTranslateWorldTransform(GpGraphics*,REAL,REAL,GpMatrixOrder);
/* GraphicsPath */
@ -561,6 +567,7 @@ GpStatus WINGDIPAPI GdipSetStringFormatMeasurableCharacterRanges(
GpStringFormat*, INT, GDIPCONST CharacterRange*);
GpStatus WINGDIPAPI GdipSetStringFormatTabStops(GpStringFormat*,REAL,INT,GDIPCONST REAL*);
GpStatus WINGDIPAPI GdipSetStringFormatTrimming(GpStringFormat*,StringTrimming);
GpStatus WINGDIPAPI GdipSetStringFormatFlags(GpStringFormat*, INT);
GpStatus WINGDIPAPI GdipStringFormatGetGenericDefault(GpStringFormat **);
GpStatus WINGDIPAPI GdipStringFormatGetGenericTypographic(GpStringFormat **);