skia2/experimental/SkV8Example/Path2D.cpp
2014-10-29 05:33:28 -07:00

56 lines
1.9 KiB
C++

/*
* Copyright 2014 Google Inc.
*
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*
*/
#include "Path2D.h"
#include "Global.h"
Global* Path2D::gGlobal = NULL;
v8::Persistent<v8::ObjectTemplate> Path2D::gPath2DTemplate;
void weakPath2DCallback(const v8::WeakCallbackData<v8::Object, Path2D>& args) {
delete args.GetParameter();
}
// Wraps an SkPath* in a Path2D object.
Path2D::Path2D(SkPath* path) : path_(path) {
// Handle scope for temporary handles.
v8::HandleScope handleScope(gGlobal->getIsolate());
// Just once create the ObjectTemplate for what Path2D looks like in JS.
if (gPath2DTemplate.IsEmpty()) {
v8::Local<v8::ObjectTemplate> localTemplate = v8::ObjectTemplate::New();
// Add a field to store the pointer to a SkPath pointer.
localTemplate->SetInternalFieldCount(1);
gPath2DTemplate.Reset(gGlobal->getIsolate(), localTemplate);
}
v8::Handle<v8::ObjectTemplate> templ =
v8::Local<v8::ObjectTemplate>::New(gGlobal->getIsolate(), gPath2DTemplate);
// Create an empty Path2D wrapper.
v8::Local<v8::Object> result = templ->NewInstance();
// Store the SkPath pointer in the JavaScript wrapper.
result->SetInternalField(0, v8::External::New(gGlobal->getIsolate(), this));
gGlobal->getIsolate()->AdjustAmountOfExternalAllocatedMemory(sizeof(SkPath));
// Make a weak persistent and set up the callback so we can delete the path pointer.
// TODO(jcgregorio) Figure out why weakPath2DCallback never gets called and we leak.
v8::Persistent<v8::Object> weak(gGlobal->getIsolate(), result);
weak.SetWeak(this, weakPath2DCallback);
this->handle_.Reset(gGlobal->getIsolate(), weak);
}
Path2D::~Path2D() {
delete path_;
handle_.Reset();
gGlobal->getIsolate()->AdjustAmountOfExternalAllocatedMemory(-sizeof(SkPath));
}