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