Commit 8bdabe3a authored by Vincent Povirk's avatar Vincent Povirk Committed by Alexandre Julliard

gdiplus: Store preset blends in linear gradient brushes.

parent 52e91927
...@@ -116,7 +116,7 @@ GpStatus WINGDIPAPI GdipCloneBrush(GpBrush *brush, GpBrush **clone) ...@@ -116,7 +116,7 @@ GpStatus WINGDIPAPI GdipCloneBrush(GpBrush *brush, GpBrush **clone)
} }
case BrushTypeLinearGradient:{ case BrushTypeLinearGradient:{
GpLineGradient *dest, *src; GpLineGradient *dest, *src;
INT count; INT count, pcount;
dest = GdipAlloc(sizeof(GpLineGradient)); dest = GdipAlloc(sizeof(GpLineGradient));
if(!dest) return OutOfMemory; if(!dest) return OutOfMemory;
...@@ -130,11 +130,20 @@ GpStatus WINGDIPAPI GdipCloneBrush(GpBrush *brush, GpBrush **clone) ...@@ -130,11 +130,20 @@ GpStatus WINGDIPAPI GdipCloneBrush(GpBrush *brush, GpBrush **clone)
count = dest->blendcount; count = dest->blendcount;
dest->blendfac = GdipAlloc(count * sizeof(REAL)); dest->blendfac = GdipAlloc(count * sizeof(REAL));
dest->blendpos = GdipAlloc(count * sizeof(REAL)); dest->blendpos = GdipAlloc(count * sizeof(REAL));
pcount = dest->pblendcount;
if (pcount)
{
dest->pblendcolor = GdipAlloc(pcount * sizeof(ARGB));
dest->pblendpos = GdipAlloc(pcount * sizeof(REAL));
}
if (!dest->blendfac || !dest->blendpos) if (!dest->blendfac || !dest->blendpos ||
(pcount && (!dest->pblendcolor || !dest->pblendpos)))
{ {
GdipFree(dest->blendfac); GdipFree(dest->blendfac);
GdipFree(dest->blendpos); GdipFree(dest->blendpos);
GdipFree(dest->pblendcolor);
GdipFree(dest->pblendpos);
DeleteObject(dest->brush.gdibrush); DeleteObject(dest->brush.gdibrush);
GdipFree(dest); GdipFree(dest);
return OutOfMemory; return OutOfMemory;
...@@ -143,6 +152,12 @@ GpStatus WINGDIPAPI GdipCloneBrush(GpBrush *brush, GpBrush **clone) ...@@ -143,6 +152,12 @@ GpStatus WINGDIPAPI GdipCloneBrush(GpBrush *brush, GpBrush **clone)
memcpy(dest->blendfac, src->blendfac, count * sizeof(REAL)); memcpy(dest->blendfac, src->blendfac, count * sizeof(REAL));
memcpy(dest->blendpos, src->blendpos, count * sizeof(REAL)); memcpy(dest->blendpos, src->blendpos, count * sizeof(REAL));
if (pcount)
{
memcpy(dest->pblendcolor, src->pblendcolor, pcount * sizeof(ARGB));
memcpy(dest->pblendpos, src->pblendpos, pcount * sizeof(REAL));
}
*clone = &dest->brush; *clone = &dest->brush;
break; break;
} }
...@@ -289,6 +304,10 @@ GpStatus WINGDIPAPI GdipCreateLineBrush(GDIPCONST GpPointF* startpoint, ...@@ -289,6 +304,10 @@ GpStatus WINGDIPAPI GdipCreateLineBrush(GDIPCONST GpPointF* startpoint,
(*line)->blendfac[0] = 1.0f; (*line)->blendfac[0] = 1.0f;
(*line)->blendpos[0] = 1.0f; (*line)->blendpos[0] = 1.0f;
(*line)->pblendcolor = NULL;
(*line)->pblendpos = NULL;
(*line)->pblendcount = 0;
return Ok; return Ok;
} }
...@@ -866,6 +885,8 @@ GpStatus WINGDIPAPI GdipDeleteBrush(GpBrush *brush) ...@@ -866,6 +885,8 @@ GpStatus WINGDIPAPI GdipDeleteBrush(GpBrush *brush)
case BrushTypeLinearGradient: case BrushTypeLinearGradient:
GdipFree(((GpLineGradient*)brush)->blendfac); GdipFree(((GpLineGradient*)brush)->blendfac);
GdipFree(((GpLineGradient*)brush)->blendpos); GdipFree(((GpLineGradient*)brush)->blendpos);
GdipFree(((GpLineGradient*)brush)->pblendcolor);
GdipFree(((GpLineGradient*)brush)->pblendpos);
break; break;
case BrushTypeTextureFill: case BrushTypeTextureFill:
GdipDeleteMatrix(((GpTexture*)brush)->transform); GdipDeleteMatrix(((GpTexture*)brush)->transform);
...@@ -1574,34 +1595,65 @@ GpStatus WINGDIPAPI GdipSetLineLinearBlend(GpLineGradient *brush, REAL focus, ...@@ -1574,34 +1595,65 @@ GpStatus WINGDIPAPI GdipSetLineLinearBlend(GpLineGradient *brush, REAL focus,
GpStatus WINGDIPAPI GdipSetLinePresetBlend(GpLineGradient *brush, GpStatus WINGDIPAPI GdipSetLinePresetBlend(GpLineGradient *brush,
GDIPCONST ARGB *blend, GDIPCONST REAL* positions, INT count) GDIPCONST ARGB *blend, GDIPCONST REAL* positions, INT count)
{ {
static int calls; ARGB *new_color;
REAL *new_pos;
TRACE("(%p,%p,%p,%i)\n", brush, blend, positions, count);
if(!(calls++)) if (!brush || !blend || !positions || count < 2 ||
FIXME("not implemented\n"); positions[0] != 0.0f || positions[count-1] != 1.0f)
{
return InvalidParameter;
}
return NotImplemented; new_color = GdipAlloc(count * sizeof(ARGB));
new_pos = GdipAlloc(count * sizeof(REAL));
if (!new_color || !new_pos)
{
GdipFree(new_color);
GdipFree(new_pos);
return OutOfMemory;
}
memcpy(new_color, blend, sizeof(ARGB) * count);
memcpy(new_pos, positions, sizeof(REAL) * count);
GdipFree(brush->pblendcolor);
GdipFree(brush->pblendpos);
brush->pblendcolor = new_color;
brush->pblendpos = new_pos;
brush->pblendcount = count;
return Ok;
} }
GpStatus WINGDIPAPI GdipGetLinePresetBlend(GpLineGradient *brush, GpStatus WINGDIPAPI GdipGetLinePresetBlend(GpLineGradient *brush,
ARGB *blend, REAL* positions, INT count) ARGB *blend, REAL* positions, INT count)
{ {
static int calls; if (!brush || !blend || !positions || count < 2)
return InvalidParameter;
if(!(calls++)) if (brush->pblendcount == 0)
FIXME("not implemented\n"); return GenericError;
return NotImplemented; if (count < brush->pblendcount)
return InsufficientBuffer;
memcpy(blend, brush->pblendcolor, sizeof(ARGB) * brush->pblendcount);
memcpy(positions, brush->pblendpos, sizeof(REAL) * brush->pblendcount);
return Ok;
} }
GpStatus WINGDIPAPI GdipGetLinePresetBlendCount(GpLineGradient *brush, GpStatus WINGDIPAPI GdipGetLinePresetBlendCount(GpLineGradient *brush,
INT *count) INT *count)
{ {
static int calls; if (!brush || !count)
return InvalidParameter;
if(!(calls++)) *count = brush->pblendcount;
FIXME("not implemented\n");
return NotImplemented; return Ok;
} }
GpStatus WINGDIPAPI GdipResetLineTransform(GpLineGradient *brush) GpStatus WINGDIPAPI GdipResetLineTransform(GpLineGradient *brush)
......
...@@ -166,6 +166,9 @@ struct GpLineGradient{ ...@@ -166,6 +166,9 @@ struct GpLineGradient{
REAL* blendfac; /* blend factors */ REAL* blendfac; /* blend factors */
REAL* blendpos; /* blend positions */ REAL* blendpos; /* blend positions */
INT blendcount; INT blendcount;
ARGB* pblendcolor; /* preset blend colors */
REAL* pblendpos; /* preset blend positions */
INT pblendcount;
}; };
struct GpTexture{ struct GpTexture{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment