1a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com/* 2a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com * Copyright 2011 Google Inc. 3a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com * 4a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com * Use of this source code is governed by a BSD-style license that can be 5a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com * found in the LICENSE file. 6a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com */ 7a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 8a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com#include "gm.h" 9a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com#include "SkCanvas.h" 10a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com#include "SkColorPriv.h" 11a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com#include "SkShader.h" 12a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 13761661580e798abe3caed8d45c7e742ac87521c6reed@google.comstatic void test4(SkCanvas* canvas) { 14761661580e798abe3caed8d45c7e742ac87521c6reed@google.com SkPaint paint; 15761661580e798abe3caed8d45c7e742ac87521c6reed@google.com paint.setAntiAlias(true); 16761661580e798abe3caed8d45c7e742ac87521c6reed@google.com SkPoint pts[] = { 17761661580e798abe3caed8d45c7e742ac87521c6reed@google.com {10, 160}, {610, 160}, 18761661580e798abe3caed8d45c7e742ac87521c6reed@google.com {610, 160}, {10, 160}, 19d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 20761661580e798abe3caed8d45c7e742ac87521c6reed@google.com {610, 160}, {610, 160}, 21761661580e798abe3caed8d45c7e742ac87521c6reed@google.com {610, 199}, {610, 199}, 22d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 23761661580e798abe3caed8d45c7e742ac87521c6reed@google.com {10, 198}, {610, 198}, 24761661580e798abe3caed8d45c7e742ac87521c6reed@google.com {610, 199}, {10, 199}, 25d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 26761661580e798abe3caed8d45c7e742ac87521c6reed@google.com {10, 160}, {10, 160}, 27761661580e798abe3caed8d45c7e742ac87521c6reed@google.com {10, 199}, {10, 199} 28761661580e798abe3caed8d45c7e742ac87521c6reed@google.com }; 29761661580e798abe3caed8d45c7e742ac87521c6reed@google.com char verbs[] = { 30d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 0, 1, 1, 1, 4, 31761661580e798abe3caed8d45c7e742ac87521c6reed@google.com 0, 1, 1, 1, 4, 32761661580e798abe3caed8d45c7e742ac87521c6reed@google.com 0, 1, 1, 1, 4, 33761661580e798abe3caed8d45c7e742ac87521c6reed@google.com 0, 1, 1, 1, 4 34761661580e798abe3caed8d45c7e742ac87521c6reed@google.com }; 35761661580e798abe3caed8d45c7e742ac87521c6reed@google.com SkPath path; 36761661580e798abe3caed8d45c7e742ac87521c6reed@google.com SkPoint* ptPtr = pts; 3731648eb1cfe19257ec077efebb11ab251bfd25f7bsalomon@google.com for (size_t i = 0; i < sizeof(verbs); ++i) { 38761661580e798abe3caed8d45c7e742ac87521c6reed@google.com switch ((SkPath::Verb) verbs[i]) { 39761661580e798abe3caed8d45c7e742ac87521c6reed@google.com case SkPath::kMove_Verb: 40761661580e798abe3caed8d45c7e742ac87521c6reed@google.com path.moveTo(ptPtr->fX, ptPtr->fY); 41761661580e798abe3caed8d45c7e742ac87521c6reed@google.com ++ptPtr; 42761661580e798abe3caed8d45c7e742ac87521c6reed@google.com break; 43761661580e798abe3caed8d45c7e742ac87521c6reed@google.com case SkPath::kLine_Verb: 44761661580e798abe3caed8d45c7e742ac87521c6reed@google.com path.lineTo(ptPtr->fX, ptPtr->fY); 45761661580e798abe3caed8d45c7e742ac87521c6reed@google.com ++ptPtr; 46761661580e798abe3caed8d45c7e742ac87521c6reed@google.com break; 47761661580e798abe3caed8d45c7e742ac87521c6reed@google.com case SkPath::kClose_Verb: 48761661580e798abe3caed8d45c7e742ac87521c6reed@google.com path.close(); 49761661580e798abe3caed8d45c7e742ac87521c6reed@google.com break; 5031648eb1cfe19257ec077efebb11ab251bfd25f7bsalomon@google.com default: 5131648eb1cfe19257ec077efebb11ab251bfd25f7bsalomon@google.com SkASSERT(false); 5231648eb1cfe19257ec077efebb11ab251bfd25f7bsalomon@google.com break; 53761661580e798abe3caed8d45c7e742ac87521c6reed@google.com } 54761661580e798abe3caed8d45c7e742ac87521c6reed@google.com } 55761661580e798abe3caed8d45c7e742ac87521c6reed@google.com SkRect clip = {0, 130, 772, 531}; 56761661580e798abe3caed8d45c7e742ac87521c6reed@google.com canvas->clipRect(clip); 57761661580e798abe3caed8d45c7e742ac87521c6reed@google.com canvas->drawPath(path, paint); 58761661580e798abe3caed8d45c7e742ac87521c6reed@google.com} 59761661580e798abe3caed8d45c7e742ac87521c6reed@google.com 60a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.comstatic const struct { 61a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com SkXfermode::Mode fMode; 62a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com const char* fLabel; 63a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com} gModes[] = { 64a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com { SkXfermode::kClear_Mode, "Clear" }, 65a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com { SkXfermode::kSrc_Mode, "Src" }, 66a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com { SkXfermode::kDst_Mode, "Dst" }, 67a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com { SkXfermode::kSrcOver_Mode, "SrcOver" }, 68a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com { SkXfermode::kDstOver_Mode, "DstOver" }, 69a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com { SkXfermode::kSrcIn_Mode, "SrcIn" }, 70a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com { SkXfermode::kDstIn_Mode, "DstIn" }, 71a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com { SkXfermode::kSrcOut_Mode, "SrcOut" }, 72a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com { SkXfermode::kDstOut_Mode, "DstOut" }, 73a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com { SkXfermode::kSrcATop_Mode, "SrcATop" }, 74a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com { SkXfermode::kDstATop_Mode, "DstATop" }, 75a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com { SkXfermode::kXor_Mode, "Xor" }, 76a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com}; 77a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 78a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.comconst int gWidth = 64; 79a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.comconst int gHeight = 64; 80a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.comconst SkScalar W = SkIntToScalar(gWidth); 81a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.comconst SkScalar H = SkIntToScalar(gHeight); 82a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 83a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.comstatic SkScalar drawCell(SkCanvas* canvas, SkXfermode* mode, 84a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com SkAlpha a0, SkAlpha a1) { 85a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 86a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com SkPaint paint; 87a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com paint.setAntiAlias(true); 88a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 89a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com SkRect r = SkRect::MakeWH(W, H); 90a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com r.inset(W/10, H/10); 91a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 92a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com paint.setColor(SK_ColorBLUE); 93a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com paint.setAlpha(a0); 94a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com canvas->drawOval(r, paint); 95a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 96a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com paint.setColor(SK_ColorRED); 97a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com paint.setAlpha(a1); 98a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com paint.setXfermode(mode); 99a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 100a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com SkScalar offset = SK_Scalar1 / 3; 101a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com SkRect rect = SkRect::MakeXYWH(W / 4 + offset, 102a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com H / 4 + offset, 103a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com W / 2, H / 2); 104a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com canvas->drawRect(rect, paint); 105d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 106a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com return H; 107a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com} 108a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 109a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.comstatic SkShader* make_bg_shader() { 110a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com SkBitmap bm; 111eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com bm.allocN32Pixels(2, 2); 112a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com *bm.getAddr32(0, 0) = *bm.getAddr32(1, 1) = 0xFFFFFFFF; 113a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com *bm.getAddr32(1, 0) = *bm.getAddr32(0, 1) = SkPackARGB32(0xFF, 0xCC, 114a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 0xCC, 0xCC); 115a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 1169c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org SkMatrix m; 1179c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org m.setScale(SkIntToScalar(6), SkIntToScalar(6)); 118a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com SkShader* s = SkShader::CreateBitmapShader(bm, 119a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com SkShader::kRepeat_TileMode, 1209c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org SkShader::kRepeat_TileMode, 1219c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org &m); 122d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 123a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com return s; 124a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com} 125a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 126a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.comnamespace skiagm { 127d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 128a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com class AARectModesGM : public GM { 129a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com SkPaint fBGPaint; 130a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com public: 131a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com AARectModesGM () { 132a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com fBGPaint.setShader(make_bg_shader())->unref(); 133a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com } 134a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 135a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com protected: 136a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org virtual uint32_t onGetFlags() const SK_OVERRIDE { 137a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org return kSkipTiled_Flag; 138a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org } 139a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 140a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com virtual SkString onShortName() { 141a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com return SkString("aarectmodes"); 142a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com } 143a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 144f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina virtual SkISize onISize() { return SkISize::Make(640, 480); } 145a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 146a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com virtual void onDraw(SkCanvas* canvas) { 1471313086ef4d901176e569d1f4b6362250ac02cd7caryclark@google.com if (false) { // avoid bit rot, suppress warning 1481313086ef4d901176e569d1f4b6362250ac02cd7caryclark@google.com test4(canvas); 1491313086ef4d901176e569d1f4b6362250ac02cd7caryclark@google.com } 150a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com const SkRect bounds = SkRect::MakeWH(W, H); 151a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com static const SkAlpha gAlphaValue[] = { 0xFF, 0x88, 0x88 }; 152a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 153a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com canvas->translate(SkIntToScalar(4), SkIntToScalar(4)); 154a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 155a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com for (int alpha = 0; alpha < 4; ++alpha) { 156a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com canvas->save(); 157a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com canvas->save(); 158a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); ++i) { 159a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com if (6 == i) { 160a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com canvas->restore(); 161a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com canvas->translate(W * 5, 0); 162a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com canvas->save(); 163a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com } 164a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com SkXfermode* mode = SkXfermode::Create(gModes[i].fMode); 165d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 166a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com canvas->drawRect(bounds, fBGPaint); 167a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com canvas->saveLayer(&bounds, NULL); 168a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com SkScalar dy = drawCell(canvas, mode, 169a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com gAlphaValue[alpha & 1], 170a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com gAlphaValue[alpha & 2]); 171a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com canvas->restore(); 172a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 173a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com canvas->translate(0, dy * 5 / 4); 174a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com SkSafeUnref(mode); 175a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com } 176a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com canvas->restore(); 177a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com canvas->restore(); 178a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com canvas->translate(W * 5 / 4, 0); 179a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com } 180a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com } 181a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 182a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com private: 183a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com typedef GM INHERITED; 184a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com }; 185a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 186a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com////////////////////////////////////////////////////////////////////////////// 187a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 188a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com static GM* MyFactory(void*) { return new AARectModesGM; } 189a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com static GMRegistry reg(MyFactory); 190a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 191a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com} 192