Home | History | Annotate | Download | only in gm
      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.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
     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