Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(496)

Side by Side Diff: experimental/SkV8Example/SkV8Example.cpp

Issue 108813004: Added canvas.fillStyle with support for just the "#RRGGBB" style of colors. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Review fixes. Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « experimental/SkV8Example/SkV8Example.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2013 Google Inc. 2 * Copyright 2013 Google Inc.
3 * 3 *
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 * 7 *
8 */ 8 */
9 #include <v8.h> 9 #include <v8.h>
10 10
11 using namespace v8; 11 using namespace v8;
12 12
13 #include "SkV8Example.h" 13 #include "SkV8Example.h"
14 14
15 #include "gl/GrGLUtil.h" 15 #include "gl/GrGLUtil.h"
16 #include "gl/GrGLDefines.h" 16 #include "gl/GrGLDefines.h"
17 #include "gl/GrGLInterface.h" 17 #include "gl/GrGLInterface.h"
18 #include "SkApplication.h" 18 #include "SkApplication.h"
19 #include "SkDraw.h" 19 #include "SkDraw.h"
20 #include "SkGpuDevice.h" 20 #include "SkGpuDevice.h"
21 #include "SkGraphics.h" 21 #include "SkGraphics.h"
22 #include "SkScalar.h"
22 23
23 24
24 void application_init() { 25 void application_init() {
25 SkGraphics::Init(); 26 SkGraphics::Init();
26 SkEvent::Init(); 27 SkEvent::Init();
27 } 28 }
28 29
29 void application_term() { 30 void application_term() {
30 SkEvent::Term(); 31 SkEvent::Term();
31 SkGraphics::Term(); 32 SkGraphics::Term();
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 const char* stack_trace_string = ToCString(stack_trace); 73 const char* stack_trace_string = ToCString(stack_trace);
73 fprintf(stderr, "%s\n", stack_trace_string); 74 fprintf(stderr, "%s\n", stack_trace_string);
74 } 75 }
75 } 76 }
76 } 77 }
77 78
78 SkV8ExampleWindow::SkV8ExampleWindow(void* hwnd, JsCanvas* canvas) 79 SkV8ExampleWindow::SkV8ExampleWindow(void* hwnd, JsCanvas* canvas)
79 : INHERITED(hwnd) 80 : INHERITED(hwnd)
80 , fJsCanvas(canvas) 81 , fJsCanvas(canvas)
81 { 82 {
82 fRotationAngle = SkIntToScalar(0);
83 this->setConfig(SkBitmap::kARGB_8888_Config); 83 this->setConfig(SkBitmap::kARGB_8888_Config);
84 this->setVisibleP(true); 84 this->setVisibleP(true);
85 this->setClipToBounds(false); 85 this->setClipToBounds(false);
86 } 86 }
87 87
88 JsCanvas* JsCanvas::unwrap(Handle<Object> obj) { 88 JsCanvas* JsCanvas::Unwrap(Handle<Object> obj) {
89 Handle<External> field = Handle<External>::Cast(obj->GetInternalField(0)); 89 Handle<External> field = Handle<External>::Cast(obj->GetInternalField(0));
90 void* ptr = field->Value(); 90 void* ptr = field->Value();
91 return static_cast<JsCanvas*>(ptr); 91 return static_cast<JsCanvas*>(ptr);
92 } 92 }
93 93
94 void JsCanvas::inval(const v8::FunctionCallbackInfo<Value>& args) { 94 void JsCanvas::Inval(const v8::FunctionCallbackInfo<Value>& args) {
95 unwrap(args.This())->fWindow->inval(NULL); 95 Unwrap(args.This())->fWindow->inval(NULL);
96 } 96 }
97 97
98 void JsCanvas::drawRect(const v8::FunctionCallbackInfo<Value>& args) { 98 void JsCanvas::FillRect(const v8::FunctionCallbackInfo<Value>& args) {
99 SkCanvas* canvas = unwrap(args.This())->fCanvas; 99 JsCanvas* jsCanvas = Unwrap(args.This());
100 SkCanvas* canvas = jsCanvas->fCanvas;
100 101
101 canvas->drawColor(SK_ColorWHITE); 102 if (args.Length() != 4) {
103 args.GetIsolate()->ThrowException(
104 v8::String::NewFromUtf8(
105 args.GetIsolate(), "Error: 4 arguments required."));
106 return;
107 }
108 // TODO(jcgregorio) Really figure out the conversion from JS numbers to
109 // SkScalars. Maybe test if int first? Not sure of the performance impact.
110 double x = args[0]->NumberValue();
111 double y = args[1]->NumberValue();
112 double w = args[2]->NumberValue();
113 double h = args[3]->NumberValue();
102 114
103 // Draw a rectangle with red paint.
104 SkPaint paint;
105 paint.setColor(SK_ColorRED);
106 SkRect rect = { 115 SkRect rect = {
107 SkIntToScalar(10), SkIntToScalar(10), 116 SkDoubleToScalar(x),
108 SkIntToScalar(128), SkIntToScalar(128) 117 SkDoubleToScalar(y),
118 SkDoubleToScalar(x) + SkDoubleToScalar(w),
119 SkDoubleToScalar(y) + SkDoubleToScalar(h)
109 }; 120 };
110 canvas->drawRect(rect, paint); 121 canvas->drawRect(rect, jsCanvas->fFillStyle);
111 } 122 }
112 123
124 void JsCanvas::GetFillStyle(Local<String> name,
125 const PropertyCallbackInfo<Value>& info) {
126 JsCanvas* jsCanvas = Unwrap(info.This());
127 SkColor color = jsCanvas->fFillStyle.getColor();
128 char buf[8];
129 sprintf(buf, "#%02X%02X%02X", SkColorGetR(color), SkColorGetG(color),
130 SkColorGetB(color));
131
132 info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), buf));
133 }
134
135 void JsCanvas::SetFillStyle(Local<String> name, Local<Value> value,
136 const PropertyCallbackInfo<void>& info) {
137 JsCanvas* jsCanvas = Unwrap(info.This());
138 Local<String> s = value->ToString();
139 if (s->Length() != 7) {
140 info.GetIsolate()->ThrowException(
141 v8::String::NewFromUtf8(
142 info.GetIsolate(), "Invalid fill style format."));
143 return;
144 }
145 char buf[8];
146 s->WriteUtf8(buf, sizeof(buf));
147
148 if (buf[0] != '#') {
149 info.GetIsolate()->ThrowException(
150 v8::String::NewFromUtf8(
151 info.GetIsolate(), "Invalid fill style format."));
152 return;
153 }
154
155 long color = strtol(buf+1, NULL, 16);
156 jsCanvas->fFillStyle.setColor(SkColorSetA(SkColor(color), SK_AlphaOPAQUE));
157 }
158
159
113 Persistent<ObjectTemplate> JsCanvas::fCanvasTemplate; 160 Persistent<ObjectTemplate> JsCanvas::fCanvasTemplate;
114 161
115 Handle<ObjectTemplate> JsCanvas::makeCanvasTemplate() { 162 Handle<ObjectTemplate> JsCanvas::makeCanvasTemplate() {
116 EscapableHandleScope handleScope(fIsolate); 163 EscapableHandleScope handleScope(fIsolate);
117 164
118 Local<ObjectTemplate> result = ObjectTemplate::New(); 165 Local<ObjectTemplate> result = ObjectTemplate::New();
119 166
120 // Add a field to store the pointer to a JsCanvas instance. 167 // Add a field to store the pointer to a JsCanvas instance.
121 result->SetInternalFieldCount(1); 168 result->SetInternalFieldCount(1);
122 169
123 // Add accessors for each of the fields of the canvas object. 170 // Add accessors for each of the fields of the canvas object.
171 result->SetAccessor(
172 String::NewFromUtf8(fIsolate, "fillStyle", String::kInternalizedString),
173 GetFillStyle, SetFillStyle);
174
175 // Add methods.
124 result->Set( 176 result->Set(
125 String::NewFromUtf8( 177 String::NewFromUtf8(
126 fIsolate, "drawRect", String::kInternalizedString), 178 fIsolate, "fillRect", String::kInternalizedString),
127 FunctionTemplate::New(drawRect)); 179 FunctionTemplate::New(FillRect));
128 result->Set( 180 result->Set(
129 String::NewFromUtf8( 181 String::NewFromUtf8(
130 fIsolate, "inval", String::kInternalizedString), 182 fIsolate, "inval", String::kInternalizedString),
131 FunctionTemplate::New(inval)); 183 FunctionTemplate::New(Inval));
132 184
133 // Return the result through the current handle scope. 185 // Return the result through the current handle scope.
134 return handleScope.Escape(result); 186 return handleScope.Escape(result);
135 } 187 }
136 188
137 189
138 // Wraps 'this' in a Javascript object. 190 // Wraps 'this' in a Javascript object.
139 Handle<Object> JsCanvas::wrap() { 191 Handle<Object> JsCanvas::wrap() {
140 // Handle scope for temporary handles. 192 // Handle scope for temporary handles.
141 EscapableHandleScope handleScope(fIsolate); 193 EscapableHandleScope handleScope(fIsolate);
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
207 String::Utf8Value str(result); 259 String::Utf8Value str(result);
208 const char* cstr = ToCString(str); 260 const char* cstr = ToCString(str);
209 printf("%s\n", cstr); 261 printf("%s\n", cstr);
210 } 262 }
211 } 263 }
212 } 264 }
213 265
214 void SkV8ExampleWindow::onDraw(SkCanvas* canvas) { 266 void SkV8ExampleWindow::onDraw(SkCanvas* canvas) {
215 267
216 canvas->save(); 268 canvas->save();
217 269 canvas->drawColor(SK_ColorWHITE);
218 fRotationAngle += SkDoubleToScalar(0.2);
219 if (fRotationAngle > SkDoubleToScalar(360.0)) {
220 fRotationAngle -= SkDoubleToScalar(360.0);
221 }
222
223 canvas->rotate(fRotationAngle);
224 270
225 // Now jump into JS and call the onDraw(canvas) method defined there. 271 // Now jump into JS and call the onDraw(canvas) method defined there.
226 fJsCanvas->onDraw(canvas, this); 272 fJsCanvas->onDraw(canvas, this);
227 273
228 canvas->restore(); 274 canvas->restore();
229 275
230 INHERITED::onDraw(canvas); 276 INHERITED::onDraw(canvas);
231 } 277 }
232 278
233 279
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
303 const char* cstr = ToCString(str); 349 const char* cstr = ToCString(str);
304 printf("%s\n", cstr); 350 printf("%s\n", cstr);
305 return false; 351 return false;
306 } 352 }
307 } 353 }
308 354
309 Handle<String> fn_name = String::NewFromUtf8(fIsolate, "onDraw"); 355 Handle<String> fn_name = String::NewFromUtf8(fIsolate, "onDraw");
310 Handle<Value> fn_val = context->Global()->Get(fn_name); 356 Handle<Value> fn_val = context->Global()->Get(fn_name);
311 357
312 if (!fn_val->IsFunction()) { 358 if (!fn_val->IsFunction()) {
359 printf("Not a function.\n");
313 return false; 360 return false;
314 } 361 }
315 362
316 // It is a function; cast it to a Function. 363 // It is a function; cast it to a Function.
317 Handle<Function> fn_fun = Handle<Function>::Cast(fn_val); 364 Handle<Function> fn_fun = Handle<Function>::Cast(fn_val);
318 365
319 // Store the function in a Persistent handle, since we also want that to 366 // Store the function in a Persistent handle, since we also want that to
320 // remain after this call returns. 367 // remain after this call returns.
321 fOnDraw.Reset(fIsolate, fn_fun); 368 fOnDraw.Reset(fIsolate, fn_fun);
322 369
323 // Also make the context persistent. 370 // Also make the context persistent.
324 fContext.Reset(fIsolate, context); 371 fContext.Reset(fIsolate, context);
325 return true; 372 return true;
326 } 373 }
327 374
328 SkOSWindow* create_sk_window(void* hwnd, int argc, char** argv) { 375 SkOSWindow* create_sk_window(void* hwnd, int argc, char** argv) {
329 printf("Started\n"); 376 printf("Started\n");
330 377
331 // Get the default Isolate created at startup. 378 // Get the default Isolate created at startup.
332 Isolate* isolate = Isolate::GetCurrent(); 379 Isolate* isolate = Isolate::GetCurrent();
333 380
334 JsCanvas* jsCanvas = new JsCanvas(isolate); 381 JsCanvas* jsCanvas = new JsCanvas(isolate);
335 const char* script = "function onDraw(canvas){" 382 const char* script =
336 "canvas.drawRect();" 383 "var onDraw = function(){ \n"
337 "canvas.inval();" 384 " var tick = 0; \n"
338 "};"; 385 " function f(canvas) { \n"
386 " tick += 0.001; \n"
387 " canvas.fillStyle = '#00FF00'; \n"
388 " canvas.fillRect(20, 20, 100, Math.abs(Math.cos(tick)*100)); \n"
389 " canvas.inval(); \n"
390 " }; \n"
391 " return f; \n"
392 "}(); \n";
339 if (!jsCanvas->initialize(script)) { 393 if (!jsCanvas->initialize(script)) {
340 printf("Failed to initialize.\n"); 394 printf("Failed to initialize.\n");
341 exit(1); 395 exit(1);
342 } 396 }
343 397
344 return new SkV8ExampleWindow(hwnd, jsCanvas); 398 return new SkV8ExampleWindow(hwnd, jsCanvas);
345 } 399 }
OLDNEW
« no previous file with comments | « experimental/SkV8Example/SkV8Example.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698