You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2175 lines
54 KiB
2175 lines
54 KiB
/**************************************************************************\
|
|
*
|
|
* Copyright (c) 1998 Microsoft Corporation
|
|
*
|
|
* Module Name:
|
|
*
|
|
* GDI+ private enumsruntime
|
|
*
|
|
* Abstract:
|
|
*
|
|
* Enums moved from sdkinc because we don't want them public.
|
|
*
|
|
* Revision History:
|
|
*
|
|
* 2/15/2k ericvan
|
|
* Created it.
|
|
*
|
|
\**************************************************************************/
|
|
|
|
#include "..\..\sdkinc\gdiplusenums.h"
|
|
|
|
enum EnumerationType
|
|
{
|
|
LinesAndBeziers = 0,
|
|
Flattened = 1,
|
|
Widened = 2
|
|
};
|
|
|
|
const UINT MAX_TEXT_CONTRAST_VALUE = 12;
|
|
const UINT DEFAULT_TEXT_CONTRAST = 4;
|
|
|
|
|
|
// UnitWorld and UnitDisplay are NOT valid as a srcUnit
|
|
inline BOOL
|
|
SrcUnitIsValid(
|
|
Unit unit
|
|
)
|
|
{
|
|
return ((unit >= UnitPixel) && (unit <= UnitMillimeter));
|
|
}
|
|
|
|
inline BOOL
|
|
MetafileFrameUnitIsValid(
|
|
MetafileFrameUnit frameUnit
|
|
)
|
|
{
|
|
return ((frameUnit >= MetafileFrameUnitPixel) && (frameUnit <= MetafileFrameUnitGdi));
|
|
}
|
|
|
|
inline BOOL
|
|
WrapModeIsValid(
|
|
WrapMode mode
|
|
)
|
|
{
|
|
return ((mode >= WrapModeTile) && (mode <= WrapModeClamp));
|
|
}
|
|
|
|
inline BOOL
|
|
CombineModeIsValid(
|
|
CombineMode combineMode
|
|
)
|
|
{
|
|
return ((combineMode >= CombineModeReplace) &&
|
|
(combineMode <= CombineModeComplement));
|
|
}
|
|
|
|
inline BOOL
|
|
MatrixOrderIsValid(
|
|
MatrixOrder order
|
|
)
|
|
{
|
|
return ((order == MatrixOrderPrepend) || (order == MatrixOrderAppend));
|
|
}
|
|
|
|
inline BOOL
|
|
EmfTypeIsValid(
|
|
EmfType type
|
|
)
|
|
{
|
|
return ((type >= EmfTypeEmfOnly) && (type <= EmfTypeEmfPlusDual));
|
|
}
|
|
|
|
inline BOOL
|
|
ColorAdjustTypeIsValid(
|
|
ColorAdjustType type
|
|
)
|
|
{
|
|
return ((type >= ColorAdjustTypeDefault) && (type < ColorAdjustTypeCount));
|
|
}
|
|
|
|
#if 0
|
|
GpStatus
|
|
WINGDIPAPI
|
|
GdipCreateRectGradient(
|
|
REAL x,
|
|
REAL y,
|
|
REAL width,
|
|
REAL height,
|
|
ARGB* colors,
|
|
GpWrapMode wrapMode,
|
|
GpRectGradient **rectgrad
|
|
)
|
|
{
|
|
CheckParameter(rectgrad && colors);
|
|
|
|
GpRectF rect(x, y, width, height);
|
|
|
|
GpColor gpcolor[4];
|
|
|
|
gpcolor[0].SetColor(colors[0]);
|
|
gpcolor[1].SetColor(colors[1]);
|
|
gpcolor[2].SetColor(colors[2]);
|
|
gpcolor[3].SetColor(colors[3]);
|
|
|
|
*rectgrad = new GpRectGradient(rect, gpcolor, wrapMode);
|
|
|
|
if (CheckValid(*rectgrad))
|
|
return Ok;
|
|
else
|
|
return OutOfMemory;
|
|
}
|
|
|
|
GpStatus
|
|
WINGDIPAPI
|
|
GdipCreateRectGradientI(
|
|
INT x,
|
|
INT y,
|
|
INT width,
|
|
INT height,
|
|
ARGB* colors,
|
|
GpWrapMode wrapMode,
|
|
GpRectGradient **rectgrad
|
|
)
|
|
{
|
|
return GdipCreateRectGradient(TOREAL(x),
|
|
TOREAL(y),
|
|
TOREAL(width),
|
|
TOREAL(height),
|
|
colors,
|
|
wrapMode,
|
|
rectgrad);
|
|
}
|
|
|
|
GpStatus
|
|
WINGDIPAPI
|
|
GdipGetRectGradientColor(
|
|
GpRectGradient *brush,
|
|
ARGB* colors
|
|
)
|
|
{
|
|
CheckParameter(colors);
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
|
|
GpColor gpcolor[4];
|
|
|
|
brush->GetColors(gpcolor);
|
|
|
|
colors[0] = gpcolor[0].GetValue();
|
|
colors[1] = gpcolor[1].GetValue();
|
|
colors[2] = gpcolor[2].GetValue();
|
|
colors[3] = gpcolor[3].GetValue();
|
|
|
|
return Ok;
|
|
}
|
|
|
|
GpStatus
|
|
WINGDIPAPI
|
|
GdipSetRectGradientColor(
|
|
GpRectGradient *brush,
|
|
ARGB* colors
|
|
)
|
|
{
|
|
CheckParameter(colors);
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
|
|
GpColor gpcolor[4];
|
|
|
|
gpcolor[0].SetColor(colors[0]);
|
|
gpcolor[1].SetColor(colors[1]);
|
|
gpcolor[2].SetColor(colors[2]);
|
|
gpcolor[3].SetColor(colors[3]);
|
|
|
|
brush->SetColors(gpcolor);
|
|
|
|
return Ok;
|
|
}
|
|
|
|
GpStatus
|
|
WINGDIPAPI
|
|
GdipGetRectGradientRect(
|
|
GpRectGradient *brush,
|
|
GpRectF *rect
|
|
)
|
|
{
|
|
CheckParameter(rect);
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
|
|
brush->GetRect(*rect);
|
|
|
|
return Ok;
|
|
}
|
|
|
|
GpStatus
|
|
WINGDIPAPI
|
|
GdipGetRectGradientRectI(
|
|
GpRectGradient *brush,
|
|
GpRect *rect
|
|
)
|
|
{
|
|
CheckParameter(rect);
|
|
|
|
GpRectF rectF;
|
|
|
|
GpStatus status = GdipGetRectGradientRect(brush, &rectF);
|
|
|
|
if (status == Ok)
|
|
{
|
|
FPUStateSaver fpuState;
|
|
|
|
rect->X = GpRound(rectF.X);
|
|
rect->Y = GpRound(rectF.Y);
|
|
rect->Width = GpRound(rectF.Width);
|
|
rect->Height = GpRound(rectF.Height);
|
|
}
|
|
|
|
return status;
|
|
}
|
|
|
|
GpStatus
|
|
WINGDIPAPI
|
|
GdipGetRectGradientBlendCountH(
|
|
GpRectGradient *brush,
|
|
INT *count
|
|
)
|
|
{
|
|
CheckParameter(count);
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
|
|
*count = brush->GetHorizontalBlendCount();
|
|
|
|
return Ok;
|
|
}
|
|
|
|
GpStatus
|
|
WINGDIPAPI
|
|
GdipGetRectGradientBlendH(
|
|
GpRectGradient *brush,
|
|
REAL *blend,
|
|
REAL *positions,
|
|
INT count
|
|
)
|
|
{
|
|
CheckParameter(blend);
|
|
CheckParameter(positions);
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
|
|
return brush->GetHorizontalBlend(blend, positions, count);
|
|
}
|
|
|
|
GpStatus
|
|
WINGDIPAPI
|
|
GdipSetRectGradientBlendH(
|
|
GpRectGradient *brush,
|
|
REAL *blend,
|
|
REAL *positions,
|
|
INT count
|
|
)
|
|
{
|
|
CheckParameter(blend);
|
|
CheckParameter(positions);
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
|
|
return brush->SetHorizontalBlend(blend, positions, count);
|
|
}
|
|
|
|
GpStatus
|
|
WINGDIPAPI
|
|
GdipGetRectGradientBlendCountV(
|
|
GpRectGradient *brush,
|
|
INT *count
|
|
)
|
|
{
|
|
CheckParameter(count > 0);
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
|
|
*count = brush->GetVerticalBlendCount();
|
|
|
|
return Ok;
|
|
}
|
|
|
|
GpStatus
|
|
WINGDIPAPI
|
|
GdipGetRectGradientBlendV(
|
|
GpRectGradient *brush,
|
|
REAL *blend,
|
|
REAL *positions,
|
|
INT count
|
|
)
|
|
{
|
|
CheckParameter(blend);
|
|
CheckParameter(positions);
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
|
|
return brush->GetVerticalBlend(blend, positions, count);
|
|
}
|
|
|
|
GpStatus
|
|
WINGDIPAPI
|
|
GdipSetRectGradientBlendV(
|
|
GpRectGradient *brush,
|
|
REAL *blend,
|
|
REAL *positions,
|
|
INT count
|
|
)
|
|
{
|
|
CheckParameter(blend);
|
|
CheckParameter(positions);
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
|
|
return brush->SetVerticalBlend(blend, positions, count);
|
|
}
|
|
|
|
GpStatus
|
|
WINGDIPAPI
|
|
GdipSetRectGradientWrapMode(
|
|
GpRectGradient *brush,
|
|
GpWrapMode wrapmode
|
|
)
|
|
{
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
|
|
brush->SetWrapMode(wrapmode);
|
|
|
|
return Ok;
|
|
}
|
|
|
|
GpStatus
|
|
WINGDIPAPI
|
|
GdipGetRectGradientWrapMode(
|
|
GpRectGradient *brush,
|
|
GpWrapMode *wrapmode
|
|
)
|
|
{
|
|
CheckParameter(wrapmode);
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
|
|
*wrapmode = (GpWrapMode)brush->GetWrapMode();
|
|
|
|
return Ok;
|
|
}
|
|
|
|
GpStatus
|
|
WINGDIPAPI
|
|
GdipSetRectGradientTransform(
|
|
GpRectGradient *brush,
|
|
GpMatrix *matrix
|
|
)
|
|
{
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
CheckParameterValid(matrix);
|
|
CheckObjectBusy(matrix);
|
|
|
|
brush->SetTransform(*matrix);
|
|
|
|
return Ok;
|
|
}
|
|
|
|
GpStatus
|
|
WINGDIPAPI
|
|
GdipGetRectGradientTransform(
|
|
GpRectGradient *brush,
|
|
GpMatrix *matrix
|
|
)
|
|
{
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
CheckParameterValid(matrix);
|
|
CheckObjectBusy(matrix);
|
|
|
|
brush->GetTransform(matrix);
|
|
|
|
return Ok;
|
|
}
|
|
|
|
GpStatus
|
|
WINGDIPAPI
|
|
GdipCreateRadialBrush(
|
|
GpRectF *gprect,
|
|
ARGB centercol,
|
|
ARGB boundarycol,
|
|
GpWrapMode wrapmode,
|
|
GpRadialGradient **radgrad
|
|
)
|
|
{
|
|
CheckParameter(radgrad && gprect);
|
|
|
|
GpColor center(centercol);
|
|
GpColor boundary(boundarycol);
|
|
|
|
*radgrad = new GpRadialGradient(*gprect, center, boundary, wrapmode);
|
|
|
|
if (CheckValid(*radgrad))
|
|
return Ok;
|
|
else
|
|
return OutOfMemory;
|
|
}
|
|
|
|
GpStatus
|
|
WINGDIPAPI
|
|
GdipCreateRadialBrushI(
|
|
GpRect *gprect,
|
|
ARGB centercol,
|
|
ARGB boundarycol,
|
|
GpWrapMode wrapmode,
|
|
GpRadialGradient **radgrad
|
|
)
|
|
{
|
|
CheckParameter(gprect);
|
|
|
|
GpRectF rectF(TOREAL(gprect->X),
|
|
TOREAL(gprect->Y),
|
|
TOREAL(gprect->Width),
|
|
TOREAL(gprect->Height));
|
|
|
|
return GdipCreateRadialBrush(&rectF,
|
|
centercol,
|
|
boundarycol,
|
|
wrapmode,
|
|
radgrad);
|
|
}
|
|
|
|
GpStatus
|
|
WINGDIPAPI
|
|
GdipSetRadialCenterColor(
|
|
GpRadialGradient *brush,
|
|
ARGB argb
|
|
)
|
|
{
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
|
|
GpColor center(argb);
|
|
|
|
brush->SetCenterColor(center);
|
|
|
|
return Ok;
|
|
}
|
|
|
|
GpStatus
|
|
WINGDIPAPI
|
|
GdipSetRadialBoundaryColor(
|
|
GpRadialGradient *brush,
|
|
ARGB argb
|
|
)
|
|
{
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
|
|
GpColor boundary(argb);
|
|
|
|
brush->SetBoundaryColor(boundary);
|
|
|
|
return Ok;
|
|
}
|
|
|
|
GpStatus
|
|
WINGDIPAPI
|
|
GdipGetRadialCenterColor(
|
|
GpRadialGradient *brush,
|
|
ARGB *argb
|
|
)
|
|
{
|
|
CheckParameter(argb);
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
|
|
GpColor center = brush->GetCenterColor();
|
|
|
|
*argb = center.GetValue();
|
|
|
|
return Ok;
|
|
}
|
|
|
|
GpStatus
|
|
WINGDIPAPI
|
|
GdipGetRadialBoundaryColor(
|
|
GpRadialGradient *brush,
|
|
ARGB *argb
|
|
)
|
|
{
|
|
CheckParameter(argb);
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
|
|
GpColor boundary = brush->GetBoundaryColor();
|
|
|
|
*argb = boundary.GetValue();
|
|
|
|
return Ok;
|
|
}
|
|
|
|
GpStatus
|
|
WINGDIPAPI
|
|
GdipGetRadialRect(
|
|
GpRadialGradient *brush,
|
|
GpRectF *rect
|
|
)
|
|
{
|
|
CheckParameter(rect);
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
|
|
brush->GetRect(*rect);
|
|
|
|
return Ok;
|
|
}
|
|
|
|
GpStatus
|
|
WINGDIPAPI
|
|
GdipGetRadialRectI(
|
|
GpRadialGradient *brush,
|
|
GpRect *rect
|
|
)
|
|
{
|
|
CheckParameter(rect);
|
|
|
|
GpRectF rectF;
|
|
|
|
GpStatus status = GdipGetRadialRect(brush, &rectF);
|
|
|
|
if (status == Ok)
|
|
{
|
|
FPUStateSaver fpuState;
|
|
|
|
rect->X = GpRound(rectF.X);
|
|
rect->Y = GpRound(rectF.Y);
|
|
rect->Width = GpRound(rectF.Width);
|
|
rect->Height = GpRound(rectF.Height);
|
|
}
|
|
|
|
return status;
|
|
}
|
|
|
|
GpStatus
|
|
WINGDIPAPI
|
|
GdipGetRadialBlendCount(
|
|
GpRadialGradient *brush,
|
|
INT *count
|
|
)
|
|
{
|
|
CheckParameter(count);
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
|
|
*count = brush->GetBlendCount();
|
|
|
|
return Ok;
|
|
}
|
|
|
|
GpStatus
|
|
WINGDIPAPI
|
|
GdipGetRadialBlend(
|
|
GpRadialGradient *brush,
|
|
REAL *blend,
|
|
REAL *positions,
|
|
INT count
|
|
)
|
|
{
|
|
CheckParameter(blend);
|
|
CheckParameter(positions);
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
|
|
return brush->GetBlend(blend, positions, count);
|
|
}
|
|
|
|
GpStatus
|
|
WINGDIPAPI
|
|
GdipSetRadialBlend(
|
|
GpRadialGradient *brush,
|
|
REAL *blend,
|
|
REAL *positions,
|
|
INT count
|
|
)
|
|
{
|
|
CheckParameter(blend);
|
|
CheckParameter(positions);
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
|
|
return brush->SetBlend(blend, positions, count);
|
|
}
|
|
|
|
GpStatus
|
|
WINGDIPAPI
|
|
GdipGetRadialPresetBlendCount(
|
|
GpRadialGradient *brush,
|
|
INT *count
|
|
)
|
|
{
|
|
CheckParameter(count);
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
|
|
*count = brush->GetPresetBlendCount();
|
|
|
|
return Ok;
|
|
}
|
|
|
|
GpStatus
|
|
WINGDIPAPI
|
|
GdipGetRadialPresetBlend(
|
|
GpRadialGradient *brush,
|
|
ARGB *blend,
|
|
REAL *blendPositions,
|
|
INT count
|
|
)
|
|
{
|
|
CheckParameter(blend);
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
|
|
StackBuffer buffer;
|
|
|
|
GpColor* gpcolors = (GpColor*) buffer.GetBuffer(count*sizeof(GpColor));
|
|
|
|
if(!gpcolors) return OutOfMemory;
|
|
|
|
if (gpcolors)
|
|
{
|
|
GpStatus status = brush->GetPresetBlend(gpcolors, blendPositions, count);
|
|
|
|
for(INT i = 0; i < count; i++)
|
|
{
|
|
blend[i] = gpcolors[i].GetValue();
|
|
}
|
|
|
|
return status;
|
|
}
|
|
else
|
|
return OutOfMemory;
|
|
}
|
|
|
|
GpStatus
|
|
WINGDIPAPI
|
|
GdipSetRadialPresetBlend(
|
|
GpRadialGradient *brush,
|
|
ARGB *blend,
|
|
REAL* blendPositions, INT count )
|
|
{
|
|
CheckParameter(blend);
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
|
|
StackBuffer buffer;
|
|
|
|
GpColor* gpcolors = (GpColor*) buffer.GetBuffer(count*sizeof(GpColor));
|
|
|
|
if(!gpcolors) return OutOfMemory;
|
|
|
|
if (gpcolors)
|
|
{
|
|
for(INT i = 0; i < count; i++)
|
|
{
|
|
gpcolors[i].SetColor(blend[i]);
|
|
}
|
|
|
|
GpStatus status = brush->SetPresetBlend(gpcolors, blendPositions, count);
|
|
|
|
return status;
|
|
}
|
|
else
|
|
return OutOfMemory;
|
|
}
|
|
|
|
GpStatus
|
|
WINGDIPAPI
|
|
GdipSetRadialSigmaBlend(
|
|
GpRadialGradient *brush,
|
|
REAL focus,
|
|
REAL scale
|
|
)
|
|
{
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
|
|
return brush->SetSigmaBlend(focus, scale);
|
|
}
|
|
|
|
GpStatus
|
|
WINGDIPAPI
|
|
GdipSetRadialLinearBlend(
|
|
GpRadialGradient *brush,
|
|
REAL focus,
|
|
REAL scale
|
|
)
|
|
{
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
|
|
return brush->SetLinearBlend(focus, scale);
|
|
}
|
|
|
|
GpStatus
|
|
WINGDIPAPI
|
|
GdipSetRadialWrapMode(
|
|
GpRadialGradient *brush,
|
|
GpWrapMode wrapmode
|
|
)
|
|
{
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
|
|
brush->SetWrapMode(wrapmode);
|
|
|
|
return Ok;
|
|
}
|
|
|
|
GpStatus
|
|
WINGDIPAPI
|
|
GdipGetRadialWrapMode(
|
|
GpRadialGradient *brush,
|
|
GpWrapMode *wrapmode
|
|
)
|
|
{
|
|
CheckParameter(wrapmode);
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
|
|
*wrapmode = (GpWrapMode)brush->GetWrapMode();
|
|
|
|
return Ok;
|
|
}
|
|
|
|
GpStatus
|
|
WINGDIPAPI
|
|
GdipSetRadialTransform(
|
|
GpRadialGradient *brush,
|
|
GpMatrix *matrix
|
|
)
|
|
{
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
CheckParameterValid(matrix);
|
|
CheckObjectBusy(matrix);
|
|
|
|
brush->SetTransform(*matrix);
|
|
|
|
return Ok;
|
|
}
|
|
|
|
GpStatus
|
|
WINGDIPAPI
|
|
GdipGetRadialTransform(
|
|
GpRadialGradient *brush,
|
|
GpMatrix *matrix
|
|
)
|
|
{
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
CheckParameterValid(matrix);
|
|
CheckObjectBusy(matrix);
|
|
|
|
brush->GetTransform(matrix);
|
|
|
|
return Ok;
|
|
}
|
|
|
|
GpStatus
|
|
WINGDIPAPI
|
|
GdipCreateTriangleGradient(
|
|
GpPointF* points,
|
|
ARGB* colors,
|
|
GpWrapMode wrapMode,
|
|
GpTriangleGradient **trigrad
|
|
)
|
|
{
|
|
CheckParameter(points && trigrad && colors);
|
|
|
|
GpColor gpcolor[3];
|
|
|
|
gpcolor[0].SetColor(colors[0]);
|
|
gpcolor[1].SetColor(colors[1]);
|
|
gpcolor[2].SetColor(colors[2]);
|
|
|
|
*trigrad = new GpTriangleGradient(points, gpcolor, wrapMode);
|
|
|
|
if (CheckValid(*trigrad))
|
|
return Ok;
|
|
else
|
|
return OutOfMemory;
|
|
}
|
|
|
|
GpStatus
|
|
WINGDIPAPI
|
|
GdipCreateTriangleGradientI(
|
|
GpPoint* points,
|
|
ARGB* colors,
|
|
GpWrapMode wrapMode,
|
|
GpTriangleGradient **trigrad
|
|
)
|
|
{
|
|
CheckParameter(points);
|
|
|
|
GpPointF pointsF[3];
|
|
|
|
pointsF[0].X = TOREAL(points[0].X);
|
|
pointsF[0].Y = TOREAL(points[0].Y);
|
|
pointsF[1].X = TOREAL(points[1].X);
|
|
pointsF[1].Y = TOREAL(points[1].Y);
|
|
pointsF[2].X = TOREAL(points[2].X);
|
|
pointsF[2].Y = TOREAL(points[2].Y);
|
|
|
|
return GdipCreateTriangleGradient(&pointsF[0], colors, wrapMode, trigrad);
|
|
}
|
|
|
|
GpStatus
|
|
GdipGetTriangleGradientColor(
|
|
GpTriangleGradient *brush,
|
|
ARGB* colors
|
|
)
|
|
{
|
|
CheckParameter(colors);
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
|
|
GpColor gpcolor[3];
|
|
|
|
brush->GetColors(gpcolor);
|
|
|
|
colors[0] = gpcolor[0].GetValue();
|
|
colors[1] = gpcolor[1].GetValue();
|
|
colors[2] = gpcolor[2].GetValue();
|
|
|
|
return Ok;
|
|
}
|
|
|
|
GpStatus
|
|
GdipSetTriangleGradientColor(
|
|
GpTriangleGradient *brush,
|
|
ARGB* colors
|
|
)
|
|
{
|
|
CheckParameter(colors);
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
|
|
GpColor gpcolor[3];
|
|
|
|
gpcolor[0].SetColor(colors[0]);
|
|
gpcolor[1].SetColor(colors[1]);
|
|
gpcolor[2].SetColor(colors[2]);
|
|
|
|
brush->SetColors(gpcolor);
|
|
|
|
return Ok;
|
|
}
|
|
|
|
GpStatus
|
|
GdipGetTriangleGradientTriangle(
|
|
GpTriangleGradient *brush,
|
|
GpPointF* points
|
|
)
|
|
{
|
|
CheckParameter(points);
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
|
|
brush->GetTriangle(points);
|
|
|
|
return Ok;
|
|
}
|
|
|
|
GpStatus
|
|
GdipGetTriangleGradientTriangleI(
|
|
GpTriangleGradient *brush,
|
|
GpPoint* points
|
|
)
|
|
{
|
|
CheckParameter(points);
|
|
|
|
GpPointF pointsF[3];
|
|
|
|
GpStatus status = GdipGetTriangleGradientTriangle(brush, &pointsF[0]);
|
|
|
|
if (status == Ok)
|
|
{
|
|
FPUStateSaver fpuState;
|
|
|
|
points[0].X = GpRound(pointsF[0].X);
|
|
points[0].Y = GpRound(pointsF[0].Y);
|
|
points[1].X = GpRound(pointsF[1].X);
|
|
points[1].Y = GpRound(pointsF[1].Y);
|
|
points[2].X = GpRound(pointsF[2].X);
|
|
points[2].Y = GpRound(pointsF[2].Y);
|
|
}
|
|
|
|
return status;
|
|
}
|
|
|
|
GpStatus
|
|
GdipSetTriangleGradientTriangle(
|
|
GpTriangleGradient *brush,
|
|
GpPointF* points
|
|
)
|
|
{
|
|
CheckParameter(points);
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
|
|
brush->SetTriangle(points);
|
|
|
|
return Ok;
|
|
}
|
|
|
|
GpStatus
|
|
GdipSetTriangleGradientTriangleI(
|
|
GpTriangleGradient *brush,
|
|
GpPoint* points
|
|
)
|
|
{
|
|
CheckParameter(points);
|
|
|
|
GpPointF pointsF[3];
|
|
|
|
pointsF[0].X = TOREAL(points[0].X);
|
|
pointsF[0].Y = TOREAL(points[0].Y);
|
|
pointsF[1].X = TOREAL(points[1].X);
|
|
pointsF[1].Y = TOREAL(points[1].Y);
|
|
pointsF[2].X = TOREAL(points[2].X);
|
|
pointsF[2].Y = TOREAL(points[2].Y);
|
|
|
|
return GdipSetTriangleGradientTriangle(brush, &pointsF[0]);
|
|
}
|
|
|
|
GpStatus
|
|
GdipGetTriangleGradientRect(
|
|
GpTriangleGradient *brush,
|
|
GpRectF *rect
|
|
)
|
|
{
|
|
CheckParameter(rect);
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
|
|
brush->GetRect(*rect);
|
|
|
|
return Ok;
|
|
}
|
|
|
|
GpStatus
|
|
GdipGetTriangleGradientRectI(
|
|
GpTriangleGradient *brush,
|
|
GpRect *rect
|
|
)
|
|
{
|
|
CheckParameter(rect);
|
|
|
|
GpRectF rectf;
|
|
|
|
GpStatus status = GdipGetTriangleGradientRect(brush, &rectf);
|
|
|
|
if (status == Ok)
|
|
{
|
|
FPUStateSaver fpuState;
|
|
|
|
rect->X = GpRound(rectf.X);
|
|
rect->Y = GpRound(rectf.Y);
|
|
rect->Width = GpRound(rectf.Width);
|
|
rect->Height = GpRound(rectf.Height);
|
|
}
|
|
|
|
return status;
|
|
}
|
|
|
|
GpStatus
|
|
GdipGetTriangleGradientBlendCount0(
|
|
GpTriangleGradient *brush,
|
|
INT *count
|
|
)
|
|
{
|
|
CheckParameter(count);
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
|
|
*count = brush->GetBlendCount0();
|
|
|
|
return Ok;
|
|
}
|
|
|
|
GpStatus
|
|
GdipGetTriangleGradientBlend0(
|
|
GpTriangleGradient *brush,
|
|
REAL *blend,
|
|
REAL *positions,
|
|
INT count
|
|
)
|
|
{
|
|
CheckParameter(blend);
|
|
CheckParameter(positions);
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
|
|
return brush->GetBlend0(blend, positions, count);
|
|
}
|
|
|
|
GpStatus
|
|
GdipSetTriangleGradientBlend0(
|
|
GpTriangleGradient *brush,
|
|
REAL *blend,
|
|
REAL *positions,
|
|
INT count
|
|
)
|
|
{
|
|
CheckParameter(blend);
|
|
CheckParameter(positions);
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
|
|
return brush->SetBlend0(blend, positions, count);
|
|
}
|
|
|
|
GpStatus
|
|
GdipGetTriangleGradientBlendCount1(
|
|
GpTriangleGradient *brush,
|
|
INT *count
|
|
)
|
|
{
|
|
CheckParameter(count);
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
|
|
*count = brush->GetBlendCount1();
|
|
|
|
return Ok;
|
|
}
|
|
|
|
GpStatus
|
|
GdipGetTriangleGradientBlend1(
|
|
GpTriangleGradient *brush,
|
|
REAL *blend,
|
|
REAL *positions,
|
|
INT count
|
|
)
|
|
{
|
|
CheckParameter(blend);
|
|
CheckParameter(positions);
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
|
|
return brush->GetBlend1(blend, positions, count);
|
|
}
|
|
|
|
GpStatus
|
|
GdipSetTriangleGradientBlend1(
|
|
GpTriangleGradient *brush,
|
|
REAL *blend,
|
|
REAL *positions,
|
|
INT count
|
|
)
|
|
{
|
|
CheckParameter(blend);
|
|
CheckParameter(positions);
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
|
|
return brush->SetBlend1(blend, positions, count);
|
|
}
|
|
|
|
GpStatus
|
|
GdipGetTriangleGradientBlendCount2(
|
|
GpTriangleGradient *brush,
|
|
INT *count
|
|
)
|
|
{
|
|
CheckParameter(count);
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
|
|
*count = brush->GetBlendCount2();
|
|
|
|
return Ok;
|
|
}
|
|
|
|
GpStatus
|
|
GdipGetTriangleGradientBlend2(
|
|
GpTriangleGradient *brush,
|
|
REAL *blend,
|
|
REAL *positions,
|
|
INT count
|
|
)
|
|
{
|
|
CheckParameter(blend);
|
|
CheckParameter(positions);
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
|
|
return brush->GetBlend2(blend, positions, count);
|
|
}
|
|
|
|
GpStatus
|
|
GdipSetTriangleGradientBlend2(
|
|
GpTriangleGradient *brush,
|
|
REAL *blend,
|
|
REAL *positions,
|
|
INT count
|
|
)
|
|
{
|
|
CheckParameter(blend);
|
|
CheckParameter(positions);
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
|
|
return brush->SetBlend2(blend, positions, count);
|
|
}
|
|
|
|
GpStatus
|
|
GdipGetTriangleGradientWrapMode(
|
|
GpTriangleGradient *brush,
|
|
GpWrapMode *wrapmode
|
|
)
|
|
{
|
|
CheckParameter(wrapmode);
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
|
|
*wrapmode = (GpWrapMode)brush->GetWrapMode();
|
|
|
|
return Ok;
|
|
}
|
|
|
|
GpStatus
|
|
GdipSetTriangleGradientWrapMode(
|
|
GpTriangleGradient *brush,
|
|
GpWrapMode wrapmode
|
|
)
|
|
{
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
|
|
brush->SetWrapMode(wrapmode);
|
|
|
|
return Ok;
|
|
}
|
|
|
|
GpStatus
|
|
GdipGetTriangleGradientTransform(
|
|
GpTriangleGradient *brush,
|
|
GpMatrix *matrix
|
|
)
|
|
{
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
CheckParameterValid(matrix);
|
|
CheckObjectBusy(matrix);
|
|
|
|
brush->GetTransform(matrix);
|
|
|
|
return Ok;
|
|
}
|
|
|
|
GpStatus
|
|
GdipSetTriangleGradientTransform(
|
|
GpTriangleGradient *brush,
|
|
GpMatrix *matrix
|
|
)
|
|
{
|
|
CheckParameterValid(brush);
|
|
CheckObjectBusy(brush);
|
|
CheckParameterValid(matrix);
|
|
CheckObjectBusy(matrix);
|
|
|
|
brush->SetTransform(*matrix);
|
|
|
|
return Ok;
|
|
}
|
|
|
|
// For reference in V2
|
|
|
|
/**
|
|
* Represent line texture objects
|
|
*/
|
|
class LineTexture
|
|
{
|
|
public:
|
|
friend class Pen;
|
|
|
|
/**
|
|
* Create a new line texture object
|
|
*/
|
|
// !! Take Image* instead?
|
|
LineTexture(const Bitmap* bitmap,
|
|
REAL length)
|
|
{
|
|
GpLineTexture *lineTexture = NULL;
|
|
|
|
lastResult = DllExports::GdipCreateLineTexture((GpBitmap*)
|
|
bitmap->nativeImage,
|
|
length,
|
|
0,
|
|
&lineTexture);
|
|
SetNativeLineTexture(lineTexture);
|
|
}
|
|
|
|
LineTexture(const Bitmap* bitmap,
|
|
REAL length,
|
|
REAL offset)
|
|
{
|
|
GpLineTexture *lineTexture = NULL;
|
|
|
|
lastResult = DllExports::GdipCreateLineTexture((GpBitmap*)
|
|
bitmap->nativeImage,
|
|
length,
|
|
offset,
|
|
&lineTexture);
|
|
SetNativeLineTexture(lineTexture);
|
|
}
|
|
|
|
LineTexture* Clone() const
|
|
{
|
|
GpLineTexture *cloneLineTexture = NULL;
|
|
|
|
SetStatus(DllExports::GdipCloneLineTexture(nativeLineTexture,
|
|
&cloneLineTexture));
|
|
|
|
return new LineTexture(cloneLineTexture, lastResult);
|
|
}
|
|
|
|
/**
|
|
* Dispose of resources associated with the line texture
|
|
*/
|
|
~LineTexture()
|
|
{
|
|
DllExports::GdipDeleteLineTexture(nativeLineTexture);
|
|
}
|
|
|
|
/**
|
|
* Get line texture attributes
|
|
*/
|
|
Bitmap* GetBitmap() const
|
|
{
|
|
SetStatus(NotImplemented);
|
|
|
|
return NULL;
|
|
}
|
|
|
|
REAL GetLength() const
|
|
{
|
|
REAL len = 0;
|
|
|
|
SetStatus(DllExports::GdipGetLineTextureLength(nativeLineTexture,
|
|
&len));
|
|
return len;
|
|
}
|
|
|
|
REAL GetOffset() const
|
|
{
|
|
REAL offset = 0;
|
|
|
|
SetStatus(DllExports::GdipGetLineTextureOffset(nativeLineTexture,
|
|
&offset));
|
|
return offset;
|
|
}
|
|
|
|
Status GetLastStatus() const
|
|
{
|
|
Status lastStatus = lastResult;
|
|
lastResult = Ok;
|
|
|
|
return lastStatus;
|
|
}
|
|
|
|
protected:
|
|
LineTexture(GpLineTexture* lineTexture, Status status)
|
|
{
|
|
lastResult = status;
|
|
SetNativeLineTexture(lineTexture);
|
|
}
|
|
|
|
VOID SetNativeLineTexture(GpLineTexture *lineTexture)
|
|
{
|
|
nativeLineTexture = lineTexture;
|
|
}
|
|
|
|
Status SetStatus(Status status) const
|
|
{
|
|
if (status != Ok)
|
|
return (lastResult = status);
|
|
else
|
|
return status;
|
|
}
|
|
|
|
private:
|
|
/*
|
|
* handle to native line texture object
|
|
*/
|
|
|
|
GpLineTexture* nativeLineTexture;
|
|
mutable Status lastResult;
|
|
};
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Represent triangular gradient brush object
|
|
//--------------------------------------------------------------------------
|
|
|
|
class TriangleGradientBrush : public Brush
|
|
{
|
|
public:
|
|
friend class Pen;
|
|
|
|
// Constructors
|
|
|
|
TriangleGradientBrush(
|
|
const PointF* points,
|
|
const Color* colors,
|
|
WrapMode wrapMode = WrapModeClamp)
|
|
{
|
|
ARGB argb[3];
|
|
|
|
argb[0] = colors[0].GetValue();
|
|
argb[1] = colors[1].GetValue();
|
|
argb[2] = colors[2].GetValue();
|
|
|
|
GpTriangleGradient *brush = NULL;
|
|
|
|
lastResult = DllExports::GdipCreateTriangleGradient(
|
|
points, argb,
|
|
wrapMode, &brush);
|
|
SetNativeBrush(brush);
|
|
}
|
|
|
|
TriangleGradientBrush(
|
|
const Point* points,
|
|
const Color* colors,
|
|
WrapMode wrapMode = WrapModeClamp)
|
|
{
|
|
ARGB argb[3];
|
|
|
|
argb[0] = colors[0].GetValue();
|
|
argb[1] = colors[1].GetValue();
|
|
argb[2] = colors[2].GetValue();
|
|
|
|
GpTriangleGradient *brush = NULL;
|
|
|
|
lastResult = DllExports::GdipCreateTriangleGradientI(
|
|
points, argb,
|
|
wrapMode, &brush);
|
|
SetNativeBrush(brush);
|
|
}
|
|
|
|
// Get/set colors
|
|
|
|
Status GetColors(Color colors[]) const
|
|
{
|
|
ARGB argb[3];
|
|
|
|
SetStatus(DllExports::GdipGetTriangleGradientColor(
|
|
(GpTriangleGradient*) nativeBrush, argb));
|
|
|
|
if (lastResult == Ok)
|
|
{
|
|
// use bitwise copy operator for Color copy
|
|
colors[0] = Color(argb[0]);
|
|
colors[1] = Color(argb[1]);
|
|
colors[2] = Color(argb[2]);
|
|
}
|
|
|
|
return lastResult;
|
|
}
|
|
|
|
Status SetColors(Color colors[])
|
|
{
|
|
ARGB argb[3];
|
|
|
|
argb[0] = colors[0].GetValue();
|
|
argb[1] = colors[1].GetValue();
|
|
argb[2] = colors[2].GetValue();
|
|
|
|
return SetStatus(DllExports::GdipSetTriangleGradientColor(
|
|
(GpTriangleGradient*)nativeBrush, argb));
|
|
}
|
|
|
|
// Get/set triangle
|
|
|
|
Status GetTriangle(PointF* points) const
|
|
{
|
|
return SetStatus(DllExports::GdipGetTriangleGradientTriangle(
|
|
(GpTriangleGradient*)nativeBrush, points));
|
|
}
|
|
|
|
Status GetTriangle(Point* points) const
|
|
{
|
|
return SetStatus(DllExports::GdipGetTriangleGradientTriangleI(
|
|
(GpTriangleGradient*)nativeBrush, points));
|
|
}
|
|
|
|
Status SetTriangle(PointF* points)
|
|
{
|
|
return SetStatus(DllExports::GdipSetTriangleGradientTriangle(
|
|
(GpTriangleGradient*)nativeBrush, points));
|
|
}
|
|
|
|
Status SetTriangle(Point* points)
|
|
{
|
|
return SetStatus(DllExports::GdipSetTriangleGradientTriangleI(
|
|
(GpTriangleGradient*)nativeBrush, points));
|
|
}
|
|
|
|
Status GetRectangle(RectF& rect) const
|
|
{
|
|
return SetStatus(DllExports::GdipGetTriangleGradientRect(
|
|
(GpTriangleGradient*)nativeBrush, &rect));
|
|
}
|
|
|
|
Status GetRectangle(Rect& rect) const
|
|
{
|
|
return SetStatus(DllExports::GdipGetTriangleGradientRectI(
|
|
(GpTriangleGradient*)nativeBrush, &rect));
|
|
}
|
|
|
|
// Get/set blend factors
|
|
//
|
|
// If the blendFactors.length = 1, then it's treated
|
|
// as the falloff parameter. Otherwise, it's the array
|
|
// of blend factors.
|
|
|
|
// NOTE: Differing semantics from COM+ version where we return
|
|
// an array containing the implicit length value.
|
|
|
|
INT GetBlendCount0() const
|
|
{
|
|
INT count = 0;
|
|
|
|
SetStatus(DllExports::GdipGetTriangleGradientBlendCount0(
|
|
(GpTriangleGradient*) nativeBrush, &count));
|
|
|
|
return count;
|
|
}
|
|
|
|
Status GetBlend0(REAL** blendFactors, REAL** blendPositions, INT count) const
|
|
{
|
|
if (!blendFactors || !blendPositions || count <= 0)
|
|
return SetStatus(InvalidParameter);
|
|
|
|
*blendFactors = new REAL[count];
|
|
*blendPositions = new REAL[count];
|
|
|
|
if (!*blendFactors || !*blendPositions)
|
|
{
|
|
if (*blendFactors)
|
|
delete[] *blendFactors;
|
|
if (*blendPositions)
|
|
delete[] *blendPositions;
|
|
|
|
return SetStatus(OutOfMemory);
|
|
}
|
|
|
|
Status status = SetStatus(DllExports::GdipGetTriangleGradientBlend0(
|
|
(GpTriangleGradient*)nativeBrush,
|
|
*blendFactors, *blendPositions, count));
|
|
|
|
if (status != Ok)
|
|
{
|
|
delete[] *blendFactors;
|
|
*blendFactors = NULL;
|
|
delete[] *blendPositions;
|
|
*blendPositions = NULL;
|
|
}
|
|
|
|
return status;
|
|
}
|
|
|
|
Status SetBlend0(REAL* blendFactors, REAL* blendPositions, INT count)
|
|
{
|
|
return SetStatus(DllExports::GdipSetTriangleGradientBlend0(
|
|
(GpTriangleGradient*)nativeBrush,
|
|
blendFactors, blendPositions, count));
|
|
}
|
|
|
|
INT GetBlendCount1() const
|
|
{
|
|
INT count = 0;
|
|
|
|
SetStatus(DllExports::GdipGetTriangleGradientBlendCount1(
|
|
(GpTriangleGradient*) nativeBrush, &count));
|
|
|
|
return count;
|
|
}
|
|
|
|
Status GetBlend1(REAL** blendFactors, REAL** blendPositions, INT count) const
|
|
{
|
|
if (!blendFactors || !blendPositions || count <= 0)
|
|
return SetStatus(InvalidParameter);
|
|
|
|
*blendFactors = new REAL[count];
|
|
*blendPositions = new REAL[count];
|
|
|
|
if (!*blendFactors || !*blendPositions)
|
|
{
|
|
if (*blendFactors)
|
|
delete[] *blendFactors;
|
|
if (*blendPositions)
|
|
delete[] *blendPositions;
|
|
|
|
return SetStatus(OutOfMemory);
|
|
}
|
|
|
|
Status status = SetStatus(DllExports::GdipGetTriangleGradientBlend1(
|
|
(GpTriangleGradient*)nativeBrush,
|
|
*blendFactors, *blendPositions, count));
|
|
if (status != Ok)
|
|
{
|
|
delete[] *blendFactors;
|
|
*blendFactors = NULL;
|
|
delete[] *blendPositions;
|
|
*blendPositions = NULL;
|
|
}
|
|
|
|
return status;
|
|
}
|
|
|
|
Status SetBlend1(REAL* blendFactors, REAL* blendPositions, INT count)
|
|
{
|
|
return SetStatus(DllExports::GdipSetTriangleGradientBlend1(
|
|
(GpTriangleGradient*)nativeBrush,
|
|
blendFactors, blendPositions, count));
|
|
}
|
|
|
|
INT GetBlendCount2() const
|
|
{
|
|
INT count = 0;
|
|
|
|
SetStatus(DllExports::GdipGetTriangleGradientBlendCount2(
|
|
(GpTriangleGradient*) nativeBrush, &count));
|
|
|
|
return count;
|
|
}
|
|
|
|
Status GetBlend2(REAL** blendFactors, REAL** blendPositions, INT count) const
|
|
{
|
|
if (!blendFactors || !blendPositions || count <= 0)
|
|
return SetStatus(InvalidParameter);
|
|
|
|
*blendFactors = new REAL[count];
|
|
*blendPositions = new REAL[count];
|
|
|
|
if (!*blendFactors || !*blendPositions)
|
|
{
|
|
if (*blendFactors)
|
|
delete[] *blendFactors;
|
|
if (*blendPositions)
|
|
delete[] *blendPositions;
|
|
return SetStatus(OutOfMemory);
|
|
}
|
|
|
|
Status status = SetStatus(DllExports::GdipGetTriangleGradientBlend2(
|
|
(GpTriangleGradient*)nativeBrush,
|
|
*blendFactors, *blendPositions, count));
|
|
|
|
if (status != Ok)
|
|
{
|
|
delete[] *blendFactors;
|
|
*blendFactors = NULL;
|
|
delete[] *blendPositions;
|
|
*blendPositions = NULL;
|
|
}
|
|
|
|
return status;
|
|
}
|
|
|
|
Status SetBlend2(REAL* blendFactors, REAL* blendPositions, INT count)
|
|
{
|
|
return SetStatus(DllExports::GdipSetTriangleGradientBlend2(
|
|
(GpTriangleGradient*)nativeBrush,
|
|
blendFactors, blendPositions, count));
|
|
}
|
|
|
|
// Check the opacity of this brush element.
|
|
|
|
/**
|
|
* Get/set brush transform
|
|
*/
|
|
Status GetTransform(Matrix *matrix) const
|
|
{
|
|
return SetStatus(DllExports::GdipGetTriangleGradientTransform(
|
|
(GpTriangleGradient*) nativeBrush, matrix->nativeMatrix));
|
|
}
|
|
|
|
Status SetTransform(const Matrix* matrix)
|
|
{
|
|
return SetStatus(DllExports::GdipSetTriangleGradientTransform(
|
|
(GpTriangleGradient*) nativeBrush, matrix->nativeMatrix));
|
|
}
|
|
|
|
|
|
/**
|
|
* Get/set brush wrapping mode
|
|
*/
|
|
WrapMode GetWrapMode() const
|
|
{
|
|
WrapMode wrapMode;
|
|
|
|
SetStatus(DllExports::GdipGetTriangleGradientWrapMode(
|
|
(GpTriangleGradient*) nativeBrush, &wrapMode));
|
|
|
|
return wrapMode;
|
|
}
|
|
|
|
Status SetWrapMode(WrapMode wrapMode)
|
|
{
|
|
return SetStatus(DllExports::GdipSetTriangleGradientWrapMode(
|
|
(GpTriangleGradient*) nativeBrush, wrapMode));
|
|
}
|
|
|
|
protected:
|
|
|
|
TriangleGradientBrush()
|
|
{
|
|
}
|
|
};
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Represent rectangular gradient brush object
|
|
//--------------------------------------------------------------------------
|
|
class RectangleGradientBrush : public Brush
|
|
{
|
|
public:
|
|
friend class Pen;
|
|
|
|
// Constructors
|
|
|
|
RectangleGradientBrush(const RectF& rect,
|
|
const Color* colors,
|
|
WrapMode wrapMode = WrapModeTile)
|
|
{
|
|
ARGB argb[4];
|
|
|
|
argb[0] = colors[0].GetValue();
|
|
argb[1] = colors[1].GetValue();
|
|
argb[2] = colors[2].GetValue();
|
|
argb[3] = colors[3].GetValue();
|
|
|
|
GpRectGradient *brush = NULL;
|
|
|
|
lastResult = DllExports::GdipCreateRectGradient(rect.X,
|
|
rect.Y,
|
|
rect.Width,
|
|
rect.Height,
|
|
argb,
|
|
wrapMode,
|
|
&brush);
|
|
SetNativeBrush(brush);
|
|
}
|
|
|
|
// integer version
|
|
RectangleGradientBrush(const Rect& rect,
|
|
const Color* colors,
|
|
WrapMode wrapMode = WrapModeTile)
|
|
{
|
|
ARGB argb[4];
|
|
|
|
argb[0] = colors[0].GetValue();
|
|
argb[1] = colors[1].GetValue();
|
|
argb[2] = colors[2].GetValue();
|
|
argb[3] = colors[3].GetValue();
|
|
|
|
GpRectGradient *brush = NULL;
|
|
|
|
lastResult = DllExports::GdipCreateRectGradientI(rect.X,
|
|
rect.Y,
|
|
rect.Width,
|
|
rect.Height,
|
|
argb,
|
|
wrapMode,
|
|
&brush);
|
|
SetNativeBrush(brush);
|
|
}
|
|
|
|
// Get/set colors
|
|
|
|
Status SetColors(const Color colors[])
|
|
{
|
|
ARGB argb[4];
|
|
|
|
argb[0] = colors[0].GetValue();
|
|
argb[1] = colors[1].GetValue();
|
|
argb[2] = colors[2].GetValue();
|
|
argb[3] = colors[3].GetValue();
|
|
|
|
return SetStatus(DllExports::GdipSetRectGradientColor(
|
|
(GpRectGradient*)nativeBrush,
|
|
argb));
|
|
}
|
|
|
|
Status GetColors(Color colors[]) const
|
|
{
|
|
ARGB argb[4];
|
|
|
|
SetStatus(DllExports::GdipGetRectGradientColor((GpRectGradient*)
|
|
nativeBrush,
|
|
argb));
|
|
|
|
if (lastResult == Ok)
|
|
{
|
|
// use bitwise copy operator for Color copy
|
|
colors[0] = Color(argb[0]);
|
|
colors[1] = Color(argb[1]);
|
|
colors[2] = Color(argb[2]);
|
|
colors[3] = Color(argb[3]);
|
|
}
|
|
|
|
return lastResult;
|
|
}
|
|
|
|
|
|
Status GetRectangle(RectF& rect) const
|
|
{
|
|
return SetStatus(DllExports::GdipGetRectGradientRect((GpRectGradient*)nativeBrush,
|
|
&rect));
|
|
}
|
|
|
|
Status GetRectangle(Rect& rect) const
|
|
{
|
|
return SetStatus(DllExports::GdipGetRectGradientRectI((GpRectGradient*)nativeBrush,
|
|
&rect));
|
|
}
|
|
|
|
// Get/set blend factors
|
|
//
|
|
// If the blendFactors.length = 1, then it's treated
|
|
// as the falloff parameter. Otherwise, it's the array
|
|
// of blend factors.
|
|
|
|
// NOTE: Differing semantics from COM+ version where we return
|
|
// an array containing the implicit length value.
|
|
|
|
INT GetHorizontalBlendCount() const
|
|
{
|
|
INT count = 0;
|
|
|
|
SetStatus(DllExports::GdipGetRectGradientBlendCountH((GpRectGradient*)
|
|
nativeBrush,
|
|
&count));
|
|
return count;
|
|
}
|
|
|
|
Status GetHorizontalBlend(REAL** blendFactors, REAL** blendPositions, INT count) const
|
|
{
|
|
if (!blendFactors || !blendPositions || count <= 0)
|
|
return SetStatus(InvalidParameter);
|
|
|
|
*blendFactors = new REAL[count];
|
|
*blendPositions = new REAL[count];
|
|
|
|
if (!*blendFactors || !*blendPositions)
|
|
{
|
|
if (*blendFactors)
|
|
delete *blendFactors;
|
|
if (*blendPositions)
|
|
delete *blendPositions;
|
|
return SetStatus(OutOfMemory);
|
|
}
|
|
|
|
Status status = SetStatus(DllExports::GdipGetRectGradientBlendH((GpRectGradient*)nativeBrush,
|
|
*blendFactors, *blendPositions, count));
|
|
|
|
if (status != Ok)
|
|
{
|
|
delete[] *blendFactors;
|
|
*blendFactors = NULL;
|
|
delete[] *blendPositions;
|
|
*blendPositions = NULL;
|
|
}
|
|
|
|
return status;
|
|
}
|
|
|
|
Status SetHorizontalBlend(const REAL* blendFactors, const REAL* blendPositions, INT count)
|
|
{
|
|
return SetStatus(DllExports::GdipSetRectGradientBlendH((GpRectGradient*)nativeBrush,
|
|
blendFactors, blendPositions, count));
|
|
}
|
|
|
|
INT GetVerticalBlendCount() const
|
|
{
|
|
INT count = 0;
|
|
|
|
SetStatus(DllExports::GdipGetRectGradientBlendCountV((GpRectGradient*)
|
|
nativeBrush,
|
|
&count));
|
|
return count;
|
|
}
|
|
|
|
Status GetVerticalBlend(REAL** blendFactors, REAL** blendPositions, INT count) const
|
|
{
|
|
if (!blendFactors || !blendPositions || count <= 0)
|
|
return SetStatus(OutOfMemory);
|
|
|
|
*blendFactors = new REAL[count];
|
|
*blendPositions = new REAL[count];
|
|
|
|
if (!*blendFactors || !*blendPositions)
|
|
{
|
|
if (*blendFactors)
|
|
delete[] *blendFactors;
|
|
if (*blendPositions)
|
|
delete[] *blendPositions;
|
|
return SetStatus(OutOfMemory);
|
|
}
|
|
|
|
Status status = SetStatus(DllExports::GdipGetRectGradientBlendV((GpRectGradient*)nativeBrush,
|
|
*blendFactors, *blendPositions, count));
|
|
|
|
if (status != Ok)
|
|
{
|
|
delete[] *blendFactors;
|
|
*blendFactors = NULL;
|
|
delete[] *blendPositions;
|
|
*blendPositions = NULL;
|
|
}
|
|
|
|
return status;
|
|
}
|
|
|
|
Status SetVerticalBlend(const REAL* blendFactors, const REAL* blendPositions, INT count)
|
|
{
|
|
return SetStatus(DllExports::GdipSetRectGradientBlendV((GpRectGradient*)nativeBrush,
|
|
blendFactors, blendPositions, count));
|
|
}
|
|
|
|
// Check the opacity of this brush element.
|
|
|
|
/**
|
|
* Set/get brush transform
|
|
*/
|
|
Status SetTransform(const Matrix* matrix)
|
|
{
|
|
return SetStatus(DllExports::GdipSetRectGradientTransform((GpRectGradient*)
|
|
nativeBrush,
|
|
matrix->nativeMatrix));
|
|
}
|
|
|
|
Status GetTransform(Matrix *matrix) const
|
|
{
|
|
return SetStatus(DllExports::GdipGetRectGradientTransform((GpRectGradient*)
|
|
nativeBrush,
|
|
matrix->nativeMatrix));
|
|
}
|
|
|
|
/**
|
|
* Set/get brush wrapping mode
|
|
*/
|
|
Status SetWrapMode(WrapMode wrapMode)
|
|
{
|
|
return SetStatus(DllExports::GdipSetRectGradientWrapMode((GpRectGradient*)
|
|
nativeBrush,
|
|
wrapMode));
|
|
}
|
|
|
|
WrapMode GetWrapMode() const
|
|
{
|
|
WrapMode wrapMode;
|
|
|
|
SetStatus(DllExports::GdipGetRectGradientWrapMode((GpRectGradient*)
|
|
nativeBrush,
|
|
&wrapMode));
|
|
|
|
return wrapMode;
|
|
}
|
|
|
|
protected:
|
|
|
|
RectangleGradientBrush()
|
|
{
|
|
}
|
|
};
|
|
|
|
class RadialGradientBrush : public Brush
|
|
{
|
|
public:
|
|
friend class Pen;
|
|
|
|
RadialGradientBrush(
|
|
const RectF& rect,
|
|
const Color& centerColor,
|
|
const Color& boundaryColor,
|
|
WrapMode wrapMode = WrapModeClamp
|
|
)
|
|
{
|
|
GpRadialGradient *brush = NULL;
|
|
|
|
lastResult = DllExports::GdipCreateRadialBrush(&rect,
|
|
centerColor.GetValue(),
|
|
boundaryColor.GetValue(),
|
|
wrapMode, &brush);
|
|
|
|
SetNativeBrush(brush);
|
|
}
|
|
|
|
RadialGradientBrush(
|
|
const Rect& rect,
|
|
const Color& centerColor,
|
|
const Color& boundaryColor,
|
|
WrapMode wrapMode = WrapModeClamp
|
|
)
|
|
{
|
|
GpRadialGradient *brush = NULL;
|
|
|
|
lastResult = DllExports::GdipCreateRadialBrushI(&rect,
|
|
centerColor.GetValue(),
|
|
boundaryColor.GetValue(),
|
|
wrapMode, &brush);
|
|
|
|
SetNativeBrush(brush);
|
|
}
|
|
// Get/set color attributes
|
|
|
|
Status SetCenterColor(const Color& color)
|
|
{
|
|
return SetStatus(DllExports::GdipSetRadialCenterColor((GpRadialGradient*)nativeBrush,
|
|
color.GetValue()));
|
|
}
|
|
|
|
Status SetBoundaryColor(const Color& color)
|
|
{
|
|
return SetStatus(DllExports::GdipSetRadialBoundaryColor((GpRadialGradient*)nativeBrush,
|
|
color.GetValue()));
|
|
}
|
|
|
|
Status GetCenterColor(Color& centerColor)
|
|
{
|
|
ARGB argb;
|
|
|
|
SetStatus(DllExports::GdipGetRadialCenterColor((GpRadialGradient*)
|
|
nativeBrush, &argb));
|
|
|
|
centerColor = Color(argb);
|
|
|
|
return lastResult;
|
|
}
|
|
|
|
Status GetBoundaryColor(Color& boundaryColor)
|
|
{
|
|
ARGB argb = 0;
|
|
|
|
SetStatus(DllExports::GdipGetRadialBoundaryColor((GpRadialGradient*)
|
|
nativeBrush, &argb));
|
|
|
|
boundaryColor = Color(argb);
|
|
|
|
return lastResult;
|
|
}
|
|
|
|
Status GetRectangle(RectF& rect) const
|
|
{
|
|
return SetStatus(DllExports::GdipGetRadialRect(
|
|
(GpRadialGradient*)nativeBrush, &rect));
|
|
}
|
|
|
|
Status GetRectangle(Rect& rect) const
|
|
{
|
|
return SetStatus(DllExports::GdipGetRadialRectI(
|
|
(GpRadialGradient*)nativeBrush, &rect));
|
|
}
|
|
|
|
// !!! This diverges from COM+ implemention in that we give
|
|
// them all blend values instead of upto 'count' of them.
|
|
|
|
Status SetBlend(const REAL* blendFactors, const REAL* blendPositions, INT count)
|
|
{
|
|
return SetStatus(DllExports::GdipSetRadialBlend((GpRadialGradient*)
|
|
nativeBrush,
|
|
blendFactors,
|
|
blendPositions,
|
|
count));
|
|
}
|
|
|
|
INT GetBlendCount() const
|
|
{
|
|
INT count = 0;
|
|
|
|
SetStatus(DllExports::GdipGetRadialBlendCount((GpRadialGradient*)
|
|
nativeBrush,
|
|
&count));
|
|
|
|
return count;
|
|
}
|
|
|
|
Status GetBlend(REAL** blendFactors, REAL** blendPositions, INT count) const
|
|
{
|
|
if (!blendFactors || !blendPositions || count <= 0)
|
|
return SetStatus(InvalidParameter);
|
|
|
|
*blendFactors = new REAL[count];
|
|
*blendPositions = new REAL[count];
|
|
|
|
if (!*blendFactors || !*blendPositions)
|
|
{
|
|
if (*blendFactors)
|
|
delete[] *blendFactors;
|
|
if (*blendPositions)
|
|
delete[] *blendPositions;
|
|
|
|
return SetStatus(OutOfMemory);
|
|
}
|
|
|
|
Status status = SetStatus(DllExports::GdipGetRadialBlend((GpRadialGradient*)nativeBrush,
|
|
*blendFactors,
|
|
*blendPositions,
|
|
count));
|
|
if (status != Ok)
|
|
{
|
|
delete[] *blendFactors;
|
|
*blendFactors = NULL;
|
|
delete[] *blendPositions;
|
|
*blendPositions = NULL;
|
|
}
|
|
|
|
return status;
|
|
}
|
|
|
|
INT GetPresetBlendCount() const
|
|
{
|
|
INT count = 0;
|
|
|
|
SetStatus(DllExports::GdipGetRadialPresetBlendCount((GpRadialGradient*)
|
|
nativeBrush,
|
|
&count));
|
|
|
|
return count;
|
|
}
|
|
|
|
Status SetPresetBlend(const Color* presetColors,
|
|
const REAL* blendPositions, INT count)
|
|
{
|
|
if (!presetColors || !blendPositions || count <= 0)
|
|
return SetStatus(InvalidParameter);
|
|
|
|
ARGB* argbs = (ARGB*) malloc(count*sizeof(ARGB));
|
|
|
|
if (argbs)
|
|
{
|
|
for (INT i = 0; i < count; i++)
|
|
{
|
|
argbs[i] = presetColors[i].GetValue();
|
|
}
|
|
|
|
Status status = SetStatus(DllExports::GdipSetRadialPresetBlend(
|
|
(GpRadialGradient*) nativeBrush,
|
|
argbs,
|
|
blendPositions,
|
|
count));
|
|
free(argbs);
|
|
return status;
|
|
}
|
|
else
|
|
{
|
|
return SetStatus(OutOfMemory);
|
|
}
|
|
}
|
|
|
|
Status GetPresetBlend(Color** presetColors, REAL** blendPositions, INT count) const
|
|
{
|
|
if (!presetColors || !blendPositions || count <= 0)
|
|
return SetStatus(InvalidParameter);
|
|
|
|
*presetColors = new Color[count];
|
|
*blendPositions = new REAL[count];
|
|
|
|
ARGB* argbs = (ARGB*) malloc(count*sizeof(ARGB));
|
|
|
|
if (!*presetColors || !*blendPositions || !argbs)
|
|
{
|
|
if (*presetColors)
|
|
delete[] *presetColors;
|
|
if (*blendPositions)
|
|
delete[] *blendPositions;
|
|
free(argbs);
|
|
|
|
return SetStatus(OutOfMemory);
|
|
}
|
|
|
|
Status status = SetStatus(DllExports::GdipGetRadialPresetBlend(
|
|
(GpRadialGradient*)nativeBrush,
|
|
argbs,
|
|
*blendPositions,
|
|
count));
|
|
if (status == Ok)
|
|
{
|
|
for (INT i = 0; i < count; i++)
|
|
{
|
|
*presetColors[i] = Color(argbs[i]);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
delete[] *presetColors;
|
|
*presetColors = NULL;
|
|
delete[] *blendPositions;
|
|
*blendPositions = NULL;
|
|
}
|
|
|
|
free(argbs);
|
|
|
|
return status;
|
|
}
|
|
|
|
Status SetSigmaBlend(REAL focus, REAL scale = 1.0)
|
|
{
|
|
return SetStatus(DllExports::GdipSetRadialSigmaBlend(
|
|
(GpRadialGradient*)nativeBrush, focus, scale));
|
|
}
|
|
|
|
Status SetLinearBlend(REAL focus, REAL scale = 1.0)
|
|
{
|
|
return SetStatus(DllExports::GdipSetRadialLinearBlend(
|
|
(GpRadialGradient*)nativeBrush, focus, scale));
|
|
}
|
|
|
|
/**
|
|
* Set/get brush transform
|
|
*/
|
|
Status SetTransform(const Matrix* matrix)
|
|
{
|
|
return SetStatus(DllExports::GdipSetRadialTransform((GpRadialGradient*)nativeBrush,
|
|
matrix->nativeMatrix));
|
|
}
|
|
|
|
Status GetTransform(Matrix *matrix) const
|
|
{
|
|
return SetStatus(DllExports::GdipGetRadialTransform((GpRadialGradient*)nativeBrush,
|
|
matrix->nativeMatrix));
|
|
}
|
|
|
|
/**
|
|
* Set/get brush wrapping mode
|
|
*/
|
|
Status SetWrapMode(WrapMode wrapMode)
|
|
{
|
|
return SetStatus(DllExports::GdipSetRadialWrapMode((GpRadialGradient*)nativeBrush,
|
|
wrapMode));
|
|
}
|
|
|
|
WrapMode GetWrapMode() const
|
|
{
|
|
WrapMode wrapMode;
|
|
|
|
SetStatus(DllExports::GdipGetRadialWrapMode((GpRadialGradient*)
|
|
nativeBrush,
|
|
&wrapMode));
|
|
|
|
return wrapMode;
|
|
}
|
|
|
|
protected:
|
|
|
|
RadialGradientBrush()
|
|
{
|
|
}
|
|
};
|
|
|
|
#endif
|
|
|