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