Index: experimental/SkV8Example/Path2DBuilder.cpp |
diff --git a/experimental/SkV8Example/Path2D.cpp b/experimental/SkV8Example/Path2DBuilder.cpp |
similarity index 76% |
copy from experimental/SkV8Example/Path2D.cpp |
copy to experimental/SkV8Example/Path2DBuilder.cpp |
index 5956f69de3ade6e6fea477cb364cbe34220e4371..ad05668139a514113e5bbd769409eec3bd41bbfd 100644 |
--- a/experimental/SkV8Example/Path2D.cpp |
+++ b/experimental/SkV8Example/Path2DBuilder.cpp |
@@ -7,14 +7,16 @@ |
* |
*/ |
-#include "Path2D.h" |
#include "Global.h" |
+#include "Path2DBuilder.h" |
+#include "Path2D.h" |
+#include "SkPath.h" |
-Global* Path2D::gGlobal = NULL; |
+Global* Path2DBuilder::gGlobal = NULL; |
-void Path2D::ConstructPath(const v8::FunctionCallbackInfo<v8::Value>& args) { |
+void Path2DBuilder::ConstructPath(const v8::FunctionCallbackInfo<v8::Value>& args) { |
v8::HandleScope handleScope(gGlobal->getIsolate()); |
- Path2D* path = new Path2D(); |
+ Path2DBuilder* path = new Path2DBuilder(); |
args.This()->SetInternalField( |
0, v8::External::New(gGlobal->getIsolate(), path)); |
} |
@@ -26,9 +28,9 @@ void Path2D::ConstructPath(const v8::FunctionCallbackInfo<v8::Value>& args) { |
v8::String::kInternalizedString), \ |
v8::FunctionTemplate::New(global->getIsolate(), fn)) |
-// Install the constructor in the global scope so Path2Ds can be constructed |
+// Install the constructor in the global scope so Path2DBuilders can be constructed |
// in JS. |
-void Path2D::AddToGlobal(Global* global) { |
+void Path2DBuilder::AddToGlobal(Global* global) { |
gGlobal = global; |
// Create a stack-allocated handle scope. |
@@ -40,10 +42,10 @@ void Path2D::AddToGlobal(Global* global) { |
v8::Context::Scope contextScope(context); |
v8::Local<v8::FunctionTemplate> constructor = v8::FunctionTemplate::New( |
- gGlobal->getIsolate(), Path2D::ConstructPath); |
+ gGlobal->getIsolate(), Path2DBuilder::ConstructPath); |
constructor->InstanceTemplate()->SetInternalFieldCount(1); |
- ADD_METHOD("closePath", ClosePath); |
+ ADD_METHOD("close", ClosePath); |
ADD_METHOD("moveTo", MoveTo); |
ADD_METHOD("lineTo", LineTo); |
ADD_METHOD("quadraticCurveTo", QuadraticCurveTo); |
@@ -53,23 +55,25 @@ void Path2D::AddToGlobal(Global* global) { |
ADD_METHOD("oval", Oval); |
ADD_METHOD("conicTo", ConicTo); |
+ ADD_METHOD("finalize", Finalize); |
+ |
context->Global()->Set(v8::String::NewFromUtf8( |
- gGlobal->getIsolate(), "Path2D"), constructor->GetFunction()); |
+ gGlobal->getIsolate(), "Path2DBuilder"), constructor->GetFunction()); |
} |
-Path2D* Path2D::Unwrap(const v8::FunctionCallbackInfo<v8::Value>& args) { |
+Path2DBuilder* Path2DBuilder::Unwrap(const v8::FunctionCallbackInfo<v8::Value>& args) { |
v8::Handle<v8::External> field = v8::Handle<v8::External>::Cast( |
args.This()->GetInternalField(0)); |
void* ptr = field->Value(); |
- return static_cast<Path2D*>(ptr); |
+ return static_cast<Path2DBuilder*>(ptr); |
} |
-void Path2D::ClosePath(const v8::FunctionCallbackInfo<v8::Value>& args) { |
- Path2D* path = Unwrap(args); |
+void Path2DBuilder::ClosePath(const v8::FunctionCallbackInfo<v8::Value>& args) { |
+ Path2DBuilder* path = Unwrap(args); |
path->fSkPath.close(); |
} |
-void Path2D::MoveTo(const v8::FunctionCallbackInfo<v8::Value>& args) { |
+void Path2DBuilder::MoveTo(const v8::FunctionCallbackInfo<v8::Value>& args) { |
if (args.Length() != 2) { |
args.GetIsolate()->ThrowException( |
v8::String::NewFromUtf8( |
@@ -78,11 +82,11 @@ void Path2D::MoveTo(const v8::FunctionCallbackInfo<v8::Value>& args) { |
} |
double x = args[0]->NumberValue(); |
double y = args[1]->NumberValue(); |
- Path2D* path = Unwrap(args); |
+ Path2DBuilder* path = Unwrap(args); |
path->fSkPath.moveTo(SkDoubleToScalar(x), SkDoubleToScalar(y)); |
} |
-void Path2D::LineTo(const v8::FunctionCallbackInfo<v8::Value>& args) { |
+void Path2DBuilder::LineTo(const v8::FunctionCallbackInfo<v8::Value>& args) { |
if (args.Length() != 2) { |
args.GetIsolate()->ThrowException( |
v8::String::NewFromUtf8( |
@@ -91,11 +95,11 @@ void Path2D::LineTo(const v8::FunctionCallbackInfo<v8::Value>& args) { |
} |
double x = args[0]->NumberValue(); |
double y = args[1]->NumberValue(); |
- Path2D* path = Unwrap(args); |
+ Path2DBuilder* path = Unwrap(args); |
path->fSkPath.lineTo(SkDoubleToScalar(x), SkDoubleToScalar(y)); |
} |
-void Path2D::QuadraticCurveTo(const v8::FunctionCallbackInfo<v8::Value>& args) { |
+void Path2DBuilder::QuadraticCurveTo(const v8::FunctionCallbackInfo<v8::Value>& args) { |
if (args.Length() != 4) { |
args.GetIsolate()->ThrowException( |
v8::String::NewFromUtf8( |
@@ -106,7 +110,7 @@ void Path2D::QuadraticCurveTo(const v8::FunctionCallbackInfo<v8::Value>& args) { |
double cpy = args[1]->NumberValue(); |
double x = args[2]->NumberValue(); |
double y = args[3]->NumberValue(); |
- Path2D* path = Unwrap(args); |
+ Path2DBuilder* path = Unwrap(args); |
// TODO(jcgregorio) Doesn't handle the empty last path case correctly per |
// the HTML 5 spec. |
path->fSkPath.quadTo( |
@@ -114,7 +118,7 @@ void Path2D::QuadraticCurveTo(const v8::FunctionCallbackInfo<v8::Value>& args) { |
SkDoubleToScalar(x), SkDoubleToScalar(y)); |
} |
-void Path2D::BezierCurveTo(const v8::FunctionCallbackInfo<v8::Value>& args) { |
+void Path2DBuilder::BezierCurveTo(const v8::FunctionCallbackInfo<v8::Value>& args) { |
if (args.Length() != 6) { |
args.GetIsolate()->ThrowException( |
v8::String::NewFromUtf8( |
@@ -127,7 +131,7 @@ void Path2D::BezierCurveTo(const v8::FunctionCallbackInfo<v8::Value>& args) { |
double cp2y = args[3]->NumberValue(); |
double x = args[4]->NumberValue(); |
double y = args[5]->NumberValue(); |
- Path2D* path = Unwrap(args); |
+ Path2DBuilder* path = Unwrap(args); |
// TODO(jcgregorio) Doesn't handle the empty last path case correctly per |
// the HTML 5 spec. |
path->fSkPath.cubicTo( |
@@ -136,7 +140,7 @@ void Path2D::BezierCurveTo(const v8::FunctionCallbackInfo<v8::Value>& args) { |
SkDoubleToScalar(x), SkDoubleToScalar(y)); |
} |
-void Path2D::Arc(const v8::FunctionCallbackInfo<v8::Value>& args) { |
+void Path2DBuilder::Arc(const v8::FunctionCallbackInfo<v8::Value>& args) { |
if (args.Length() != 5 && args.Length() != 6) { |
args.GetIsolate()->ThrowException( |
v8::String::NewFromUtf8( |
@@ -160,7 +164,7 @@ void Path2D::Arc(const v8::FunctionCallbackInfo<v8::Value>& args) { |
startAngle = endAngle; |
} |
- Path2D* path = Unwrap(args); |
+ Path2DBuilder* path = Unwrap(args); |
SkRect rect = { |
SkDoubleToScalar(x-radius), |
SkDoubleToScalar(y-radius), |
@@ -172,7 +176,7 @@ void Path2D::Arc(const v8::FunctionCallbackInfo<v8::Value>& args) { |
SkRadiansToDegrees(sweepAngle)); |
} |
-void Path2D::Rect(const v8::FunctionCallbackInfo<v8::Value>& args) { |
+void Path2DBuilder::Rect(const v8::FunctionCallbackInfo<v8::Value>& args) { |
if (args.Length() != 4) { |
args.GetIsolate()->ThrowException( |
v8::String::NewFromUtf8( |
@@ -190,11 +194,11 @@ void Path2D::Rect(const v8::FunctionCallbackInfo<v8::Value>& args) { |
SkDoubleToScalar(x) + SkDoubleToScalar(w), |
SkDoubleToScalar(y) + SkDoubleToScalar(h) |
}; |
- Path2D* path = Unwrap(args); |
+ Path2DBuilder* path = Unwrap(args); |
path->fSkPath.addRect(rect); |
} |
-void Path2D::Oval(const v8::FunctionCallbackInfo<v8::Value>& args) { |
+void Path2DBuilder::Oval(const v8::FunctionCallbackInfo<v8::Value>& args) { |
if (args.Length() != 4 && args.Length() != 5) { |
args.GetIsolate()->ThrowException( |
v8::String::NewFromUtf8( |
@@ -209,7 +213,7 @@ void Path2D::Oval(const v8::FunctionCallbackInfo<v8::Value>& args) { |
if (args.Length() == 5 && !args[4]->BooleanValue()) { |
dir = SkPath::kCCW_Direction; |
} |
- Path2D* path = Unwrap(args); |
+ Path2DBuilder* path = Unwrap(args); |
SkRect rect = { |
SkDoubleToScalar(x-radiusX), |
SkDoubleToScalar(y-radiusX), |
@@ -220,7 +224,7 @@ void Path2D::Oval(const v8::FunctionCallbackInfo<v8::Value>& args) { |
path->fSkPath.addOval(rect, dir); |
} |
-void Path2D::ConicTo(const v8::FunctionCallbackInfo<v8::Value>& args) { |
+void Path2DBuilder::ConicTo(const v8::FunctionCallbackInfo<v8::Value>& args) { |
if (args.Length() != 5) { |
args.GetIsolate()->ThrowException( |
v8::String::NewFromUtf8( |
@@ -232,7 +236,7 @@ void Path2D::ConicTo(const v8::FunctionCallbackInfo<v8::Value>& args) { |
double x2 = args[2]->NumberValue(); |
double y2 = args[3]->NumberValue(); |
double w = args[4]->NumberValue(); |
- Path2D* path = Unwrap(args); |
+ Path2DBuilder* path = Unwrap(args); |
path->fSkPath.conicTo( |
SkDoubleToScalar(x1), |
@@ -242,3 +246,16 @@ void Path2D::ConicTo(const v8::FunctionCallbackInfo<v8::Value>& args) { |
SkDoubleToScalar(w) |
); |
} |
+ |
+void Path2DBuilder::Finalize(const v8::FunctionCallbackInfo<v8::Value>& args) { |
+ Path2DBuilder* path = Unwrap(args); |
+ |
+ // Build Path2D from out fSkPath and return it. |
+ SkPath* skPath = new SkPath(path->fSkPath); |
+ |
+ path->fSkPath.reset(); |
+ |
+ Path2D* pathWrap = new Path2D(skPath); |
+ |
+ args.GetReturnValue().Set(pathWrap->persistent()); |
+} |