class SkSurface_Base;
class SkTextBlob;
+/*
+ * If you want the legacy cliptolayer flag (i.e. android), then you must have the new
+ * legacy saveflags.
+ */
+#ifdef SK_SUPPORT_LEGACY_CLIPTOLAYERFLAG
+#ifndef SK_SUPPORT_LEGACY_SAVEFLAGS
+ #define SK_SUPPORT_LEGACY_SAVEFLAGS
+#endif
+#endif
+
/** \class SkCanvas
A Canvas encapsulates all of the state about drawing into a device (bitmap).
etc.
*/
class SK_API SkCanvas : public SkRefCnt {
+ enum PrivateSaveLayerFlags {
+ kDontClipToLayer_PrivateSaveLayerFlag = 1 << 31,
+ };
+
public:
/**
* Attempt to allocate raster canvas, matching the ImageInfo, that will draw directly into the
///////////////////////////////////////////////////////////////////////////
+#ifdef SK_SUPPORT_LEGACY_SAVEFLAGS
enum SaveFlags {
/** save the matrix state, restoring it on restore() */
// [deprecated] kMatrix_SaveFlag = 0x01,
#endif
kARGB_ClipLayer_SaveFlag = 0x1F
};
+#endif
/** This call saves the current matrix, clip, and drawFilter, and pushes a
copy onto a private stack. Subsequent calls to translate, scale,
*/
int saveLayerPreserveLCDTextRequests(const SkRect* bounds, const SkPaint* paint);
+#ifdef SK_SUPPORT_LEGACY_SAVEFLAGS
/** DEPRECATED - use saveLayer(const SkRect*, const SkPaint*) instead.
This behaves the same as saveLayer(const SkRect*, const SkPaint*),
*/
SK_ATTR_EXTERNALLY_DEPRECATED("SaveFlags use is deprecated")
int saveLayer(const SkRect* bounds, const SkPaint* paint, SaveFlags flags);
+#endif
/** This behaves the same as save(), but in addition it allocates an
offscreen bitmap. All drawing calls are directed there, and only when
*/
int saveLayerAlpha(const SkRect* bounds, U8CPU alpha);
+#ifdef SK_SUPPORT_LEGACY_SAVEFLAGS
/** DEPRECATED - use saveLayerAlpha(const SkRect*, U8CPU) instead.
This behaves the same as saveLayerAlpha(const SkRect*, U8CPU),
*/
SK_ATTR_EXTERNALLY_DEPRECATED("SaveFlags use is deprecated")
int saveLayerAlpha(const SkRect* bounds, U8CPU alpha, SaveFlags flags);
+#endif
enum {
kIsOpaque_SaveLayerFlag = 1 << 0,
kPreserveLCDText_SaveLayerFlag = 1 << 1,
+
+#ifdef SK_SUPPORT_LEGACY_CLIPTOLAYERFLAG
+ kDontClipToLayer_Legacy_SaveLayerFlag = kDontClipToLayer_PrivateSaveLayerFlag,
+#endif
};
typedef uint32_t SaveLayerFlags;
const SkImageFilter* imageFilter = NULL);
private:
- enum PrivateSaveLayerFlags {
- kDontClipToLayer_PrivateSaveLayerFlag = 1 << 31,
- };
-
static bool BoundsAffectsClip(SaveLayerFlags);
+#ifdef SK_SUPPORT_LEGACY_SAVEFLAGS
static uint32_t SaveFlagsToSaveLayerFlags(SaveFlags);
+#endif
+ static SaveLayerFlags LegacySaveFlagsToSaveLayerFlags(uint32_t legacySaveFlags);
enum ShaderOverrideOpacity {
kNone_ShaderOverrideOpacity, //!< there is no overriding shader (bitmap or image)
size_t fRowBytes;
};
+#ifdef SK_SUPPORT_LEGACY_SAVEFLAGS
static inline SkCanvas::SaveFlags operator|(const SkCanvas::SaveFlags lhs,
const SkCanvas::SaveFlags rhs) {
return static_cast<SkCanvas::SaveFlags>(static_cast<int>(lhs) | static_cast<int>(rhs));
lhs = lhs | rhs;
return lhs;
}
+#endif
class SkCanvasClipVisitor {
public:
return true;
}
+#ifdef SK_SUPPORT_LEGACY_SAVEFLAGS
uint32_t SkCanvas::SaveFlagsToSaveLayerFlags(SaveFlags flags) {
uint32_t layerFlags = 0;
}
return layerFlags;
}
+#endif
int SkCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint) {
return this->saveLayer(SaveLayerRec(bounds, paint, 0));
}
+#ifdef SK_SUPPORT_LEGACY_SAVEFLAGS
int SkCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint, SaveFlags flags) {
return this->saveLayer(SaveLayerRec(bounds, paint, SaveFlagsToSaveLayerFlags(flags)));
}
+#endif
int SkCanvas::saveLayerPreserveLCDTextRequests(const SkRect* bounds, const SkPaint* paint) {
return this->saveLayer(SaveLayerRec(bounds, paint, kPreserveLCDText_SaveLayerFlag));
}
int SkCanvas::saveLayerAlpha(const SkRect* bounds, U8CPU alpha) {
- return this->saveLayerAlpha(bounds, alpha, kARGB_ClipLayer_SaveFlag);
+ if (0xFF == alpha) {
+ return this->saveLayer(bounds, nullptr);
+ } else {
+ SkPaint tmpPaint;
+ tmpPaint.setAlpha(alpha);
+ return this->saveLayer(bounds, &tmpPaint);
+ }
}
+#ifdef SK_SUPPORT_LEGACY_SAVEFLAGS
int SkCanvas::saveLayerAlpha(const SkRect* bounds, U8CPU alpha,
SaveFlags flags) {
if (0xFF == alpha) {
return this->saveLayer(bounds, &tmpPaint, flags);
}
}
+#endif
void SkCanvas::internalRestore() {
SkASSERT(fMCStack.count() != 0);
#include "SkTDArray.h"
#include "SkTypes.h"
+// matches old SkCanvas::SaveFlags
+enum LegacySaveFlags {
+ kHasAlphaLayer_LegacySaveFlags = 0x04,
+ kClipToLayer_LegacySaveFlags = 0x10,
+};
+#ifdef SK_SUPPORT_LEGACY_SAVEFLAGS
+static_assert(kHasAlphaLayer_LegacySaveFlags == (int)SkCanvas::kHasAlphaLayer_SaveFlag, "");
+static_assert(kClipToLayer_LegacySaveFlags == (int)SkCanvas::kClipToLayer_SaveFlag, "");
+#endif
+
+SkCanvas::SaveLayerFlags SkCanvas::LegacySaveFlagsToSaveLayerFlags(uint32_t flags) {
+ uint32_t layerFlags = 0;
+
+ if (0 == (flags & kClipToLayer_LegacySaveFlags)) {
+ layerFlags |= SkCanvas::kDontClipToLayer_PrivateSaveLayerFlag;
+ }
+ if (0 == (flags & kHasAlphaLayer_LegacySaveFlags)) {
+ layerFlags |= kIsOpaque_SaveLayerFlag;
+ }
+ return layerFlags;
+}
+
/*
* Read the next op code and chunk size from 'reader'. The returned size
* is the entire size of the chunk (including the opcode). Thus, the
case SAVE_LAYER_SAVEFLAGS_DEPRECATED: {
const SkRect* boundsPtr = get_rect_ptr(reader);
const SkPaint* paint = fPictureData->getPaint(reader);
- const SkCanvas::SaveFlags flags = (SkCanvas::SaveFlags)reader->readInt();
- canvas->saveLayer(SkCanvas::SaveLayerRec(boundsPtr, paint,
- SkCanvas::SaveFlagsToSaveLayerFlags(flags)));
+ auto flags = SkCanvas::LegacySaveFlagsToSaveLayerFlags(reader->readInt());
+ canvas->saveLayer(SkCanvas::SaveLayerRec(boundsPtr, paint, flags));
} break;
case SAVE_LAYER_SAVELAYERFLAGS: {
const SkRect* boundsPtr = get_rect_ptr(reader);