clippedbitmapshaders.cpp revision 583b18a20959c9ac360316a366f4ddd9598bdf52
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; 30e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org bmp.setConfig(SkBitmap::kARGB_8888_Config, 2, 2); 31e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org bmp.allocPixels(); 32e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org bmp.lockPixels(); 33e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org uint32_t* pixels = reinterpret_cast<uint32_t*>(bmp.getPixels()); 34e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org pixels[0] = SkPreMultiplyColor(SK_ColorRED); 35e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org pixels[1] = SkPreMultiplyColor(SK_ColorGREEN); 36e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org pixels[2] = SkPreMultiplyColor(SK_ColorBLACK); 37e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org pixels[3] = SkPreMultiplyColor(SK_ColorBLUE); 38e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org bmp.unlockPixels(); 39e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org 40e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org return bmp; 41e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org} 42e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org 43e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgstatic const SkScalar RECT_SIZE = 64; 44e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgstatic const SkScalar SLIDE_SIZE = 300; 45e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org 46e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgclass ClippedBitmapShadersGM : public GM { 47e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgpublic: 48759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org ClippedBitmapShadersGM(SkShader::TileMode mode, bool hq=false) 49759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org : fMode(mode), fHQ(hq) { 50e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org } 51e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org 52e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgprotected: 53e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org SkShader::TileMode fMode; 54759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org bool fHQ; 55e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org 56e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org virtual SkString onShortName() { 57e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org SkString descriptor; 58e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org switch (fMode) { 59e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org case SkShader::kRepeat_TileMode: 60e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org descriptor = "tile"; 61e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org break; 62e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org case SkShader::kMirror_TileMode: 63e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org descriptor = "mirror"; 64e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org break; 65e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org case SkShader::kClamp_TileMode: 66e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org descriptor = "clamp"; 67e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org break; 68e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org default: 69e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org SkASSERT(false); 70e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org } 71e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org descriptor.prepend("clipped-bitmap-shaders-"); 72759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org if (fHQ) { 73759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org descriptor.append("-hq"); 74759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org } 75e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org return descriptor; 76e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org } 77e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org 78e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org virtual SkISize onISize() { 79e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org return SkISize::Make(300, 300); 80e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org } 81583b18a20959c9ac360316a366f4ddd9598bdf52skia.committer@gmail.com 82e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org virtual void onDraw(SkCanvas* canvas) { 83e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org SkBitmap bmp = create_bitmap(); 84e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org SkShader* shader = SkShader::CreateBitmapShader( 85e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org bmp, fMode, fMode); 86e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org 87e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org SkPaint paint; 88e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org SkMatrix s; 89e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org s.reset(); 90e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org s.setScale(8, 8); 91e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org s.postTranslate(SLIDE_SIZE / 2, SLIDE_SIZE / 2); 92e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org shader->setLocalMatrix(s); 93e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org paint.setShader(shader)->unref(); 94583b18a20959c9ac360316a366f4ddd9598bdf52skia.committer@gmail.com 95759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org if (fHQ) { 96759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org paint.setFilterLevel(SkPaint::kHigh_FilterLevel); 97759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org } 98e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org 99e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org SkScalar margin = (SLIDE_SIZE / 3 - RECT_SIZE) / 2; 100e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org for (int i = 0; i < 3; i++) { 101e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org SkScalar yOrigin = SLIDE_SIZE / 3 * i + margin; 102e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org for (int j = 0; j < 3; j++) { 103e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org SkScalar xOrigin = SLIDE_SIZE / 3 * j + margin; 104e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org if (i == 1 && j == 1) { 105e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org continue; // skip center element 106e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org } 107e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org SkRect rect = SkRect::MakeXYWH(xOrigin, yOrigin, 108e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org RECT_SIZE, RECT_SIZE); 109e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org canvas->save(); 110e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org canvas->clipRect(rect); 111e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org canvas->drawRect(rect, paint); 112e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org canvas->restore(); 113e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org } 114e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org } 115e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org } 116e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org 117e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgprivate: 118e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org typedef GM INHERITED; 119e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org}; 120e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org 121e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org////////////////////////////////////////////////////////////////////////////// 122e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org 123e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgDEF_GM( return new ClippedBitmapShadersGM(SkShader::kRepeat_TileMode); ) 124e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgDEF_GM( return new ClippedBitmapShadersGM(SkShader::kMirror_TileMode); ) 125e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgDEF_GM( return new ClippedBitmapShadersGM(SkShader::kClamp_TileMode); ) 126759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org 127759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.orgDEF_GM( return new ClippedBitmapShadersGM(SkShader::kRepeat_TileMode, true); ) 128759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.orgDEF_GM( return new ClippedBitmapShadersGM(SkShader::kMirror_TileMode, true); ) 129759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.orgDEF_GM( return new ClippedBitmapShadersGM(SkShader::kClamp_TileMode, true); ) 130759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org 131759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org 132e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org} 133