1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* 2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2011 Google Inc. 3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be 5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file. 6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "gm.h" 9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "sk_tool_utils.h" 10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkCanvas.h" 11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkGradientShader.h" 12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotnamespace skiagm { 14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic void makebm(SkBitmap* bm, int w, int h) { 16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bm->allocN32Pixels(w, h); 17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bm->eraseColor(SK_ColorTRANSPARENT); 18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkCanvas canvas(*bm); 20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar s = SkIntToScalar(SkMin32(w, h)); 21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkPoint kPts0[] = { { 0, 0 }, { s, s } }; 22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkPoint kPts1[] = { { s/2, 0 }, { s/2, s } }; 23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkScalar kPos[] = { 0, SK_Scalar1/2, SK_Scalar1 }; 24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkColor kColors0[] = {0x80F00080, 0xF0F08000, 0x800080F0 }; 25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkColor kColors1[] = {0xF08000F0, 0x8080F000, 0xF000F080 }; 26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint paint; 29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setShader(SkGradientShader::MakeLinear(kPts0, kColors0, kPos, 31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SK_ARRAY_COUNT(kColors0), SkShader::kClamp_TileMode)); 32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas.drawPaint(paint); 33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setShader(SkGradientShader::MakeLinear(kPts1, kColors1, kPos, 34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SK_ARRAY_COUNT(kColors1), SkShader::kClamp_TileMode)); 35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas.drawPaint(paint); 36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/////////////////////////////////////////////////////////////////////////////// 39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstruct LabeledMatrix { 41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkMatrix fMatrix; 42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* fLabel; 43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotconstexpr char kText[] = "B"; 46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotconstexpr int kTextLen = SK_ARRAY_COUNT(kText) - 1; 47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotconstexpr int kPointSize = 300; 48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass ShaderText3GM : public GM { 50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot ShaderText3GM() { 52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->setBGColor(sk_tool_utils::color_to_565(0xFFDDDDDD)); 53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkString onShortName() override { 58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkString("shadertext3"); 59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkISize onISize() override{ return SkISize::Make(820, 930); } 62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onOnceBeforeDraw() override { 64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot makebm(&fBmp, kPointSize / 4, kPointSize / 4); 65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDraw(SkCanvas* canvas) override { 68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint bmpPaint; 70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bmpPaint.setAntiAlias(true); 71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bmpPaint.setFilterQuality(kLow_SkFilterQuality); 72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bmpPaint.setAlpha(0x80); 73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawBitmap(fBmp, 5.f, 5.f, &bmpPaint); 74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint outlinePaint; 76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot outlinePaint.setAntiAlias(true); 77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_tool_utils::set_portable_typeface(&outlinePaint); 78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot outlinePaint.setTextSize(SkIntToScalar(kPointSize)); 79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot outlinePaint.setStyle(SkPaint::kStroke_Style); 80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot outlinePaint.setStrokeWidth(0.f); 81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->translate(15.f, 15.f); 83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // draw glyphs scaled up 85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->scale(2.f, 2.f); 86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot constexpr SkShader::TileMode kTileModes[] = { 88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkShader::kRepeat_TileMode, 89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkShader::kMirror_TileMode, 90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // position the baseline of the first run 93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->translate(0.f, 0.75f * kPointSize); 94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->save(); 96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int i = 0; 97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (size_t tm0 = 0; tm0 < SK_ARRAY_COUNT(kTileModes); ++tm0) { 98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (size_t tm1 = 0; tm1 < SK_ARRAY_COUNT(kTileModes); ++tm1) { 99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkMatrix localM; 100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot localM.setTranslate(5.f, 5.f); 101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot localM.postRotate(20); 102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot localM.postScale(1.15f, .85f); 103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint fillPaint; 105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fillPaint.setAntiAlias(true); 106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_tool_utils::set_portable_typeface(&fillPaint); 107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fillPaint.setTextSize(SkIntToScalar(kPointSize)); 108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fillPaint.setFilterQuality(kLow_SkFilterQuality); 109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fillPaint.setShader(SkShader::MakeBitmapShader(fBmp, kTileModes[tm0], 110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kTileModes[tm1], &localM)); 111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawText(kText, kTextLen, 0, 0, fillPaint); 113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawText(kText, kTextLen, 0, 0, outlinePaint); 114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar w = fillPaint.measureText(kText, kTextLen); 115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->translate(w + 10.f, 0.f); 116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot ++i; 117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (!(i % 2)) { 118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->restore(); 119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->translate(0, 0.75f * kPointSize); 120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->save(); 121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->restore(); 125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBitmap fBmp; 129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef GM INHERITED; 130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/////////////////////////////////////////////////////////////////////////////// 133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic GM* MyFactory(void*) { return new ShaderText3GM; } 135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic GMRegistry reg(MyFactory); 136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 137