1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2015 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/SkRect.h" 15cb93a386Sopenharmony_ci#include "include/core/SkRefCnt.h" 16cb93a386Sopenharmony_ci#include "include/core/SkScalar.h" 17cb93a386Sopenharmony_ci#include "include/core/SkSize.h" 18cb93a386Sopenharmony_ci#include "include/core/SkString.h" 19cb93a386Sopenharmony_ci#include "include/core/SkTextBlob.h" 20cb93a386Sopenharmony_ci#include "include/core/SkTypeface.h" 21cb93a386Sopenharmony_ci#include "tools/ToolUtils.h" 22cb93a386Sopenharmony_ci 23cb93a386Sopenharmony_ci#include <string.h> 24cb93a386Sopenharmony_ci 25cb93a386Sopenharmony_cinamespace skiagm { 26cb93a386Sopenharmony_ciclass TextBlobTransforms : public GM { 27cb93a386Sopenharmony_cipublic: 28cb93a386Sopenharmony_ci // This gm tests that textblobs can be translated, rotated, and scaled 29cb93a386Sopenharmony_ci TextBlobTransforms() {} 30cb93a386Sopenharmony_ci 31cb93a386Sopenharmony_ciprotected: 32cb93a386Sopenharmony_ci void onOnceBeforeDraw() override { 33cb93a386Sopenharmony_ci SkTextBlobBuilder builder; 34cb93a386Sopenharmony_ci 35cb93a386Sopenharmony_ci // make textblob. To stress distance fields, we choose sizes appropriately 36cb93a386Sopenharmony_ci SkFont font(ToolUtils::create_portable_typeface(), 162); 37cb93a386Sopenharmony_ci font.setEdging(SkFont::Edging::kAlias); 38cb93a386Sopenharmony_ci const char* text = "A"; 39cb93a386Sopenharmony_ci 40cb93a386Sopenharmony_ci SkRect bounds; 41cb93a386Sopenharmony_ci font.measureText(text, strlen(text), SkTextEncoding::kUTF8, &bounds); 42cb93a386Sopenharmony_ci ToolUtils::add_to_text_blob(&builder, text, font, 0, 0); 43cb93a386Sopenharmony_ci 44cb93a386Sopenharmony_ci // Medium 45cb93a386Sopenharmony_ci SkScalar xOffset = bounds.width() + 5; 46cb93a386Sopenharmony_ci font.setSize(72); 47cb93a386Sopenharmony_ci text = "B"; 48cb93a386Sopenharmony_ci ToolUtils::add_to_text_blob(&builder, text, font, xOffset, 0); 49cb93a386Sopenharmony_ci 50cb93a386Sopenharmony_ci font.measureText(text, strlen(text), SkTextEncoding::kUTF8, &bounds); 51cb93a386Sopenharmony_ci SkScalar yOffset = bounds.height(); 52cb93a386Sopenharmony_ci 53cb93a386Sopenharmony_ci // Small 54cb93a386Sopenharmony_ci font.setSize(32); 55cb93a386Sopenharmony_ci text = "C"; 56cb93a386Sopenharmony_ci ToolUtils::add_to_text_blob(&builder, text, font, xOffset, -yOffset - 10); 57cb93a386Sopenharmony_ci 58cb93a386Sopenharmony_ci // build 59cb93a386Sopenharmony_ci fBlob = builder.make(); 60cb93a386Sopenharmony_ci } 61cb93a386Sopenharmony_ci 62cb93a386Sopenharmony_ci SkString onShortName() override { 63cb93a386Sopenharmony_ci return SkString("textblobtransforms"); 64cb93a386Sopenharmony_ci } 65cb93a386Sopenharmony_ci 66cb93a386Sopenharmony_ci SkISize onISize() override { 67cb93a386Sopenharmony_ci return SkISize::Make(kWidth, kHeight); 68cb93a386Sopenharmony_ci } 69cb93a386Sopenharmony_ci 70cb93a386Sopenharmony_ci void onDraw(SkCanvas* canvas) override { 71cb93a386Sopenharmony_ci 72cb93a386Sopenharmony_ci canvas->drawColor(SK_ColorGRAY); 73cb93a386Sopenharmony_ci 74cb93a386Sopenharmony_ci SkPaint paint; 75cb93a386Sopenharmony_ci 76cb93a386Sopenharmony_ci SkRect bounds = fBlob->bounds(); 77cb93a386Sopenharmony_ci canvas->translate(20, 20); 78cb93a386Sopenharmony_ci 79cb93a386Sopenharmony_ci // Colors were chosen to map to pairs of canonical colors. The GPU Backend will cache A8 80cb93a386Sopenharmony_ci // Texture Blobs based on the canonical color they map to. Canonical colors are used to 81cb93a386Sopenharmony_ci // create masks. For A8 there are 8 of them. 82cb93a386Sopenharmony_ci //SkColor colors[] = {SK_ColorCYAN, SK_ColorLTGRAY, SK_ColorYELLOW, SK_ColorWHITE}; 83cb93a386Sopenharmony_ci 84cb93a386Sopenharmony_ci SkScalar xOffset = SkScalarCeilToScalar(bounds.width()); 85cb93a386Sopenharmony_ci SkScalar yOffset = SkScalarCeilToScalar(bounds.height()); 86cb93a386Sopenharmony_ci // first translate 87cb93a386Sopenharmony_ci canvas->translate(xOffset, 2 * yOffset); 88cb93a386Sopenharmony_ci canvas->drawTextBlob(fBlob, 0, 0, paint); 89cb93a386Sopenharmony_ci canvas->translate(-xOffset, 0); 90cb93a386Sopenharmony_ci canvas->drawTextBlob(fBlob, 0, 0, paint); 91cb93a386Sopenharmony_ci canvas->translate(2 * xOffset, 0); 92cb93a386Sopenharmony_ci canvas->drawTextBlob(fBlob, 0, 0, paint); 93cb93a386Sopenharmony_ci canvas->translate(-xOffset, -yOffset); 94cb93a386Sopenharmony_ci canvas->drawTextBlob(fBlob, 0, 0, paint); 95cb93a386Sopenharmony_ci canvas->translate(0, 2 * yOffset); 96cb93a386Sopenharmony_ci canvas->drawTextBlob(fBlob, 0, 0, paint); 97cb93a386Sopenharmony_ci 98cb93a386Sopenharmony_ci // now rotate 99cb93a386Sopenharmony_ci canvas->translate(4 * xOffset, -yOffset); 100cb93a386Sopenharmony_ci canvas->rotate(180.f); 101cb93a386Sopenharmony_ci canvas->drawTextBlob(fBlob, 0, 0, paint); 102cb93a386Sopenharmony_ci canvas->rotate(-180.f); 103cb93a386Sopenharmony_ci canvas->translate(0, -yOffset); 104cb93a386Sopenharmony_ci canvas->rotate(-180.f); 105cb93a386Sopenharmony_ci canvas->drawTextBlob(fBlob, 0, 0, paint); 106cb93a386Sopenharmony_ci canvas->rotate(270.f); 107cb93a386Sopenharmony_ci canvas->drawTextBlob(fBlob, 0, 0, paint); 108cb93a386Sopenharmony_ci canvas->rotate(-90.f); 109cb93a386Sopenharmony_ci canvas->translate(-xOffset, yOffset); 110cb93a386Sopenharmony_ci canvas->rotate(-90.f); 111cb93a386Sopenharmony_ci canvas->drawTextBlob(fBlob, 0, 0, paint); 112cb93a386Sopenharmony_ci canvas->rotate(90.f); 113cb93a386Sopenharmony_ci 114cb93a386Sopenharmony_ci // and scales 115cb93a386Sopenharmony_ci canvas->translate(- 3 * xOffset, 3 * yOffset); 116cb93a386Sopenharmony_ci canvas->scale(1.5f, 1.5f); 117cb93a386Sopenharmony_ci canvas->drawTextBlob(fBlob, 0, 0, paint); 118cb93a386Sopenharmony_ci canvas->translate(xOffset, 0); 119cb93a386Sopenharmony_ci canvas->scale(.25f, .25f); 120cb93a386Sopenharmony_ci canvas->drawTextBlob(fBlob, 0, 0, paint); 121cb93a386Sopenharmony_ci canvas->translate(xOffset, 0); 122cb93a386Sopenharmony_ci canvas->scale(3.f, 2.f); 123cb93a386Sopenharmony_ci canvas->drawTextBlob(fBlob, 0, 0, paint); 124cb93a386Sopenharmony_ci 125cb93a386Sopenharmony_ci // finally rotates, scales, and translates together 126cb93a386Sopenharmony_ci canvas->translate(xOffset, 0); 127cb93a386Sopenharmony_ci canvas->rotate(23.f); 128cb93a386Sopenharmony_ci canvas->scale(.33f, .5f); 129cb93a386Sopenharmony_ci canvas->drawTextBlob(fBlob, 0, 0, paint); 130cb93a386Sopenharmony_ci 131cb93a386Sopenharmony_ci canvas->rotate(-46.f); 132cb93a386Sopenharmony_ci canvas->translate(xOffset, 0); 133cb93a386Sopenharmony_ci canvas->scale(1.2f, 1.1f); 134cb93a386Sopenharmony_ci canvas->drawTextBlob(fBlob, 0, 0, paint); 135cb93a386Sopenharmony_ci 136cb93a386Sopenharmony_ci canvas->rotate(46.f); 137cb93a386Sopenharmony_ci canvas->translate(xOffset, 0); 138cb93a386Sopenharmony_ci canvas->scale(1.1f, 1.2f); 139cb93a386Sopenharmony_ci canvas->drawTextBlob(fBlob, 0, 0, paint); 140cb93a386Sopenharmony_ci 141cb93a386Sopenharmony_ci canvas->rotate(46.f); 142cb93a386Sopenharmony_ci canvas->translate(xOffset, 0); 143cb93a386Sopenharmony_ci canvas->scale(.95f, 1.1f); 144cb93a386Sopenharmony_ci canvas->drawTextBlob(fBlob, 0, 0, paint); 145cb93a386Sopenharmony_ci 146cb93a386Sopenharmony_ci canvas->rotate(46.f); 147cb93a386Sopenharmony_ci canvas->translate(xOffset, 0); 148cb93a386Sopenharmony_ci canvas->scale(1.3f, .7f); 149cb93a386Sopenharmony_ci canvas->drawTextBlob(fBlob, 0, 0, paint); 150cb93a386Sopenharmony_ci 151cb93a386Sopenharmony_ci canvas->rotate(46.f); 152cb93a386Sopenharmony_ci canvas->translate(xOffset, 0); 153cb93a386Sopenharmony_ci canvas->scale(.8f, 1.1f); 154cb93a386Sopenharmony_ci canvas->drawTextBlob(fBlob, 0, 0, paint); 155cb93a386Sopenharmony_ci 156cb93a386Sopenharmony_ci canvas->rotate(10.f); 157cb93a386Sopenharmony_ci canvas->translate(xOffset, 0); 158cb93a386Sopenharmony_ci canvas->scale(1.f, 5.f); 159cb93a386Sopenharmony_ci canvas->drawTextBlob(fBlob, 0, 0, paint); 160cb93a386Sopenharmony_ci 161cb93a386Sopenharmony_ci canvas->rotate(5.f); 162cb93a386Sopenharmony_ci canvas->translate(xOffset, 0); 163cb93a386Sopenharmony_ci canvas->scale(5.f, 1.f); 164cb93a386Sopenharmony_ci canvas->drawTextBlob(fBlob, 0, 0, paint); 165cb93a386Sopenharmony_ci } 166cb93a386Sopenharmony_ci 167cb93a386Sopenharmony_ciprivate: 168cb93a386Sopenharmony_ci sk_sp<SkTextBlob> fBlob; 169cb93a386Sopenharmony_ci 170cb93a386Sopenharmony_ci inline static constexpr int kWidth = 1000; 171cb93a386Sopenharmony_ci inline static constexpr int kHeight = 1200; 172cb93a386Sopenharmony_ci 173cb93a386Sopenharmony_ci using INHERITED = GM; 174cb93a386Sopenharmony_ci}; 175cb93a386Sopenharmony_ci 176cb93a386Sopenharmony_ci////////////////////////////////////////////////////////////////////////////// 177cb93a386Sopenharmony_ci 178cb93a386Sopenharmony_ciDEF_GM(return new TextBlobTransforms;) 179cb93a386Sopenharmony_ci} // namespace skiagm 180