1e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org/* 2e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org * Copyright 2013 Google Inc. 3e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org * 4e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be 5e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org * found in the LICENSE file. 6e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org */ 7e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org 8e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org#include "gm.h" 9e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org#include "SkBitmap.h" 10e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org#include "SkCanvas.h" 11e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org#include "SkColor.h" 12e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org#include "SkShader.h" 13e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org 14e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgnamespace skiagm { 15e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org 16e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org// This GM draws a 3x3 grid (with the center element excluded) of rectangles 17e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org// filled with a bitmap shader. The bitmap shader is transformed so that the 18e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org// pattern cell is at the center (excluded) region. 19e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org// 20e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org// In Repeat and Mirror mode, this tests that the bitmap shader still draws 21e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org// even though the pattern cell is outside the clip. 22e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org// 23e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org// In Clamp mode, this tests that the clamp is handled properly. For PDF, 24e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org// (and possibly other exported formats) this also "tests" that the image itself 25e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org// is not stored (well, you'll need to open it up with an external tool to 26e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org// verify that). 27e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org 28e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgstatic SkBitmap create_bitmap() { 29e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org SkBitmap bmp; 30eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com bmp.allocN32Pixels(2, 2); 31e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org uint32_t* pixels = reinterpret_cast<uint32_t*>(bmp.getPixels()); 32e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org pixels[0] = SkPreMultiplyColor(SK_ColorRED); 33e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org pixels[1] = SkPreMultiplyColor(SK_ColorGREEN); 34e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org pixels[2] = SkPreMultiplyColor(SK_ColorBLACK); 35e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org pixels[3] = SkPreMultiplyColor(SK_ColorBLUE); 36e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org 37e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org return bmp; 38e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org} 39e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org 40e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgstatic const SkScalar RECT_SIZE = 64; 41e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgstatic const SkScalar SLIDE_SIZE = 300; 42e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org 43e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgclass ClippedBitmapShadersGM : public GM { 44e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgpublic: 45759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org ClippedBitmapShadersGM(SkShader::TileMode mode, bool hq=false) 46759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org : fMode(mode), fHQ(hq) { 47e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org } 48e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org 49e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgprotected: 50e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org SkShader::TileMode fMode; 51759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org bool fHQ; 52e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org 53e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org virtual SkString onShortName() { 54e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org SkString descriptor; 55e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org switch (fMode) { 56e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org case SkShader::kRepeat_TileMode: 57e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org descriptor = "tile"; 58e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org break; 59e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org case SkShader::kMirror_TileMode: 60e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org descriptor = "mirror"; 61e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org break; 62e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org case SkShader::kClamp_TileMode: 63e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org descriptor = "clamp"; 64e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org break; 65e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org default: 66e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org SkASSERT(false); 67e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org } 68e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org descriptor.prepend("clipped-bitmap-shaders-"); 69759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org if (fHQ) { 70759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org descriptor.append("-hq"); 71759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org } 72e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org return descriptor; 73e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org } 74e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org 75e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org virtual SkISize onISize() { 76e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org return SkISize::Make(300, 300); 77e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org } 78583b18a20959c9ac360316a366f4ddd9598bdf52skia.committer@gmail.com 79e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org virtual void onDraw(SkCanvas* canvas) { 80e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org SkBitmap bmp = create_bitmap(); 81e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org SkMatrix s; 82e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org s.reset(); 83e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org s.setScale(8, 8); 84e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org s.postTranslate(SLIDE_SIZE / 2, SLIDE_SIZE / 2); 859c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org SkShader* shader = SkShader::CreateBitmapShader( 869c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org bmp, fMode, fMode, &s); 879c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org 889c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org SkPaint paint; 89e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org paint.setShader(shader)->unref(); 90583b18a20959c9ac360316a366f4ddd9598bdf52skia.committer@gmail.com 91759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org if (fHQ) { 92759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org paint.setFilterLevel(SkPaint::kHigh_FilterLevel); 93759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org } 94e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org 95e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org SkScalar margin = (SLIDE_SIZE / 3 - RECT_SIZE) / 2; 96e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org for (int i = 0; i < 3; i++) { 97e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org SkScalar yOrigin = SLIDE_SIZE / 3 * i + margin; 98e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org for (int j = 0; j < 3; j++) { 99e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org SkScalar xOrigin = SLIDE_SIZE / 3 * j + margin; 100e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org if (i == 1 && j == 1) { 101e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org continue; // skip center element 102e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org } 103e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org SkRect rect = SkRect::MakeXYWH(xOrigin, yOrigin, 104e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org RECT_SIZE, RECT_SIZE); 105e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org canvas->save(); 106e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org canvas->clipRect(rect); 107e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org canvas->drawRect(rect, paint); 108e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org canvas->restore(); 109e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org } 110e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org } 111e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org } 112e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org 113e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgprivate: 114e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org typedef GM INHERITED; 115e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org}; 116e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org 117e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org////////////////////////////////////////////////////////////////////////////// 118e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org 119e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgDEF_GM( return new ClippedBitmapShadersGM(SkShader::kRepeat_TileMode); ) 120e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgDEF_GM( return new ClippedBitmapShadersGM(SkShader::kMirror_TileMode); ) 121e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgDEF_GM( return new ClippedBitmapShadersGM(SkShader::kClamp_TileMode); ) 122759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org 123759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.orgDEF_GM( return new ClippedBitmapShadersGM(SkShader::kRepeat_TileMode, true); ) 124759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.orgDEF_GM( return new ClippedBitmapShadersGM(SkShader::kMirror_TileMode, true); ) 125759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.orgDEF_GM( return new ClippedBitmapShadersGM(SkShader::kClamp_TileMode, true); ) 126759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org 127759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org 128e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org} 129