Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 /* | |
| 2 * Copyright 2014 Google Inc. | |
| 3 * | |
| 4 * | |
| 5 * Use of this source code is governed by a BSD-style license that can be | |
| 6 * found in the LICENSE file. | |
| 7 * | |
| 8 */ | |
| 9 #include <v8.h> | |
| 10 | |
| 11 using namespace v8; | |
| 12 | |
| 13 #include "Global.h" | |
| 14 #include "BaseContext.h" | |
| 15 #include "Path2D.h" | |
| 16 #include "SkCanvas.h" | |
| 17 | |
| 18 | |
| 19 BaseContext* BaseContext::Unwrap(Handle<Object> obj) { | |
| 20 Handle<External> field = Handle<External>::Cast(obj->GetInternalField(0)); | |
| 21 void* ptr = field->Value(); | |
| 22 return static_cast<BaseContext*>(ptr); | |
| 23 } | |
| 24 | |
| 25 void BaseContext::FillRect(const v8::FunctionCallbackInfo<Value>& args) { | |
| 26 BaseContext* BaseContext = Unwrap(args.This()); | |
| 27 SkCanvas* canvas = BaseContext->getCanvas(); | |
|
robertphillips
2014/03/04 20:05:03
if () {\n
}
jcgregorio
2014/03/04 20:29:31
Done, here and all below.
On 2014/03/04 20:05:03,
| |
| 28 if (NULL == canvas) { return; } | |
| 29 | |
| 30 if (args.Length() != 4) { | |
| 31 args.GetIsolate()->ThrowException( | |
| 32 v8::String::NewFromUtf8( | |
| 33 args.GetIsolate(), "Error: 4 arguments required.")); | |
| 34 return; | |
| 35 } | |
| 36 double x = args[0]->NumberValue(); | |
| 37 double y = args[1]->NumberValue(); | |
| 38 double w = args[2]->NumberValue(); | |
| 39 double h = args[3]->NumberValue(); | |
| 40 | |
| 41 SkRect rect = { | |
| 42 SkDoubleToScalar(x), | |
| 43 SkDoubleToScalar(y), | |
| 44 SkDoubleToScalar(x) + SkDoubleToScalar(w), | |
| 45 SkDoubleToScalar(y) + SkDoubleToScalar(h) | |
| 46 }; | |
| 47 canvas->drawRect(rect, BaseContext->fFillStyle); | |
| 48 } | |
| 49 | |
| 50 void BaseContext::Save(const v8::FunctionCallbackInfo<Value>& args) { | |
| 51 BaseContext* BaseContext = Unwrap(args.This()); | |
| 52 SkCanvas* canvas = BaseContext->getCanvas(); | |
|
robertphillips
2014/03/04 20:05:03
same here
| |
| 53 if (NULL == canvas) { return; } | |
| 54 | |
| 55 canvas->save(); | |
| 56 } | |
| 57 | |
| 58 void BaseContext::Restore(const v8::FunctionCallbackInfo<Value>& args) { | |
| 59 BaseContext* BaseContext = Unwrap(args.This()); | |
| 60 SkCanvas* canvas = BaseContext->getCanvas(); | |
|
robertphillips
2014/03/04 20:05:03
same
| |
| 61 if (NULL == canvas) { return; } | |
| 62 | |
| 63 canvas->restore(); | |
| 64 } | |
| 65 | |
| 66 void BaseContext::Rotate(const v8::FunctionCallbackInfo<Value>& args) { | |
| 67 BaseContext* BaseContext = Unwrap(args.This()); | |
| 68 SkCanvas* canvas = BaseContext->getCanvas(); | |
| 69 if (NULL == canvas) { return; } | |
| 70 | |
| 71 if (args.Length() != 1) { | |
| 72 args.GetIsolate()->ThrowException( | |
| 73 v8::String::NewFromUtf8( | |
| 74 args.GetIsolate(), "Error: 1 arguments required.")); | |
| 75 return; | |
| 76 } | |
| 77 double angle = args[0]->NumberValue(); | |
| 78 canvas->rotate(SkRadiansToDegrees(angle)); | |
| 79 } | |
| 80 | |
| 81 void BaseContext::Translate(const v8::FunctionCallbackInfo<Value>& args) { | |
| 82 BaseContext* BaseContext = Unwrap(args.This()); | |
| 83 SkCanvas* canvas = BaseContext->getCanvas(); | |
| 84 if (NULL == canvas) { return; } | |
| 85 | |
| 86 if (args.Length() != 2) { | |
| 87 args.GetIsolate()->ThrowException( | |
| 88 v8::String::NewFromUtf8( | |
| 89 args.GetIsolate(), "Error: 2 arguments required.")); | |
| 90 return; | |
| 91 } | |
| 92 double dx = args[0]->NumberValue(); | |
| 93 double dy = args[1]->NumberValue(); | |
| 94 canvas->translate(SkDoubleToScalar(dx), SkDoubleToScalar(dy)); | |
| 95 } | |
| 96 | |
| 97 void BaseContext::ResetTransform(const v8::FunctionCallbackInfo<Value>& args) { | |
| 98 BaseContext* BaseContext = Unwrap(args.This()); | |
| 99 SkCanvas* canvas = BaseContext->getCanvas(); | |
| 100 if (NULL == canvas) { return; } | |
| 101 | |
| 102 canvas->resetMatrix(); | |
| 103 } | |
| 104 | |
| 105 void BaseContext::Stroke(const v8::FunctionCallbackInfo<Value>& args) { | |
| 106 BaseContext* BaseContext = Unwrap(args.This()); | |
| 107 SkCanvas* canvas = BaseContext->getCanvas(); | |
| 108 if (NULL == canvas) { return; } | |
| 109 | |
| 110 if (args.Length() != 1) { | |
| 111 args.GetIsolate()->ThrowException( | |
| 112 v8::String::NewFromUtf8( | |
| 113 args.GetIsolate(), "Error: 1 arguments required.")); | |
| 114 return; | |
| 115 } | |
| 116 | |
| 117 Handle<External> field = Handle<External>::Cast( | |
| 118 args[0]->ToObject()->GetInternalField(0)); | |
| 119 void* ptr = field->Value(); | |
| 120 Path2D* path = static_cast<Path2D*>(ptr); | |
| 121 | |
| 122 canvas->drawPath(path->getSkPath(), BaseContext->fStrokeStyle); | |
| 123 } | |
| 124 | |
| 125 void BaseContext::Fill(const v8::FunctionCallbackInfo<Value>& args) { | |
| 126 BaseContext* BaseContext = Unwrap(args.This()); | |
| 127 SkCanvas* canvas = BaseContext->getCanvas(); | |
| 128 if (NULL == canvas) { return; } | |
| 129 | |
| 130 if (args.Length() != 1) { | |
| 131 args.GetIsolate()->ThrowException( | |
| 132 v8::String::NewFromUtf8( | |
| 133 args.GetIsolate(), "Error: 1 arguments required.")); | |
| 134 return; | |
| 135 } | |
| 136 | |
| 137 Handle<External> field = Handle<External>::Cast( | |
| 138 args[0]->ToObject()->GetInternalField(0)); | |
| 139 void* ptr = field->Value(); | |
| 140 Path2D* path = static_cast<Path2D*>(ptr); | |
| 141 | |
| 142 canvas->drawPath(path->getSkPath(), BaseContext->fFillStyle); | |
| 143 } | |
| 144 | |
| 145 void BaseContext::GetStyle(Local<String> name, | |
| 146 const PropertyCallbackInfo<Value>& info, | |
| 147 const SkPaint& style) { | |
| 148 char buf[8]; | |
| 149 SkColor color = style.getColor(); | |
| 150 sprintf(buf, "#%02X%02X%02X", SkColorGetR(color), SkColorGetG(color), | |
| 151 SkColorGetB(color)); | |
| 152 | |
| 153 info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), buf)); | |
| 154 } | |
| 155 | |
| 156 void BaseContext::SetStyle(Local<String> name, Local<Value> value, | |
| 157 const PropertyCallbackInfo<void>& info, | |
| 158 SkPaint& style) { | |
| 159 Local<String> s = value->ToString(); | |
| 160 if (s->Length() != 7 && s->Length() != 9) { | |
| 161 info.GetIsolate()->ThrowException( | |
| 162 v8::String::NewFromUtf8( | |
| 163 info.GetIsolate(), | |
| 164 "Invalid fill style format length.")); | |
| 165 return; | |
| 166 } | |
| 167 char buf[10]; | |
| 168 s->WriteUtf8(buf, sizeof(buf)); | |
| 169 | |
| 170 if (buf[0] != '#') { | |
| 171 info.GetIsolate()->ThrowException( | |
| 172 v8::String::NewFromUtf8( | |
| 173 info.GetIsolate(), "Invalid fill style format.")); | |
| 174 return; | |
| 175 } | |
| 176 | |
| 177 // Colors can be RRGGBBAA, but SkColor uses ARGB. | |
| 178 long color = strtol(buf+1, NULL, 16); | |
| 179 uint32_t alpha = SK_AlphaOPAQUE; | |
| 180 if (s->Length() == 9) { | |
| 181 alpha = color & 0xFF; | |
| 182 color >>= 8; | |
| 183 } | |
| 184 style.setColor(SkColorSetA(SkColor(color), alpha)); | |
| 185 } | |
| 186 | |
| 187 void BaseContext::GetFillStyle(Local<String> name, | |
| 188 const PropertyCallbackInfo<Value>& info) { | |
|
robertphillips
2014/03/04 20:05:03
baseContext
jcgregorio
2014/03/04 20:29:31
Done, here and all below.
On 2014/03/04 20:05:03,
| |
| 189 BaseContext* BaseContext = Unwrap(info.This()); | |
|
robertphillips
2014/03/04 20:05:03
this->
| |
| 190 GetStyle(name, info, BaseContext->fFillStyle); | |
| 191 } | |
| 192 | |
| 193 void BaseContext::GetStrokeStyle(Local<String> name, | |
| 194 const PropertyCallbackInfo<Value>& info) { | |
|
robertphillips
2014/03/04 20:05:03
baseContext
| |
| 195 BaseContext* BaseContext = Unwrap(info.This()); | |
|
robertphillips
2014/03/04 20:05:03
this->
| |
| 196 GetStyle(name, info, BaseContext->fStrokeStyle); | |
| 197 } | |
| 198 | |
| 199 void BaseContext::SetFillStyle(Local<String> name, Local<Value> value, | |
| 200 const PropertyCallbackInfo<void>& info) { | |
|
robertphillips
2014/03/04 20:05:03
baseContext
| |
| 201 BaseContext* BaseContext = Unwrap(info.This()); | |
|
robertphillips
2014/03/04 20:05:03
this->
| |
| 202 SetStyle(name, value, info, BaseContext->fFillStyle); | |
| 203 } | |
| 204 | |
| 205 void BaseContext::SetStrokeStyle(Local<String> name, Local<Value> value, | |
| 206 const PropertyCallbackInfo<void>& info) { | |
|
robertphillips
2014/03/04 20:05:03
baseContext
| |
| 207 BaseContext* BaseContext = Unwrap(info.This()); | |
|
robertphillips
2014/03/04 20:05:03
this->
| |
| 208 SetStyle(name, value, info, BaseContext->fStrokeStyle); | |
| 209 } | |
| 210 | |
| 211 | |
| 212 void BaseContext::GetWidth(Local<String> name, | |
| 213 const PropertyCallbackInfo<Value>& info) { | |
|
robertphillips
2014/03/04 20:05:03
baseContext
| |
| 214 BaseContext* BaseContext = Unwrap(info.This()); | |
| 215 SkCanvas* canvas = BaseContext->getCanvas(); | |
| 216 if (NULL == canvas) { return; } | |
| 217 SkISize size = canvas->getDeviceSize(); | |
| 218 | |
| 219 info.GetReturnValue().Set( | |
| 220 Int32::New(BaseContext->fGlobal->getIsolate(), size.fWidth)); | |
| 221 } | |
| 222 | |
| 223 void BaseContext::GetHeight(Local<String> name, | |
| 224 const PropertyCallbackInfo<Value>& info) { | |
|
robertphillips
2014/03/04 20:05:03
baseContext
| |
| 225 BaseContext* BaseContext = Unwrap(info.This()); | |
| 226 SkCanvas* canvas = BaseContext->getCanvas(); | |
| 227 if (NULL == canvas) { return; } | |
| 228 SkISize size = canvas->getDeviceSize(); | |
| 229 | |
| 230 info.GetReturnValue().Set( | |
| 231 Int32::New(BaseContext->fGlobal->getIsolate(), size.fHeight)); | |
| 232 } | |
| 233 | |
| 234 #define ADD_METHOD(name, fn) \ | |
| 235 tmpl->Set(String::NewFromUtf8( \ | |
| 236 fGlobal->getIsolate(), name, \ | |
| 237 String::kInternalizedString), \ | |
| 238 FunctionTemplate::New(fGlobal->getIsolate(), fn)) | |
| 239 | |
| 240 void BaseContext::addAttributesAndMethods(Handle<ObjectTemplate> tmpl) { | |
| 241 HandleScope scope(fGlobal->getIsolate()); | |
| 242 | |
| 243 // Add accessors for each of the fields of the context object. | |
| 244 tmpl->SetAccessor(String::NewFromUtf8( | |
| 245 fGlobal->getIsolate(), "fillStyle", String::kInternalizedString), | |
| 246 GetFillStyle, SetFillStyle); | |
| 247 tmpl->SetAccessor(String::NewFromUtf8( | |
| 248 fGlobal->getIsolate(), "strokeStyle", String::kInternalizedString), | |
| 249 GetStrokeStyle, SetStrokeStyle); | |
| 250 tmpl->SetAccessor(String::NewFromUtf8( | |
| 251 fGlobal->getIsolate(), "width", String::kInternalizedString), | |
| 252 GetWidth); | |
| 253 tmpl->SetAccessor(String::NewFromUtf8( | |
| 254 fGlobal->getIsolate(), "height", String::kInternalizedString), | |
| 255 GetHeight); | |
| 256 | |
| 257 // Add methods. | |
| 258 ADD_METHOD("fillRect", FillRect); | |
| 259 ADD_METHOD("stroke", Stroke); | |
| 260 ADD_METHOD("fill", Fill); | |
| 261 ADD_METHOD("rotate", Rotate); | |
| 262 ADD_METHOD("save", Save); | |
| 263 ADD_METHOD("restore", Restore); | |
| 264 ADD_METHOD("translate", Translate); | |
| 265 ADD_METHOD("resetTransform", ResetTransform); | |
| 266 } | |
| OLD | NEW |