/*
|
* Copyright 2018 Google Inc.
|
*
|
* Use of this source code is governed by a BSD-style license that can be
|
* found in the LICENSE file.
|
*/
|
|
#ifndef SkFontPriv_DEFINED
|
#define SkFontPriv_DEFINED
|
|
#include "SkFont.h"
|
#include "SkMatrix.h"
|
#include "SkTypeface.h"
|
|
class SkReadBuffer;
|
class SkWriteBuffer;
|
|
class SkFontPriv {
|
public:
|
/* This is the size we use when we ask for a glyph's path. We then
|
* post-transform it as we draw to match the request.
|
* This is done to try to re-use cache entries for the path.
|
*
|
* This value is somewhat arbitrary. In theory, it could be 1, since
|
* we store paths as floats. However, we get the path from the font
|
* scaler, and it may represent its paths as fixed-point (or 26.6),
|
* so we shouldn't ask for something too big (might overflow 16.16)
|
* or too small (underflow 26.6).
|
*
|
* This value could track kMaxSizeForGlyphCache, assuming the above
|
* constraints, but since we ask for unhinted paths, the two values
|
* need not match per-se.
|
*/
|
static constexpr int kCanonicalTextSizeForPaths = 64;
|
|
static bool TooBigToUseCache(const SkMatrix& ctm, const SkMatrix& textM, SkScalar maxLimit);
|
|
static SkScalar MaxCacheSize2(SkScalar maxLimit);
|
|
/**
|
* Return a matrix that applies the paint's text values: size, scale, skew
|
*/
|
static SkMatrix MakeTextMatrix(SkScalar size, SkScalar scaleX, SkScalar skewX) {
|
SkMatrix m = SkMatrix::MakeScale(size * scaleX, size);
|
if (skewX) {
|
m.postSkew(skewX, 0);
|
}
|
return m;
|
}
|
|
static SkMatrix MakeTextMatrix(const SkFont& font) {
|
return MakeTextMatrix(font.getSize(), font.getScaleX(), font.getSkewX());
|
}
|
|
static void ScaleFontMetrics(SkFontMetrics*, SkScalar);
|
|
/**
|
Returns the union of bounds of all glyphs.
|
Returned dimensions are computed by font manager from font data,
|
ignoring SkPaint::Hinting. Includes font metrics, but not fake bold or SkPathEffect.
|
|
If text size is large, text scale is one, and text skew is zero,
|
returns the bounds as:
|
{ SkFontMetrics::fXMin, SkFontMetrics::fTop, SkFontMetrics::fXMax, SkFontMetrics::fBottom }.
|
|
@return union of bounds of all glyphs
|
*/
|
static SkRect GetFontBounds(const SkFont&);
|
|
static bool IsFinite(const SkFont& font) {
|
return SkScalarIsFinite(font.getSize()) &&
|
SkScalarIsFinite(font.getScaleX()) &&
|
SkScalarIsFinite(font.getSkewX());
|
}
|
|
// Returns the number of elements (characters or glyphs) in the array.
|
static int CountTextElements(const void* text, size_t byteLength, SkTextEncoding);
|
|
static void GlyphsToUnichars(const SkFont&, const uint16_t glyphs[], int count, SkUnichar[]);
|
|
static void Flatten(const SkFont&, SkWriteBuffer& buffer);
|
static bool Unflatten(SkFont*, SkReadBuffer& buffer);
|
};
|
|
class SkAutoToGlyphs {
|
public:
|
SkAutoToGlyphs(const SkFont& font, const void* text, size_t length, SkTextEncoding encoding) {
|
if (encoding == kGlyphID_SkTextEncoding || length == 0) {
|
fGlyphs = reinterpret_cast<const uint16_t*>(text);
|
fCount = length >> 1;
|
} else {
|
fCount = font.countText(text, length, encoding);
|
fStorage.reset(fCount);
|
font.textToGlyphs(text, length, encoding, fStorage.get(), fCount);
|
fGlyphs = fStorage.get();
|
}
|
}
|
|
int count() const { return fCount; }
|
const uint16_t* glyphs() const { return fGlyphs; }
|
|
private:
|
SkAutoSTArray<32, uint16_t> fStorage;
|
const uint16_t* fGlyphs;
|
int fCount;
|
};
|
|
#endif
|