4d1700125c
Perhaps just make this SkTStack... Change-Id: Iefdbb1e33acec96aec5f885e3e16ac2d97fd5f73 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/271320 Reviewed-by: Mike Reed <reed@google.com> Commit-Queue: Mike Reed <reed@google.com>
101 lines
3.3 KiB
C++
101 lines
3.3 KiB
C++
/*
|
||
* Copyright 2017 Google Inc.
|
||
*
|
||
* Use of this source code is governed by a BSD-style license that can be
|
||
* found in the LICENSE file.
|
||
*/
|
||
|
||
#ifndef SkAtlasTextTarget_DEFINED
|
||
#define SkAtlasTextTarget_DEFINED
|
||
|
||
#include "include/core/SkRefCnt.h"
|
||
#include "include/core/SkScalar.h"
|
||
#include "include/private/SkDeque.h"
|
||
|
||
#include <memory>
|
||
|
||
class SkAtlasTextContext;
|
||
class SkAtlasTextFont;
|
||
class SkMatrix;
|
||
struct SkPoint;
|
||
|
||
/** Represents a client-created renderable surface and is used to draw text into the surface. */
|
||
class SK_API SkAtlasTextTarget {
|
||
public:
|
||
virtual ~SkAtlasTextTarget();
|
||
|
||
/**
|
||
* Creates a text drawing target. ‘handle’ is used to identify this rendering surface when
|
||
* draws are flushed to the SkAtlasTextContext's SkAtlasTextRenderer.
|
||
*/
|
||
static std::unique_ptr<SkAtlasTextTarget> Make(sk_sp<SkAtlasTextContext>,
|
||
int width,
|
||
int height,
|
||
void* handle);
|
||
|
||
/**
|
||
* Enqueues a text draw in the target. The caller provides an array of glyphs and their
|
||
* positions. The meaning of 'color' here is interpreted by the client's SkAtlasTextRenderer
|
||
* when it actually renders the text.
|
||
*/
|
||
virtual void drawText(const SkGlyphID[], const SkPoint[], int glyphCnt, uint32_t color,
|
||
const SkAtlasTextFont&) = 0;
|
||
|
||
/** Issues all queued text draws to SkAtlasTextRenderer. */
|
||
virtual void flush() = 0;
|
||
|
||
int width() const { return fWidth; }
|
||
int height() const { return fHeight; }
|
||
|
||
void* handle() const { return fHandle; }
|
||
|
||
SkAtlasTextContext* context() const { return fContext.get(); }
|
||
|
||
/** Saves the current matrix in a stack. Returns the prior depth of the saved matrix stack. */
|
||
int save();
|
||
/** Pops the top matrix on the stack if the stack is not empty. */
|
||
void restore();
|
||
/**
|
||
* Pops the matrix stack until the stack depth is count. Does nothing if the depth is already
|
||
* less than count.
|
||
*/
|
||
void restoreToCount(int count);
|
||
|
||
/** Pre-translates the current CTM. */
|
||
void translate(SkScalar dx, SkScalar dy);
|
||
/** Pre-scales the current CTM. */
|
||
void scale(SkScalar sx, SkScalar sy);
|
||
/** Pre-rotates the current CTM about the origin. */
|
||
void rotate(SkScalar degrees);
|
||
/** Pre-rotates the current CTM about the (px, py). */
|
||
void rotate(SkScalar degrees, SkScalar px, SkScalar py);
|
||
/** Pre-skews the current CTM. */
|
||
void skew(SkScalar sx, SkScalar sy);
|
||
/** Pre-concats the current CTM. */
|
||
void concat(const SkMatrix& matrix);
|
||
|
||
protected:
|
||
SkAtlasTextTarget(sk_sp<SkAtlasTextContext>, int width, int height, void* handle);
|
||
|
||
const SkMatrix& ctm() const { return *static_cast<const SkMatrix*>(fMatrixStack.back()); }
|
||
|
||
void* const fHandle;
|
||
const sk_sp<SkAtlasTextContext> fContext;
|
||
const int fWidth;
|
||
const int fHeight;
|
||
|
||
private:
|
||
SkDeque fMatrixStack;
|
||
int fSaveCnt;
|
||
|
||
SkMatrix* accessCTM() const {
|
||
return static_cast<SkMatrix*>(const_cast<void*>(fMatrixStack.back()));
|
||
}
|
||
|
||
SkAtlasTextTarget() = delete;
|
||
SkAtlasTextTarget(const SkAtlasTextContext&) = delete;
|
||
SkAtlasTextTarget& operator=(const SkAtlasTextContext&) = delete;
|
||
};
|
||
|
||
#endif
|