1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2017 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#ifndef SkAtlasTextTarget_DEFINED
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define SkAtlasTextTarget_DEFINED
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include <memory>
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkDeque.h"
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkRefCnt.h"
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkScalar.h"
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkAtlasTextContext;
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkAtlasTextFont;
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkMatrix;
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstruct SkPoint;
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/** Represents a client-created renderable surface and is used to draw text into the surface. */
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SK_API SkAtlasTextTarget {
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    virtual ~SkAtlasTextTarget();
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Creates a text drawing target. ‘handle’ is used to identify this rendering surface when
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * draws are flushed to the SkAtlasTextContext's SkAtlasTextRenderer.
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static std::unique_ptr<SkAtlasTextTarget> Make(sk_sp<SkAtlasTextContext>, int width, int height,
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                   void* handle);
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Enqueues a text draw in the target. The caller provides an array of glyphs and their
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * positions. The meaning of 'color' here is interpreted by the client's SkAtlasTextRenderer
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * when it actually renders the text.
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    virtual void drawText(const SkGlyphID[], const SkPoint[], int glyphCnt, uint32_t color,
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                          const SkAtlasTextFont&) = 0;
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /** Issues all queued text draws to SkAtlasTextRenderer. */
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    virtual void flush() = 0;
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int width() const { return fWidth; }
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int height() const { return fHeight; }
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void* handle() const { return fHandle; }
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkAtlasTextContext* context() const { return fContext.get(); }
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /** Saves the current matrix in a stack. Returns the prior depth of the saved matrix stack. */
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int save();
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /** Pops the top matrix on the stack if the stack is not empty. */
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void restore();
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Pops the matrix stack until the stack depth is count. Does nothing if the depth is already
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * less than count.
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void restoreToCount(int count);
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /** Pre-translates the current CTM. */
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void translate(SkScalar dx, SkScalar dy);
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /** Pre-scales the current CTM. */
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void scale(SkScalar sx, SkScalar sy);
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /** Pre-rotates the current CTM about the origin. */
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void rotate(SkScalar degrees);
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /** Pre-rotates the current CTM about the (px, py). */
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void rotate(SkScalar degrees, SkScalar px, SkScalar py);
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /** Pre-skews the current CTM. */
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void skew(SkScalar sx, SkScalar sy);
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /** Pre-concats the current CTM. */
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void concat(const SkMatrix& matrix);
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkAtlasTextTarget(sk_sp<SkAtlasTextContext>, int width, int height, void* handle);
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const SkMatrix& ctm() const { return *static_cast<const SkMatrix*>(fMatrixStack.back()); }
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void* const fHandle;
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const sk_sp<SkAtlasTextContext> fContext;
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const int fWidth;
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const int fHeight;
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkDeque fMatrixStack;
86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int fSaveCnt;
87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkMatrix* accessCTM() const {
89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return static_cast<SkMatrix*>(const_cast<void*>(fMatrixStack.back()));
90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkAtlasTextTarget() = delete;
93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkAtlasTextTarget(const SkAtlasTextContext&) = delete;
94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkAtlasTextTarget& operator=(const SkAtlasTextContext&) = delete;
95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif
98