From f9a0a660ecbb18cf552631ae91c31dec233e612b Mon Sep 17 00:00:00 2001 From: "fmalita@google.com" Date: Fri, 23 Aug 2013 18:08:53 +0000 Subject: Updated SkLumaXfermode GM. Added AA & gradient combinations. Review URL: https://codereview.chromium.org/23382012 git-svn-id: http://skia.googlecode.com/svn/trunk@10893 2bbb7eff-a529-9590-31e7-b0007b416f81 --- gm/lumamode.cpp | 129 +++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 96 insertions(+), 33 deletions(-) diff --git a/gm/lumamode.cpp b/gm/lumamode.cpp index ddafc7c351..adb7792d9d 100644 --- a/gm/lumamode.cpp +++ b/gm/lumamode.cpp @@ -7,48 +7,65 @@ #include "gm.h" #include "SkCanvas.h" +#include "SkGradientShader.h" #include "SkLumaXfermode.h" -static void show_scene(SkCanvas* canvas, SkXfermode* mode, const char* label) { +static unsigned kSize = 80; +static unsigned kInset = 10; +static SkColor kColor1 = SkColorSetARGB(0xff, 0xff, 0xff, 0); +static SkColor kColor2 = SkColorSetARGB(0xff, 0x80, 0xff, 0); + +static void draw_label(SkCanvas* canvas, const char* label, + const SkPoint& offset) { + SkPaint paint; + size_t len = strlen(label); + + SkScalar width = paint.measureText(label, len); + canvas->drawText(label, len, offset.x() - width / 2, offset.y(), + paint); +} + +static void draw_scene(SkCanvas* canvas, SkXfermode* mode, bool aa, + SkShader* s1, SkShader* s2) { SkPaint paint; - paint.setAntiAlias(true); - SkRect r, c, bounds = { 10, 10, 110, 110 }; + paint.setAntiAlias(aa); + SkRect r, c, bounds = SkRect::MakeWH(kSize, kSize); c = bounds; c.fRight = bounds.centerX(); - r = bounds; - r.fBottom = bounds.centerY(); - canvas->drawRect(r, paint); - - SkScalar tw = paint.measureText(label, strlen(label)); - canvas->drawText(label, strlen(label), bounds.centerX() - tw / 2, - bounds.bottom() + 15, paint); + canvas->drawRect(bounds, paint); canvas->saveLayer(&bounds, NULL); r = bounds; - r.inset(20, 0); - paint.setColor(0x80FFFF00); - canvas->drawOval(r, paint); - canvas->save(); - canvas->clipRect(c); - paint.setColor(0xFFFFFF00); + r.inset(kInset, 0); + paint.setShader(s1); + paint.setColor(s1 ? SK_ColorBLACK : SkColorSetA(kColor1, 0x80)); canvas->drawOval(r, paint); - canvas->restore(); + if (!s1) { + canvas->save(); + canvas->clipRect(c); + paint.setColor(s1 ? SK_ColorBLACK : kColor1); + canvas->drawOval(r, paint); + canvas->restore(); + } SkPaint xferPaint; xferPaint.setXfermode(mode); canvas->saveLayer(&bounds, &xferPaint); r = bounds; - r.inset(0, 20); - paint.setColor(0x8080FF00); + r.inset(0, kInset); + paint.setShader(s2); + paint.setColor(s2 ? SK_ColorBLACK : SkColorSetA(kColor2, 0x80)); canvas->drawOval(r, paint); - canvas->save(); - canvas->clipRect(c); - paint.setColor(0xFF80FF00); - canvas->drawOval(r, paint); - canvas->restore(); + if (!s2) { + canvas->save(); + canvas->clipRect(c); + paint.setColor(s2 ? SK_ColorBLACK : kColor2); + canvas->drawOval(r, paint); + canvas->restore(); + } canvas->restore(); canvas->restore(); @@ -56,7 +73,27 @@ static void show_scene(SkCanvas* canvas, SkXfermode* mode, const char* label) { class LumaXfermodeGM : public skiagm::GM { public: - LumaXfermodeGM() {} + LumaXfermodeGM() { + fSrcInXfer.reset(SkLumaMaskXfermode::Create(SkXfermode::kSrcIn_Mode)); + fDstInXfer.reset(SkLumaMaskXfermode::Create(SkXfermode::kDstIn_Mode)); + + SkColor g1Colors[] = { kColor1, SkColorSetA(kColor1, 0x20) }; + SkColor g2Colors[] = { kColor2, SkColorSetA(kColor2, 0x20) }; + SkPoint g1Points[] = { {0, 0}, {0, 100} }; + SkPoint g2Points[] = { {0, 0}, {kSize, 0} }; + SkScalar pos[] = { 0.2f, 1.0f }; + + fGr1.reset(SkGradientShader::CreateLinear(g1Points, + g1Colors, + pos, + SK_ARRAY_COUNT(g1Colors), + SkShader::kClamp_TileMode)); + fGr2.reset(SkGradientShader::CreateLinear(g2Points, + g2Colors, + pos, + SK_ARRAY_COUNT(g2Colors), + SkShader::kClamp_TileMode)); + } protected: virtual SkString onShortName() SK_OVERRIDE { @@ -64,20 +101,46 @@ protected: } virtual SkISize onISize() SK_OVERRIDE { - return SkISize::Make(450, 140); + return SkISize::Make(600, 420); } virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { - show_scene(canvas, NULL, "SrcOver"); - canvas->translate(150, 0); - SkAutoTUnref src_in(SkLumaMaskXfermode::Create(SkXfermode::kSrcIn_Mode)); - show_scene(canvas, src_in.get(), "SrcInLuma"); - canvas->translate(150, 0); - SkAutoTUnref dst_in(SkLumaMaskXfermode::Create(SkXfermode::kDstIn_Mode)); - show_scene(canvas, dst_in.get(), "DstInLuma"); + SkXfermode* modes[] = { NULL, fSrcInXfer, fDstInXfer }; + struct { + SkShader* fShader1; + SkShader* fShader2; + } shaders[] = { + { NULL, NULL }, + { NULL, fGr2 }, + { fGr1, NULL }, + { fGr1, fGr2 }, + }; + + draw_label(canvas, "SrcOver", + SkPoint::Make(kSize + 2 * kInset, 20)); + draw_label(canvas, "SrcInLuma", + SkPoint::Make(3 * (kSize + 2 * kInset), 20)); + draw_label(canvas, "DstInLuma", + SkPoint::Make(5 * (kSize + 2 * kInset), 20)); + for (size_t i = 0; i < SK_ARRAY_COUNT(shaders); ++i) { + canvas->save(); + canvas->translate(kInset, 30 + i * (kSize + 2 * kInset)); + for (size_t m = 0; m < SK_ARRAY_COUNT(modes); ++m) { + draw_scene(canvas, modes[m], true, shaders[i].fShader1, + shaders[i].fShader2); + canvas->translate(kSize + 2 * kInset, 0); + draw_scene(canvas, modes[m], false, shaders[i].fShader1, + shaders[i].fShader2); + canvas->translate(kSize + 2 * kInset, 0); + } + canvas->restore(); + } } private: + SkAutoTUnref fGr1, fGr2; + SkAutoTUnref fSrcInXfer, fDstInXfer; + typedef skiagm::GM INHERITED; }; -- cgit v1.2.3