Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(10)

Unified Diff: include/core/SkFlattenable.h

Issue 23021015: Initial error handling code (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: New serialization method Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: include/core/SkFlattenable.h
diff --git a/include/core/SkFlattenable.h b/include/core/SkFlattenable.h
index 0b21abcc764c7aed2bd67f9a83c5162df3e222a9..80928e44f84d7d7cc50cda0fa7fd2616c29212ee 100644
--- a/include/core/SkFlattenable.h
+++ b/include/core/SkFlattenable.h
@@ -27,14 +27,52 @@ class SkFlattenableWriteBuffer;
}
#define SK_DECLARE_UNFLATTENABLE_OBJECT() \
- virtual Factory getFactory() SK_OVERRIDE { return NULL; }; \
+ virtual Factory getFactory() SK_OVERRIDE { return NULL; };
+
+#define SK_DEFINE_FLATTENABLE_TYPE_FCNT(flattenable) \
mtklein 2013/09/24 22:52:18 OK, I give up. What's FCNT stand for / short for?
sugoi1 2013/09/25 21:15:27 Sorry, typo, I meant FNCT, as in function. The nam
+ static bool IsA(SkFlattenable::Type type) { \
+ return (flattenable::GetType() == type) || INHERITED::IsA(type); \
+ } \
+ virtual SkFlattenable::Type getFlattenableType() SK_OVERRIDE { \
+ return flattenable::GetType(); \
+ }
-#define SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(flattenable) \
+#define SK_DEFINE_FLATTENABLE_TYPE(flattenable) \
mtklein 2013/09/24 22:52:18 Normally I love macros which cleverly do things li
sugoi1 2013/09/25 21:15:27 I not against this, but I sort of like the fact th
+ static SkFlattenable::Type GetType() { \
+ return SkFlattenable::k##flattenable; \
+ } \
+ SK_DEFINE_FLATTENABLE_TYPE_FCNT(flattenable)
+
+/** Only for SkFlattenable derived objects that have implementations hidden in a cpp file
+ */
+#define SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_UTILS() \
mtklein 2013/09/24 22:52:18 May SK_DECLARE_FLATTENABLE_DESERIALIZATION and SK_
sugoi1 2013/09/25 21:15:27 I didn't invent the PUBLIC name, it was there befo
+ static SkFlattenable::Factory GetFactory(SkFlattenable::Type); \
+ static SkFlattenable::TypeCheck GetTypeCheck(SkFlattenable::Type);
+
+#define SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION(flattenable) \
virtual Factory getFactory() SK_OVERRIDE { return CreateProc; } \
static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) { \
return SkNEW_ARGS(flattenable, (buffer)); \
}
+/** For SkFlattenable derived objects defined within the skia library
+ */
+#define SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(flattenable) \
mtklein 2013/09/24 22:52:18 I think we'll be better off in the long term if we
sugoi1 2013/09/25 21:15:27 All right, I'll try to combine them into fewer mac
+ SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION(flattenable) \
+ SK_DEFINE_FLATTENABLE_TYPE(flattenable)
+
+/** For SkFlattenable derived objects defined outside of the skia (sample code, gms, etc).
+ Since these external object won't go through the ipc serialization, they are not given
+ a "Type" in the SkFlattenable::Type enum and there is no need to modify SkFlattenable.h
+ to add these derived classes. Note that the type is set to SkFlattenable::kNone here.
+ */
+#define SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS_EXTERN(flattenable) \
+ SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION(flattenable) \
+ static SkFlattenable::Type GetType() { \
+ return SkFlattenable::kNone; \
+ } \
+ SK_DEFINE_FLATTENABLE_TYPE_FCNT(flattenable)
+
/** \class SkFlattenable
SkFlattenable is the base class for objects that need to be flattened
@@ -43,9 +81,111 @@ class SkFlattenableWriteBuffer;
*/
class SK_API SkFlattenable : public SkRefCnt {
public:
+ enum Type {
mtklein 2013/09/24 22:52:18 Do you have any opinion on whether we want to limi
mtklein 2013/09/24 22:52:18 It'll help to add some comments here about how thi
sugoi1 2013/09/25 21:15:27 I don't see any reason to exclude types from it. T
sugoi1 2013/09/25 21:15:27 I added the comment about not reordering and a not
+ kNone,
mtklein 2013/09/24 22:52:18 Oh I so hate to ask you to do this, but you're goi
sugoi1 2013/09/25 21:15:27 No problem, that's easy enough.
+ kSkFlattenable,
+ kBATShader,
+ kSk2DPathEffect,
+ kSk3DShader,
+ kSkAnnotation,
+ kSkArithmeticMode_scalar,
+ kSkAvoidXfermode,
+ kSkBicubicImageFilter,
+ kSkBitmapProcShader,
+ kSkBitmapSource,
+ kSkBlurDrawLooper,
+ kSkBlurImageFilter,
+ kSkBlurMaskFilterImpl,
+ kSkClearXfermode,
+ kSkColorFilter,
+ kSkColorFilterImageFilter,
+ kSkColorMatrixFilter,
+ kSkColorShader,
+ kSkColorTable,
+ kSkComposeImageFilter,
+ kSkComposePathEffect,
+ kSkComposeShader,
+ kSkCornerPathEffect,
+ kSkCosineMapper,
+ kSkData,
+ kSkDataPixelRef,
+ kSkDataSet,
+ kSkDataTable,
+ kSkDiffuseLightingImageFilter,
+ kSkDilateImageFilter,
+ kSkDiscreteMapper,
+ kSkDiscretePathEffect,
+ kSkDisplacementMapEffect,
+ kSkDistantLight,
+ kSkDownSampleImageFilter,
+ kSkDrawLooper,
+ kSkDropShadowImageFilter,
+ kSkDstInXfermode,
+ kSkDstOutXfermode,
+ kSkEmbossMaskFilter,
+ kSkEmptyShader,
+ kSkErodeImageFilter,
+ kSkFilterShader,
+ kSkImageFilter,
+ kSkImageRef_GlobalPool,
+ kSkKernel33MaskFilter,
+ kSkLayerDrawLooper,
+ kSkLayerRasterizer,
+ kSkLerpXfermode,
+ kSkLight,
+ kSkLightingColorFilter,
+ kSkLightingColorFilter_JustAdd,
+ kSkLightingColorFilter_JustMul,
+ kSkLightingColorFilter_NoPin,
+ kSkLightingColorFilter_SingleMul,
+ kSkLinearGradient,
+ kSkLine2DPathEffect,
+ kSkLumaMaskXfermode,
+ kSkLumaMaskXfermodeSrcOver,
+ kSkMagnifierImageFilter,
+ kSkMallocPixelRef,
+ kSkMaskFilter,
+ kSkMatrixConvolutionImageFilter,
+ kSkMergeImageFilter,
+ kSkModeColorFilter,
+ kSkOffsetImageFilter,
+ kSkPathEffect,
+ kSkPath1DPathEffect,
+ kSkPath2DPathEffect,
+ kSkPerlinNoiseShader,
+ kSkPixelRef,
+ kSkPixelXorXfermode,
+ kSkPointLight,
+ kSkProcCoeffXfermode,
+ kSkProcXfermode,
+ kSkRadialGradient,
+ kSkRasterizer,
+ kSkRectShaderImageFilter,
+ kSkShader,
+ kSkSpecularLightingImageFilter,
+ kSkSpotLight,
+ kSkSrcXfermode,
+ kSkStippleMaskFilter,
+ kSkSumPathEffect,
+ kSkSweepGradient,
+ kSkTable_ColorFilter,
+ kSkTableMaskFilter,
+ kSkTransparentShader,
+ kSkTriColorShader,
+ kSkTwoPointConicalGradient,
+ kSkTwoPointRadialGradient,
+ kSkUnitMapper,
+ kSkXfermode,
+ kSkXfermodeImageFilter,
+ kSrc_SkModeColorFilter,
+ kSrcOver_SkModeColorFilter,
+ kTypeCount
+ };
mtklein 2013/09/24 22:52:18 Can you add a comment betwe kSrcOver_SkModeColorFi
sugoi1 2013/09/25 21:15:27 Done.
+
SK_DECLARE_INST_COUNT(SkFlattenable)
typedef SkFlattenable* (*Factory)(SkFlattenableReadBuffer&);
+ typedef bool (*TypeCheck)(SkFlattenable::Type);
SkFlattenable() {}
@@ -59,6 +199,32 @@ public:
static const char* FactoryToName(Factory);
static void Register(const char name[], Factory);
+ /** Returns the class id
mtklein 2013/09/24 22:52:18 Let's flesh out this (and related comments): /**
sugoi1 2013/09/25 21:15:27 Done.
+ */
+ static SkFlattenable::Type GetType() {
+ return SkFlattenable::kSkFlattenable;
+ }
+
+ /** Returns the class id of an object
+ */
+ virtual SkFlattenable::Type getFlattenableType() = 0;
+
+ /** Returns whether the current object is of the given type
+ */
+ static bool IsA(SkFlattenable::Type type) {
+ return (GetType() == type);
+ }
+
+ /** Returns the factory function required to create the given type
+ */
+ static Factory TypeToFactory(Type type);
+
+ /** Checks if typeA is a typeB
+ * For example, if typeA is kSkImageFilter and typeB is kSkFlattenable, this would return true
+ * Inversely, if typeA is kSkFlattenable and typeB is kSkImageFilter, this would return false
+ */
+ static bool TypeIsA(SkFlattenable::Type typeA, SkFlattenable::Type typeB);
mtklein 2013/09/24 22:52:18 Does this need to be public?
sugoi1 2013/09/25 21:15:27 It needs to be accessible inside SkValidatingReadB
+
class Registrar {
public:
Registrar(const char name[], Factory factory) {

Powered by Google App Engine
This is Rietveld 408576698