1685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com
2685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com/*
3685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com * Copyright 2006 The Android Open Source Project
4685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com *
5685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com * found in the LICENSE file.
7685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com */
8685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com
9bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
10bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include <jsapi.h>
11bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkJS.h"
12bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkDisplayType.h"
13bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com//#include "SkAnimateColor.h"
14bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkAnimateMaker.h"
15bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkAnimateSet.h"
16bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com//#include "SkAnimateTransform.h"
17bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkCanvas.h"
18bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com//#include "SkDimensions.h"
19bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkDisplayAdd.h"
20bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkDisplayApply.h"
21bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com//#include "SkDisplayBefore.h"
22bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkDisplayEvent.h"
23bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com//#include "SkDisplayFocus.h"
24bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkDisplayInclude.h"
25bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkDisplayPost.h"
26bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkDisplayRandom.h"
27bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkDraw3D.h"
28bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkDrawBitmap.h"
29bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkDrawClip.h"
30bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkDrawDash.h"
31bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkDrawDiscrete.h"
32bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkDrawEmboss.h"
33bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com//#include "SkDrawFont.h"
34bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkDrawFull.h"
35bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkDrawGradient.h"
36bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkDrawLine.h"
37bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com//#include "SkDrawMaskFilter.h"
38bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkDrawMatrix.h"
39bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkDrawOval.h"
40bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkDrawPaint.h"
41bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkDrawPath.h"
42bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkDrawPoint.h"
43bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com// #include "SkDrawStroke.h"
44bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkDrawText.h"
45bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkDrawTo.h"
46bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com//#include "SkDrawTransferMode.h"
47bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkDrawTransparentShader.h"
48bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com//#include "SkDrawUse.h"
49bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkMatrixParts.h"
50bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkPathParts.h"
51bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkPostParts.h"
52bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkScript.h"
53bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkSnapshot.h"
54bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkTextOnPath.h"
55bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkTextToPath.h"
56bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
57bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
58bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comclass SkJSDisplayable {
59bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.compublic:
60bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkJSDisplayable() : fDisplayable(NULL) {}
61bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    ~SkJSDisplayable() { delete fDisplayable; }
62bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    static void Destructor(JSContext *cx, JSObject *obj);
63bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    static JSBool GetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp);
64bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    static JSBool SetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp);
65bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    static SkCanvas* gCanvas;
66bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    static SkPaint* gPaint;
67bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    static JSBool Draw(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
68bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkDisplayable* fDisplayable;
69bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com};
70bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
71bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comSkCanvas* SkJSDisplayable::gCanvas;
72bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comSkPaint* SkJSDisplayable::gPaint;
73bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
74bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJSBool SkJSDisplayable::Draw(JSContext *cx, JSObject *obj, uintN argc,
75bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                                    jsval *argv, jsval *rval)
76bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{
77bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkJSDisplayable *p = (SkJSDisplayable*) JS_GetPrivate(cx, obj);
78bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkASSERT(p->fDisplayable->isDrawable());
79bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkDrawable* drawable = (SkDrawable*) p->fDisplayable;
80bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkAnimateMaker maker(NULL, gCanvas, gPaint);
81bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    drawable->draw(maker);
82bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    return JS_TRUE;
83bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com}
84bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
85bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
86dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.comJSFunctionSpec SkJSDisplayable_methods[] =
87bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{
88bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    { "draw", SkJSDisplayable::Draw, 1, 0, 0 },
89bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    { 0 }
90bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com};
91bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
92bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comstatic JSPropertySpec* gDisplayableProperties[kNumberOfTypes];
93bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comstatic JSClass gDisplayableClasses[kNumberOfTypes];
94bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
95bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#define JS_INIT(_prefix, _class) \
96bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comstatic JSBool _class##Constructor(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { \
97bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkJSDisplayable* jsDisplayable = new SkJSDisplayable(); \
98bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    jsDisplayable->fDisplayable = new _prefix##_class(); \
99bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    JS_SetPrivate(cx, obj, (void*) jsDisplayable); \
100bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    return JS_TRUE; \
101bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} \
102bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    \
103bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comstatic JSObject* _class##Init(JSContext *cx, JSObject *obj, JSObject *proto) { \
104bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    JSObject *newProtoObj = JS_InitClass(cx, obj, proto, &gDisplayableClasses[SkType_##_class], \
105bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        _class##Constructor, 0, \
106bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        NULL, SkJSDisplayable_methods , \
107bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        NULL, NULL); \
108bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    JS_DefineProperties(cx, newProtoObj, gDisplayableProperties[SkType_##_class]); \
109bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    return newProtoObj; \
110bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com}
111bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
112bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, Add)
113bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, AddCircle)
114bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, AddOval)
115bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, AddPath)
116bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, AddRectangle)
117bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, AddRoundRect)
118bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com//JS_INIT(Sk, After)
119bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, Apply)
120bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com// JS_INIT(Sk, Animate)
121bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com//JS_INIT(Sk, AnimateColor)
122bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, AnimateField)
123bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com//JS_INIT(Sk, AnimateRotate)
124bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com//JS_INIT(Sk, AnimateScale)
125bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com//JS_INIT(Sk, AnimateTranslate)
126bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(SkDraw, Bitmap)
127bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, BaseBitmap)
128bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com//JS_INIT(Sk, Before)
129bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(SkDraw, BitmapShader)
130bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(SkDraw, Blur)
131bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(SkDraw, Clip)
132bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(SkDraw, Color)
133bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, CubicTo)
134bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, Dash)
135bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, Data)
136bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com//JS_INIT(Sk, Dimensions)
137bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, Discrete)
138bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, DrawTo)
139bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(SkDraw, Emboss)
140bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(SkDisplay, Event)
141bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com// JS_INIT(SkDraw, Font)
142bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com// JS_INIT(Sk, Focus)
143bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, Image)
144bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, Include)
145bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com// JS_INIT(Sk, Input)
146bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, Line)
147bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, LinearGradient)
148bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, LineTo)
149bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(SkDraw, Matrix)
150bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, Move)
151bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, MoveTo)
152bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, Oval)
153bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(SkDraw, Path)
154bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(SkDraw, Paint)
155bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, DrawPoint)
156bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, PolyToPoly)
157bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, Polygon)
158bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, Polyline)
159bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, Post)
160bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, QuadTo)
161bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, RadialGradient)
162bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(SkDisplay, Random)
163bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, RectToRect)
164bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, Rectangle)
165bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, Remove)
166bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, Replace)
167bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, Rotate)
168bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, RoundRect)
169bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, Scale)
170bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, Set)
171bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, Skew)
172bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com// JS_INIT(Sk, 3D_Camera)
173bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com// JS_INIT(Sk, 3D_Patch)
174bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, Snapshot)
175bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com// JS_INIT(SkDraw, Stroke)
176bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, Text)
177bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, TextOnPath)
178bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, TextToPath)
179bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJS_INIT(Sk, Translate)
180bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com//JS_INIT(Sk, Use)
181bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
182bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#if SK_USE_CONDENSED_INFO == 0
183bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comstatic void GenerateTables() {
184bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    for (int index = 0; index < kTypeNamesSize; index++) {
185bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        int infoCount;
186bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        SkDisplayTypes type = gTypeNames[index].fType;
187bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        const SkMemberInfo* info = SkDisplayType::GetMembers(NULL /* fMaker */, type, &infoCount);
188bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        if (info == NULL)
189bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            continue;
190bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        gDisplayableProperties[type] = new JSPropertySpec[infoCount + 1];
191bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        JSPropertySpec* propertySpec = gDisplayableProperties[type];
192bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        memset(propertySpec, 0, sizeof (JSPropertySpec) * (infoCount + 1));
193bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        for (int inner = 0; inner < infoCount; inner++) {
194bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            if (info[inner].fType == SkType_BaseClassInfo)
195bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                continue;
196bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            propertySpec[inner].name = info[inner].fName;
197bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            propertySpec[inner].tinyid = inner;
198bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            propertySpec[inner].flags = JSPROP_ENUMERATE;
199bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        }
200bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        gDisplayableClasses[type].name = gTypeNames[index].fName;
201bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        gDisplayableClasses[type].flags = JSCLASS_HAS_PRIVATE;
202bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        gDisplayableClasses[type].addProperty = JS_PropertyStub;
203bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        gDisplayableClasses[type].delProperty = JS_PropertyStub;
204bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        gDisplayableClasses[type].getProperty = SkJSDisplayable::GetProperty;
205bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        gDisplayableClasses[type].setProperty = SkJSDisplayable::SetProperty;
206bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        gDisplayableClasses[type].enumerate = JS_EnumerateStub;
207bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        gDisplayableClasses[type].resolve = JS_ResolveStub;
208bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        gDisplayableClasses[type].convert = JS_ConvertStub;
209bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        gDisplayableClasses[type].finalize = SkJSDisplayable::Destructor;
210bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    }
211bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com}
212bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#endif
213bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
214bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comvoid SkJSDisplayable::Destructor(JSContext *cx, JSObject *obj) {
215bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    delete (SkJSDisplayable*) JS_GetPrivate(cx, obj);
216bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com}
217bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
218bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJSBool SkJSDisplayable::GetProperty(JSContext *cx, JSObject *obj, jsval id,
219bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                                 jsval *vp)
220bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{
221bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    if (JSVAL_IS_INT(id) == 0)
222dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com        return JS_TRUE;
223bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkJSDisplayable *p = (SkJSDisplayable *) JS_GetPrivate(cx, obj);
224bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkDisplayable* displayable = p->fDisplayable;
225bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkDisplayTypes displayableType = displayable->getType();
226bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    int members;
227bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    const SkMemberInfo* info = SkDisplayType::GetMembers(NULL /* fMaker */, displayableType, &members);
228bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    int idIndex = JSVAL_TO_INT(id);
229bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkASSERT(idIndex >= 0 && idIndex < members);
230bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    info = &info[idIndex];
231bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkDisplayTypes infoType = (SkDisplayTypes) info->fType;
232bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkScalar scalar = 0;
233bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    S32 s32 = 0;
234bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkString* string= NULL;
235bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    JSString *str;
236bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    if (infoType == SkType_MemberProperty) {
237bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        infoType = info->propertyType();
238bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        switch (infoType) {
239bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            case SkType_Scalar: {
240bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                SkScriptValue scriptValue;
241bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                bool success = displayable->getProperty(info->propertyIndex(), &scriptValue);
242bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                SkASSERT(scriptValue.fType == SkType_Scalar);
243bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                scalar = scriptValue.fOperand.fScalar;
244bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                } break;
245bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            default:
246bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                SkASSERT(0); // !!! unimplemented
247bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        }
248bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    } else {
249bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        SkASSERT(info->fCount == 1);
250bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        switch (infoType) {
251bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            case SkType_Boolean:
252bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            case SkType_Color:
253bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            case SkType_S32:
254bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                s32 = *(S32*) info->memberData(displayable);
255bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                break;
256bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            case SkType_String:
257bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                info->getString(displayable, &string);
258bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                break;
259bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            case SkType_Scalar:
260bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                SkOperand operand;
261bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                info->getValue(displayable, &operand, 1);
262bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                scalar = operand.fScalar;
263bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                break;
264bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            default:
265bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                SkASSERT(0); // !!! unimplemented
266bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        }
267bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    }
268bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    switch (infoType) {
269bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        case SkType_Boolean:
270bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            *vp = BOOLEAN_TO_JSVAL(s32);
271bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            break;
272bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        case SkType_Color:
273bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        case SkType_S32:
274bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            *vp = INT_TO_JSVAL(s32);
275bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            break;
276bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        case SkType_Scalar:
277bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            if (SkScalarFraction(scalar) == 0)
278bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                *vp = INT_TO_JSVAL(SkScalarFloor(scalar));
279bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            else
280bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#ifdef SK_SCALAR_IS_FLOAT
281bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            *vp = DOUBLE_TO_JSVAL(scalar);
282bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#else
283bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            *vp = DOUBLE_TO_JSVAL(scalar / 65536.0f );
284bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#endif
285bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            break;
286bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        case SkType_String:
287bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            str = JS_NewStringCopyN(cx, string->c_str(), string->size());
288bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            *vp = STRING_TO_JSVAL(str);
289bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            break;
290bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        default:
291bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            SkASSERT(0); // !!! unimplemented
292bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    }
293bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    return JS_TRUE;
294bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com}
295bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
296bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comJSBool SkJSDisplayable::SetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
297bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    if (JSVAL_IS_INT(id) == 0)
298dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com        return JS_TRUE;
299bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkJSDisplayable *p = (SkJSDisplayable *) JS_GetPrivate(cx, obj);
300bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkDisplayable* displayable = p->fDisplayable;
301bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkDisplayTypes displayableType = displayable->getType();
302bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    int members;
303bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    const SkMemberInfo* info = SkDisplayType::GetMembers(NULL /* fMaker */, displayableType, &members);
304bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    int idIndex = JSVAL_TO_INT(id);
305bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkASSERT(idIndex >= 0 && idIndex < members);
306bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    info = &info[idIndex];
307bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkDisplayTypes infoType = info->getType();
308bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkScalar scalar = 0;
309bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    S32 s32 = 0;
310bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkString string;
311bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    JSString* str;
312bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    jsval value = *vp;
313bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    switch (infoType) {
314bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        case SkType_Boolean:
315bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            s32 = JSVAL_TO_BOOLEAN(value);
316bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            break;
317bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        case SkType_Color:
318bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        case SkType_S32:
319bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            s32 = JSVAL_TO_INT(value);
320bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            break;
321bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        case SkType_Scalar:
322bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            if (JSVAL_IS_INT(value))
323bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                scalar = SkIntToScalar(JSVAL_TO_INT(value));
324bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            else {
325bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                SkASSERT(JSVAL_IS_DOUBLE(value));
326bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#ifdef SK_SCALAR_IS_FLOAT
327bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                scalar = (float) *(double*) JSVAL_TO_DOUBLE(value);
328bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#else
329bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                scalar = (SkFixed)  (*(double*)JSVAL_TO_DOUBLE(value) * 65536.0);
330bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#endif
331bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            }
332bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            break;
333bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        case SkType_String:
334bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            str = JS_ValueToString(cx, value);
335bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            string.set(JS_GetStringBytes(str));
336bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            break;
337bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        default:
338bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            SkASSERT(0); // !!! unimplemented
339bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    }
340bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    if (info->fType == SkType_MemberProperty) {
341bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        switch (infoType) {
342bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            case SkType_Scalar: {
343bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                SkScriptValue scriptValue;
344bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                scriptValue.fType = SkType_Scalar;
345bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                scriptValue.fOperand.fScalar = scalar;
346bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                displayable->setProperty(-1 - (int) info->fOffset, scriptValue);
347bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                } break;
348bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            default:
349bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                SkASSERT(0); // !!! unimplemented
350bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        }
351bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    } else {
352bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        SkASSERT(info->fCount == 1);
353bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        switch (infoType) {
354bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            case SkType_Boolean:
355bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            case SkType_Color:
356bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            case SkType_S32:
357bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                s32 = *(S32*) ((const char*) displayable + info->fOffset);
358bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                break;
359bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            case SkType_String:
360bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                info->setString(displayable, &string);
361bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                break;
362bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            case SkType_Scalar:
363bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                SkOperand operand;
364bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                operand.fScalar = scalar;
365bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                info->setValue(displayable, &operand, 1);
366bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                break;
367bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com            default:
368bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                SkASSERT(0); // !!! unimplemented
369bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        }
370bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    }
371bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    return JS_TRUE;
372bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com}
373bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
374bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comvoid SkJS::InitializeDisplayables(const SkBitmap& bitmap, JSContext *cx, JSObject *obj, JSObject *proto) {
375bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkJSDisplayable::gCanvas = new SkCanvas(bitmap);
376bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkJSDisplayable::gPaint = new SkPaint();
377bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#if SK_USE_CONDENSED_INFO == 0
378bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    GenerateTables();
379bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#else
380bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkASSERT(0); // !!! compressed version hasn't been implemented
381bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#endif
382bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    AddInit(cx, obj, proto);
383bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    AddCircleInit(cx, obj, proto);
384bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    AddOvalInit(cx, obj, proto);
385bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    AddPathInit(cx, obj, proto);
386bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    AddRectangleInit(cx, obj, proto);
387bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    AddRoundRectInit(cx, obj, proto);
388bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com//  AfterInit(cx, obj, proto);
389bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    ApplyInit(cx, obj, proto);
390bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    // AnimateInit(cx, obj, proto);
391bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com//  AnimateColorInit(cx, obj, proto);
392bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    AnimateFieldInit(cx, obj, proto);
393bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com//  AnimateRotateInit(cx, obj, proto);
394bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com//  AnimateScaleInit(cx, obj, proto);
395bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com//  AnimateTranslateInit(cx, obj, proto);
396bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    BitmapInit(cx, obj, proto);
397bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com//  BaseBitmapInit(cx, obj, proto);
398bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com//  BeforeInit(cx, obj, proto);
399bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    BitmapShaderInit(cx, obj, proto);
400bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    BlurInit(cx, obj, proto);
401bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    ClipInit(cx, obj, proto);
402bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    ColorInit(cx, obj, proto);
403bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    CubicToInit(cx, obj, proto);
404bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    DashInit(cx, obj, proto);
405bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    DataInit(cx, obj, proto);
406bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com//  DimensionsInit(cx, obj, proto);
407bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    DiscreteInit(cx, obj, proto);
408bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    DrawToInit(cx, obj, proto);
409bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    EmbossInit(cx, obj, proto);
410bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    EventInit(cx, obj, proto);
411bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com//  FontInit(cx, obj, proto);
412bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com//  FocusInit(cx, obj, proto);
413bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    ImageInit(cx, obj, proto);
414bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    IncludeInit(cx, obj, proto);
415bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com//  InputInit(cx, obj, proto);
416bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    LineInit(cx, obj, proto);
417bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    LinearGradientInit(cx, obj, proto);
418bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    LineToInit(cx, obj, proto);
419bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    MatrixInit(cx, obj, proto);
420bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    MoveInit(cx, obj, proto);
421bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    MoveToInit(cx, obj, proto);
422bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    OvalInit(cx, obj, proto);
423bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    PathInit(cx, obj, proto);
424bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    PaintInit(cx, obj, proto);
425bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    DrawPointInit(cx, obj, proto);
426bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    PolyToPolyInit(cx, obj, proto);
427bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    PolygonInit(cx, obj, proto);
428bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    PolylineInit(cx, obj, proto);
429bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    PostInit(cx, obj, proto);
430bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    QuadToInit(cx, obj, proto);
431bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    RadialGradientInit(cx, obj, proto);
432bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    RandomInit(cx, obj, proto);
433bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    RectToRectInit(cx, obj, proto);
434bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    RectangleInit(cx, obj, proto);
435bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    RemoveInit(cx, obj, proto);
436bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    ReplaceInit(cx, obj, proto);
437bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    RotateInit(cx, obj, proto);
438bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    RoundRectInit(cx, obj, proto);
439bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    ScaleInit(cx, obj, proto);
440bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SetInit(cx, obj, proto);
441bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkewInit(cx, obj, proto);
442bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    // 3D_CameraInit(cx, obj, proto);
443bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    // 3D_PatchInit(cx, obj, proto);
444bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SnapshotInit(cx, obj, proto);
445bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com//  StrokeInit(cx, obj, proto);
446bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    TextInit(cx, obj, proto);
447bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    TextOnPathInit(cx, obj, proto);
448bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    TextToPathInit(cx, obj, proto);
449bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    TranslateInit(cx, obj, proto);
450bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com//  UseInit(cx, obj, proto);
451bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com}
452bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
453bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comvoid SkJS::DisposeDisplayables() {
454bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    delete SkJSDisplayable::gPaint;
455bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    delete SkJSDisplayable::gCanvas;
456bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    for (int index = 0; index < kTypeNamesSize; index++) {
457bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        SkDisplayTypes type = gTypeNames[index].fType;
458bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        delete[] gDisplayableProperties[type];
459bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    }
460bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com}
461