5e44b00392
Adds DrawingMethods with some of the methods it defines. Context is now an implementation of DrawingMethods. The sample.js file now shows how the context is used. Not much new code here, that's mostly in DrawingMethods::DrawPath, most everything else is a code move. BUG=skia: Review URL: https://codereview.chromium.org/676423002
173 lines
5.2 KiB
C++
173 lines
5.2 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 <v8.h>
|
|
|
|
#include "Global.h"
|
|
#include "DrawingMethods.h"
|
|
#include "Path2D.h"
|
|
#include "SkCanvas.h"
|
|
#include "SkPaint.h"
|
|
|
|
|
|
DrawingMethods* DrawingMethods::Unwrap(v8::Handle<v8::Object> obj) {
|
|
v8::Handle<v8::External> field = v8::Handle<v8::External>::Cast(obj->GetInternalField(0));
|
|
void* ptr = field->Value();
|
|
return static_cast<DrawingMethods*>(ptr);
|
|
}
|
|
|
|
|
|
void DrawingMethods::Save(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
|
DrawingMethods* drawingMethods = Unwrap(args.This());
|
|
SkCanvas* canvas = drawingMethods->getCanvas();
|
|
if (NULL == canvas) {
|
|
return;
|
|
}
|
|
|
|
canvas->save();
|
|
}
|
|
|
|
void DrawingMethods::Restore(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
|
DrawingMethods* drawingMethods = Unwrap(args.This());
|
|
SkCanvas* canvas = drawingMethods->getCanvas();
|
|
if (NULL == canvas) {
|
|
return;
|
|
}
|
|
|
|
canvas->restore();
|
|
}
|
|
|
|
void DrawingMethods::Rotate(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
|
DrawingMethods* drawingMethods = Unwrap(args.This());
|
|
SkCanvas* canvas = drawingMethods->getCanvas();
|
|
if (NULL == canvas) {
|
|
return;
|
|
}
|
|
|
|
if (args.Length() != 1) {
|
|
args.GetIsolate()->ThrowException(
|
|
v8::String::NewFromUtf8(
|
|
args.GetIsolate(), "Error: 1 arguments required."));
|
|
return;
|
|
}
|
|
double angle = args[0]->NumberValue();
|
|
canvas->rotate(SkRadiansToDegrees(angle));
|
|
}
|
|
|
|
void DrawingMethods::Translate(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
|
DrawingMethods* drawingMethods = Unwrap(args.This());
|
|
SkCanvas* canvas = drawingMethods->getCanvas();
|
|
if (NULL == canvas) {
|
|
return;
|
|
}
|
|
|
|
if (args.Length() != 2) {
|
|
args.GetIsolate()->ThrowException(
|
|
v8::String::NewFromUtf8(
|
|
args.GetIsolate(), "Error: 2 arguments required."));
|
|
return;
|
|
}
|
|
double dx = args[0]->NumberValue();
|
|
double dy = args[1]->NumberValue();
|
|
canvas->translate(SkDoubleToScalar(dx), SkDoubleToScalar(dy));
|
|
}
|
|
|
|
void DrawingMethods::ResetTransform(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
|
DrawingMethods* drawingMethods = Unwrap(args.This());
|
|
SkCanvas* canvas = drawingMethods->getCanvas();
|
|
if (NULL == canvas) {
|
|
return;
|
|
}
|
|
|
|
canvas->resetMatrix();
|
|
}
|
|
|
|
void DrawingMethods::DrawPath(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
|
DrawingMethods* drawingMethods = Unwrap(args.This());
|
|
SkCanvas* canvas = drawingMethods->getCanvas();
|
|
if (NULL == canvas) {
|
|
return;
|
|
}
|
|
|
|
if (args.Length() != 1) {
|
|
args.GetIsolate()->ThrowException(
|
|
v8::String::NewFromUtf8(
|
|
args.GetIsolate(), "Error: 1 argument required."));
|
|
return;
|
|
}
|
|
|
|
v8::Handle<v8::External> field = v8::Handle<v8::External>::Cast(
|
|
args[0]->ToObject()->GetInternalField(0));
|
|
void* ptr = field->Value();
|
|
Path2D* path = static_cast<Path2D*>(ptr);
|
|
if (NULL == path) {
|
|
return;
|
|
}
|
|
// TODO(jcgregorio) Add support for Paint2D parameter after Paint2D is
|
|
// implemented.
|
|
SkPaint fillStyle;
|
|
fillStyle.setColor(SK_ColorBLACK);
|
|
fillStyle.setAntiAlias(true);
|
|
fillStyle.setStyle(SkPaint::kFill_Style);
|
|
canvas->drawPath(path->getSkPath(), fillStyle);
|
|
}
|
|
|
|
|
|
void DrawingMethods::GetWidth(v8::Local<v8::String> name,
|
|
const v8::PropertyCallbackInfo<v8::Value>& info) {
|
|
DrawingMethods* drawingMethods = Unwrap(info.This());
|
|
SkCanvas* canvas = drawingMethods->getCanvas();
|
|
if (NULL == canvas) {
|
|
return;
|
|
}
|
|
|
|
info.GetReturnValue().Set(
|
|
v8::Int32::New(
|
|
drawingMethods->fGlobal->getIsolate(), canvas->imageInfo().width()));
|
|
}
|
|
|
|
void DrawingMethods::GetHeight(v8::Local<v8::String> name,
|
|
const v8::PropertyCallbackInfo<v8::Value>& info) {
|
|
DrawingMethods* drawingMethods = Unwrap(info.This());
|
|
SkCanvas* canvas = drawingMethods->getCanvas();
|
|
if (NULL == canvas) {
|
|
return;
|
|
}
|
|
|
|
info.GetReturnValue().Set(
|
|
v8::Int32::New(
|
|
drawingMethods->fGlobal->getIsolate(), canvas->imageInfo().height()));
|
|
}
|
|
|
|
#define ADD_METHOD(name, fn) \
|
|
tmpl->Set(v8::String::NewFromUtf8( \
|
|
fGlobal->getIsolate(), name, \
|
|
v8::String::kInternalizedString), \
|
|
v8::FunctionTemplate::New(fGlobal->getIsolate(), fn))
|
|
|
|
void DrawingMethods::addAttributesAndMethods(v8::Handle<v8::ObjectTemplate> tmpl) {
|
|
v8::HandleScope scope(fGlobal->getIsolate());
|
|
|
|
// Add accessors for each of the fields of the context object.
|
|
tmpl->SetAccessor(v8::String::NewFromUtf8(
|
|
fGlobal->getIsolate(), "width", v8::String::kInternalizedString),
|
|
GetWidth);
|
|
tmpl->SetAccessor(v8::String::NewFromUtf8(
|
|
fGlobal->getIsolate(), "height", v8::String::kInternalizedString),
|
|
GetHeight);
|
|
|
|
// Add methods.
|
|
ADD_METHOD("save", Save);
|
|
ADD_METHOD("restore", Restore);
|
|
ADD_METHOD("rotate", Rotate);
|
|
ADD_METHOD("translate", Translate);
|
|
ADD_METHOD("resetTransform", ResetTransform);
|
|
|
|
ADD_METHOD("drawPath", DrawPath);
|
|
}
|