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