diff options
author | reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2012-06-06 20:31:56 +0000 |
---|---|---|
committer | reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2012-06-06 20:31:56 +0000 |
commit | cb7be694c31f833c00a0dfb3529aaead3a4db62d (patch) | |
tree | 41bf84b12e7b0e128cb5b75f21abb037ca3f2cff /gm | |
parent | d895b055a05992f5575fee08f0e1ccfe167b0f94 (diff) |
Add new gradient to support HTML Canvas2D two-point-radial-gradient. Ours is
called (for now at least) TwoPointConical, to distinguish it from the
existing one (TwoPointRadial), and to reflect its odd behavior where it draws
transparent outside the boundary of the "cone" between the two circles.
This impl is unsupported by GPU and Printing at the moment, and Chrome does not
yet invoke it.
Review URL: https://codereview.appspot.com/6299051
git-svn-id: http://skia.googlecode.com/svn/trunk@4197 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'gm')
-rw-r--r-- | gm/twopointradial.cpp | 36 |
1 files changed, 24 insertions, 12 deletions
diff --git a/gm/twopointradial.cpp b/gm/twopointradial.cpp index b87f896174..52e338d984 100644 --- a/gm/twopointradial.cpp +++ b/gm/twopointradial.cpp @@ -17,6 +17,11 @@ static void intToScalars(SkScalar dst[], const int src[], int n) { } static void drawGrad(SkCanvas* canvas, const SkScalar d0[], const SkScalar d1[]) { + const SkRect bounds = SkRect::MakeXYWH(SkIntToScalar(-50), + SkIntToScalar(-50), + SkIntToScalar(200), + SkIntToScalar(100)); + SkPoint c0 = { d0[0], d0[1] }; SkScalar r0 = d0[2]; SkPoint c1 = { d1[0], d1[1] }; @@ -25,18 +30,25 @@ static void drawGrad(SkCanvas* canvas, const SkScalar d0[], const SkScalar d1[]) SkColor colors[] = { SK_ColorGREEN, SK_ColorRED }; SkPaint paint; paint.setAntiAlias(true); - paint.setShader(SkGradientShader::CreateTwoPointRadial(c0, r0, c1, r1, - colors, NULL, 2, - SkShader::kClamp_TileMode))->unref(); - canvas->drawRect(SkRect::MakeXYWH(SkIntToScalar(-50), - SkIntToScalar(-50), - SkIntToScalar(200), - SkIntToScalar(100)), paint); + + SkString str; + str.printf("%g,%g,%g %g,%g,%g", + SkScalarToFloat(c0.fX), SkScalarToFloat(c0.fY), SkScalarToFloat(r0), + SkScalarToFloat(c1.fX), SkScalarToFloat(c1.fY), SkScalarToFloat(r1)); + canvas->drawText(str.c_str(), str.size(), + bounds.fLeft, bounds.fTop - paint.getTextSize()/2, paint); + + paint.setShader(SkGradientShader::CreateTwoPointConical(c0, r0, c1, r1, + colors, NULL, 2, + SkShader::kClamp_TileMode))->unref(); + canvas->drawRect(bounds, paint); paint.setShader(NULL); + paint.setColor(0x66000000); paint.setStyle(SkPaint::kStroke_Style); canvas->drawCircle(c0.fX, c0.fY, r0, paint); canvas->drawCircle(c1.fX, c1.fY, r1, paint); + canvas->drawRect(bounds, paint); } class TwoPointRadialGM : public skiagm::GM { @@ -45,10 +57,10 @@ public: protected: SkString onShortName() { - return SkString("two_point_radial"); + return SkString("twopointconical"); } - SkISize onISize() { return skiagm::make_isize(480, 725); } + SkISize onISize() { return skiagm::make_isize(480, 780); } // BUG: PDF code (at least on mac) fails when we run this virtual uint32_t onGetFlags() const SK_OVERRIDE { return kSkipPDF_Flag; } @@ -64,15 +76,15 @@ protected: const int R1 = 40; const SkScalar DX = SkIntToScalar(250); - const SkScalar DY = SkIntToScalar(120); + const SkScalar DY = SkIntToScalar(130); - canvas->translate(SkIntToScalar(60), SkIntToScalar(60)); + canvas->translate(SkIntToScalar(60), SkIntToScalar(70)); static const int gData[] = { 0, 0, R0, 0, 0, R1, + 0, 0, R0, 20, 0, R1, 0, 0, R0, 25, 0, R1, 0, 0, R0, 100, 0, R1, - 0, 0, R0, 0, 0, R0, 0, 0, R0, 25, 0, R0, 0, 0, R0, 100, 0, R0, }; |