gdiplus: Implement GdipBeginContainer2 and GdipEndContainer.
This commit is contained in:
parent
3484d46a36
commit
632aef3d8b
|
@ -29,6 +29,7 @@
|
|||
|
||||
#include "objbase.h"
|
||||
#include "ocidl.h"
|
||||
#include "wine/list.h"
|
||||
|
||||
#include "gdiplus.h"
|
||||
|
||||
|
@ -109,6 +110,8 @@ struct GpGraphics{
|
|||
BOOL busy; /* hdc handle obtained by GdipGetDC */
|
||||
GpRegion *clip;
|
||||
UINT textcontrast; /* not used yet. get/set only */
|
||||
struct list containers;
|
||||
GraphicsContainer contid; /* last-issued container ID */
|
||||
};
|
||||
|
||||
struct GpBrush{
|
||||
|
|
|
@ -38,6 +38,7 @@
|
|||
#include "gdiplus.h"
|
||||
#include "gdiplus_private.h"
|
||||
#include "wine/debug.h"
|
||||
#include "wine/list.h"
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(gdiplus);
|
||||
|
||||
|
@ -941,6 +942,104 @@ GpStatus trace_path(GpGraphics *graphics, GpPath *path)
|
|||
return result;
|
||||
}
|
||||
|
||||
typedef struct _GraphicsContainerItem {
|
||||
struct list entry;
|
||||
GraphicsContainer contid;
|
||||
|
||||
SmoothingMode smoothing;
|
||||
CompositingQuality compqual;
|
||||
InterpolationMode interpolation;
|
||||
CompositingMode compmode;
|
||||
TextRenderingHint texthint;
|
||||
REAL scale;
|
||||
GpUnit unit;
|
||||
PixelOffsetMode pixeloffset;
|
||||
UINT textcontrast;
|
||||
GpMatrix* worldtrans;
|
||||
GpRegion* clip;
|
||||
} GraphicsContainerItem;
|
||||
|
||||
static GpStatus init_container(GraphicsContainerItem** container,
|
||||
GDIPCONST GpGraphics* graphics){
|
||||
GpStatus sts;
|
||||
|
||||
*container = GdipAlloc(sizeof(GraphicsContainerItem));
|
||||
if(!(*container))
|
||||
return OutOfMemory;
|
||||
|
||||
(*container)->contid = graphics->contid + 1;
|
||||
|
||||
(*container)->smoothing = graphics->smoothing;
|
||||
(*container)->compqual = graphics->compqual;
|
||||
(*container)->interpolation = graphics->interpolation;
|
||||
(*container)->compmode = graphics->compmode;
|
||||
(*container)->texthint = graphics->texthint;
|
||||
(*container)->scale = graphics->scale;
|
||||
(*container)->unit = graphics->unit;
|
||||
(*container)->textcontrast = graphics->textcontrast;
|
||||
(*container)->pixeloffset = graphics->pixeloffset;
|
||||
|
||||
sts = GdipCloneMatrix(graphics->worldtrans, &(*container)->worldtrans);
|
||||
if(sts != Ok){
|
||||
GdipFree(*container);
|
||||
*container = NULL;
|
||||
return sts;
|
||||
}
|
||||
|
||||
sts = GdipCloneRegion(graphics->clip, &(*container)->clip);
|
||||
if(sts != Ok){
|
||||
GdipDeleteMatrix((*container)->worldtrans);
|
||||
GdipFree(*container);
|
||||
*container = NULL;
|
||||
return sts;
|
||||
}
|
||||
|
||||
return Ok;
|
||||
}
|
||||
|
||||
static void delete_container(GraphicsContainerItem* container){
|
||||
GdipDeleteMatrix(container->worldtrans);
|
||||
GdipDeleteRegion(container->clip);
|
||||
GdipFree(container);
|
||||
}
|
||||
|
||||
static GpStatus restore_container(GpGraphics* graphics,
|
||||
GDIPCONST GraphicsContainerItem* container){
|
||||
GpStatus sts;
|
||||
GpMatrix *newTrans;
|
||||
GpRegion *newClip;
|
||||
|
||||
sts = GdipCloneMatrix(container->worldtrans, &newTrans);
|
||||
if(sts != Ok)
|
||||
return sts;
|
||||
|
||||
sts = GdipCloneRegion(container->clip, &newClip);
|
||||
if(sts != Ok){
|
||||
GdipDeleteMatrix(newTrans);
|
||||
return sts;
|
||||
}
|
||||
|
||||
GdipDeleteMatrix(graphics->worldtrans);
|
||||
graphics->worldtrans = newTrans;
|
||||
|
||||
GdipDeleteRegion(graphics->clip);
|
||||
graphics->clip = newClip;
|
||||
|
||||
graphics->contid = container->contid - 1;
|
||||
|
||||
graphics->smoothing = container->smoothing;
|
||||
graphics->compqual = container->compqual;
|
||||
graphics->interpolation = container->interpolation;
|
||||
graphics->compmode = container->compmode;
|
||||
graphics->texthint = container->texthint;
|
||||
graphics->scale = container->scale;
|
||||
graphics->unit = container->unit;
|
||||
graphics->textcontrast = container->textcontrast;
|
||||
graphics->pixeloffset = container->pixeloffset;
|
||||
|
||||
return Ok;
|
||||
}
|
||||
|
||||
GpStatus WINGDIPAPI GdipCreateFromHDC(HDC hdc, GpGraphics **graphics)
|
||||
{
|
||||
TRACE("(%p, %p)\n", hdc, graphics);
|
||||
|
@ -991,6 +1090,8 @@ GpStatus WINGDIPAPI GdipCreateFromHDC2(HDC hdc, HANDLE hDevice, GpGraphics **gra
|
|||
(*graphics)->scale = 1.0;
|
||||
(*graphics)->busy = FALSE;
|
||||
(*graphics)->textcontrast = 4;
|
||||
list_init(&(*graphics)->containers);
|
||||
(*graphics)->contid = 0;
|
||||
|
||||
return Ok;
|
||||
}
|
||||
|
@ -1155,6 +1256,7 @@ GpStatus WINGDIPAPI GdipCreateStreamOnFile(GDIPCONST WCHAR * filename,
|
|||
|
||||
GpStatus WINGDIPAPI GdipDeleteGraphics(GpGraphics *graphics)
|
||||
{
|
||||
GraphicsContainerItem *cont, *next;
|
||||
TRACE("(%p)\n", graphics);
|
||||
|
||||
if(!graphics) return InvalidParameter;
|
||||
|
@ -1163,6 +1265,11 @@ GpStatus WINGDIPAPI GdipDeleteGraphics(GpGraphics *graphics)
|
|||
if(graphics->owndc)
|
||||
ReleaseDC(graphics->hwnd, graphics->hdc);
|
||||
|
||||
LIST_FOR_EACH_ENTRY_SAFE(cont, next, &graphics->containers, GraphicsContainerItem, entry){
|
||||
list_remove(&cont->entry);
|
||||
delete_container(cont);
|
||||
}
|
||||
|
||||
GdipDeleteRegion(graphics->clip);
|
||||
GdipDeleteMatrix(graphics->worldtrans);
|
||||
GdipFree(graphics);
|
||||
|
@ -3254,14 +3361,24 @@ GpStatus WINGDIPAPI GdipSaveGraphics(GpGraphics *graphics, GraphicsState *state)
|
|||
return Ok;
|
||||
}
|
||||
|
||||
GpStatus WINGDIPAPI GdipBeginContainer2(GpGraphics *graphics, GraphicsContainer *state)
|
||||
GpStatus WINGDIPAPI GdipBeginContainer2(GpGraphics *graphics,
|
||||
GraphicsContainer *state)
|
||||
{
|
||||
FIXME("(%p, %p)\n", graphics, state);
|
||||
GraphicsContainerItem *container;
|
||||
GpStatus sts;
|
||||
|
||||
TRACE("(%p, %p)\n", graphics, state);
|
||||
|
||||
if(!graphics || !state)
|
||||
return InvalidParameter;
|
||||
|
||||
*state = 0xdeadbeef;
|
||||
sts = init_container(&container, graphics);
|
||||
if(sts != Ok)
|
||||
return sts;
|
||||
|
||||
list_add_head(&graphics->containers, &container->entry);
|
||||
*state = graphics->contid = container->contid;
|
||||
|
||||
return Ok;
|
||||
}
|
||||
|
||||
|
@ -3285,12 +3402,36 @@ GpStatus WINGDIPAPI GdipComment(GpGraphics *graphics, UINT sizeData, GDIPCONST B
|
|||
|
||||
GpStatus WINGDIPAPI GdipEndContainer(GpGraphics *graphics, GraphicsState state)
|
||||
{
|
||||
FIXME("(%p, 0x%x)\n", graphics, state);
|
||||
GpStatus sts;
|
||||
GraphicsContainerItem *container, *container2;
|
||||
|
||||
if(!graphics || !state)
|
||||
TRACE("(%p, %x)\n", graphics, state);
|
||||
|
||||
if(!graphics)
|
||||
return InvalidParameter;
|
||||
|
||||
return Ok;
|
||||
LIST_FOR_EACH_ENTRY(container, &graphics->containers, GraphicsContainerItem, entry){
|
||||
if(container->contid == state)
|
||||
break;
|
||||
}
|
||||
|
||||
/* did not find a matching container */
|
||||
if(&container->entry == &graphics->containers)
|
||||
return Ok;
|
||||
|
||||
/* remove all of the containers on top of the found container */
|
||||
LIST_FOR_EACH_ENTRY_SAFE(container, container2, &graphics->containers, GraphicsContainerItem, entry){
|
||||
if(container->contid == state)
|
||||
break;
|
||||
list_remove(&container->entry);
|
||||
delete_container(container);
|
||||
}
|
||||
|
||||
list_remove(&container->entry);
|
||||
sts = restore_container(graphics, container);
|
||||
delete_container(container);
|
||||
|
||||
return sts;
|
||||
}
|
||||
|
||||
GpStatus WINGDIPAPI GdipScaleWorldTransform(GpGraphics *graphics, REAL sx,
|
||||
|
|
|
@ -127,6 +127,7 @@ GpStatus WINGDIPAPI GdipFlush(GpGraphics*, GpFlushIntention);
|
|||
GpStatus WINGDIPAPI GdipBeginContainer(GpGraphics*,GDIPCONST GpRectF*,GDIPCONST GpRectF*,GpUnit,GraphicsContainer*);
|
||||
GpStatus WINGDIPAPI GdipBeginContainer2(GpGraphics*,GraphicsContainer*);
|
||||
GpStatus WINGDIPAPI GdipBeginContainerI(GpGraphics*,GDIPCONST GpRect*,GDIPCONST GpRect*,GpUnit,GraphicsContainer*);
|
||||
GpStatus WINGDIPAPI GdipEndContainer(GpGraphics*,GraphicsContainer);
|
||||
GpStatus WINGDIPAPI GdipComment(GpGraphics*,UINT,GDIPCONST BYTE*);
|
||||
GpStatus WINGDIPAPI GdipCreateFromHDC(HDC,GpGraphics**);
|
||||
GpStatus WINGDIPAPI GdipCreateFromHDC2(HDC,HANDLE,GpGraphics**);
|
||||
|
|
Loading…
Reference in New Issue