1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2014 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "gm/gm.h" 9cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h" 10cb93a386Sopenharmony_ci#include "include/core/SkColor.h" 11cb93a386Sopenharmony_ci#include "include/core/SkFont.h" 12cb93a386Sopenharmony_ci#include "include/core/SkFontTypes.h" 13cb93a386Sopenharmony_ci#include "include/core/SkPaint.h" 14cb93a386Sopenharmony_ci#include "include/core/SkPoint.h" 15cb93a386Sopenharmony_ci#include "include/core/SkRefCnt.h" 16cb93a386Sopenharmony_ci#include "include/core/SkScalar.h" 17cb93a386Sopenharmony_ci#include "include/core/SkShader.h" 18cb93a386Sopenharmony_ci#include "include/core/SkSize.h" 19cb93a386Sopenharmony_ci#include "include/core/SkString.h" 20cb93a386Sopenharmony_ci#include "include/core/SkTextBlob.h" 21cb93a386Sopenharmony_ci#include "include/core/SkTileMode.h" 22cb93a386Sopenharmony_ci#include "include/core/SkTypeface.h" 23cb93a386Sopenharmony_ci#include "include/core/SkTypes.h" 24cb93a386Sopenharmony_ci#include "include/effects/SkGradientShader.h" 25cb93a386Sopenharmony_ci#include "include/private/SkTDArray.h" 26cb93a386Sopenharmony_ci#include "tools/ToolUtils.h" 27cb93a386Sopenharmony_ci 28cb93a386Sopenharmony_ci#include <math.h> 29cb93a386Sopenharmony_ci#include <string.h> 30cb93a386Sopenharmony_ci 31cb93a386Sopenharmony_ci// This GM exercises drawTextBlob offset vs. shader space behavior. 32cb93a386Sopenharmony_ciclass TextBlobShaderGM : public skiagm::GM { 33cb93a386Sopenharmony_cipublic: 34cb93a386Sopenharmony_ci TextBlobShaderGM() {} 35cb93a386Sopenharmony_ci 36cb93a386Sopenharmony_ciprivate: 37cb93a386Sopenharmony_ci void onOnceBeforeDraw() override { 38cb93a386Sopenharmony_ci { 39cb93a386Sopenharmony_ci SkFont font(ToolUtils::create_portable_typeface()); 40cb93a386Sopenharmony_ci const char* txt = "Blobber"; 41cb93a386Sopenharmony_ci size_t txtLen = strlen(txt); 42cb93a386Sopenharmony_ci fGlyphs.append(font.countText(txt, txtLen, SkTextEncoding::kUTF8)); 43cb93a386Sopenharmony_ci font.textToGlyphs(txt, txtLen, SkTextEncoding::kUTF8, fGlyphs.begin(), fGlyphs.count()); 44cb93a386Sopenharmony_ci } 45cb93a386Sopenharmony_ci 46cb93a386Sopenharmony_ci SkFont font; 47cb93a386Sopenharmony_ci font.setSubpixel(true); 48cb93a386Sopenharmony_ci font.setEdging(SkFont::Edging::kAntiAlias); 49cb93a386Sopenharmony_ci font.setSize(30); 50cb93a386Sopenharmony_ci font.setTypeface(ToolUtils::create_portable_typeface()); 51cb93a386Sopenharmony_ci 52cb93a386Sopenharmony_ci SkTextBlobBuilder builder; 53cb93a386Sopenharmony_ci int glyphCount = fGlyphs.count(); 54cb93a386Sopenharmony_ci const SkTextBlobBuilder::RunBuffer* run; 55cb93a386Sopenharmony_ci 56cb93a386Sopenharmony_ci run = &builder.allocRun(font, glyphCount, 10, 10, nullptr); 57cb93a386Sopenharmony_ci memcpy(run->glyphs, fGlyphs.begin(), glyphCount * sizeof(uint16_t)); 58cb93a386Sopenharmony_ci 59cb93a386Sopenharmony_ci run = &builder.allocRunPosH(font, glyphCount, 80, nullptr); 60cb93a386Sopenharmony_ci memcpy(run->glyphs, fGlyphs.begin(), glyphCount * sizeof(uint16_t)); 61cb93a386Sopenharmony_ci for (int i = 0; i < glyphCount; ++i) { 62cb93a386Sopenharmony_ci run->pos[i] = font.getSize() * i * .75f; 63cb93a386Sopenharmony_ci } 64cb93a386Sopenharmony_ci 65cb93a386Sopenharmony_ci run = &builder.allocRunPos(font, glyphCount, nullptr); 66cb93a386Sopenharmony_ci memcpy(run->glyphs, fGlyphs.begin(), glyphCount * sizeof(uint16_t)); 67cb93a386Sopenharmony_ci for (int i = 0; i < glyphCount; ++i) { 68cb93a386Sopenharmony_ci run->pos[i * 2] = font.getSize() * i * .75f; 69cb93a386Sopenharmony_ci run->pos[i * 2 + 1] = 150 + 5 * sinf((float)i * 8 / glyphCount); 70cb93a386Sopenharmony_ci } 71cb93a386Sopenharmony_ci 72cb93a386Sopenharmony_ci fBlob = builder.make(); 73cb93a386Sopenharmony_ci 74cb93a386Sopenharmony_ci SkColor colors[2]; 75cb93a386Sopenharmony_ci colors[0] = SK_ColorRED; 76cb93a386Sopenharmony_ci colors[1] = SK_ColorGREEN; 77cb93a386Sopenharmony_ci 78cb93a386Sopenharmony_ci SkScalar pos[SK_ARRAY_COUNT(colors)]; 79cb93a386Sopenharmony_ci for (unsigned i = 0; i < SK_ARRAY_COUNT(pos); ++i) { 80cb93a386Sopenharmony_ci pos[i] = (float)i / (SK_ARRAY_COUNT(pos) - 1); 81cb93a386Sopenharmony_ci } 82cb93a386Sopenharmony_ci 83cb93a386Sopenharmony_ci SkISize sz = this->onISize(); 84cb93a386Sopenharmony_ci fShader = SkGradientShader::MakeRadial(SkPoint::Make(SkIntToScalar(sz.width() / 2), 85cb93a386Sopenharmony_ci SkIntToScalar(sz.height() / 2)), 86cb93a386Sopenharmony_ci sz.width() * .66f, colors, pos, 87cb93a386Sopenharmony_ci SK_ARRAY_COUNT(colors), 88cb93a386Sopenharmony_ci SkTileMode::kRepeat); 89cb93a386Sopenharmony_ci } 90cb93a386Sopenharmony_ci 91cb93a386Sopenharmony_ci SkString onShortName() override { 92cb93a386Sopenharmony_ci return SkString("textblobshader"); 93cb93a386Sopenharmony_ci } 94cb93a386Sopenharmony_ci 95cb93a386Sopenharmony_ci SkISize onISize() override { 96cb93a386Sopenharmony_ci return SkISize::Make(640, 480); 97cb93a386Sopenharmony_ci } 98cb93a386Sopenharmony_ci 99cb93a386Sopenharmony_ci void onDraw(SkCanvas* canvas) override { 100cb93a386Sopenharmony_ci SkPaint p; 101cb93a386Sopenharmony_ci p.setAntiAlias(true); 102cb93a386Sopenharmony_ci p.setStyle(SkPaint::kFill_Style); 103cb93a386Sopenharmony_ci p.setShader(fShader); 104cb93a386Sopenharmony_ci 105cb93a386Sopenharmony_ci SkISize sz = this->onISize(); 106cb93a386Sopenharmony_ci constexpr int kXCount = 4; 107cb93a386Sopenharmony_ci constexpr int kYCount = 3; 108cb93a386Sopenharmony_ci for (int i = 0; i < kXCount; ++i) { 109cb93a386Sopenharmony_ci for (int j = 0; j < kYCount; ++j) { 110cb93a386Sopenharmony_ci canvas->drawTextBlob(fBlob, 111cb93a386Sopenharmony_ci SkIntToScalar(i * sz.width() / kXCount), 112cb93a386Sopenharmony_ci SkIntToScalar(j * sz.height() / kYCount), 113cb93a386Sopenharmony_ci p); 114cb93a386Sopenharmony_ci } 115cb93a386Sopenharmony_ci } 116cb93a386Sopenharmony_ci } 117cb93a386Sopenharmony_ci 118cb93a386Sopenharmony_ci SkTDArray<uint16_t> fGlyphs; 119cb93a386Sopenharmony_ci sk_sp<SkTextBlob> fBlob; 120cb93a386Sopenharmony_ci sk_sp<SkShader> fShader; 121cb93a386Sopenharmony_ci 122cb93a386Sopenharmony_ci using INHERITED = skiagm::GM; 123cb93a386Sopenharmony_ci}; 124cb93a386Sopenharmony_ci 125cb93a386Sopenharmony_ciDEF_GM(return new TextBlobShaderGM;) 126