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