SkSVGElement* SkSVGParser::CreateElement(SkSVGTypes type, SkSVGElement* parent) { SkSVGElement* created = NULL; switch (type) { CASE_NEW(Circle); CASE_NEW(ClipPath); CASE_NEW(Defs); CASE_NEW(Ellipse); CASE_NEW(FeColorMatrix); CASE_NEW(Filter); CASE_NEW(G); CASE_NEW(Image); CASE_NEW(Line); CASE_NEW(LinearGradient); CASE_NEW(Mask); CASE_NEW(Metadata); CASE_NEW(Path); CASE_NEW(Polygon); CASE_NEW(Polyline); CASE_NEW(RadialGradient); CASE_NEW(Rect); CASE_NEW(Stop); CASE_NEW(SVG); CASE_NEW(Symbol); CASE_NEW(Text); CASE_NEW(Tspan); CASE_NEW(Use); default: SkASSERT(0); return NULL; } created->fParent = parent; bool isDef = created->fIsDef = created->isDef(); bool isNotDef = created->fIsNotDef = created->isNotDef(); if (isDef) { SkSVGElement* up = parent; while (up && up->fIsDef == false) { up->fIsDef = true; up = up->fParent; } } if (isNotDef) { SkSVGElement* up = parent; while (up && up->fIsNotDef == false) { up->fIsNotDef = true; up = up->fParent; } } return created; }
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; }