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

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: Fix more 80 cols 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
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.
robertphillips 2013/12/11 16:45:46 We shouldn't worry about fixed point.
jcgregorio 2013/12/11 17:23:47 Done.
110 // Also conversion could depend on SkScalar being float or fixed-point.
111 // If fixed-point, check for overflow.
112 double x = args[0]->NumberValue();
113 double y = args[1]->NumberValue();
114 double w = args[2]->NumberValue();
115 double h = args[3]->NumberValue();
102 116
103 // Draw a rectangle with red paint.
104 SkPaint paint;
105 paint.setColor(SK_ColorRED);
106 SkRect rect = { 117 SkRect rect = {
107 SkIntToScalar(10), SkIntToScalar(10), 118 SkDoubleToScalar(x),
108 SkIntToScalar(128), SkIntToScalar(128) 119 SkDoubleToScalar(y),
120 SkDoubleToScalar(x) + SkDoubleToScalar(w),
121 SkDoubleToScalar(y) + SkDoubleToScalar(h)
109 }; 122 };
110 canvas->drawRect(rect, paint); 123 canvas->drawRect(rect, jsCanvas->fFillStyle);
111 } 124 }
112 125
126 void JsCanvas::getFillStyle(Local<String> name,
robertphillips 2013/12/11 16:45:46 line this up with preceding line?
jcgregorio 2013/12/11 17:23:47 Done.
127 const PropertyCallbackInfo<Value>& info) {
128 JsCanvas* jsCanvas = unwrap(info.This());
129 SkColor color = jsCanvas->fFillStyle.getColor();
130 char buf[8];
robertphillips 2013/12/11 16:45:46 _snprintf?
jcgregorio 2013/12/11 17:23:47 Not done per our conversation.
131 sprintf(buf, "#%02X%02X%02X", SkColorGetR(color), SkColorGetG(color),
132 SkColorGetB(color));
133
134 info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), buf));
135 }
136
robertphillips 2013/12/11 16:45:46 rm space in "( L")?
jcgregorio 2013/12/11 17:23:47 Done.
137 void JsCanvas::setFillStyle( Local<String> name, Local<Value> value,
robertphillips 2013/12/11 16:45:46 line this up with preceding line?
jcgregorio 2013/12/11 17:23:47 Done.
138 const PropertyCallbackInfo<void>& info) {
139 JsCanvas* jsCanvas = unwrap(info.This());
140 Local<String> s = value->ToString();
141 if (s->Length() != 7) {
142 info.GetIsolate()->ThrowException(
143 v8::String::NewFromUtf8(
robertphillips 2013/12/11 16:45:46 "Invalid fill style format"?
jcgregorio 2013/12/11 17:23:47 Done.
144 info.GetIsolate(), "Invalid style format."));
145 return;
146 }
147 char buf[8];
148 s->WriteUtf8(buf, sizeof(buf));
robertphillips 2013/12/11 16:45:46 Test if buf[0] == '#'?
jcgregorio 2013/12/11 17:23:47 Done.
149 long color = strtol(buf+1, NULL, 16);
150 jsCanvas->fFillStyle.setColor(SkColorSetA(SkColor(color), SK_AlphaOPAQUE));
151 }
152
153
113 Persistent<ObjectTemplate> JsCanvas::fCanvasTemplate; 154 Persistent<ObjectTemplate> JsCanvas::fCanvasTemplate;
114 155
115 Handle<ObjectTemplate> JsCanvas::makeCanvasTemplate() { 156 Handle<ObjectTemplate> JsCanvas::makeCanvasTemplate() {
116 EscapableHandleScope handleScope(fIsolate); 157 EscapableHandleScope handleScope(fIsolate);
117 158
118 Local<ObjectTemplate> result = ObjectTemplate::New(); 159 Local<ObjectTemplate> result = ObjectTemplate::New();
119 160
120 // Add a field to store the pointer to a JsCanvas instance. 161 // Add a field to store the pointer to a JsCanvas instance.
121 result->SetInternalFieldCount(1); 162 result->SetInternalFieldCount(1);
122 163
123 // Add accessors for each of the fields of the canvas object. 164 // Add accessors for each of the fields of the canvas object.
165 result->SetAccessor(
166 String::NewFromUtf8(fIsolate, "fillStyle", String::kInternalizedString),
167 getFillStyle, setFillStyle);
168
169 // Add methods.
124 result->Set( 170 result->Set(
125 String::NewFromUtf8( 171 String::NewFromUtf8(
126 fIsolate, "drawRect", String::kInternalizedString), 172 fIsolate, "fillRect", String::kInternalizedString),
127 FunctionTemplate::New(drawRect)); 173 FunctionTemplate::New(fillRect));
128 result->Set( 174 result->Set(
129 String::NewFromUtf8( 175 String::NewFromUtf8(
130 fIsolate, "inval", String::kInternalizedString), 176 fIsolate, "inval", String::kInternalizedString),
131 FunctionTemplate::New(inval)); 177 FunctionTemplate::New(inval));
132 178
133 // Return the result through the current handle scope. 179 // Return the result through the current handle scope.
134 return handleScope.Escape(result); 180 return handleScope.Escape(result);
135 } 181 }
136 182
137 183
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
207 String::Utf8Value str(result); 253 String::Utf8Value str(result);
208 const char* cstr = ToCString(str); 254 const char* cstr = ToCString(str);
209 printf("%s\n", cstr); 255 printf("%s\n", cstr);
210 } 256 }
211 } 257 }
212 } 258 }
213 259
214 void SkV8ExampleWindow::onDraw(SkCanvas* canvas) { 260 void SkV8ExampleWindow::onDraw(SkCanvas* canvas) {
215 261
216 canvas->save(); 262 canvas->save();
217 263 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 264
225 // Now jump into JS and call the onDraw(canvas) method defined there. 265 // Now jump into JS and call the onDraw(canvas) method defined there.
226 fJsCanvas->onDraw(canvas, this); 266 fJsCanvas->onDraw(canvas, this);
227 267
228 canvas->restore(); 268 canvas->restore();
229 269
230 INHERITED::onDraw(canvas); 270 INHERITED::onDraw(canvas);
231 } 271 }
232 272
233 273
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
303 const char* cstr = ToCString(str); 343 const char* cstr = ToCString(str);
304 printf("%s\n", cstr); 344 printf("%s\n", cstr);
305 return false; 345 return false;
306 } 346 }
307 } 347 }
308 348
309 Handle<String> fn_name = String::NewFromUtf8(fIsolate, "onDraw"); 349 Handle<String> fn_name = String::NewFromUtf8(fIsolate, "onDraw");
310 Handle<Value> fn_val = context->Global()->Get(fn_name); 350 Handle<Value> fn_val = context->Global()->Get(fn_name);
311 351
312 if (!fn_val->IsFunction()) { 352 if (!fn_val->IsFunction()) {
353 printf("Not a function.\n");
313 return false; 354 return false;
314 } 355 }
315 356
316 // It is a function; cast it to a Function. 357 // It is a function; cast it to a Function.
317 Handle<Function> fn_fun = Handle<Function>::Cast(fn_val); 358 Handle<Function> fn_fun = Handle<Function>::Cast(fn_val);
318 359
319 // Store the function in a Persistent handle, since we also want that to 360 // Store the function in a Persistent handle, since we also want that to
320 // remain after this call returns. 361 // remain after this call returns.
321 fOnDraw.Reset(fIsolate, fn_fun); 362 fOnDraw.Reset(fIsolate, fn_fun);
322 363
323 // Also make the context persistent. 364 // Also make the context persistent.
324 fContext.Reset(fIsolate, context); 365 fContext.Reset(fIsolate, context);
325 return true; 366 return true;
326 } 367 }
327 368
328 SkOSWindow* create_sk_window(void* hwnd, int argc, char** argv) { 369 SkOSWindow* create_sk_window(void* hwnd, int argc, char** argv) {
329 printf("Started\n"); 370 printf("Started\n");
330 371
331 // Get the default Isolate created at startup. 372 // Get the default Isolate created at startup.
332 Isolate* isolate = Isolate::GetCurrent(); 373 Isolate* isolate = Isolate::GetCurrent();
333 374
334 JsCanvas* jsCanvas = new JsCanvas(isolate); 375 JsCanvas* jsCanvas = new JsCanvas(isolate);
335 const char* script = "function onDraw(canvas){" 376 const char* script =
robertphillips 2013/12/11 16:45:46 move var right a bit to line up with }?
jcgregorio 2013/12/11 17:23:47 Reformatted. Eventually would like to add a comma
336 "canvas.drawRect();" 377 "var onDraw = function(){ \n"
337 "canvas.inval();" 378 " var tick = 0; \n"
338 "};"; 379 " function f(canvas) { \n"
380 " tick += 0.001; \n"
381 " canvas.fillStyle = '#00FF00'; \n"
382 " canvas.fillRect(20, 20, 100, Math.abs(Math.cos(tick)*100)); \n"
383 " canvas.inval(); \n"
384 " }; \n"
385 " return f; \n"
386 " }(); \n";
339 if (!jsCanvas->initialize(script)) { 387 if (!jsCanvas->initialize(script)) {
340 printf("Failed to initialize.\n"); 388 printf("Failed to initialize.\n");
341 exit(1); 389 exit(1);
342 } 390 }
343 391
344 return new SkV8ExampleWindow(hwnd, jsCanvas); 392 return new SkV8ExampleWindow(hwnd, jsCanvas);
345 } 393 }
OLDNEW
« experimental/SkV8Example/SkV8Example.h ('K') | « experimental/SkV8Example/SkV8Example.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698