gdiplus: Add blend information to linear gradient brushes.
This commit is contained in:
parent
1de792290b
commit
b05cf906d1
@ -108,14 +108,38 @@ GpStatus WINGDIPAPI GdipCloneBrush(GpBrush *brush, GpBrush **clone)
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case BrushTypeLinearGradient:
|
case BrushTypeLinearGradient:{
|
||||||
*clone = GdipAlloc(sizeof(GpLineGradient));
|
GpLineGradient *dest, *src;
|
||||||
if(!*clone) return OutOfMemory;
|
INT count;
|
||||||
|
|
||||||
memcpy(*clone, brush, sizeof(GpLineGradient));
|
dest = GdipAlloc(sizeof(GpLineGradient));
|
||||||
|
if(!dest) return OutOfMemory;
|
||||||
|
|
||||||
(*clone)->gdibrush = CreateSolidBrush((*clone)->lb.lbColor);
|
src = (GpLineGradient*)brush;
|
||||||
|
|
||||||
|
memcpy(dest, src, sizeof(GpLineGradient));
|
||||||
|
|
||||||
|
dest->brush.gdibrush = CreateSolidBrush(dest->brush.lb.lbColor);
|
||||||
|
|
||||||
|
count = dest->blendcount;
|
||||||
|
dest->blendfac = GdipAlloc(count * sizeof(REAL));
|
||||||
|
dest->blendpos = GdipAlloc(count * sizeof(REAL));
|
||||||
|
|
||||||
|
if (!dest->blendfac || !dest->blendpos)
|
||||||
|
{
|
||||||
|
GdipFree(dest->blendfac);
|
||||||
|
GdipFree(dest->blendpos);
|
||||||
|
DeleteObject(dest->brush.gdibrush);
|
||||||
|
GdipFree(dest);
|
||||||
|
return OutOfMemory;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(dest->blendfac, src->blendfac, count * sizeof(REAL));
|
||||||
|
memcpy(dest->blendpos, src->blendpos, count * sizeof(REAL));
|
||||||
|
|
||||||
|
*clone = &dest->brush;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case BrushTypeTextureFill:
|
case BrushTypeTextureFill:
|
||||||
*clone = GdipAlloc(sizeof(GpTexture));
|
*clone = GdipAlloc(sizeof(GpTexture));
|
||||||
if(!*clone) return OutOfMemory;
|
if(!*clone) return OutOfMemory;
|
||||||
@ -226,6 +250,23 @@ GpStatus WINGDIPAPI GdipCreateLineBrush(GDIPCONST GpPointF* startpoint,
|
|||||||
(*line)->wrap = wrap;
|
(*line)->wrap = wrap;
|
||||||
(*line)->gamma = FALSE;
|
(*line)->gamma = FALSE;
|
||||||
|
|
||||||
|
(*line)->blendcount = 1;
|
||||||
|
(*line)->blendfac = GdipAlloc(sizeof(REAL));
|
||||||
|
(*line)->blendpos = GdipAlloc(sizeof(REAL));
|
||||||
|
|
||||||
|
if (!(*line)->blendfac || !(*line)->blendpos)
|
||||||
|
{
|
||||||
|
GdipFree((*line)->blendfac);
|
||||||
|
GdipFree((*line)->blendpos);
|
||||||
|
DeleteObject((*line)->brush.gdibrush);
|
||||||
|
GdipFree(*line);
|
||||||
|
*line = NULL;
|
||||||
|
return OutOfMemory;
|
||||||
|
}
|
||||||
|
|
||||||
|
(*line)->blendfac[0] = 1.0f;
|
||||||
|
(*line)->blendpos[0] = 1.0f;
|
||||||
|
|
||||||
return Ok;
|
return Ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -765,7 +806,10 @@ GpStatus WINGDIPAPI GdipDeleteBrush(GpBrush *brush)
|
|||||||
GdipFree(((GpPathGradient*) brush)->blendpos);
|
GdipFree(((GpPathGradient*) brush)->blendpos);
|
||||||
break;
|
break;
|
||||||
case BrushTypeSolidColor:
|
case BrushTypeSolidColor:
|
||||||
|
break;
|
||||||
case BrushTypeLinearGradient:
|
case BrushTypeLinearGradient:
|
||||||
|
GdipFree(((GpLineGradient*)brush)->blendfac);
|
||||||
|
GdipFree(((GpLineGradient*)brush)->blendpos);
|
||||||
break;
|
break;
|
||||||
case BrushTypeTextureFill:
|
case BrushTypeTextureFill:
|
||||||
GdipDeleteMatrix(((GpTexture*)brush)->transform);
|
GdipDeleteMatrix(((GpTexture*)brush)->transform);
|
||||||
|
@ -145,6 +145,9 @@ struct GpLineGradient{
|
|||||||
ARGB endcolor;
|
ARGB endcolor;
|
||||||
GpWrapMode wrap;
|
GpWrapMode wrap;
|
||||||
BOOL gamma;
|
BOOL gamma;
|
||||||
|
REAL* blendfac; /* blend factors */
|
||||||
|
REAL* blendpos; /* blend positions */
|
||||||
|
INT blendcount;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct GpTexture{
|
struct GpTexture{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user