1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2006 The Android Open Source Project
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
8ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include <jsapi.h>
118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkJS.h"
128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDisplayType.h"
138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//#include "SkAnimateColor.h"
148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkAnimateMaker.h"
158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkAnimateSet.h"
168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//#include "SkAnimateTransform.h"
178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkCanvas.h"
188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//#include "SkDimensions.h"
198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDisplayAdd.h"
208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDisplayApply.h"
218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//#include "SkDisplayBefore.h"
228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDisplayEvent.h"
238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//#include "SkDisplayFocus.h"
248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDisplayInclude.h"
258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDisplayPost.h"
268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDisplayRandom.h"
278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDraw3D.h"
288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDrawBitmap.h"
298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDrawClip.h"
308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDrawDash.h"
318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDrawDiscrete.h"
328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDrawEmboss.h"
338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//#include "SkDrawFont.h"
348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDrawFull.h"
358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDrawGradient.h"
368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDrawLine.h"
378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//#include "SkDrawMaskFilter.h"
388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDrawMatrix.h"
398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDrawOval.h"
408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDrawPaint.h"
418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDrawPath.h"
428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDrawPoint.h"
438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com// #include "SkDrawStroke.h"
448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDrawText.h"
458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDrawTo.h"
468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//#include "SkDrawTransferMode.h"
478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDrawTransparentShader.h"
488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//#include "SkDrawUse.h"
498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkMatrixParts.h"
508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPathParts.h"
518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPostParts.h"
528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkScript.h"
538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkSnapshot.h"
548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkTextOnPath.h"
558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkTextToPath.h"
568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkJSDisplayable {
598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkJSDisplayable() : fDisplayable(NULL) {}
618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    ~SkJSDisplayable() { delete fDisplayable; }
628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static void Destructor(JSContext *cx, JSObject *obj);
638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static JSBool GetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp);
648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static JSBool SetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp);
658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static SkCanvas* gCanvas;
668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static SkPaint* gPaint;
678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static JSBool Draw(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);
688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkDisplayable* fDisplayable;
698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkCanvas* SkJSDisplayable::gCanvas;
728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkPaint* SkJSDisplayable::gPaint;
738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJSBool SkJSDisplayable::Draw(JSContext *cx, JSObject *obj, uintN argc,
758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                                    jsval *argv, jsval *rval)
768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkJSDisplayable *p = (SkJSDisplayable*) JS_GetPrivate(cx, obj);
788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(p->fDisplayable->isDrawable());
798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkDrawable* drawable = (SkDrawable*) p->fDisplayable;
808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkAnimateMaker maker(NULL, gCanvas, gPaint);
818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    drawable->draw(maker);
828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return JS_TRUE;
838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
86d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comJSFunctionSpec SkJSDisplayable_methods[] =
878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    { "draw", SkJSDisplayable::Draw, 1, 0, 0 },
898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    { 0 }
908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic JSPropertySpec* gDisplayableProperties[kNumberOfTypes];
938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic JSClass gDisplayableClasses[kNumberOfTypes];
948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define JS_INIT(_prefix, _class) \
968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic JSBool _class##Constructor(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { \
978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkJSDisplayable* jsDisplayable = new SkJSDisplayable(); \
988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    jsDisplayable->fDisplayable = new _prefix##_class(); \
998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    JS_SetPrivate(cx, obj, (void*) jsDisplayable); \
1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return JS_TRUE; \
1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} \
1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    \
1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic JSObject* _class##Init(JSContext *cx, JSObject *obj, JSObject *proto) { \
1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    JSObject *newProtoObj = JS_InitClass(cx, obj, proto, &gDisplayableClasses[SkType_##_class], \
1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        _class##Constructor, 0, \
1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        NULL, SkJSDisplayable_methods , \
1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        NULL, NULL); \
1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    JS_DefineProperties(cx, newProtoObj, gDisplayableProperties[SkType_##_class]); \
1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return newProtoObj; \
1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, Add)
1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, AddCircle)
1148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, AddOval)
1158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, AddPath)
1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, AddRectangle)
1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, AddRoundRect)
1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//JS_INIT(Sk, After)
1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, Apply)
1208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com// JS_INIT(Sk, Animate)
1218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//JS_INIT(Sk, AnimateColor)
1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, AnimateField)
1238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//JS_INIT(Sk, AnimateRotate)
1248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//JS_INIT(Sk, AnimateScale)
1258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//JS_INIT(Sk, AnimateTranslate)
1268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(SkDraw, Bitmap)
1278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, BaseBitmap)
1288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//JS_INIT(Sk, Before)
1298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(SkDraw, BitmapShader)
1308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(SkDraw, Blur)
1318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(SkDraw, Clip)
1328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(SkDraw, Color)
1338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, CubicTo)
1348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, Dash)
1358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, Data)
1368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//JS_INIT(Sk, Dimensions)
1378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, Discrete)
1388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, DrawTo)
1398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(SkDraw, Emboss)
1408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(SkDisplay, Event)
1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com// JS_INIT(SkDraw, Font)
1428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com// JS_INIT(Sk, Focus)
1438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, Image)
1448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, Include)
1458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com// JS_INIT(Sk, Input)
1468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, Line)
1478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, LinearGradient)
1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, LineTo)
1498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(SkDraw, Matrix)
1508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, Move)
1518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, MoveTo)
1528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, Oval)
1538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(SkDraw, Path)
1548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(SkDraw, Paint)
1558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, DrawPoint)
1568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, PolyToPoly)
1578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, Polygon)
1588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, Polyline)
1598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, Post)
1608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, QuadTo)
1618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, RadialGradient)
1628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(SkDisplay, Random)
1638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, RectToRect)
1648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, Rectangle)
1658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, Remove)
1668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, Replace)
1678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, Rotate)
1688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, RoundRect)
1698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, Scale)
1708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, Set)
1718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, Skew)
1728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com// JS_INIT(Sk, 3D_Camera)
1738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com// JS_INIT(Sk, 3D_Patch)
1748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, Snapshot)
1758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com// JS_INIT(SkDraw, Stroke)
1768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, Text)
1778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, TextOnPath)
1788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, TextToPath)
1798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJS_INIT(Sk, Translate)
1808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//JS_INIT(Sk, Use)
1818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if SK_USE_CONDENSED_INFO == 0
1838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic void GenerateTables() {
1848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    for (int index = 0; index < kTypeNamesSize; index++) {
1858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        int infoCount;
1868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDisplayTypes type = gTypeNames[index].fType;
1878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        const SkMemberInfo* info = SkDisplayType::GetMembers(NULL /* fMaker */, type, &infoCount);
1888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (info == NULL)
1898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            continue;
1908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        gDisplayableProperties[type] = new JSPropertySpec[infoCount + 1];
1918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        JSPropertySpec* propertySpec = gDisplayableProperties[type];
1928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        memset(propertySpec, 0, sizeof (JSPropertySpec) * (infoCount + 1));
1938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        for (int inner = 0; inner < infoCount; inner++) {
1948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            if (info[inner].fType == SkType_BaseClassInfo)
1958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                continue;
1968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            propertySpec[inner].name = info[inner].fName;
1978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            propertySpec[inner].tinyid = inner;
1988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            propertySpec[inner].flags = JSPROP_ENUMERATE;
1998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
2008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        gDisplayableClasses[type].name = gTypeNames[index].fName;
2018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        gDisplayableClasses[type].flags = JSCLASS_HAS_PRIVATE;
2028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        gDisplayableClasses[type].addProperty = JS_PropertyStub;
2038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        gDisplayableClasses[type].delProperty = JS_PropertyStub;
2048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        gDisplayableClasses[type].getProperty = SkJSDisplayable::GetProperty;
2058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        gDisplayableClasses[type].setProperty = SkJSDisplayable::SetProperty;
2068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        gDisplayableClasses[type].enumerate = JS_EnumerateStub;
2078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        gDisplayableClasses[type].resolve = JS_ResolveStub;
2088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        gDisplayableClasses[type].convert = JS_ConvertStub;
2098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        gDisplayableClasses[type].finalize = SkJSDisplayable::Destructor;
2108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
2118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
2138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkJSDisplayable::Destructor(JSContext *cx, JSObject *obj) {
2158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    delete (SkJSDisplayable*) JS_GetPrivate(cx, obj);
2168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJSBool SkJSDisplayable::GetProperty(JSContext *cx, JSObject *obj, jsval id,
2198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                                 jsval *vp)
2208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
2218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (JSVAL_IS_INT(id) == 0)
222d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com        return JS_TRUE;
2238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkJSDisplayable *p = (SkJSDisplayable *) JS_GetPrivate(cx, obj);
2248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkDisplayable* displayable = p->fDisplayable;
2258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkDisplayTypes displayableType = displayable->getType();
2268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    int members;
2278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    const SkMemberInfo* info = SkDisplayType::GetMembers(NULL /* fMaker */, displayableType, &members);
2288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    int idIndex = JSVAL_TO_INT(id);
2298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(idIndex >= 0 && idIndex < members);
2308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    info = &info[idIndex];
2318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkDisplayTypes infoType = (SkDisplayTypes) info->fType;
2328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkScalar scalar = 0;
2338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    S32 s32 = 0;
2348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkString* string= NULL;
2358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    JSString *str;
2368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (infoType == SkType_MemberProperty) {
2378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        infoType = info->propertyType();
2388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        switch (infoType) {
2398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            case SkType_Scalar: {
2408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                SkScriptValue scriptValue;
2418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                bool success = displayable->getProperty(info->propertyIndex(), &scriptValue);
2428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                SkASSERT(scriptValue.fType == SkType_Scalar);
2438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                scalar = scriptValue.fOperand.fScalar;
2448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                } break;
2458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            default:
2468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                SkASSERT(0); // !!! unimplemented
2478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
2488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    } else {
2498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkASSERT(info->fCount == 1);
2508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        switch (infoType) {
2518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            case SkType_Boolean:
2528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            case SkType_Color:
2538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            case SkType_S32:
2548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                s32 = *(S32*) info->memberData(displayable);
2558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                break;
2568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            case SkType_String:
2578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                info->getString(displayable, &string);
2588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                break;
2598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            case SkType_Scalar:
2608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                SkOperand operand;
2618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                info->getValue(displayable, &operand, 1);
2628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                scalar = operand.fScalar;
2638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                break;
2648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            default:
2658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                SkASSERT(0); // !!! unimplemented
2668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
2678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
2688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    switch (infoType) {
2698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case SkType_Boolean:
2708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            *vp = BOOLEAN_TO_JSVAL(s32);
2718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            break;
2728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case SkType_Color:
2738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case SkType_S32:
2748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            *vp = INT_TO_JSVAL(s32);
2758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            break;
2768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case SkType_Scalar:
2778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            if (SkScalarFraction(scalar) == 0)
2788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                *vp = INT_TO_JSVAL(SkScalarFloor(scalar));
2798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            else
2808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            *vp = DOUBLE_TO_JSVAL(scalar);
2818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            break;
2828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case SkType_String:
2838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            str = JS_NewStringCopyN(cx, string->c_str(), string->size());
2848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            *vp = STRING_TO_JSVAL(str);
2858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            break;
2868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        default:
2878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkASSERT(0); // !!! unimplemented
2888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
2898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return JS_TRUE;
2908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comJSBool SkJSDisplayable::SetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
2938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (JSVAL_IS_INT(id) == 0)
294d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com        return JS_TRUE;
2958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkJSDisplayable *p = (SkJSDisplayable *) JS_GetPrivate(cx, obj);
2968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkDisplayable* displayable = p->fDisplayable;
2978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkDisplayTypes displayableType = displayable->getType();
2988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    int members;
2998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    const SkMemberInfo* info = SkDisplayType::GetMembers(NULL /* fMaker */, displayableType, &members);
3008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    int idIndex = JSVAL_TO_INT(id);
3018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(idIndex >= 0 && idIndex < members);
3028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    info = &info[idIndex];
3038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkDisplayTypes infoType = info->getType();
3048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkScalar scalar = 0;
3058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    S32 s32 = 0;
3068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkString string;
3078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    JSString* str;
3088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    jsval value = *vp;
3098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    switch (infoType) {
3108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case SkType_Boolean:
3118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            s32 = JSVAL_TO_BOOLEAN(value);
3128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            break;
3138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case SkType_Color:
3148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case SkType_S32:
3158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            s32 = JSVAL_TO_INT(value);
3168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            break;
3178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case SkType_Scalar:
3188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            if (JSVAL_IS_INT(value))
3198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                scalar = SkIntToScalar(JSVAL_TO_INT(value));
3208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            else {
3218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                SkASSERT(JSVAL_IS_DOUBLE(value));
3228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                scalar = (float) *(double*) JSVAL_TO_DOUBLE(value);
3238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            }
3248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            break;
3258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        case SkType_String:
3268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            str = JS_ValueToString(cx, value);
3278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            string.set(JS_GetStringBytes(str));
3288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            break;
3298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        default:
3308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkASSERT(0); // !!! unimplemented
3318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
3328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (info->fType == SkType_MemberProperty) {
3338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        switch (infoType) {
3348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            case SkType_Scalar: {
3358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                SkScriptValue scriptValue;
3368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                scriptValue.fType = SkType_Scalar;
3378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                scriptValue.fOperand.fScalar = scalar;
3388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                displayable->setProperty(-1 - (int) info->fOffset, scriptValue);
3398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                } break;
3408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            default:
3418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                SkASSERT(0); // !!! unimplemented
3428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
3438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    } else {
3448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkASSERT(info->fCount == 1);
3458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        switch (infoType) {
3468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            case SkType_Boolean:
3478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            case SkType_Color:
3488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            case SkType_S32:
3498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                s32 = *(S32*) ((const char*) displayable + info->fOffset);
3508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                break;
3518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            case SkType_String:
3528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                info->setString(displayable, &string);
3538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                break;
3548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            case SkType_Scalar:
3558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                SkOperand operand;
3568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                operand.fScalar = scalar;
3578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                info->setValue(displayable, &operand, 1);
3588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                break;
3598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            default:
3608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                SkASSERT(0); // !!! unimplemented
3618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
3628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
3638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return JS_TRUE;
3648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
3658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkJS::InitializeDisplayables(const SkBitmap& bitmap, JSContext *cx, JSObject *obj, JSObject *proto) {
3678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkJSDisplayable::gCanvas = new SkCanvas(bitmap);
3688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkJSDisplayable::gPaint = new SkPaint();
3698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if SK_USE_CONDENSED_INFO == 0
3708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    GenerateTables();
3718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#else
3728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(0); // !!! compressed version hasn't been implemented
3738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
3748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    AddInit(cx, obj, proto);
3758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    AddCircleInit(cx, obj, proto);
3768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    AddOvalInit(cx, obj, proto);
3778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    AddPathInit(cx, obj, proto);
3788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    AddRectangleInit(cx, obj, proto);
3798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    AddRoundRectInit(cx, obj, proto);
3808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//  AfterInit(cx, obj, proto);
3818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    ApplyInit(cx, obj, proto);
3828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // AnimateInit(cx, obj, proto);
3838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//  AnimateColorInit(cx, obj, proto);
3848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    AnimateFieldInit(cx, obj, proto);
3858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//  AnimateRotateInit(cx, obj, proto);
3868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//  AnimateScaleInit(cx, obj, proto);
3878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//  AnimateTranslateInit(cx, obj, proto);
3888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    BitmapInit(cx, obj, proto);
3898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//  BaseBitmapInit(cx, obj, proto);
3908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//  BeforeInit(cx, obj, proto);
3918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    BitmapShaderInit(cx, obj, proto);
3928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    BlurInit(cx, obj, proto);
3938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    ClipInit(cx, obj, proto);
3948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    ColorInit(cx, obj, proto);
3958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    CubicToInit(cx, obj, proto);
3968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    DashInit(cx, obj, proto);
3978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    DataInit(cx, obj, proto);
3988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//  DimensionsInit(cx, obj, proto);
3998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    DiscreteInit(cx, obj, proto);
4008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    DrawToInit(cx, obj, proto);
4018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    EmbossInit(cx, obj, proto);
4028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    EventInit(cx, obj, proto);
4038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//  FontInit(cx, obj, proto);
4048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//  FocusInit(cx, obj, proto);
4058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    ImageInit(cx, obj, proto);
4068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    IncludeInit(cx, obj, proto);
4078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//  InputInit(cx, obj, proto);
4088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    LineInit(cx, obj, proto);
4098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    LinearGradientInit(cx, obj, proto);
4108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    LineToInit(cx, obj, proto);
4118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    MatrixInit(cx, obj, proto);
4128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    MoveInit(cx, obj, proto);
4138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    MoveToInit(cx, obj, proto);
4148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    OvalInit(cx, obj, proto);
4158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    PathInit(cx, obj, proto);
4168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    PaintInit(cx, obj, proto);
4178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    DrawPointInit(cx, obj, proto);
4188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    PolyToPolyInit(cx, obj, proto);
4198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    PolygonInit(cx, obj, proto);
4208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    PolylineInit(cx, obj, proto);
4218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    PostInit(cx, obj, proto);
4228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    QuadToInit(cx, obj, proto);
4238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    RadialGradientInit(cx, obj, proto);
4248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    RandomInit(cx, obj, proto);
4258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    RectToRectInit(cx, obj, proto);
4268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    RectangleInit(cx, obj, proto);
4278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    RemoveInit(cx, obj, proto);
4288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    ReplaceInit(cx, obj, proto);
4298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    RotateInit(cx, obj, proto);
4308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    RoundRectInit(cx, obj, proto);
4318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    ScaleInit(cx, obj, proto);
4328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SetInit(cx, obj, proto);
4338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkewInit(cx, obj, proto);
4348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // 3D_CameraInit(cx, obj, proto);
4358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // 3D_PatchInit(cx, obj, proto);
4368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SnapshotInit(cx, obj, proto);
4378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//  StrokeInit(cx, obj, proto);
4388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    TextInit(cx, obj, proto);
4398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    TextOnPathInit(cx, obj, proto);
4408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    TextToPathInit(cx, obj, proto);
4418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    TranslateInit(cx, obj, proto);
4428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//  UseInit(cx, obj, proto);
4438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
4448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkJS::DisposeDisplayables() {
4468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    delete SkJSDisplayable::gPaint;
4478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    delete SkJSDisplayable::gCanvas;
4488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    for (int index = 0; index < kTypeNamesSize; index++) {
4498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkDisplayTypes type = gTypeNames[index].fType;
4508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        delete[] gDisplayableProperties[type];
4518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
4528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
453