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" 11 using namespace skiagm; 12 13 GM::GM() { 14 fMode = kGM_Mode; 15 fBGColor = SK_ColorWHITE; 16 fCanvasIsDeferred = false; 17 fHaveCalledOnceBeforeDraw = false; 18 fStarterMatrix.reset(); 19 } 20 21 GM::~GM() {} 22 23 void GM::draw(SkCanvas* canvas) { 24 this->drawBackground(canvas); 25 this->drawContent(canvas); 26 } 27 28 void GM::drawContent(SkCanvas* canvas) { 29 if (!fHaveCalledOnceBeforeDraw) { 30 fHaveCalledOnceBeforeDraw = true; 31 this->onOnceBeforeDraw(); 32 } 33 this->onDraw(canvas); 34 } 35 36 void GM::drawBackground(SkCanvas* canvas) { 37 if (!fHaveCalledOnceBeforeDraw) { 38 fHaveCalledOnceBeforeDraw = true; 39 this->onOnceBeforeDraw(); 40 } 41 this->onDrawBackground(canvas); 42 } 43 44 const char* GM::getName() { 45 if (fShortName.size() == 0) { 46 fShortName = this->onShortName(); 47 } 48 return fShortName.c_str(); 49 } 50 51 void GM::setBGColor(SkColor color) { 52 fBGColor = color; 53 } 54 55 bool GM::animate(const SkAnimTimer& timer) { 56 return this->onAnimate(timer); 57 } 58 59 ///////////////////////////////////////////////////////////////////////////////////////////// 60 61 void GM::onDrawBackground(SkCanvas* canvas) { 62 canvas->drawColor(fBGColor, SkBlendMode::kSrc); 63 } 64 65 void 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 74 void 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.drawString(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 98 template GMRegistry* GMRegistry::gHead; 99 100 void skiagm::SimpleGM::onDraw(SkCanvas* canvas) { 101 fDrawProc(canvas); 102 } 103 104 SkISize skiagm::SimpleGM::onISize() { 105 return fSize; 106 } 107 108 SkString skiagm::SimpleGM::onShortName() { 109 return fName; 110 } 111