1/* 2 * Copyright 2011 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8#include "gm.h" 9#include "sk_tool_utils.h" 10#include "SkShader.h" 11using namespace skiagm; 12 13GM::GM() { 14 fMode = kGM_Mode; 15 fBGColor = SK_ColorWHITE; 16 fCanvasIsDeferred = false; 17 fHaveCalledOnceBeforeDraw = false; 18 fStarterMatrix.reset(); 19} 20 21GM::~GM() {} 22 23void GM::draw(SkCanvas* canvas) { 24 this->drawBackground(canvas); 25 this->drawContent(canvas); 26} 27 28void GM::drawContent(SkCanvas* canvas) { 29 if (!fHaveCalledOnceBeforeDraw) { 30 fHaveCalledOnceBeforeDraw = true; 31 this->onOnceBeforeDraw(); 32 } 33 this->onDraw(canvas); 34} 35 36void GM::drawBackground(SkCanvas* canvas) { 37 if (!fHaveCalledOnceBeforeDraw) { 38 fHaveCalledOnceBeforeDraw = true; 39 this->onOnceBeforeDraw(); 40 } 41 this->onDrawBackground(canvas); 42} 43 44const char* GM::getName() { 45 if (fShortName.size() == 0) { 46 fShortName = this->onShortName(); 47 } 48 return fShortName.c_str(); 49} 50 51void GM::setBGColor(SkColor color) { 52 fBGColor = color; 53} 54 55bool GM::animate(const SkAnimTimer& timer) { 56 return this->onAnimate(timer); 57} 58 59///////////////////////////////////////////////////////////////////////////////////////////// 60 61void GM::onDrawBackground(SkCanvas* canvas) { 62 canvas->drawColor(fBGColor, SkBlendMode::kSrc); 63} 64 65void GM::drawSizeBounds(SkCanvas* canvas, SkColor color) { 66 SkISize size = this->getISize(); 67 SkRect r = SkRect::MakeWH(SkIntToScalar(size.width()), 68 SkIntToScalar(size.height())); 69 SkPaint paint; 70 paint.setColor(color); 71 canvas->drawRect(r, paint); 72} 73 74void GM::DrawGpuOnlyMessage(SkCanvas* canvas) { 75 SkBitmap bmp; 76 bmp.allocN32Pixels(128, 64); 77 SkCanvas bmpCanvas(bmp); 78 bmpCanvas.drawColor(SK_ColorWHITE); 79 SkPaint paint; 80 paint.setAntiAlias(true); 81 paint.setTextSize(20); 82 paint.setColor(SK_ColorRED); 83 sk_tool_utils::set_portable_typeface(&paint); 84 constexpr char kTxt[] = "GPU Only"; 85 bmpCanvas.drawText(kTxt, strlen(kTxt), 20, 40, paint); 86 SkMatrix localM; 87 localM.setRotate(35.f); 88 localM.postTranslate(10.f, 0.f); 89 paint.setShader(SkShader::MakeBitmapShader(bmp, SkShader::kMirror_TileMode, 90 SkShader::kMirror_TileMode, 91 &localM)); 92 paint.setFilterQuality(kMedium_SkFilterQuality); 93 canvas->drawPaint(paint); 94 return; 95} 96 97// need to explicitly declare this, or we get some weird infinite loop llist 98template GMRegistry* GMRegistry::gHead; 99 100void skiagm::SimpleGM::onDraw(SkCanvas* canvas) { 101 fDrawProc(canvas); 102} 103 104SkISize skiagm::SimpleGM::onISize() { 105 return fSize; 106} 107 108SkString skiagm::SimpleGM::onShortName() { 109 return fName; 110} 111