1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* 2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2014 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 11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkCanvas.h" 12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkGradientShader.h" 13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPoint.h" 14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkShader.h" 15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkTextBlob.h" 16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkTDArray.h" 17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkTypeface.h" 18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// This GM exercises drawTextBlob offset vs. shader space behavior. 20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass TextBlobShaderGM : public skiagm::GM { 21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot TextBlobShaderGM(const char* txt) { 23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint p; 24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_tool_utils::set_portable_typeface(&p); 25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot size_t txtLen = strlen(txt); 26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fGlyphs.append(p.textToGlyphs(txt, txtLen, nullptr)); 27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot p.textToGlyphs(txt, txtLen, fGlyphs.begin()); 28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onOnceBeforeDraw() override { 33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint p; 34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot p.setAntiAlias(true); 35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot p.setSubpixelText(true); 36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot p.setTextSize(30); 37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot p.setTextEncoding(SkPaint::kGlyphID_TextEncoding); 38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_tool_utils::set_portable_typeface(&p); 39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkTextBlobBuilder builder; 41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int glyphCount = fGlyphs.count(); 42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkTextBlobBuilder::RunBuffer* run; 43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot run = &builder.allocRun(p, glyphCount, 10, 10, nullptr); 45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot memcpy(run->glyphs, fGlyphs.begin(), glyphCount * sizeof(uint16_t)); 46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot run = &builder.allocRunPosH(p, glyphCount, 80, nullptr); 48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot memcpy(run->glyphs, fGlyphs.begin(), glyphCount * sizeof(uint16_t)); 49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < glyphCount; ++i) { 50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot run->pos[i] = p.getTextSize() * i * .75f; 51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot run = &builder.allocRunPos(p, glyphCount, nullptr); 54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot memcpy(run->glyphs, fGlyphs.begin(), glyphCount * sizeof(uint16_t)); 55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < glyphCount; ++i) { 56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot run->pos[i * 2] = p.getTextSize() * i * .75f; 57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot run->pos[i * 2 + 1] = 150 + 5 * sinf((float)i * 8 / glyphCount); 58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fBlob = builder.make(); 61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColor colors[2]; 63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot colors[0] = SK_ColorRED; 64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot colors[1] = SK_ColorGREEN; 65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar pos[SK_ARRAY_COUNT(colors)]; 67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (unsigned i = 0; i < SK_ARRAY_COUNT(pos); ++i) { 68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot pos[i] = (float)i / (SK_ARRAY_COUNT(pos) - 1); 69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkISize sz = this->onISize(); 72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fShader = SkGradientShader::MakeRadial(SkPoint::Make(SkIntToScalar(sz.width() / 2), 73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkIntToScalar(sz.height() / 2)), 74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sz.width() * .66f, colors, pos, 75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SK_ARRAY_COUNT(colors), 76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkShader::kRepeat_TileMode); 77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkString onShortName() override { 80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkString("textblobshader"); 81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkISize onISize() override { 84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkISize::Make(640, 480); 85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDraw(SkCanvas* canvas) override { 88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint p; 89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot p.setStyle(SkPaint::kFill_Style); 90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot p.setShader(fShader); 91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkISize sz = this->onISize(); 93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot constexpr int kXCount = 4; 94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot constexpr int kYCount = 3; 95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < kXCount; ++i) { 96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int j = 0; j < kYCount; ++j) { 97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawTextBlob(fBlob, 98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkIntToScalar(i * sz.width() / kXCount), 99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkIntToScalar(j * sz.height() / kYCount), 100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot p); 101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkTDArray<uint16_t> fGlyphs; 107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkTextBlob> fBlob; 108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkShader> fShader; 109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef skiagm::GM INHERITED; 111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_GM(return new TextBlobShaderGM("Blobber");) 114