2017-11-19 18:20:13 +00:00
|
|
|
|
/*
|
|
|
|
|
* 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
|
|
|
|
|
|
2017-12-13 15:59:33 +00:00
|
|
|
|
#include "SkDeque.h"
|
2017-11-19 18:20:13 +00:00
|
|
|
|
#include "SkRefCnt.h"
|
|
|
|
|
#include "SkScalar.h"
|
|
|
|
|
|
2018-09-19 14:28:59 +00:00
|
|
|
|
#include <memory>
|
|
|
|
|
|
2017-11-19 18:20:13 +00:00
|
|
|
|
class SkAtlasTextContext;
|
|
|
|
|
class SkAtlasTextFont;
|
2017-12-13 15:59:33 +00:00
|
|
|
|
class SkMatrix;
|
2017-11-20 18:17:43 +00:00
|
|
|
|
struct SkPoint;
|
2017-11-19 18:20:13 +00:00
|
|
|
|
|
|
|
|
|
/** 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.
|
|
|
|
|
*/
|
2018-06-19 17:09:54 +00:00
|
|
|
|
static std::unique_ptr<SkAtlasTextTarget> Make(sk_sp<SkAtlasTextContext>,
|
|
|
|
|
int width,
|
|
|
|
|
int height,
|
2017-11-19 18:20:13 +00:00
|
|
|
|
void* handle);
|
|
|
|
|
|
|
|
|
|
/**
|
2017-11-20 18:17:43 +00:00
|
|
|
|
* 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.
|
2017-11-19 18:20:13 +00:00
|
|
|
|
*/
|
2017-11-20 18:17:43 +00:00
|
|
|
|
virtual void drawText(const SkGlyphID[], const SkPoint[], int glyphCnt, uint32_t color,
|
|
|
|
|
const SkAtlasTextFont&) = 0;
|
2017-11-19 18:20:13 +00:00
|
|
|
|
|
|
|
|
|
/** 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(); }
|
|
|
|
|
|
2017-12-13 15:59:33 +00:00
|
|
|
|
/** 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);
|
|
|
|
|
|
2017-11-19 18:20:13 +00:00
|
|
|
|
protected:
|
|
|
|
|
SkAtlasTextTarget(sk_sp<SkAtlasTextContext>, int width, int height, void* handle);
|
|
|
|
|
|
2017-12-13 15:59:33 +00:00
|
|
|
|
const SkMatrix& ctm() const { return *static_cast<const SkMatrix*>(fMatrixStack.back()); }
|
|
|
|
|
|
2017-11-19 18:20:13 +00:00
|
|
|
|
void* const fHandle;
|
|
|
|
|
const sk_sp<SkAtlasTextContext> fContext;
|
|
|
|
|
const int fWidth;
|
|
|
|
|
const int fHeight;
|
|
|
|
|
|
|
|
|
|
private:
|
2017-12-13 15:59:33 +00:00
|
|
|
|
SkDeque fMatrixStack;
|
|
|
|
|
int fSaveCnt;
|
|
|
|
|
|
|
|
|
|
SkMatrix* accessCTM() const {
|
|
|
|
|
return static_cast<SkMatrix*>(const_cast<void*>(fMatrixStack.back()));
|
|
|
|
|
}
|
|
|
|
|
|
2017-11-19 18:20:13 +00:00
|
|
|
|
SkAtlasTextTarget() = delete;
|
|
|
|
|
SkAtlasTextTarget(const SkAtlasTextContext&) = delete;
|
|
|
|
|
SkAtlasTextTarget& operator=(const SkAtlasTextContext&) = delete;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
#endif
|