| Index: include/core/SkPaint.h
|
| diff --git a/include/core/SkPaint.h b/include/core/SkPaint.h
|
| index a6c9bd4d198112e8f88e60ff5de8db16cbb68c72..624f39c36d89f88c989cecbf074547ad0e4ffbcd 100644
|
| --- a/include/core/SkPaint.h
|
| +++ b/include/core/SkPaint.h
|
| @@ -13,6 +13,7 @@
|
|
|
| #include "SkColor.h"
|
| #include "SkDrawLooper.h"
|
| +#include "SkMatrix.h"
|
| #include "SkXfermode.h"
|
| #ifdef SK_BUILD_FOR_ANDROID
|
| #include "SkPaintOptionsAndroid.h"
|
| @@ -30,7 +31,6 @@ struct SkRect;
|
| class SkGlyphCache;
|
| class SkImageFilter;
|
| class SkMaskFilter;
|
| -class SkMatrix;
|
| class SkPath;
|
| class SkPathEffect;
|
| struct SkPoint;
|
| @@ -935,6 +935,22 @@ public:
|
| const SkRect& doComputeFastBounds(const SkRect& orig, SkRect* storage,
|
| Style) const;
|
|
|
| + /**
|
| + * Return a matrix that applies the paint's text values: size, scale, skew
|
| + */
|
| + static SkMatrix* SetTextMatrix(SkMatrix* matrix, SkScalar size,
|
| + SkScalar scaleX, SkScalar skewX) {
|
| + matrix->setScale(size * scaleX, size);
|
| + if (skewX) {
|
| + matrix->postSkew(skewX, 0);
|
| + }
|
| + return matrix;
|
| + }
|
| +
|
| + SkMatrix* setTextMatrix(SkMatrix* matrix) const {
|
| + return SetTextMatrix(matrix, fTextSize, fTextScaleX, fTextSkewX);
|
| + }
|
| +
|
| SkDEVCODE(void toString(SkString*) const;)
|
|
|
| private:
|
| @@ -989,14 +1005,53 @@ private:
|
| static void Term();
|
|
|
| enum {
|
| - kCanonicalTextSizeForPaths = 64
|
| + /* 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.
|
| + */
|
| + kCanonicalTextSizeForPaths = 64,
|
| +
|
| + /*
|
| + * Above this size (taking into account CTM and textSize), we never use
|
| + * the cache for bits or metrics (we might overflow), so we just ask
|
| + * for a caononical size and post-transform that.
|
| + */
|
| + kMaxSizeForGlyphCache = 256,
|
| };
|
| +
|
| + static bool TooBigToUseCache(const SkMatrix& ctm, const SkMatrix& textM);
|
| +
|
| + bool tooBigToUseCache() const;
|
| + bool tooBigToUseCache(const SkMatrix& ctm) const;
|
| +
|
| + // Set flags/hinting/textSize up to use for drawing text as paths.
|
| + // Returns scale factor to restore the original textSize, since will will
|
| + // have change it to kCanonicalTextSizeForPaths.
|
| + SkScalar setupForAsPaths();
|
| +
|
| + static SkScalar MaxCacheSize2() {
|
| + static const SkScalar kMaxSize = SkIntToScalar(kMaxSizeForGlyphCache);
|
| + static const SkScalar kMag2Max = kMaxSize * kMaxSize;
|
| + return kMag2Max;
|
| + }
|
| +
|
| friend class SkAutoGlyphCache;
|
| friend class SkCanvas;
|
| friend class SkDraw;
|
| friend class SkGraphics; // So Term() can be called.
|
| friend class SkPDFDevice;
|
| friend class SkTextToPathIter;
|
| + friend class SkCanonicalizePaint;
|
|
|
| #ifdef SK_BUILD_FOR_ANDROID
|
| SkPaintOptionsAndroid fPaintOptionsAndroid;
|
|
|