void gdip_recompute_line_gradient(GF_STENCIL _this) { GpPointF start, end; u32 i, k; REAL w, h; GPSTEN(); if (!_sten->needs_rebuild) return; _sten->needs_rebuild = GF_FALSE; if (_sten->pLinear) GdipDeleteBrush(_sten->pLinear); GdipCreateLineBrush(&_sten->start, &_sten->end, 0xFFFF0000, 0xFFFF00FF, WrapModeTile, &_sten->pLinear); switch (_sten->spread) { case GF_GRADIENT_MODE_PAD: break; case GF_GRADIENT_MODE_SPREAD: GdipSetLineWrapMode(_sten->pLinear, WrapModeTileFlipXY); GdipSetLinePresetBlend(_sten->pLinear, (ARGB *) _sten->cols, _sten->pos, _sten->num_pos); return; case GF_GRADIENT_MODE_REPEAT: GdipSetLineWrapMode(_sten->pLinear, WrapModeTile); GdipSetLinePresetBlend(_sten->pLinear, (ARGB *) _sten->cols, _sten->pos, _sten->num_pos); return; } /*currently gdiplus doesn't support padded mode on gradients, so update the line gradient by using a line 3 times longer*/ w = _sten->end.X - _sten->start.X; h = _sten->end.Y - _sten->start.Y; start.X = _sten->start.X - w; start.Y = _sten->start.Y - h; end.X = _sten->end.X + w; end.Y = _sten->end.Y + h; GdipCreateLineBrush(&start, &end, 0xFFFF0000, 0xFFFF00FF, WrapModeTile, &_sten->pLinear); ARGB *cols = new ARGB[_sten->num_pos+2]; REAL *pos = new REAL[_sten->num_pos+2]; k=0; for (i=0; i<_sten->num_pos; i++) { cols[i+k] = _sten->cols[i]; pos[i+k] = (1 + _sten->pos[i])/3; if (!i) { pos[1] = pos[0]; cols[1] = cols[0]; k=1; pos[0] = 0; } } pos[_sten->num_pos+1] = 1.0; cols[_sten->num_pos+1] = cols[_sten->num_pos]; /*since depending on gradient transform the padding is likely to be not big enough, use flipXY to assure that in most cases the x3 dilatation is enough*/ GdipSetLineWrapMode(_sten->pLinear, WrapModeTileFlipXY); GdipSetLinePresetBlend(_sten->pLinear, cols, pos, 2+_sten->num_pos); delete [] cols; delete [] pos; }
static void test_constructor_destructor2(void) { GpStatus status; GpPen *pen = NULL; GpBrush *brush = NULL; GpPointF points[2]; status = GdipCreatePen2(NULL, 10.0f, UnitPixel, &pen); expect(InvalidParameter, status); ok(pen == NULL, "Expected pen to be NULL\n"); points[0].X = 7.0; points[0].Y = 11.0; points[1].X = 13.0; points[1].Y = 17.0; status = GdipCreateLineBrush(&points[0], &points[1], (ARGB)0xffff00ff, (ARGB)0xff0000ff, WrapModeTile, (GpLineGradient **)&brush); expect(Ok, status); ok(brush != NULL, "Expected brush to be initialized\n"); status = GdipCreatePen2(brush, 10.0f, UnitPixel, &pen); expect(Ok, status); ok(pen != NULL, "Expected pen to be initialized\n"); status = GdipDeletePen(pen); expect(Ok, status); status = GdipDeleteBrush(brush); expect(Ok, status); }
static void test_penfilltype(void) { GpPen *pen; GpSolidFill *solid; GpLineGradient *line; GpPointF a, b; GpStatus status; GpPenType type; /* NULL */ status = GdipGetPenFillType(NULL, NULL); expect(InvalidParameter, status); status = GdipCreatePen1((ARGB)0xffff00ff, 10.0f, UnitPixel, &pen); expect(Ok, status); status = GdipGetPenFillType(pen, NULL); expect(InvalidParameter, status); /* created with GdipCreatePen1() */ status = GdipGetPenFillType(pen, &type); expect(Ok, status); expect(PenTypeSolidColor, type); GdipDeletePen(pen); /* based on SolidBrush */ status = GdipCreateSolidFill((ARGB)0xffff00ff, &solid); expect(Ok, status); status = GdipCreatePen2((GpBrush*)solid, 10.0f, UnitPixel, &pen); expect(Ok, status); status = GdipGetPenFillType(pen, &type); expect(Ok, status); expect(PenTypeSolidColor, type); GdipDeletePen(pen); GdipDeleteBrush((GpBrush*)solid); /* based on LinearGradientBrush */ a.X = a.Y = 0.0; b.X = b.Y = 10.0; status = GdipCreateLineBrush(&a, &b, (ARGB)0xffff00ff, (ARGB)0xffff0000, WrapModeTile, &line); expect(Ok, status); status = GdipCreatePen2((GpBrush*)line, 10.0f, UnitPixel, &pen); expect(Ok, status); status = GdipGetPenFillType(pen, &type); expect(Ok, status); expect(PenTypeLinearGradient, type); GdipDeletePen(pen); GdipDeleteBrush((GpBrush*)line); }
GpStatus WINGDIPAPI GdipCreateLineBrushFromRect(GDIPCONST GpRectF* rect, ARGB startcolor, ARGB endcolor, LinearGradientMode mode, GpWrapMode wrap, GpLineGradient **line) { GpPointF start, end; if(!line || !rect) return InvalidParameter; start.X = rect->X; start.Y = rect->Y; end.X = rect->X + rect->Width; end.Y = rect->Y + rect->Height; return GdipCreateLineBrush(&start, &end, startcolor, endcolor, wrap, line); }
GpStatus WINGDIPAPI GdipCreateLineBrushI(GDIPCONST GpPoint* startpoint, GDIPCONST GpPoint* endpoint, ARGB startcolor, ARGB endcolor, GpWrapMode wrap, GpLineGradient **line) { GpPointF stF; GpPointF endF; if(!startpoint || !endpoint) return InvalidParameter; stF.X = (REAL)startpoint->X; stF.Y = (REAL)startpoint->Y; endF.X = (REAL)endpoint->X; endF.X = (REAL)endpoint->Y; return GdipCreateLineBrush(&stF, &endF, startcolor, endcolor, wrap, line); }
static GF_Err gdip_set_linear_gradient (GF_STENCIL _this, Fixed start_x, Fixed start_y, Fixed end_x, Fixed end_y) { GPSTEN(); CHECK_RET(GF_STENCIL_LINEAR_GRADIENT); if (_sten->pLinear) GdipDeleteBrush(_sten->pLinear); _sten->start.X = FIX2FLT(start_x); _sten->start.Y = FIX2FLT(start_y); _sten->end.X = FIX2FLT(end_x); _sten->end.Y = FIX2FLT(end_y); GdipCreateLineBrush(&_sten->start, &_sten->end, 0xFF000000, 0xFFFFFFFF, WrapModeTile, &_sten->pLinear); if (!_sten->pLinearMat) GdipCreateMatrix(&_sten->pLinearMat); GdipGetLineTransform(_sten->pLinear, _sten->pLinearMat); _sten->needs_rebuild = GF_TRUE; return GF_OK; }
static void test_getgamma(void) { GpStatus status; GpLineGradient *line; GpPointF start, end; BOOL gamma; start.X = start.Y = 0.0; end.X = end.Y = 100.0; status = GdipCreateLineBrush(&start, &end, (ARGB)0xdeadbeef, 0xdeadbeef, WrapModeTile, &line); expect(Ok, status); /* NULL arguments */ status = GdipGetLineGammaCorrection(NULL, NULL); expect(InvalidParameter, status); status = GdipGetLineGammaCorrection(line, NULL); expect(InvalidParameter, status); status = GdipGetLineGammaCorrection(NULL, &gamma); expect(InvalidParameter, status); GdipDeleteBrush((GpBrush*)line); }
static void test_linelinearblend(void) { GpLineGradient *brush; GpStatus status; GpPointF pt1, pt2; INT count=10; REAL res_factors[3] = {0.3f}; REAL res_positions[3] = {0.3f}; status = GdipSetLineLinearBlend(NULL, 0.6, 0.8); expect(InvalidParameter, status); pt1.X = pt1.Y = 1.0; pt2.X = pt2.Y = 100.0; status = GdipCreateLineBrush(&pt1, &pt2, 0, 0, WrapModeTile, &brush); expect(Ok, status); status = GdipSetLineLinearBlend(brush, 0.6, 0.8); expect(Ok, status); status = GdipGetLineBlendCount(brush, &count); expect(Ok, status); expect(3, count); status = GdipGetLineBlend(brush, res_factors, res_positions, 3); expect(Ok, status); expectf(0.0, res_factors[0]); expectf(0.0, res_positions[0]); expectf(0.8, res_factors[1]); expectf(0.6, res_positions[1]); expectf(0.0, res_factors[2]); expectf(1.0, res_positions[2]); status = GdipSetLineLinearBlend(brush, 0.0, 0.8); expect(Ok, status); status = GdipGetLineBlendCount(brush, &count); expect(Ok, status); expect(2, count); status = GdipGetLineBlend(brush, res_factors, res_positions, 3); expect(Ok, status); expectf(0.8, res_factors[0]); expectf(0.0, res_positions[0]); expectf(0.0, res_factors[1]); expectf(1.0, res_positions[1]); status = GdipSetLineLinearBlend(brush, 1.0, 0.8); expect(Ok, status); status = GdipGetLineBlendCount(brush, &count); expect(Ok, status); expect(2, count); status = GdipGetLineBlend(brush, res_factors, res_positions, 3); expect(Ok, status); expectf(0.0, res_factors[0]); expectf(0.0, res_positions[0]); expectf(0.8, res_factors[1]); expectf(1.0, res_positions[1]); status = GdipDeleteBrush((GpBrush*)brush); expect(Ok, status); }
static void test_lineblend(void) { GpLineGradient *brush; GpStatus status; GpPointF pt1, pt2; INT count=10; int i; const REAL factors[5] = {0.0f, 0.1f, 0.5f, 0.9f, 1.0f}; const REAL positions[5] = {0.0f, 0.2f, 0.5f, 0.8f, 1.0f}; const REAL two_positions[2] = {0.0f, 1.0f}; const ARGB colors[5] = {0xff0000ff, 0xff00ff00, 0xff00ffff, 0xffff0000, 0xffffffff}; REAL res_factors[6] = {0.3f, 0.0f, 0.0f, 0.0f, 0.0f}; REAL res_positions[6] = {0.3f, 0.0f, 0.0f, 0.0f, 0.0f}; ARGB res_colors[6] = {0xdeadbeef, 0, 0, 0, 0}; pt1.X = pt1.Y = pt2.Y = pt2.X = 1.0; status = GdipCreateLineBrush(&pt1, &pt2, 0, 0, WrapModeTile, &brush); expect(OutOfMemory, status); pt1.X = pt1.Y = 1.0; pt2.X = pt2.Y = 100.0; status = GdipCreateLineBrush(&pt1, &pt2, 0, 0, WrapModeTile, &brush); expect(Ok, status); status = GdipGetLineBlendCount(NULL, &count); expect(InvalidParameter, status); status = GdipGetLineBlendCount(brush, NULL); expect(InvalidParameter, status); status = GdipGetLineBlendCount(brush, &count); expect(Ok, status); expect(1, count); status = GdipGetLineBlend(NULL, res_factors, res_positions, 1); expect(InvalidParameter, status); status = GdipGetLineBlend(brush, NULL, res_positions, 1); expect(InvalidParameter, status); status = GdipGetLineBlend(brush, res_factors, NULL, 1); expect(InvalidParameter, status); status = GdipGetLineBlend(brush, res_factors, res_positions, 0); expect(InvalidParameter, status); status = GdipGetLineBlend(brush, res_factors, res_positions, -1); expect(InvalidParameter, status); status = GdipGetLineBlend(brush, res_factors, res_positions, 1); expect(Ok, status); status = GdipGetLineBlend(brush, res_factors, res_positions, 2); expect(Ok, status); status = GdipSetLineBlend(NULL, factors, positions, 5); expect(InvalidParameter, status); status = GdipSetLineBlend(brush, NULL, positions, 5); expect(InvalidParameter, status); status = GdipSetLineBlend(brush, factors, NULL, 5); expect(InvalidParameter, status); status = GdipSetLineBlend(brush, factors, positions, 0); expect(InvalidParameter, status); status = GdipSetLineBlend(brush, factors, positions, -1); expect(InvalidParameter, status); /* leave off the 0.0 position */ status = GdipSetLineBlend(brush, &factors[1], &positions[1], 4); expect(InvalidParameter, status); /* leave off the 1.0 position */ status = GdipSetLineBlend(brush, factors, positions, 4); expect(InvalidParameter, status); status = GdipSetLineBlend(brush, factors, positions, 5); expect(Ok, status); status = GdipGetLineBlendCount(brush, &count); expect(Ok, status); expect(5, count); status = GdipGetLineBlend(brush, res_factors, res_positions, 4); expect(InsufficientBuffer, status); status = GdipGetLineBlend(brush, res_factors, res_positions, 5); expect(Ok, status); for (i=0; i<5; i++) { expectf(factors[i], res_factors[i]); expectf(positions[i], res_positions[i]); } status = GdipGetLineBlend(brush, res_factors, res_positions, 6); expect(Ok, status); status = GdipSetLineBlend(brush, factors, positions, 1); expect(Ok, status); status = GdipGetLineBlendCount(brush, &count); expect(Ok, status); expect(1, count); status = GdipGetLineBlend(brush, res_factors, res_positions, 1); expect(Ok, status); status = GdipGetLinePresetBlendCount(NULL, &count); expect(InvalidParameter, status); status = GdipGetLinePresetBlendCount(brush, NULL); expect(InvalidParameter, status); status = GdipGetLinePresetBlendCount(brush, &count); expect(Ok, status); expect(0, count); status = GdipGetLinePresetBlend(NULL, res_colors, res_positions, 1); expect(InvalidParameter, status); status = GdipGetLinePresetBlend(brush, NULL, res_positions, 1); expect(InvalidParameter, status); status = GdipGetLinePresetBlend(brush, res_colors, NULL, 1); expect(InvalidParameter, status); status = GdipGetLinePresetBlend(brush, res_colors, res_positions, 0); expect(InvalidParameter, status); status = GdipGetLinePresetBlend(brush, res_colors, res_positions, -1); expect(InvalidParameter, status); status = GdipGetLinePresetBlend(brush, res_colors, res_positions, 1); expect(InvalidParameter, status); status = GdipGetLinePresetBlend(brush, res_colors, res_positions, 2); expect(GenericError, status); status = GdipSetLinePresetBlend(NULL, colors, positions, 5); expect(InvalidParameter, status); status = GdipSetLinePresetBlend(brush, NULL, positions, 5); expect(InvalidParameter, status); status = GdipSetLinePresetBlend(brush, colors, NULL, 5); expect(InvalidParameter, status); status = GdipSetLinePresetBlend(brush, colors, positions, 0); expect(InvalidParameter, status); status = GdipSetLinePresetBlend(brush, colors, positions, -1); expect(InvalidParameter, status); status = GdipSetLinePresetBlend(brush, colors, positions, 1); expect(InvalidParameter, status); /* leave off the 0.0 position */ status = GdipSetLinePresetBlend(brush, &colors[1], &positions[1], 4); expect(InvalidParameter, status); /* leave off the 1.0 position */ status = GdipSetLinePresetBlend(brush, colors, positions, 4); expect(InvalidParameter, status); status = GdipSetLinePresetBlend(brush, colors, positions, 5); expect(Ok, status); status = GdipGetLinePresetBlendCount(brush, &count); expect(Ok, status); expect(5, count); status = GdipGetLinePresetBlend(brush, res_colors, res_positions, 4); expect(InsufficientBuffer, status); status = GdipGetLinePresetBlend(brush, res_colors, res_positions, 5); expect(Ok, status); for (i=0; i<5; i++) { expect(colors[i], res_colors[i]); expectf(positions[i], res_positions[i]); } status = GdipGetLinePresetBlend(brush, res_colors, res_positions, 6); expect(Ok, status); status = GdipSetLinePresetBlend(brush, colors, two_positions, 2); expect(Ok, status); status = GdipDeleteBrush((GpBrush*)brush); expect(Ok, status); }
static void test_gradientgetrect(void) { GpLineGradient *brush; GpMatrix *transform; REAL elements[6]; GpRectF rectf; GpStatus status; GpPointF pt1, pt2; status = GdipCreateMatrix(&transform); expect(Ok, status); pt1.X = pt1.Y = 1.0; pt2.X = pt2.Y = 100.0; status = GdipCreateLineBrush(&pt1, &pt2, 0, 0, WrapModeTile, &brush); expect(Ok, status); memset(&rectf, 0, sizeof(GpRectF)); status = GdipGetLineRect(brush, &rectf); expect(Ok, status); expectf(1.0, rectf.X); expectf(1.0, rectf.Y); expectf(99.0, rectf.Width); expectf(99.0, rectf.Height); status = GdipGetLineTransform(brush, transform); todo_wine expect(Ok, status); if (status == Ok) { status = GdipGetMatrixElements(transform, elements); expect(Ok, status); expectf(1.0, elements[0]); expectf(1.0, elements[1]); expectf(-1.0, elements[2]); expectf(1.0, elements[3]); expectf(50.50, elements[4]); expectf(-50.50, elements[5]); } status = GdipDeleteBrush((GpBrush*)brush); expect(Ok, status); /* vertical gradient */ pt1.X = pt1.Y = pt2.X = 0.0; pt2.Y = 10.0; status = GdipCreateLineBrush(&pt1, &pt2, 0, 0, WrapModeTile, &brush); expect(Ok, status); memset(&rectf, 0, sizeof(GpRectF)); status = GdipGetLineRect(brush, &rectf); expect(Ok, status); expectf(-5.0, rectf.X); expectf(0.0, rectf.Y); expectf(10.0, rectf.Width); expectf(10.0, rectf.Height); status = GdipGetLineTransform(brush, transform); todo_wine expect(Ok, status); if (status == Ok) { status = GdipGetMatrixElements(transform, elements); expect(Ok, status); expectf(0.0, elements[0]); expectf(1.0, elements[1]); expectf(-1.0, elements[2]); expectf(0.0, elements[3]); expectf(5.0, elements[4]); expectf(5.0, elements[5]); } status = GdipDeleteBrush((GpBrush*)brush); expect(Ok, status); /* horizontal gradient */ pt1.X = pt1.Y = pt2.Y = 0.0; pt2.X = 10.0; status = GdipCreateLineBrush(&pt1, &pt2, 0, 0, WrapModeTile, &brush); expect(Ok, status); memset(&rectf, 0, sizeof(GpRectF)); status = GdipGetLineRect(brush, &rectf); expect(Ok, status); expectf(0.0, rectf.X); expectf(-5.0, rectf.Y); expectf(10.0, rectf.Width); expectf(10.0, rectf.Height); status = GdipGetLineTransform(brush, transform); todo_wine expect(Ok, status); if (status == Ok) { status = GdipGetMatrixElements(transform, elements); expect(Ok, status); expectf(1.0, elements[0]); expectf(0.0, elements[1]); expectf(0.0, elements[2]); expectf(1.0, elements[3]); expectf(0.0, elements[4]); expectf(0.0, elements[5]); } status = GdipDeleteBrush((GpBrush*)brush); expect(Ok, status); /* slope = -1 */ pt1.X = pt1.Y = 0.0; pt2.X = 20.0; pt2.Y = -20.0; status = GdipCreateLineBrush(&pt1, &pt2, 0, 0, WrapModeTile, &brush); expect(Ok, status); memset(&rectf, 0, sizeof(GpRectF)); status = GdipGetLineRect(brush, &rectf); expect(Ok, status); expectf(0.0, rectf.X); expectf(-20.0, rectf.Y); expectf(20.0, rectf.Width); expectf(20.0, rectf.Height); status = GdipGetLineTransform(brush, transform); todo_wine expect(Ok, status); if (status == Ok) { status = GdipGetMatrixElements(transform, elements); expect(Ok, status); expectf(1.0, elements[0]); expectf(-1.0, elements[1]); expectf(1.0, elements[2]); expectf(1.0, elements[3]); expectf(10.0, elements[4]); expectf(10.0, elements[5]); } status = GdipDeleteBrush((GpBrush*)brush); expect(Ok, status); /* slope = 1/100 */ pt1.X = pt1.Y = 0.0; pt2.X = 100.0; pt2.Y = 1.0; status = GdipCreateLineBrush(&pt1, &pt2, 0, 0, WrapModeTile, &brush); expect(Ok, status); memset(&rectf, 0, sizeof(GpRectF)); status = GdipGetLineRect(brush, &rectf); expect(Ok, status); expectf(0.0, rectf.X); expectf(0.0, rectf.Y); expectf(100.0, rectf.Width); expectf(1.0, rectf.Height); status = GdipGetLineTransform(brush, transform); todo_wine expect(Ok, status); if (status == Ok) { status = GdipGetMatrixElements(transform, elements); expect(Ok,status); expectf(1.0, elements[0]); expectf(0.01, elements[1]); expectf(-0.02, elements[2]); /* expectf(2.0, elements[3]); */ expectf(0.01, elements[4]); /* expectf(-1.0, elements[5]); */ } status = GdipDeleteBrush((GpBrush*)brush); expect(Ok,status); /* zero height rect */ rectf.X = rectf.Y = 10.0; rectf.Width = 100.0; rectf.Height = 0.0; status = GdipCreateLineBrushFromRect(&rectf, 0, 0, LinearGradientModeVertical, WrapModeTile, &brush); expect(OutOfMemory, status); /* zero width rect */ rectf.X = rectf.Y = 10.0; rectf.Width = 0.0; rectf.Height = 100.0; status = GdipCreateLineBrushFromRect(&rectf, 0, 0, LinearGradientModeHorizontal, WrapModeTile, &brush); expect(OutOfMemory, status); /* from rect with LinearGradientModeHorizontal */ rectf.X = rectf.Y = 10.0; rectf.Width = rectf.Height = 100.0; status = GdipCreateLineBrushFromRect(&rectf, 0, 0, LinearGradientModeHorizontal, WrapModeTile, &brush); expect(Ok, status); memset(&rectf, 0, sizeof(GpRectF)); status = GdipGetLineRect(brush, &rectf); expect(Ok, status); expectf(10.0, rectf.X); expectf(10.0, rectf.Y); expectf(100.0, rectf.Width); expectf(100.0, rectf.Height); status = GdipGetLineTransform(brush, transform); todo_wine expect(Ok, status); if (status == Ok) { status = GdipGetMatrixElements(transform, elements); expect(Ok,status); expectf(1.0, elements[0]); expectf(0.0, elements[1]); expectf(0.0, elements[2]); expectf(1.0, elements[3]); expectf(0.0, elements[4]); expectf(0.0, elements[5]); } status = GdipDeleteBrush((GpBrush*)brush); expect(Ok,status); /* passing negative Width/Height to LinearGradientModeHorizontal */ rectf.X = rectf.Y = 10.0; rectf.Width = rectf.Height = -100.0; status = GdipCreateLineBrushFromRect(&rectf, 0, 0, LinearGradientModeHorizontal, WrapModeTile, &brush); expect(Ok, status); memset(&rectf, 0, sizeof(GpRectF)); status = GdipGetLineRect(brush, &rectf); expect(Ok, status); expectf(10.0, rectf.X); expectf(10.0, rectf.Y); expectf(-100.0, rectf.Width); expectf(-100.0, rectf.Height); status = GdipGetLineTransform(brush, transform); todo_wine expect(Ok, status); if (status == Ok) { status = GdipGetMatrixElements(transform, elements); expect(Ok,status); expectf(1.0, elements[0]); expectf(0.0, elements[1]); expectf(0.0, elements[2]); expectf(1.0, elements[3]); expectf(0.0, elements[4]); expectf(0.0, elements[5]); } status = GdipDeleteBrush((GpBrush*)brush); expect(Ok,status); GdipDeleteMatrix(transform); }
static void test_gradientgetrect(void) { GpLineGradient *brush; GpRectF rectf; GpStatus status; GpPointF pt1, pt2; pt1.X = pt1.Y = 1.0; pt2.X = pt2.Y = 100.0; status = GdipCreateLineBrush(&pt1, &pt2, 0, 0, WrapModeTile, &brush); expect(Ok, status); memset(&rectf, 0, sizeof(GpRectF)); status = GdipGetLineRect(brush, &rectf); expect(Ok, status); expectf(1.0, rectf.X); expectf(1.0, rectf.Y); expectf(99.0, rectf.Width); expectf(99.0, rectf.Height); status = GdipDeleteBrush((GpBrush*)brush); /* vertical gradient */ pt1.X = pt1.Y = pt2.X = 0.0; pt2.Y = 10.0; status = GdipCreateLineBrush(&pt1, &pt2, 0, 0, WrapModeTile, &brush); expect(Ok, status); memset(&rectf, 0, sizeof(GpRectF)); status = GdipGetLineRect(brush, &rectf); expect(Ok, status); expectf(-5.0, rectf.X); expectf(0.0, rectf.Y); expectf(10.0, rectf.Width); expectf(10.0, rectf.Height); status = GdipDeleteBrush((GpBrush*)brush); /* horizontal gradient */ pt1.X = pt1.Y = pt2.Y = 0.0; pt2.X = 10.0; status = GdipCreateLineBrush(&pt1, &pt2, 0, 0, WrapModeTile, &brush); expect(Ok, status); memset(&rectf, 0, sizeof(GpRectF)); status = GdipGetLineRect(brush, &rectf); expect(Ok, status); expectf(0.0, rectf.X); expectf(-5.0, rectf.Y); expectf(10.0, rectf.Width); expectf(10.0, rectf.Height); status = GdipDeleteBrush((GpBrush*)brush); /* slope = -1 */ pt1.X = pt1.Y = 0.0; pt2.X = 20.0; pt2.Y = -20.0; status = GdipCreateLineBrush(&pt1, &pt2, 0, 0, WrapModeTile, &brush); expect(Ok, status); memset(&rectf, 0, sizeof(GpRectF)); status = GdipGetLineRect(brush, &rectf); expect(Ok, status); expectf(0.0, rectf.X); expectf(-20.0, rectf.Y); expectf(20.0, rectf.Width); expectf(20.0, rectf.Height); status = GdipDeleteBrush((GpBrush*)brush); /* slope = 1/100 */ pt1.X = pt1.Y = 0.0; pt2.X = 100.0; pt2.Y = 1.0; status = GdipCreateLineBrush(&pt1, &pt2, 0, 0, WrapModeTile, &brush); expect(Ok, status); memset(&rectf, 0, sizeof(GpRectF)); status = GdipGetLineRect(brush, &rectf); expect(Ok, status); expectf(0.0, rectf.X); expectf(0.0, rectf.Y); expectf(100.0, rectf.Width); expectf(1.0, rectf.Height); status = GdipDeleteBrush((GpBrush*)brush); /* from rect with LinearGradientModeHorizontal */ rectf.X = rectf.Y = 10.0; rectf.Width = rectf.Height = 100.0; status = GdipCreateLineBrushFromRect(&rectf, 0, 0, LinearGradientModeHorizontal, WrapModeTile, &brush); expect(Ok, status); memset(&rectf, 0, sizeof(GpRectF)); status = GdipGetLineRect(brush, &rectf); expect(Ok, status); expectf(10.0, rectf.X); expectf(10.0, rectf.Y); expectf(100.0, rectf.Width); expectf(100.0, rectf.Height); status = GdipDeleteBrush((GpBrush*)brush); /* passing negative Width/Height to LinearGradientModeHorizontal */ rectf.X = rectf.Y = 10.0; rectf.Width = rectf.Height = -100.0; status = GdipCreateLineBrushFromRect(&rectf, 0, 0, LinearGradientModeHorizontal, WrapModeTile, &brush); expect(Ok, status); memset(&rectf, 0, sizeof(GpRectF)); status = GdipGetLineRect(brush, &rectf); expect(Ok, status); expectf(10.0, rectf.X); expectf(10.0, rectf.Y); expectf(-100.0, rectf.Width); expectf(-100.0, rectf.Height); status = GdipDeleteBrush((GpBrush*)brush); }