1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 8dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com#include "gm.h" 9dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com#include "SkBitmap.h" 10dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com#include "SkShader.h" 11dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com#include "SkXfermode.h" 12dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com 13dd0ac281e920b01a63789893cc3e7422789658ddreed@android.comnamespace skiagm { 14dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com 157542dc8897d151afc0eca7dd73d72ea05f92baadcommit-bot@chromium.orgstatic void make_bitmaps(int w, int h, SkBitmap* src, SkBitmap* dst, 167542dc8897d151afc0eca7dd73d72ea05f92baadcommit-bot@chromium.org SkBitmap* transparent) { 17eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com src->allocN32Pixels(w, h); 18dbfac8a72393eaf01670aeb3244de0e18d8faf98junov@google.com src->eraseColor(SK_ColorTRANSPARENT); 19dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com 20dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com SkPaint p; 213bd217366342ffc331f9659b6fb1c759318be95bmike@reedtribe.org p.setAntiAlias(true); 223bd217366342ffc331f9659b6fb1c759318be95bmike@reedtribe.org 23dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com SkRect r; 24dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com SkScalar ww = SkIntToScalar(w); 25dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com SkScalar hh = SkIntToScalar(h); 26dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com 273bd217366342ffc331f9659b6fb1c759318be95bmike@reedtribe.org { 283bd217366342ffc331f9659b6fb1c759318be95bmike@reedtribe.org SkCanvas c(*src); 293bd217366342ffc331f9659b6fb1c759318be95bmike@reedtribe.org p.setColor(0xFFFFCC44); 303bd217366342ffc331f9659b6fb1c759318be95bmike@reedtribe.org r.set(0, 0, ww*3/4, hh*3/4); 313bd217366342ffc331f9659b6fb1c759318be95bmike@reedtribe.org c.drawOval(r, p); 323bd217366342ffc331f9659b6fb1c759318be95bmike@reedtribe.org } 3386bf5c91f8cbd3ab37a924db18fecf693b509d96tomhudson@google.com 34dac522589e9395b4654a1a708f1bd971f37f95a5commit-bot@chromium.org dst->allocN32Pixels(w, h); 35dbfac8a72393eaf01670aeb3244de0e18d8faf98junov@google.com dst->eraseColor(SK_ColorTRANSPARENT); 36dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com 373bd217366342ffc331f9659b6fb1c759318be95bmike@reedtribe.org { 383bd217366342ffc331f9659b6fb1c759318be95bmike@reedtribe.org SkCanvas c(*dst); 393bd217366342ffc331f9659b6fb1c759318be95bmike@reedtribe.org p.setColor(0xFF66AAFF); 403bd217366342ffc331f9659b6fb1c759318be95bmike@reedtribe.org r.set(ww/3, hh/3, ww*19/20, hh*19/20); 413bd217366342ffc331f9659b6fb1c759318be95bmike@reedtribe.org c.drawRect(r, p); 423bd217366342ffc331f9659b6fb1c759318be95bmike@reedtribe.org } 437542dc8897d151afc0eca7dd73d72ea05f92baadcommit-bot@chromium.org 44dac522589e9395b4654a1a708f1bd971f37f95a5commit-bot@chromium.org transparent->allocN32Pixels(w, h); 457542dc8897d151afc0eca7dd73d72ea05f92baadcommit-bot@chromium.org transparent->eraseColor(SK_ColorTRANSPARENT); 46dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com} 47dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com 487312a183270db1dc4e23412465a41af47c45b95cscroggo@google.comstatic uint16_t gData[] = { 0xFFFF, 0xCCCF, 0xCCCF, 0xFFFF }; 497312a183270db1dc4e23412465a41af47c45b95cscroggo@google.com 50dd0ac281e920b01a63789893cc3e7422789658ddreed@android.comclass XfermodesGM : public GM { 513b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org enum SrcType { 523b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org //! A WxH image with a rectangle in the lower right. 533b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org kRectangleImage_SrcType = 0x01, 543b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org //! kRectangleImage_SrcType with an alpha of 34.5%. 553b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org kRectangleImageWithAlpha_SrcType = 0x02, 563b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org //! kRectnagleImageWithAlpha_SrcType scaled down by half. 573b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org kSmallRectangleImageWithAlpha_SrcType = 0x04, 583b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org //! kRectangleImage_SrcType drawn directly instead in an image. 593b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org kRectangle_SrcType = 0x08, 603b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org //! Two rectangles, first on the right half, second on the bottom half. 613b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org kQuarterClear_SrcType = 0x10, 623b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org //! kQuarterClear_SrcType in a layer. 633b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org kQuarterClearInLayer_SrcType = 0x20, 647542dc8897d151afc0eca7dd73d72ea05f92baadcommit-bot@chromium.org //! A W/2xH/2 transparent image. 657542dc8897d151afc0eca7dd73d72ea05f92baadcommit-bot@chromium.org kSmallTransparentImage_SrcType = 0x40, 664e8f1e56b17c3663d1892f44a4c1893b568ce67fcommit-bot@chromium.org //! kRectangleImage_SrcType drawn directly with a mask. 674e8f1e56b17c3663d1892f44a4c1893b568ce67fcommit-bot@chromium.org kRectangleWithMask_SrcType = 0x80, 683b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org 694e8f1e56b17c3663d1892f44a4c1893b568ce67fcommit-bot@chromium.org kAll_SrcType = 0xFF, //!< All the source types. 703b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org kBasic_SrcType = 0x03, //!< Just basic source types. 713b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org }; 723b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org 73dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com SkBitmap fBG; 747542dc8897d151afc0eca7dd73d72ea05f92baadcommit-bot@chromium.org SkBitmap fSrcB, fDstB, fTransparent; 75dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com 763b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org /* The srcType argument indicates what to draw for the source part. Skia 773b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org * uses the implied shape of the drawing command and these modes 783b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org * demonstrate that. 793b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org */ 803b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org void draw_mode(SkCanvas* canvas, SkXfermode* mode, SrcType srcType, 81f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com SkScalar x, SkScalar y) { 82dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com SkPaint p; 833b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org SkMatrix m; 843b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org bool restoreNeeded = false; 853b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org m.setTranslate(x, y); 8686bf5c91f8cbd3ab37a924db18fecf693b509d96tomhudson@google.com 873b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org canvas->drawBitmapMatrix(fSrcB, m, &p); 88dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com p.setXfermode(mode); 893b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org switch (srcType) { 907542dc8897d151afc0eca7dd73d72ea05f92baadcommit-bot@chromium.org case kSmallTransparentImage_SrcType: 917542dc8897d151afc0eca7dd73d72ea05f92baadcommit-bot@chromium.org m.postScale(SK_ScalarHalf, SK_ScalarHalf, x, y); 927542dc8897d151afc0eca7dd73d72ea05f92baadcommit-bot@chromium.org canvas->drawBitmapMatrix(fTransparent, m, &p); 937542dc8897d151afc0eca7dd73d72ea05f92baadcommit-bot@chromium.org break; 943b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org case kQuarterClearInLayer_SrcType: { 95f5747daed9e3392b0a8875a7dbedfcd652b6781avandebo@chromium.org SkRect bounds = SkRect::MakeXYWH(x, y, SkIntToScalar(W), 96f5747daed9e3392b0a8875a7dbedfcd652b6781avandebo@chromium.org SkIntToScalar(H)); 973b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org canvas->saveLayer(&bounds, &p); 983b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org restoreNeeded = true; 993b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org p.setXfermodeMode(SkXfermode::kSrcOver_Mode); 1003b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org // Fall through. 1013b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org } 1023b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org case kQuarterClear_SrcType: { 1033b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org SkScalar halfW = SkIntToScalar(W) / 2; 1043b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org SkScalar halfH = SkIntToScalar(H) / 2; 1053b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org p.setColor(0xFF66AAFF); 106f5747daed9e3392b0a8875a7dbedfcd652b6781avandebo@chromium.org SkRect r = SkRect::MakeXYWH(x + halfW, y, halfW, 107f5747daed9e3392b0a8875a7dbedfcd652b6781avandebo@chromium.org SkIntToScalar(H)); 1083b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org canvas->drawRect(r, p); 1093b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org p.setColor(0xFFAA66FF); 110f5747daed9e3392b0a8875a7dbedfcd652b6781avandebo@chromium.org r = SkRect::MakeXYWH(x, y + halfH, SkIntToScalar(W), halfH); 1113b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org canvas->drawRect(r, p); 1123b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org break; 1133b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org } 1144e8f1e56b17c3663d1892f44a4c1893b568ce67fcommit-bot@chromium.org case kRectangleWithMask_SrcType: { 115091a594dbc4116ec2e54724432472bf37dae794acommit-bot@chromium.org canvas->save(); 1164e8f1e56b17c3663d1892f44a4c1893b568ce67fcommit-bot@chromium.org restoreNeeded = true; 1174e8f1e56b17c3663d1892f44a4c1893b568ce67fcommit-bot@chromium.org SkScalar w = SkIntToScalar(W); 1184e8f1e56b17c3663d1892f44a4c1893b568ce67fcommit-bot@chromium.org SkScalar h = SkIntToScalar(H); 1194e8f1e56b17c3663d1892f44a4c1893b568ce67fcommit-bot@chromium.org SkRect r = SkRect::MakeXYWH(x, y + h / 4, w, h * 23 / 60); 1204e8f1e56b17c3663d1892f44a4c1893b568ce67fcommit-bot@chromium.org canvas->clipRect(r); 1214e8f1e56b17c3663d1892f44a4c1893b568ce67fcommit-bot@chromium.org // Fall through. 1224e8f1e56b17c3663d1892f44a4c1893b568ce67fcommit-bot@chromium.org } 1233b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org case kRectangle_SrcType: { 1243b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org SkScalar w = SkIntToScalar(W); 1253b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org SkScalar h = SkIntToScalar(H); 1263b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org SkRect r = SkRect::MakeXYWH(x + w / 3, y + h / 3, 1273b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org w * 37 / 60, h * 37 / 60); 1283b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org p.setColor(0xFF66AAFF); 1293b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org canvas->drawRect(r, p); 1303b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org break; 1313b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org } 1323b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org case kSmallRectangleImageWithAlpha_SrcType: 1333b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org m.postScale(SK_ScalarHalf, SK_ScalarHalf, x, y); 1343b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org // Fall through. 1353b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org case kRectangleImageWithAlpha_SrcType: 1363b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org p.setAlpha(0x88); 1373b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org // Fall through. 1383b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org case kRectangleImage_SrcType: 1393b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org canvas->drawBitmapMatrix(fDstB, m, &p); 1403b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org break; 1413b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org default: 1423b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org break; 1433b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org } 1443b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org 1453b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org if (restoreNeeded) { 1463b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org canvas->restore(); 1473b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org } 148dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com } 14986bf5c91f8cbd3ab37a924db18fecf693b509d96tomhudson@google.com 1507312a183270db1dc4e23412465a41af47c45b95cscroggo@google.com virtual void onOnceBeforeDraw() SK_OVERRIDE { 151dac522589e9395b4654a1a708f1bd971f37f95a5commit-bot@chromium.org fBG.installPixels(SkImageInfo::Make(2, 2, kARGB_4444_SkColorType, 152dac522589e9395b4654a1a708f1bd971f37f95a5commit-bot@chromium.org kOpaque_SkAlphaType), 153dac522589e9395b4654a1a708f1bd971f37f95a5commit-bot@chromium.org gData, 4); 1547312a183270db1dc4e23412465a41af47c45b95cscroggo@google.com 1557542dc8897d151afc0eca7dd73d72ea05f92baadcommit-bot@chromium.org make_bitmaps(W, H, &fSrcB, &fDstB, &fTransparent); 1565213c042169bd63ebb27c50772062154ec2f3a4freed@google.com } 1575213c042169bd63ebb27c50772062154ec2f3a4freed@google.com 158dd0ac281e920b01a63789893cc3e7422789658ddreed@android.compublic: 159f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com const static int W = 64; 160f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com const static int H = 64; 1617312a183270db1dc4e23412465a41af47c45b95cscroggo@google.com XfermodesGM() {} 16286bf5c91f8cbd3ab37a924db18fecf693b509d96tomhudson@google.com 163dd0ac281e920b01a63789893cc3e7422789658ddreed@android.comprotected: 164048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com virtual SkString onShortName() { 1658015dd83ae37147bb630d4751030868051ad0caereed@android.com return SkString("xfermodes"); 1668015dd83ae37147bb630d4751030868051ad0caereed@android.com } 1678015dd83ae37147bb630d4751030868051ad0caereed@android.com 16886bf5c91f8cbd3ab37a924db18fecf693b509d96tomhudson@google.com virtual SkISize onISize() { 169f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina return SkISize::Make(1990, 640); 170048522dd2aa45d1b4bf52944527f877b30ea45fdreed@android.com } 171dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com 172dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com virtual void onDraw(SkCanvas* canvas) { 173f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com canvas->translate(SkIntToScalar(10), SkIntToScalar(20)); 17486bf5c91f8cbd3ab37a924db18fecf693b509d96tomhudson@google.com 175dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com const struct { 176f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com SkXfermode::Mode fMode; 1773b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org const char* fLabel; 1783b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org int fSourceTypeMask; // The source types to use this 1793b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org // mode with. See draw_mode for 1803b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org // an explanation of each type. 1813b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org // PDF has to play some tricks 1823b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org // to support the base modes, 1833b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org // test those more extensively. 184dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com } gModes[] = { 1853b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org { SkXfermode::kClear_Mode, "Clear", kAll_SrcType }, 1863b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org { SkXfermode::kSrc_Mode, "Src", kAll_SrcType }, 1873b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org { SkXfermode::kDst_Mode, "Dst", kAll_SrcType }, 1883b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org { SkXfermode::kSrcOver_Mode, "SrcOver", kAll_SrcType }, 1893b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org { SkXfermode::kDstOver_Mode, "DstOver", kAll_SrcType }, 1903b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org { SkXfermode::kSrcIn_Mode, "SrcIn", kAll_SrcType }, 1913b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org { SkXfermode::kDstIn_Mode, "DstIn", kAll_SrcType }, 1923b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org { SkXfermode::kSrcOut_Mode, "SrcOut", kAll_SrcType }, 1933b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org { SkXfermode::kDstOut_Mode, "DstOut", kAll_SrcType }, 1943b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org { SkXfermode::kSrcATop_Mode, "SrcATop", kAll_SrcType }, 1953b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org { SkXfermode::kDstATop_Mode, "DstATop", kAll_SrcType }, 1963b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org 1973b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org { SkXfermode::kXor_Mode, "Xor", kBasic_SrcType }, 1983b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org { SkXfermode::kPlus_Mode, "Plus", kBasic_SrcType }, 1993b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org { SkXfermode::kModulate_Mode, "Modulate", kAll_SrcType }, 2003b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org { SkXfermode::kScreen_Mode, "Screen", kBasic_SrcType }, 2013b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org { SkXfermode::kOverlay_Mode, "Overlay", kBasic_SrcType }, 2023b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org { SkXfermode::kDarken_Mode, "Darken", kBasic_SrcType }, 2033b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org { SkXfermode::kLighten_Mode, "Lighten", kBasic_SrcType }, 2043b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org { SkXfermode::kColorDodge_Mode, "ColorDodge", kBasic_SrcType }, 2053b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org { SkXfermode::kColorBurn_Mode, "ColorBurn", kBasic_SrcType }, 2063b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org { SkXfermode::kHardLight_Mode, "HardLight", kBasic_SrcType }, 2073b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org { SkXfermode::kSoftLight_Mode, "SoftLight", kBasic_SrcType }, 2083b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org { SkXfermode::kDifference_Mode, "Difference", kBasic_SrcType }, 2093b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org { SkXfermode::kExclusion_Mode, "Exclusion", kBasic_SrcType }, 2103b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org { SkXfermode::kMultiply_Mode, "Multiply", kAll_SrcType }, 2113b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org { SkXfermode::kHue_Mode, "Hue", kBasic_SrcType }, 2123b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org { SkXfermode::kSaturation_Mode, "Saturation", kBasic_SrcType }, 2133b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org { SkXfermode::kColor_Mode, "Color", kBasic_SrcType }, 2143b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org { SkXfermode::kLuminosity_Mode, "Luminosity", kBasic_SrcType }, 215dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com }; 21686bf5c91f8cbd3ab37a924db18fecf693b509d96tomhudson@google.com 217f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com const SkScalar w = SkIntToScalar(W); 218f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com const SkScalar h = SkIntToScalar(H); 219dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com SkMatrix m; 220dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com m.setScale(SkIntToScalar(6), SkIntToScalar(6)); 2219c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org SkShader* s = SkShader::CreateBitmapShader(fBG, 2229c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org SkShader::kRepeat_TileMode, 2239c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org SkShader::kRepeat_TileMode, 2249c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org &m); 22586bf5c91f8cbd3ab37a924db18fecf693b509d96tomhudson@google.com 226dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com SkPaint labelP; 227dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com labelP.setAntiAlias(true); 228dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com labelP.setTextAlign(SkPaint::kCenter_Align); 22986bf5c91f8cbd3ab37a924db18fecf693b509d96tomhudson@google.com 230c9c64229034f595a3dc9e193b2e531c809e1eaf7reed@android.com const int W = 5; 23186bf5c91f8cbd3ab37a924db18fecf693b509d96tomhudson@google.com 232dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com SkScalar x0 = 0; 2333b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org SkScalar y0 = 0; 2343b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org for (int sourceType = 1; sourceType & kAll_SrcType; sourceType <<= 1) { 2353b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org SkScalar x = x0, y = y0; 236dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); i++) { 2373b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org if ((gModes[i].fSourceTypeMask & sourceType) == 0) { 2383b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org continue; 2393b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org } 240c9c64229034f595a3dc9e193b2e531c809e1eaf7reed@android.com SkXfermode* mode = SkXfermode::Create(gModes[i].fMode); 241f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com SkAutoUnref aur(mode); 242dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com SkRect r; 243dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com r.set(x, y, x+w, y+h); 24486bf5c91f8cbd3ab37a924db18fecf693b509d96tomhudson@google.com 245f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com SkPaint p; 246dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com p.setStyle(SkPaint::kFill_Style); 247dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com p.setShader(s); 248dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com canvas->drawRect(r, p); 24986bf5c91f8cbd3ab37a924db18fecf693b509d96tomhudson@google.com 250091a594dbc4116ec2e54724432472bf37dae794acommit-bot@chromium.org canvas->saveLayer(&r, NULL); 2513b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org draw_mode(canvas, mode, static_cast<SrcType>(sourceType), 2523b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org r.fLeft, r.fTop); 253f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com canvas->restore(); 25486bf5c91f8cbd3ab37a924db18fecf693b509d96tomhudson@google.com 255f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com r.inset(-SK_ScalarHalf, -SK_ScalarHalf); 256f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com p.setStyle(SkPaint::kStroke_Style); 257f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com p.setShader(NULL); 258f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com canvas->drawRect(r, p); 25986bf5c91f8cbd3ab37a924db18fecf693b509d96tomhudson@google.com 260f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com#if 1 261dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com canvas->drawText(gModes[i].fLabel, strlen(gModes[i].fLabel), 262dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com x + w/2, y - labelP.getTextSize()/2, labelP); 263f3c1cc906391f5cb5179ee49c7fcaba8f9e6e5ccreed@google.com#endif 264dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com x += w + SkIntToScalar(10); 265c9c64229034f595a3dc9e193b2e531c809e1eaf7reed@android.com if ((i % W) == W - 1) { 266dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com x = x0; 267dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com y += h + SkIntToScalar(30); 268dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com } 269dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com } 2703b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org if (y < 320) { 2713b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org if (x > x0) { 2723b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org y += h + SkIntToScalar(30); 2733b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org } 2743b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org y0 = y; 2753b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org } else { 2763b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org x0 += SkIntToScalar(400); 2773b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org y0 = 0; 2783b416216d1e90cb8b1bba41bb95806fe2d40da88vandebo@chromium.org } 279dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com } 280dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com s->unref(); 281dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com } 282dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com 283dd0ac281e920b01a63789893cc3e7422789658ddreed@android.comprivate: 284dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com typedef GM INHERITED; 285dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com}; 286dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com 287dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com////////////////////////////////////////////////////////////////////////////// 288dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com 289dd0ac281e920b01a63789893cc3e7422789658ddreed@android.comstatic GM* MyFactory(void*) { return new XfermodesGM; } 290dd0ac281e920b01a63789893cc3e7422789658ddreed@android.comstatic GMRegistry reg(MyFactory); 291dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com 292dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com} 293