/* * Copyright 2013 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkPaintPriv_DEFINED #define SkPaintPriv_DEFINED #include "SkImageInfo.h" #include "SkMatrix.h" #include "SkPaint.h" #include "SkTypeface.h" class SkBitmap; class SkImage; class SkReadBuffer; class SkWriteBuffer; class SkPaintPriv { public: enum ShaderOverrideOpacity { kNone_ShaderOverrideOpacity, //!< there is no overriding shader (bitmap or image) kOpaque_ShaderOverrideOpacity, //!< the overriding shader is opaque kNotOpaque_ShaderOverrideOpacity, //!< the overriding shader may not be opaque }; /** * Returns true if drawing with this paint (or nullptr) will ovewrite all affected pixels. * * Note: returns conservative true, meaning it may return false even though the paint might * in fact overwrite its pixels. */ static bool Overwrites(const SkPaint* paint, ShaderOverrideOpacity); static bool Overwrites(const SkPaint& paint) { return Overwrites(&paint, kNone_ShaderOverrideOpacity); } /** * Returns true if drawing this bitmap with this paint (or nullptr) will ovewrite all affected * pixels. */ static bool Overwrites(const SkBitmap&, const SkPaint* paint); /** * Returns true if drawing this image with this paint (or nullptr) will ovewrite all affected * pixels. */ static bool Overwrites(const SkImage*, const SkPaint* paint); static void ScaleFontMetrics(SkPaint::FontMetrics*, SkScalar); /** * Return a matrix that applies the paint's text values: size, scale, skew */ static void MakeTextMatrix(SkMatrix* matrix, SkScalar size, SkScalar scaleX, SkScalar skewX) { matrix->setScale(size * scaleX, size); if (skewX) { matrix->postSkew(skewX, 0); } } static void MakeTextMatrix(SkMatrix* matrix, const SkPaint& paint) { MakeTextMatrix(matrix, paint.getTextSize(), paint.getTextScaleX(), paint.getTextSkewX()); } static bool ShouldDither(const SkPaint&, SkColorType); // returns -1 if buffer is invalid for specified encoding static int ValidCountText(const void* text, size_t length, SkPaint::TextEncoding); static SkTypeface* GetTypefaceOrDefault(const SkPaint& paint) { return paint.getTypeface() ? paint.getTypeface() : SkTypeface::GetDefaultTypeface(); } static sk_sp RefTypefaceOrDefault(const SkPaint& paint) { return paint.getTypeface() ? paint.refTypeface() : SkTypeface::MakeDefault(); } /** Serializes SkPaint into a buffer. A companion unflatten() call can reconstitute the paint at a later time. @param buffer SkWriteBuffer receiving the flattened SkPaint data */ static void Flatten(const SkPaint& paint, SkWriteBuffer& buffer); /** Populates SkPaint, typically from a serialized stream, created by calling flatten() at an earlier time. SkReadBuffer class is not public, so unflatten() cannot be meaningfully called by the client. @param buffer serialized data describing SkPaint content @return false if the buffer contains invalid data */ static bool Unflatten(SkPaint* paint, SkReadBuffer& buffer); }; #endif