124e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org/*
224e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org * Copyright 2014 Google Inc.
324e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org *
424e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org *
524e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be
624e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org * found in the LICENSE file.
724e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org *
824e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org */
924e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org#include <v8.h>
1024e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
1124e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.orgusing namespace v8;
1224e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
1324e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org#include "Global.h"
1424e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org#include "BaseContext.h"
1524e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org#include "Path2D.h"
1624e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org#include "SkCanvas.h"
1724e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
1824e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
1924e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.orgBaseContext* BaseContext::Unwrap(Handle<Object> obj) {
2024e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    Handle<External> field = Handle<External>::Cast(obj->GetInternalField(0));
2124e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    void* ptr = field->Value();
2224e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    return static_cast<BaseContext*>(ptr);
2324e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org}
2424e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
2524e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.orgvoid BaseContext::FillRect(const v8::FunctionCallbackInfo<Value>& args) {
2624e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    BaseContext* BaseContext = Unwrap(args.This());
2724e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    SkCanvas* canvas = BaseContext->getCanvas();
2824e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    if (NULL == canvas) {
2924e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org        return;
3024e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    }
3124e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
3224e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    if (args.Length() != 4) {
3324e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org        args.GetIsolate()->ThrowException(
3424e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org                v8::String::NewFromUtf8(
3524e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org                        args.GetIsolate(), "Error: 4 arguments required."));
3624e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org        return;
3724e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    }
3824e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    double x = args[0]->NumberValue();
3924e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    double y = args[1]->NumberValue();
4024e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    double w = args[2]->NumberValue();
4124e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    double h = args[3]->NumberValue();
4224e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
4324e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    SkRect rect = {
4424e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org        SkDoubleToScalar(x),
4524e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org        SkDoubleToScalar(y),
4624e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org        SkDoubleToScalar(x) + SkDoubleToScalar(w),
4724e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org        SkDoubleToScalar(y) + SkDoubleToScalar(h)
4824e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    };
4924e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    canvas->drawRect(rect, BaseContext->fFillStyle);
5024e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org}
5124e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
5224e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.orgvoid BaseContext::Save(const v8::FunctionCallbackInfo<Value>& args) {
5324e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    BaseContext* BaseContext = Unwrap(args.This());
5424e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    SkCanvas* canvas = BaseContext->getCanvas();
5524e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    if (NULL == canvas) {
5624e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org        return;
5724e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    }
5824e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
5924e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    canvas->save();
6024e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org}
6124e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
6224e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.orgvoid BaseContext::Restore(const v8::FunctionCallbackInfo<Value>& args) {
6324e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    BaseContext* BaseContext = Unwrap(args.This());
6424e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    SkCanvas* canvas = BaseContext->getCanvas();
6524e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    if (NULL == canvas) {
6624e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org        return;
6724e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    }
6824e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
6924e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    canvas->restore();
7024e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org}
7124e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
7224e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.orgvoid BaseContext::Rotate(const v8::FunctionCallbackInfo<Value>& args) {
7324e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    BaseContext* BaseContext = Unwrap(args.This());
7424e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    SkCanvas* canvas = BaseContext->getCanvas();
7524e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    if (NULL == canvas) {
7624e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org        return;
7724e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    }
7824e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
7924e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    if (args.Length() != 1) {
8024e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org        args.GetIsolate()->ThrowException(
8124e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org                v8::String::NewFromUtf8(
8224e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org                        args.GetIsolate(), "Error: 1 arguments required."));
8324e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org        return;
8424e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    }
8524e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    double angle = args[0]->NumberValue();
8624e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    canvas->rotate(SkRadiansToDegrees(angle));
8724e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org}
8824e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
8924e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.orgvoid BaseContext::Translate(const v8::FunctionCallbackInfo<Value>& args) {
9024e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    BaseContext* BaseContext = Unwrap(args.This());
9124e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    SkCanvas* canvas = BaseContext->getCanvas();
9224e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    if (NULL == canvas) {
9324e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org        return;
9424e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    }
9524e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
9624e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    if (args.Length() != 2) {
9724e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org        args.GetIsolate()->ThrowException(
9824e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org                v8::String::NewFromUtf8(
9924e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org                        args.GetIsolate(), "Error: 2 arguments required."));
10024e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org        return;
10124e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    }
10224e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    double dx = args[0]->NumberValue();
10324e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    double dy = args[1]->NumberValue();
10424e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    canvas->translate(SkDoubleToScalar(dx), SkDoubleToScalar(dy));
10524e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org}
10624e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
10724e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.orgvoid BaseContext::ResetTransform(const v8::FunctionCallbackInfo<Value>& args) {
10824e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    BaseContext* BaseContext = Unwrap(args.This());
10924e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    SkCanvas* canvas = BaseContext->getCanvas();
11024e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    if (NULL == canvas) {
11124e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org        return;
11224e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    }
11324e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
11424e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    canvas->resetMatrix();
11524e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org}
11624e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
11724e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.orgvoid BaseContext::Stroke(const v8::FunctionCallbackInfo<Value>& args) {
11824e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    BaseContext* BaseContext = Unwrap(args.This());
11924e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    SkCanvas* canvas = BaseContext->getCanvas();
12024e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    if (NULL == canvas) {
12124e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org        return;
12224e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    }
12324e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
12424e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    if (args.Length() != 1) {
12524e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org        args.GetIsolate()->ThrowException(
12624e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org                v8::String::NewFromUtf8(
12724e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org                        args.GetIsolate(), "Error: 1 arguments required."));
12824e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org        return;
12924e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    }
13024e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
13124e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    Handle<External> field = Handle<External>::Cast(
13224e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org            args[0]->ToObject()->GetInternalField(0));
13324e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    void* ptr = field->Value();
13424e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    Path2D* path = static_cast<Path2D*>(ptr);
13524e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
13624e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    canvas->drawPath(path->getSkPath(), BaseContext->fStrokeStyle);
13724e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org}
13824e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
13924e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.orgvoid BaseContext::Fill(const v8::FunctionCallbackInfo<Value>& args) {
14024e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    BaseContext* BaseContext = Unwrap(args.This());
14124e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    SkCanvas* canvas = BaseContext->getCanvas();
14224e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    if (NULL == canvas) {
14324e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org        return;
14424e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    }
14524e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
14624e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    if (args.Length() != 1) {
14724e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org        args.GetIsolate()->ThrowException(
14824e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org                v8::String::NewFromUtf8(
14924e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org                        args.GetIsolate(), "Error: 1 arguments required."));
15024e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org        return;
15124e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    }
15224e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
15324e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    Handle<External> field = Handle<External>::Cast(
15424e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org            args[0]->ToObject()->GetInternalField(0));
15524e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    void* ptr = field->Value();
15624e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    Path2D* path = static_cast<Path2D*>(ptr);
15724e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
15824e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    canvas->drawPath(path->getSkPath(), BaseContext->fFillStyle);
15924e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org}
16024e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
16124e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.orgvoid BaseContext::GetStyle(Local<String> name,
16224e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org                         const PropertyCallbackInfo<Value>& info,
16324e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org                         const SkPaint& style) {
16424e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    char buf[8];
16524e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    SkColor color = style.getColor();
16624e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    sprintf(buf, "#%02X%02X%02X", SkColorGetR(color), SkColorGetG(color),
16724e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org            SkColorGetB(color));
16824e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
16924e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), buf));
17024e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org}
17124e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
17224e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.orgvoid BaseContext::SetStyle(Local<String> name, Local<Value> value,
17324e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org                         const PropertyCallbackInfo<void>& info,
17424e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org                         SkPaint& style) {
17524e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    Local<String> s = value->ToString();
17624e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    if (s->Length() != 7 && s->Length() != 9) {
17724e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org        info.GetIsolate()->ThrowException(
17824e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org                v8::String::NewFromUtf8(
17924e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org                        info.GetIsolate(),
18024e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org                        "Invalid fill style format length."));
18124e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org        return;
18224e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    }
18324e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    char buf[10];
18424e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    s->WriteUtf8(buf, sizeof(buf));
18524e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
18624e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    if (buf[0] != '#') {
18724e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org        info.GetIsolate()->ThrowException(
18824e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org                v8::String::NewFromUtf8(
18924e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org                        info.GetIsolate(), "Invalid fill style format."));
19024e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org        return;
19124e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    }
19224e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
19324e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    // Colors can be RRGGBBAA, but SkColor uses ARGB.
19424e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    long color = strtol(buf+1, NULL, 16);
19524e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    uint32_t alpha = SK_AlphaOPAQUE;
19624e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    if (s->Length() == 9) {
19724e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org        alpha = color & 0xFF;
19824e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org        color >>= 8;
19924e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    }
20024e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    style.setColor(SkColorSetA(SkColor(color), alpha));
20124e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org}
20224e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
20324e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.orgvoid BaseContext::GetFillStyle(Local<String> name,
20424e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org                             const PropertyCallbackInfo<Value>& info) {
20524e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    BaseContext* baseContext = Unwrap(info.This());
20624e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    GetStyle(name, info, baseContext->fFillStyle);
20724e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org}
20824e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
20924e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.orgvoid BaseContext::GetStrokeStyle(Local<String> name,
21024e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org                               const PropertyCallbackInfo<Value>& info) {
21124e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    BaseContext* baseContext = Unwrap(info.This());
21224e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    GetStyle(name, info, baseContext->fStrokeStyle);
21324e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org}
21424e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
21524e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.orgvoid BaseContext::SetFillStyle(Local<String> name, Local<Value> value,
21624e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org                            const PropertyCallbackInfo<void>& info) {
21724e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    BaseContext* baseContext = Unwrap(info.This());
21824e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    SetStyle(name, value, info, baseContext->fFillStyle);
21924e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org}
22024e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
22124e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.orgvoid BaseContext::SetStrokeStyle(Local<String> name, Local<Value> value,
22224e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org                               const PropertyCallbackInfo<void>& info) {
22324e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    BaseContext* baseContext = Unwrap(info.This());
22424e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    SetStyle(name, value, info, baseContext->fStrokeStyle);
22524e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org}
22624e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
22724e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
22824e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.orgvoid BaseContext::GetWidth(Local<String> name,
22924e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org                         const PropertyCallbackInfo<Value>& info) {
23024e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    BaseContext* baseContext = Unwrap(info.This());
23124e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    SkCanvas* canvas = baseContext->getCanvas();
23224e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    if (NULL == canvas) {
23324e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org        return;
23424e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    }
23524e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    SkISize size = canvas->getDeviceSize();
23624e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
23724e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    info.GetReturnValue().Set(
23824e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org            Int32::New(baseContext->fGlobal->getIsolate(), size.fWidth));
23924e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org}
24024e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
24124e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.orgvoid BaseContext::GetHeight(Local<String> name,
24224e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org                         const PropertyCallbackInfo<Value>& info) {
24324e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    BaseContext* baseContext = Unwrap(info.This());
24424e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    SkCanvas* canvas = baseContext->getCanvas();
24524e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    if (NULL == canvas) {
24624e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org        return;
24724e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    }
24824e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    SkISize size = canvas->getDeviceSize();
24924e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
25024e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    info.GetReturnValue().Set(
25124e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org            Int32::New(baseContext->fGlobal->getIsolate(), size.fHeight));
25224e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org}
25324e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
25424e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org#define ADD_METHOD(name, fn) \
25524e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    tmpl->Set(String::NewFromUtf8( \
25624e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org         fGlobal->getIsolate(), name, \
25724e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org         String::kInternalizedString), \
25824e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org             FunctionTemplate::New(fGlobal->getIsolate(), fn))
25924e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
26024e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.orgvoid BaseContext::addAttributesAndMethods(Handle<ObjectTemplate> tmpl) {
26124e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    HandleScope scope(fGlobal->getIsolate());
26224e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
26324e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    // Add accessors for each of the fields of the context object.
26424e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    tmpl->SetAccessor(String::NewFromUtf8(
26524e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org        fGlobal->getIsolate(), "fillStyle", String::kInternalizedString),
26624e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org            GetFillStyle, SetFillStyle);
26724e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    tmpl->SetAccessor(String::NewFromUtf8(
26824e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org        fGlobal->getIsolate(), "strokeStyle", String::kInternalizedString),
26924e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org            GetStrokeStyle, SetStrokeStyle);
27024e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    tmpl->SetAccessor(String::NewFromUtf8(
27124e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org        fGlobal->getIsolate(), "width", String::kInternalizedString),
27224e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org            GetWidth);
27324e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    tmpl->SetAccessor(String::NewFromUtf8(
27424e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org        fGlobal->getIsolate(), "height", String::kInternalizedString),
27524e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org            GetHeight);
27624e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org
27724e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    // Add methods.
27824e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    ADD_METHOD("fillRect", FillRect);
27924e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    ADD_METHOD("stroke", Stroke);
28024e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    ADD_METHOD("fill", Fill);
28124e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    ADD_METHOD("rotate", Rotate);
28224e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    ADD_METHOD("save", Save);
28324e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    ADD_METHOD("restore", Restore);
28424e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    ADD_METHOD("translate", Translate);
28524e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org    ADD_METHOD("resetTransform", ResetTransform);
28624e0496e8d58e779487307fbe0ae20d5fea4cfc0commit-bot@chromium.org}
287