blob: 4461a4b77b01ea082293bdd332c5a10185932585 [file] [log] [blame]
/*
* Copyright 2006 The Android Open Source Project
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "SkDisplayType.h"
#include "SkAnimateMaker.h"
#include "SkAnimateSet.h"
#include "SkDisplayAdd.h"
#include "SkDisplayApply.h"
#include "SkDisplayBounds.h"
#include "SkDisplayEvent.h"
#include "SkDisplayInclude.h"
#ifdef SK_DEBUG
#include "SkDisplayList.h"
#endif
#include "SkDisplayMath.h"
#include "SkDisplayMovie.h"
#include "SkDisplayNumber.h"
#include "SkDisplayPost.h"
#include "SkDisplayRandom.h"
#include "SkDisplayTypes.h"
#include "SkDraw3D.h"
#include "SkDrawBitmap.h"
#include "SkDrawClip.h"
#include "SkDrawDash.h"
#include "SkDrawDiscrete.h"
#include "SkDrawEmboss.h"
#include "SkDrawFull.h"
#include "SkDrawGradient.h"
#include "SkDrawLine.h"
#include "SkDrawMatrix.h"
#include "SkDrawOval.h"
#include "SkDrawPaint.h"
#include "SkDrawPath.h"
#include "SkDrawPoint.h"
#include "SkDrawSaveLayer.h"
#include "SkDrawText.h"
#include "SkDrawTextBox.h"
#include "SkDrawTo.h"
#include "SkDrawTransparentShader.h"
#include "SkDump.h"
#include "SkExtras.h"
#include "SkHitClear.h"
#include "SkHitTest.h"
#include "SkMatrixParts.h"
#include "SkPathParts.h"
#include "SkPostParts.h"
#include "SkSnapshot.h"
#include "SkTextOnPath.h"
#include "SkTextToPath.h"
#include "SkTSearch.h"
#define CASE_NEW(_class) \
case SkType_##_class: result = new Sk##_class(); break
#define CASE_DRAW_NEW(_class) \
case SkType_##_class: result = new SkDraw##_class(); break
#define CASE_DISPLAY_NEW(_class) \
case SkType_##_class: result = new SkDisplay##_class(); break
#ifdef SK_DEBUG
#define CASE_DEBUG_RETURN_NIL(_class) \
case SkType_##_class: return NULL
#else
#define CASE_DEBUG_RETURN_NIL(_class)
#endif
SkDisplayTypes SkDisplayType::gNewTypes = kNumberOfTypes;
SkDisplayable* SkDisplayType::CreateInstance(SkAnimateMaker* maker, SkDisplayTypes type) {
SkDisplayable* result = NULL;
switch (type) {
// unknown
CASE_DISPLAY_NEW(Math);
CASE_DISPLAY_NEW(Number);
CASE_NEW(Add);
CASE_NEW(AddCircle);
// addgeom
CASE_DEBUG_RETURN_NIL(AddMode);
CASE_NEW(AddOval);
CASE_NEW(AddPath);
CASE_NEW(AddRect);
CASE_NEW(AddRoundRect);
CASE_DEBUG_RETURN_NIL(Align);
CASE_NEW(Animate);
// animatebase
CASE_NEW(Apply);
CASE_DEBUG_RETURN_NIL(ApplyMode);
CASE_DEBUG_RETURN_NIL(ApplyTransition);
CASE_DISPLAY_NEW(Array);
// argb
// base64
// basebitmap
// baseclassinfo
CASE_DRAW_NEW(Bitmap);
// bitmapencoding
// bitmapformat
CASE_DRAW_NEW(BitmapShader);
CASE_DRAW_NEW(Blur);
CASE_DISPLAY_NEW(Boolean);
// boundable
CASE_DISPLAY_NEW(Bounds);
CASE_DEBUG_RETURN_NIL(Cap);
CASE_NEW(Clear);
CASE_DRAW_NEW(Clip);
CASE_NEW(Close);
CASE_DRAW_NEW(Color);
CASE_NEW(CubicTo);
CASE_NEW(Dash);
CASE_NEW(DataInput);
CASE_NEW(Discrete);
// displayable
// drawable
CASE_NEW(DrawTo);
CASE_NEW(Dump);
// dynamicstring
CASE_DRAW_NEW(Emboss);
CASE_DISPLAY_NEW(Event);
CASE_DEBUG_RETURN_NIL(EventCode);
CASE_DEBUG_RETURN_NIL(EventKind);
CASE_DEBUG_RETURN_NIL(EventMode);
// filltype
// filtertype
CASE_DISPLAY_NEW(Float);
CASE_NEW(FromPath);
CASE_DEBUG_RETURN_NIL(FromPathMode);
CASE_NEW(Full);
// gradient
CASE_NEW(Group);
CASE_NEW(HitClear);
CASE_NEW(HitTest);
CASE_NEW(ImageBaseBitmap);
CASE_NEW(Include);
CASE_NEW(Input);
CASE_DISPLAY_NEW(Int);
CASE_DEBUG_RETURN_NIL(Join);
CASE_NEW(Line);
CASE_NEW(LineTo);
CASE_NEW(DrawLinearGradient);
CASE_DRAW_NEW(MaskFilter);
CASE_DEBUG_RETURN_NIL(MaskFilterBlurStyle);
// maskfilterlight
CASE_DRAW_NEW(Matrix);
// memberfunction
// memberproperty
CASE_NEW(Move);
CASE_NEW(MoveTo);
CASE_DISPLAY_NEW(Movie);
// msec
CASE_NEW(Oval);
CASE_DRAW_NEW(Paint);
CASE_DRAW_NEW(Path);
// pathdirection
CASE_DRAW_NEW(PathEffect);
// point
CASE_NEW(DrawPoint);
CASE_NEW(PolyToPoly);
CASE_NEW(Polygon);
CASE_NEW(Polyline);
CASE_NEW(Post);
CASE_NEW(QuadTo);
CASE_NEW(RCubicTo);
CASE_NEW(RLineTo);
CASE_NEW(RMoveTo);
CASE_NEW(RQuadTo);
CASE_NEW(DrawRadialGradient);
CASE_DISPLAY_NEW(Random);
CASE_DRAW_NEW(Rect);
CASE_NEW(RectToRect);
CASE_NEW(Remove);
CASE_NEW(Replace);
CASE_NEW(Rotate);
CASE_NEW(RoundRect);
CASE_NEW(Save);
CASE_NEW(SaveLayer);
CASE_NEW(Scale);
// screenplay
CASE_NEW(Set);
CASE_DRAW_NEW(Shader);
CASE_NEW(Skew);
CASE_NEW(3D_Camera);
CASE_NEW(3D_Patch);
// 3dpoint
CASE_NEW(Snapshot);
CASE_DISPLAY_NEW(String);
// style
CASE_NEW(Text);
CASE_DRAW_NEW(TextBox);
// textboxalign
// textboxmode
CASE_NEW(TextOnPath);
CASE_NEW(TextToPath);
CASE_DEBUG_RETURN_NIL(TileMode);
CASE_NEW(Translate);
CASE_DRAW_NEW(TransparentShader);
CASE_DRAW_NEW(Typeface);
CASE_DEBUG_RETURN_NIL(Xfermode);
default:
SkExtras** end = maker->fExtras.end();
for (SkExtras** extraPtr = maker->fExtras.begin(); extraPtr < end; extraPtr++) {
if ((result = (*extraPtr)->createInstance(type)) != NULL)
return result;
}
SkASSERT(0);
}
return result;
}
#undef CASE_NEW
#undef CASE_DRAW_NEW
#undef CASE_DISPLAY_NEW
#if SK_USE_CONDENSED_INFO == 0
#define CASE_GET_INFO(_class) case SkType_##_class: \
info = Sk##_class::fInfo; infoCount = Sk##_class::fInfoCount; break
#define CASE_GET_DRAW_INFO(_class) case SkType_##_class: \
info = SkDraw##_class::fInfo; infoCount = SkDraw##_class::fInfoCount; break
#define CASE_GET_DISPLAY_INFO(_class) case SkType_##_class: \
info = SkDisplay##_class::fInfo; infoCount = SkDisplay##_class::fInfoCount; \
break
const SkMemberInfo* SkDisplayType::GetMembers(SkAnimateMaker* maker,
SkDisplayTypes type, int* infoCountPtr) {
const SkMemberInfo* info = NULL;
int infoCount = 0;
switch (type) {
// unknown
CASE_GET_DISPLAY_INFO(Math);
CASE_GET_DISPLAY_INFO(Number);
CASE_GET_INFO(Add);
CASE_GET_INFO(AddCircle);
CASE_GET_INFO(AddGeom);
// addmode
CASE_GET_INFO(AddOval);
CASE_GET_INFO(AddPath);
CASE_GET_INFO(AddRect);
CASE_GET_INFO(AddRoundRect);
// align
CASE_GET_INFO(Animate);
CASE_GET_INFO(AnimateBase);
CASE_GET_INFO(Apply);
// applymode
// applytransition
CASE_GET_DISPLAY_INFO(Array);
// argb
// base64
CASE_GET_INFO(BaseBitmap);
// baseclassinfo
CASE_GET_DRAW_INFO(Bitmap);
// bitmapencoding
// bitmapformat
CASE_GET_DRAW_INFO(BitmapShader);
CASE_GET_DRAW_INFO(Blur);
CASE_GET_DISPLAY_INFO(Boolean);
// boundable
CASE_GET_DISPLAY_INFO(Bounds);
// cap
// clear
CASE_GET_DRAW_INFO(Clip);
// close
CASE_GET_DRAW_INFO(Color);
CASE_GET_INFO(CubicTo);
CASE_GET_INFO(Dash);
CASE_GET_INFO(DataInput);
CASE_GET_INFO(Discrete);
// displayable
// drawable
CASE_GET_INFO(DrawTo);
CASE_GET_INFO(Dump);
// dynamicstring
CASE_GET_DRAW_INFO(Emboss);
CASE_GET_DISPLAY_INFO(Event);
// eventcode
// eventkind
// eventmode
// filltype
// filtertype
CASE_GET_DISPLAY_INFO(Float);
CASE_GET_INFO(FromPath);
// frompathmode
// full
CASE_GET_INFO(DrawGradient);
CASE_GET_INFO(Group);
CASE_GET_INFO(HitClear);
CASE_GET_INFO(HitTest);
CASE_GET_INFO(ImageBaseBitmap);
CASE_GET_INFO(Include);
CASE_GET_INFO(Input);
CASE_GET_DISPLAY_INFO(Int);
// join
CASE_GET_INFO(Line);
CASE_GET_INFO(LineTo);
CASE_GET_INFO(DrawLinearGradient);
// maskfilter
// maskfilterblurstyle
// maskfilterlight
CASE_GET_DRAW_INFO(Matrix);
// memberfunction
// memberproperty
CASE_GET_INFO(Move);
CASE_GET_INFO(MoveTo);
CASE_GET_DISPLAY_INFO(Movie);
// msec
CASE_GET_INFO(Oval);
CASE_GET_DRAW_INFO(Path);
CASE_GET_DRAW_INFO(Paint);
// pathdirection
// patheffect
case SkType_Point: info = Sk_Point::fInfo; infoCount = Sk_Point::fInfoCount; break; // no virtual flavor
CASE_GET_INFO(DrawPoint); // virtual flavor
CASE_GET_INFO(PolyToPoly);
CASE_GET_INFO(Polygon);
CASE_GET_INFO(Polyline);
CASE_GET_INFO(Post);
CASE_GET_INFO(QuadTo);
CASE_GET_INFO(RCubicTo);
CASE_GET_INFO(RLineTo);
CASE_GET_INFO(RMoveTo);
CASE_GET_INFO(RQuadTo);
CASE_GET_INFO(DrawRadialGradient);
CASE_GET_DISPLAY_INFO(Random);
CASE_GET_DRAW_INFO(Rect);
CASE_GET_INFO(RectToRect);
CASE_GET_INFO(Remove);
CASE_GET_INFO(Replace);
CASE_GET_INFO(Rotate);
CASE_GET_INFO(RoundRect);
CASE_GET_INFO(Save);
CASE_GET_INFO(SaveLayer);
CASE_GET_INFO(Scale);
// screenplay
CASE_GET_INFO(Set);
CASE_GET_DRAW_INFO(Shader);
CASE_GET_INFO(Skew);
CASE_GET_INFO(3D_Camera);
CASE_GET_INFO(3D_Patch);
CASE_GET_INFO(3D_Point);
CASE_GET_INFO(Snapshot);
CASE_GET_DISPLAY_INFO(String);
// style
CASE_GET_INFO(Text);
CASE_GET_DRAW_INFO(TextBox);
// textboxalign
// textboxmode
CASE_GET_INFO(TextOnPath);
CASE_GET_INFO(TextToPath);
// tilemode
CASE_GET_INFO(Translate);
// transparentshader
CASE_GET_DRAW_INFO(Typeface);
// xfermode
// knumberoftypes
default:
if (maker) {
SkExtras** end = maker->fExtras.end();
for (SkExtras** extraPtr = maker->fExtras.begin(); extraPtr < end; extraPtr++) {
if ((info = (*extraPtr)->getMembers(type, infoCountPtr)) != NULL)
return info;
}
}
return NULL;
}
if (infoCountPtr)
*infoCountPtr = infoCount;
return info;
}
const SkMemberInfo* SkDisplayType::GetMember(SkAnimateMaker* maker,
SkDisplayTypes type, const char** matchPtr ) {
int infoCount = 0; // Initialize to remove a warning.
const SkMemberInfo* info = GetMembers(maker, type, &infoCount);
info = SkMemberInfo::Find(info, infoCount, matchPtr);
// SkASSERT(info);
return info;
}
#undef CASE_GET_INFO
#undef CASE_GET_DRAW_INFO
#undef CASE_GET_DISPLAY_INFO
#endif // SK_USE_CONDENSED_INFO == 0
#if defined SK_DEBUG || defined SK_BUILD_CONDENSED
#define DRAW_NAME(_name, _type) {_name, _type, true, false }
#define DISPLAY_NAME(_name, _type) {_name, _type, false, true }
#define INIT_BOOL_FIELDS , false, false
#else
#define DRAW_NAME(_name, _type) {_name, _type }
#define DISPLAY_NAME(_name, _type) {_name, _type }
#define INIT_BOOL_FIELDS
#endif
const TypeNames gTypeNames[] = {
// unknown
{ "Math", SkType_Math INIT_BOOL_FIELDS },
{ "Number", SkType_Number INIT_BOOL_FIELDS },
{ "add", SkType_Add INIT_BOOL_FIELDS },
{ "addCircle", SkType_AddCircle INIT_BOOL_FIELDS },
// addgeom
// addmode
{ "addOval", SkType_AddOval INIT_BOOL_FIELDS },
{ "addPath", SkType_AddPath INIT_BOOL_FIELDS },
{ "addRect", SkType_AddRect INIT_BOOL_FIELDS },
{ "addRoundRect", SkType_AddRoundRect INIT_BOOL_FIELDS },
// align
{ "animate", SkType_Animate INIT_BOOL_FIELDS },
// animateBase
{ "apply", SkType_Apply INIT_BOOL_FIELDS },
// applymode
// applytransition
{ "array", SkType_Array INIT_BOOL_FIELDS },
// argb
// base64
// basebitmap
// baseclassinfo
DRAW_NAME("bitmap", SkType_Bitmap),
// bitmapencoding
// bitmapformat
DRAW_NAME("bitmapShader", SkType_BitmapShader),
DRAW_NAME("blur", SkType_Blur),
{ "boolean", SkType_Boolean INIT_BOOL_FIELDS },
// boundable
DISPLAY_NAME("bounds", SkType_Bounds),
// cap
{ "clear", SkType_Clear INIT_BOOL_FIELDS },
DRAW_NAME("clip", SkType_Clip),
{ "close", SkType_Close INIT_BOOL_FIELDS },
DRAW_NAME("color", SkType_Color),
{ "cubicTo", SkType_CubicTo INIT_BOOL_FIELDS },
{ "dash", SkType_Dash INIT_BOOL_FIELDS },
{ "data", SkType_DataInput INIT_BOOL_FIELDS },
{ "discrete", SkType_Discrete INIT_BOOL_FIELDS },
// displayable
// drawable
{ "drawTo", SkType_DrawTo INIT_BOOL_FIELDS },
{ "dump", SkType_Dump INIT_BOOL_FIELDS },
// dynamicstring
DRAW_NAME("emboss", SkType_Emboss),
DISPLAY_NAME("event", SkType_Event),
// eventcode
// eventkind
// eventmode
// filltype
// filtertype
{ "float", SkType_Float INIT_BOOL_FIELDS },
{ "fromPath", SkType_FromPath INIT_BOOL_FIELDS },
// frompathmode
{ "full", SkType_Full INIT_BOOL_FIELDS },
// gradient
{ "group", SkType_Group INIT_BOOL_FIELDS },
{ "hitClear", SkType_HitClear INIT_BOOL_FIELDS },
{ "hitTest", SkType_HitTest INIT_BOOL_FIELDS },
{ "image", SkType_ImageBaseBitmap INIT_BOOL_FIELDS },
{ "include", SkType_Include INIT_BOOL_FIELDS },
{ "input", SkType_Input INIT_BOOL_FIELDS },
{ "int", SkType_Int INIT_BOOL_FIELDS },
// join
{ "line", SkType_Line INIT_BOOL_FIELDS },
{ "lineTo", SkType_LineTo INIT_BOOL_FIELDS },
{ "linearGradient", SkType_DrawLinearGradient INIT_BOOL_FIELDS },
{ "maskFilter", SkType_MaskFilter INIT_BOOL_FIELDS },
// maskfilterblurstyle
// maskfilterlight
DRAW_NAME("matrix", SkType_Matrix),
// memberfunction
// memberproperty
{ "move", SkType_Move INIT_BOOL_FIELDS },
{ "moveTo", SkType_MoveTo INIT_BOOL_FIELDS },
{ "movie", SkType_Movie INIT_BOOL_FIELDS },
// msec
{ "oval", SkType_Oval INIT_BOOL_FIELDS },
DRAW_NAME("paint", SkType_Paint),
DRAW_NAME("path", SkType_Path),
// pathdirection
{ "pathEffect", SkType_PathEffect INIT_BOOL_FIELDS },
// point
DRAW_NAME("point", SkType_DrawPoint),
{ "polyToPoly", SkType_PolyToPoly INIT_BOOL_FIELDS },
{ "polygon", SkType_Polygon INIT_BOOL_FIELDS },
{ "polyline", SkType_Polyline INIT_BOOL_FIELDS },
{ "post", SkType_Post INIT_BOOL_FIELDS },
{ "quadTo", SkType_QuadTo INIT_BOOL_FIELDS },
{ "rCubicTo", SkType_RCubicTo INIT_BOOL_FIELDS },
{ "rLineTo", SkType_RLineTo INIT_BOOL_FIELDS },
{ "rMoveTo", SkType_RMoveTo INIT_BOOL_FIELDS },
{ "rQuadTo", SkType_RQuadTo INIT_BOOL_FIELDS },
{ "radialGradient", SkType_DrawRadialGradient INIT_BOOL_FIELDS },
DISPLAY_NAME("random", SkType_Random),
{ "rect", SkType_Rect INIT_BOOL_FIELDS },
{ "rectToRect", SkType_RectToRect INIT_BOOL_FIELDS },
{ "remove", SkType_Remove INIT_BOOL_FIELDS },
{ "replace", SkType_Replace INIT_BOOL_FIELDS },
{ "rotate", SkType_Rotate INIT_BOOL_FIELDS },
{ "roundRect", SkType_RoundRect INIT_BOOL_FIELDS },
{ "save", SkType_Save INIT_BOOL_FIELDS },
{ "saveLayer", SkType_SaveLayer INIT_BOOL_FIELDS },
{ "scale", SkType_Scale INIT_BOOL_FIELDS },
// screenplay
{ "set", SkType_Set INIT_BOOL_FIELDS },
{ "shader", SkType_Shader INIT_BOOL_FIELDS },
{ "skew", SkType_Skew INIT_BOOL_FIELDS },
{ "skia3d:camera", SkType_3D_Camera INIT_BOOL_FIELDS },
{ "skia3d:patch", SkType_3D_Patch INIT_BOOL_FIELDS },
// point
{ "snapshot", SkType_Snapshot INIT_BOOL_FIELDS },
{ "string", SkType_String INIT_BOOL_FIELDS },
// style
{ "text", SkType_Text INIT_BOOL_FIELDS },
{ "textBox", SkType_TextBox INIT_BOOL_FIELDS },
// textboxalign
// textboxmode
{ "textOnPath", SkType_TextOnPath INIT_BOOL_FIELDS },
{ "textToPath", SkType_TextToPath INIT_BOOL_FIELDS },
// tilemode
{ "translate", SkType_Translate INIT_BOOL_FIELDS },
DRAW_NAME("transparentShader", SkType_TransparentShader),
{ "typeface", SkType_Typeface INIT_BOOL_FIELDS }
// xfermode
// knumberoftypes
};
const int kTypeNamesSize = SK_ARRAY_COUNT(gTypeNames);
SkDisplayTypes SkDisplayType::Find(SkAnimateMaker* maker, const SkMemberInfo* match) {
for (int index = 0; index < kTypeNamesSize; index++) {
SkDisplayTypes type = gTypeNames[index].fType;
const SkMemberInfo* info = SkDisplayType::GetMembers(maker, type, NULL);
if (info == match)
return type;
}
return (SkDisplayTypes) -1;
}
// !!! optimize this by replacing function with a byte-sized lookup table
SkDisplayTypes SkDisplayType::GetParent(SkAnimateMaker* maker, SkDisplayTypes base) {
if (base == SkType_Group || base == SkType_Save || base == SkType_SaveLayer) //!!! cheat a little until we have a lookup table
return SkType_Displayable;
if (base == SkType_Set)
return SkType_Animate; // another cheat until we have a lookup table
const SkMemberInfo* info = GetMembers(maker, base, NULL); // get info for this type
SkASSERT(info);
if (info->fType != SkType_BaseClassInfo)
return SkType_Unknown; // if no base, done
// !!! could change SK_MEMBER_INHERITED macro to take type, stuff in offset, so that
// this (and table builder) could know type without the following steps:
const SkMemberInfo* inherited = info->getInherited();
SkDisplayTypes result = (SkDisplayTypes) (SkType_Unknown + 1);
for (; result <= SkType_Xfermode; result = (SkDisplayTypes) (result + 1)) {
const SkMemberInfo* match = GetMembers(maker, result, NULL);
if (match == inherited)
break;
}
SkASSERT(result <= SkType_Xfermode);
return result;
}
SkDisplayTypes SkDisplayType::GetType(SkAnimateMaker* maker, const char match[], size_t len ) {
int index = SkStrSearch(&gTypeNames[0].fName, kTypeNamesSize, match,
len, sizeof(gTypeNames[0]));
if (index >= 0 && index < kTypeNamesSize)
return gTypeNames[index].fType;
SkExtras** end = maker->fExtras.end();
for (SkExtras** extraPtr = maker->fExtras.begin(); extraPtr < end; extraPtr++) {
SkDisplayTypes result = (*extraPtr)->getType(match, len);
if (result != SkType_Unknown)
return result;
}
return (SkDisplayTypes) -1;
}
bool SkDisplayType::IsEnum(SkAnimateMaker* , SkDisplayTypes type) {
switch (type) {
case SkType_AddMode:
case SkType_Align:
case SkType_ApplyMode:
case SkType_ApplyTransition:
case SkType_BitmapEncoding:
case SkType_BitmapFormat:
case SkType_Boolean:
case SkType_Cap:
case SkType_EventCode:
case SkType_EventKind:
case SkType_EventMode:
case SkType_FillType:
case SkType_FilterType:
case SkType_FontStyle:
case SkType_FromPathMode:
case SkType_Join:
case SkType_MaskFilterBlurStyle:
case SkType_PathDirection:
case SkType_Style:
case SkType_TextBoxAlign:
case SkType_TextBoxMode:
case SkType_TileMode:
case SkType_Xfermode:
return true;
default: // to avoid warnings
break;
}
return false;
}
bool SkDisplayType::IsDisplayable(SkAnimateMaker* , SkDisplayTypes type) {
switch (type) {
case SkType_Add:
case SkType_AddCircle:
case SkType_AddOval:
case SkType_AddPath:
case SkType_AddRect:
case SkType_AddRoundRect:
case SkType_Animate:
case SkType_AnimateBase:
case SkType_Apply:
case SkType_BaseBitmap:
case SkType_Bitmap:
case SkType_BitmapShader:
case SkType_Blur:
case SkType_Clear:
case SkType_Clip:
case SkType_Close:
case SkType_Color:
case SkType_CubicTo:
case SkType_Dash:
case SkType_DataInput:
case SkType_Discrete:
case SkType_Displayable:
case SkType_Drawable:
case SkType_DrawTo:
case SkType_Emboss:
case SkType_Event:
case SkType_FromPath:
case SkType_Full:
case SkType_Group:
case SkType_ImageBaseBitmap:
case SkType_Input:
case SkType_Line:
case SkType_LineTo:
case SkType_DrawLinearGradient:
case SkType_Matrix:
case SkType_Move:
case SkType_MoveTo:
case SkType_Movie:
case SkType_Oval:
case SkType_Paint:
case SkType_Path:
case SkType_PolyToPoly:
case SkType_Polygon:
case SkType_Polyline:
case SkType_Post:
case SkType_QuadTo:
case SkType_RCubicTo:
case SkType_RLineTo:
case SkType_RMoveTo:
case SkType_RQuadTo:
case SkType_DrawRadialGradient:
case SkType_Random:
case SkType_Rect:
case SkType_RectToRect:
case SkType_Remove:
case SkType_Replace:
case SkType_Rotate:
case SkType_RoundRect:
case SkType_Save:
case SkType_SaveLayer:
case SkType_Scale:
case SkType_Set:
case SkType_Shader:
case SkType_Skew:
case SkType_3D_Camera:
case SkType_3D_Patch:
case SkType_Snapshot:
case SkType_Text:
case SkType_TextBox:
case SkType_TextOnPath:
case SkType_TextToPath:
case SkType_Translate:
case SkType_TransparentShader:
return true;
default: // to avoid warnings
break;
}
return false;
}
bool SkDisplayType::IsStruct(SkAnimateMaker* , SkDisplayTypes type) {
switch (type) {
case SkType_Point:
case SkType_3D_Point:
return true;
default: // to avoid warnings
break;
}
return false;
}
SkDisplayTypes SkDisplayType::RegisterNewType() {
gNewTypes = (SkDisplayTypes) (gNewTypes + 1);
return gNewTypes;
}
#ifdef SK_DEBUG
const char* SkDisplayType::GetName(SkAnimateMaker* maker, SkDisplayTypes type) {
for (int index = 0; index < kTypeNamesSize - 1; index++) {
if (gTypeNames[index].fType == type)
return gTypeNames[index].fName;
}
SkExtras** end = maker->fExtras.end();
for (SkExtras** extraPtr = maker->fExtras.begin(); extraPtr < end; extraPtr++) {
const char* result = (*extraPtr)->getName(type);
if (result != NULL)
return result;
}
return NULL;
}
#endif
#ifdef SK_SUPPORT_UNITTEST
void SkDisplayType::UnitTest() {
SkAnimator animator;
SkAnimateMaker* maker = animator.fMaker;
int index;
for (index = 0; index < kTypeNamesSize - 1; index++) {
SkASSERT(strcmp(gTypeNames[index].fName, gTypeNames[index + 1].fName) < 0);
SkASSERT(gTypeNames[index].fType < gTypeNames[index + 1].fType);
}
for (index = 0; index < kTypeNamesSize; index++) {
SkDisplayable* test = CreateInstance(maker, gTypeNames[index].fType);
if (test == NULL)
continue;
#if defined _WIN32 && _MSC_VER >= 1300 && defined _INC_CRTDBG // only on windows, only if using "crtdbg.h"
// we know that crtdbg puts 0xfdfdfdfd at the end of the block
// look for unitialized memory, signature 0xcdcdcdcd prior to that
int* start = (int*) test;
while (*start != 0xfdfdfdfd) {
SkASSERT(*start != 0xcdcdcdcd);
start++;
}
#endif
delete test;
}
for (index = 0; index < kTypeNamesSize; index++) {
int infoCount;
const SkMemberInfo* info = GetMembers(maker, gTypeNames[index].fType, &infoCount);
if (info == NULL)
continue;
#if SK_USE_CONDENSED_INFO == 0
for (int inner = 0; inner < infoCount - 1; inner++) {
if (info[inner].fType == SkType_BaseClassInfo)
continue;
SkASSERT(strcmp(info[inner].fName, info[inner + 1].fName) < 0);
}
#endif
}
#if defined SK_DEBUG || defined SK_BUILD_CONDENSED
BuildCondensedInfo(maker);
#endif
}
#endif