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

Side by Side Diff: tools/json/SkJSONRenderer.cpp

Issue 1662503003: support for more features when rendering to/from JSON (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 4 years, 10 months 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 | « tools/json/SkJSONCanvas.cpp ('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 2016 Google Inc. 2 * Copyright 2016 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "SkJSONRenderer.h" 8 #include "SkJSONRenderer.h"
9 9
10 #include "SkBlurMaskFilter.h" 10 #include "SkBlurMaskFilter.h"
11 #include "SkDashPathEffect.h" 11 #include "SkDashPathEffect.h"
12 #include "SkJSONCanvas.h" 12 #include "SkJSONCanvas.h"
13 #include "SkJSONCPP.h" 13 #include "SkJSONCPP.h"
14 #include "SkPath.h" 14 #include "SkPath.h"
15 #include "SkValidatingReadBuffer.h"
15 16
16 namespace SkJSONRenderer { 17 namespace SkJSONRenderer {
17 18
18 class Renderer { 19 class Renderer {
19 public: 20 public:
20 void getPaint(Json::Value& command, SkPaint* paint); 21 void getPaint(Json::Value& command, SkPaint* paint);
21 22
22 void getRect(Json::Value& command, const char* name, SkRect* rect); 23 void getRect(Json::Value& command, const char* name, SkRect* rect);
23 24
24 void getRRect(Json::Value& command, const char* name, SkRRect* rrect); 25 void getRRect(Json::Value& command, const char* name, SkRRect* rrect);
25 26
26 void getPath(Json::Value& command, SkPath* path); 27 void getPath(Json::Value& command, SkPath* path);
27 28
28 SkRegion::Op getRegionOp(Json::Value& command); 29 SkRegion::Op getRegionOp(Json::Value& command);
29 30
30 void processCommand(Json::Value& command, SkCanvas* target); 31 void processCommand(Json::Value& command, SkCanvas* target);
31 32
32 void processMatrix(Json::Value& command, SkCanvas* target); 33 void processMatrix(Json::Value& command, SkCanvas* target);
33 34
34 void processSave(Json::Value& command, SkCanvas* target); 35 void processSave(Json::Value& command, SkCanvas* target);
35 36
36 void processRestore(Json::Value& command, SkCanvas* target); 37 void processRestore(Json::Value& command, SkCanvas* target);
37 38
39 void processSaveLayer(Json::Value& command, SkCanvas* target);
40
38 void processPaint(Json::Value& command, SkCanvas* target); 41 void processPaint(Json::Value& command, SkCanvas* target);
39 42
40 void processRect(Json::Value& command, SkCanvas* target); 43 void processRect(Json::Value& command, SkCanvas* target);
41 44
42 void processRRect(Json::Value& command, SkCanvas* target); 45 void processRRect(Json::Value& command, SkCanvas* target);
43 46
44 void processOval(Json::Value& command, SkCanvas* target); 47 void processOval(Json::Value& command, SkCanvas* target);
45 48
46 void processPath(Json::Value& command, SkCanvas* target); 49 void processPath(Json::Value& command, SkCanvas* target);
47 50
48 void processText(Json::Value& command, SkCanvas* target); 51 void processText(Json::Value& command, SkCanvas* target);
49 52
50 void processPosText(Json::Value& command, SkCanvas* target); 53 void processPosText(Json::Value& command, SkCanvas* target);
51 54
52 void processPoints(Json::Value& command, SkCanvas* target); 55 void processPoints(Json::Value& command, SkCanvas* target);
53 56
57 void processImage(Json::Value& command, SkCanvas* target);
58
59 void processImageRect(Json::Value& command, SkCanvas* target);
60
61 void processBitmap(Json::Value& command, SkCanvas* target);
62
63 void processBitmapRect(Json::Value& command, SkCanvas* target);
64
54 void processClipRect(Json::Value& command, SkCanvas* target); 65 void processClipRect(Json::Value& command, SkCanvas* target);
55 66
56 void processClipRRect(Json::Value& command, SkCanvas* target); 67 void processClipRRect(Json::Value& command, SkCanvas* target);
57 68
58 void processClipPath(Json::Value& command, SkCanvas* target); 69 void processClipPath(Json::Value& command, SkCanvas* target);
59 }; 70 };
60 71
61 void Renderer::processCommand(Json::Value& command, SkCanvas* target) { 72 void Renderer::processCommand(Json::Value& command, SkCanvas* target) {
62 const char* name = command[SKJSONCANVAS_COMMAND].asCString(); 73 const char* name = command[SKJSONCANVAS_COMMAND].asCString();
63 // TODO speed this up with a hash 74 // TODO speed this up with a hash
64 if (!strcmp(name, SKJSONCANVAS_COMMAND_MATRIX)) { 75 if (!strcmp(name, SKJSONCANVAS_COMMAND_MATRIX)) {
65 this->processMatrix(command, target); 76 this->processMatrix(command, target);
66 } 77 }
67 else if (!strcmp(name, SKJSONCANVAS_COMMAND_SAVE)) { 78 else if (!strcmp(name, SKJSONCANVAS_COMMAND_SAVE)) {
68 this->processSave(command, target); 79 this->processSave(command, target);
69 } 80 }
70 else if (!strcmp(name, SKJSONCANVAS_COMMAND_RESTORE)) { 81 else if (!strcmp(name, SKJSONCANVAS_COMMAND_RESTORE)) {
71 this->processRestore(command, target); 82 this->processRestore(command, target);
72 } 83 }
84 else if (!strcmp(name, SKJSONCANVAS_COMMAND_SAVELAYER)) {
85 this->processSaveLayer(command, target);
86 }
73 else if (!strcmp(name, SKJSONCANVAS_COMMAND_PAINT)) { 87 else if (!strcmp(name, SKJSONCANVAS_COMMAND_PAINT)) {
74 this->processPaint(command, target); 88 this->processPaint(command, target);
75 } 89 }
76 else if (!strcmp(name, SKJSONCANVAS_COMMAND_RECT)) { 90 else if (!strcmp(name, SKJSONCANVAS_COMMAND_RECT)) {
77 this->processRect(command, target); 91 this->processRect(command, target);
78 } 92 }
79 else if (!strcmp(name, SKJSONCANVAS_COMMAND_RRECT)) { 93 else if (!strcmp(name, SKJSONCANVAS_COMMAND_RRECT)) {
80 this->processRRect(command, target); 94 this->processRRect(command, target);
81 } 95 }
82 else if (!strcmp(name, SKJSONCANVAS_COMMAND_OVAL)) { 96 else if (!strcmp(name, SKJSONCANVAS_COMMAND_OVAL)) {
83 this->processOval(command, target); 97 this->processOval(command, target);
84 } 98 }
85 else if (!strcmp(name, SKJSONCANVAS_COMMAND_PATH)) { 99 else if (!strcmp(name, SKJSONCANVAS_COMMAND_PATH)) {
86 this->processPath(command, target); 100 this->processPath(command, target);
87 } 101 }
88 else if (!strcmp(name, SKJSONCANVAS_COMMAND_TEXT)) { 102 else if (!strcmp(name, SKJSONCANVAS_COMMAND_TEXT)) {
89 this->processText(command, target); 103 this->processText(command, target);
90 } 104 }
91 else if (!strcmp(name, SKJSONCANVAS_COMMAND_POSTEXT)) { 105 else if (!strcmp(name, SKJSONCANVAS_COMMAND_POSTEXT)) {
92 this->processPosText(command, target); 106 this->processPosText(command, target);
93 } 107 }
94 else if (!strcmp(name, SKJSONCANVAS_COMMAND_POINTS)) { 108 else if (!strcmp(name, SKJSONCANVAS_COMMAND_POINTS)) {
95 this->processPoints(command, target); 109 this->processPoints(command, target);
96 } 110 }
111 else if (!strcmp(name, SKJSONCANVAS_COMMAND_IMAGE)) {
112 this->processImage(command, target);
113 }
114 else if (!strcmp(name, SKJSONCANVAS_COMMAND_IMAGERECT)) {
115 this->processImageRect(command, target);
116 }
117 else if (!strcmp(name, SKJSONCANVAS_COMMAND_BITMAP)) {
118 this->processBitmap(command, target);
119 }
120 else if (!strcmp(name, SKJSONCANVAS_COMMAND_BITMAPRECT)) {
121 this->processBitmapRect(command, target);
122 }
97 else if (!strcmp(name, SKJSONCANVAS_COMMAND_CLIPRECT)) { 123 else if (!strcmp(name, SKJSONCANVAS_COMMAND_CLIPRECT)) {
98 this->processClipRect(command, target); 124 this->processClipRect(command, target);
99 } 125 }
100 else if (!strcmp(name, SKJSONCANVAS_COMMAND_CLIPRRECT)) { 126 else if (!strcmp(name, SKJSONCANVAS_COMMAND_CLIPRRECT)) {
101 this->processClipRRect(command, target); 127 this->processClipRRect(command, target);
102 } 128 }
103 else if (!strcmp(name, SKJSONCANVAS_COMMAND_CLIPPATH)) { 129 else if (!strcmp(name, SKJSONCANVAS_COMMAND_CLIPPATH)) {
104 this->processClipPath(command, target); 130 this->processClipPath(command, target);
105 } 131 }
106 else { 132 else {
107 SkDebugf("unsupported JSON command: %s\n", name); 133 SkDebugf("unsupported JSON command: %s\n", name);
108 } 134 }
109 } 135 }
110 136
111 void Renderer::getPaint(Json::Value& command, SkPaint* result) { 137 static void apply_paint_color(Json::Value& jsonPaint, SkPaint* target) {
112 Json::Value jsonPaint = command[SKJSONCANVAS_ATTRIBUTE_PAINT];
113 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_COLOR)) { 138 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_COLOR)) {
114 Json::Value color = jsonPaint[SKJSONCANVAS_ATTRIBUTE_COLOR]; 139 Json::Value color = jsonPaint[SKJSONCANVAS_ATTRIBUTE_COLOR];
115 result->setColor(SkColorSetARGB(color[0].asInt(), color[1].asInt(), colo r[2].asInt(), 140 target->setColor(SkColorSetARGB(color[0].asInt(), color[1].asInt(), colo r[2].asInt(),
116 color[3].asInt())); 141 color[3].asInt()));
117 } 142 }
143 }
144
145 // note that the caller is responsible for freeing the pointer
146 static Json::ArrayIndex decode_data(Json::Value bytes, void** target) {
147 Json::ArrayIndex size = bytes.size();
148 *target = sk_malloc_throw(size);
149 for (Json::ArrayIndex i = 0; i < size; i++) {
150 ((uint8_t*) *target)[i] = bytes[i].asInt();
151 }
152 return size;
153 }
154
155 static SkFlattenable* load_flattenable(Json::Value jsonFlattenable) {
156 if (!jsonFlattenable.isMember(SKJSONCANVAS_ATTRIBUTE_NAME)) {
157 return nullptr;
158 }
159 const char* name = jsonFlattenable[SKJSONCANVAS_ATTRIBUTE_NAME].asCString();
160 SkFlattenable::Factory factory = SkFlattenable::NameToFactory(name);
161 if (factory == nullptr) {
162 return nullptr;
163 }
164 void* data;
165 int size = decode_data(jsonFlattenable[SKJSONCANVAS_ATTRIBUTE_BYTES], &data) ;
166 SkValidatingReadBuffer buffer(data, size);
167 SkFlattenable* result = factory(buffer);
168 free(data);
169 if (!buffer.isValid()) {
170 return nullptr;
171 }
172 return result;
173 }
174
175 // caller is responsible for freeing return value
176 static SkBitmap* load_bitmap(Json::Value jsonBitmap) {
177 if (!jsonBitmap.isMember(SKJSONCANVAS_ATTRIBUTE_BYTES)) {
178 return nullptr;
179 }
180 void* data;
181 int size = decode_data(jsonBitmap[SKJSONCANVAS_ATTRIBUTE_BYTES], &data);
182 SkMemoryStream stream(data, size);
183 SkImageDecoder* decoder = SkImageDecoder::Factory(&stream);
184 SkBitmap* bitmap = new SkBitmap();
185 SkImageDecoder::Result result = decoder->decode(&stream, bitmap,
186 SkImageDecoder::kDecodePixel s_Mode);
187 free(decoder);
188 if (result != SkImageDecoder::kFailure) {
189 free(data);
190 return bitmap;
191 }
192 SkDebugf("image decode failed");
193 free(data);
194 return nullptr;
195 }
196
197 static SkImage* load_image(Json::Value jsonImage) {
198 SkBitmap* bitmap = load_bitmap(jsonImage);
199 if (bitmap == nullptr) {
200 return nullptr;
201 }
202 SkImage* result = SkImage::NewFromBitmap(*bitmap);
203 free(bitmap);
204 return result;
205 }
206
207 static void apply_paint_shader(Json::Value& jsonPaint, SkPaint* target) {
208 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_SHADER)) {
209 Json::Value jsonShader = jsonPaint[SKJSONCANVAS_ATTRIBUTE_SHADER];
210 SkShader* shader = (SkShader*) load_flattenable(jsonShader);
211 if (shader != nullptr) {
212 target->setShader(shader);
213 shader->unref();
214 }
215 }
216 }
217
218 static void apply_paint_patheffect(Json::Value& jsonPaint, SkPaint* target) {
219 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_PATHEFFECT)) {
220 Json::Value jsonPathEffect = jsonPaint[SKJSONCANVAS_ATTRIBUTE_PATHEFFECT ];
221 SkPathEffect* pathEffect = (SkPathEffect*) load_flattenable(jsonPathEffe ct);
222 if (pathEffect != nullptr) {
223 target->setPathEffect(pathEffect);
224 pathEffect->unref();
225 }
226 }
227 }
228
229 static void apply_paint_maskfilter(Json::Value& jsonPaint, SkPaint* target) {
230 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_MASKFILTER)) {
231 Json::Value jsonMaskFilter = jsonPaint[SKJSONCANVAS_ATTRIBUTE_MASKFILTER ];
232 SkMaskFilter* maskFilter = (SkMaskFilter*) load_flattenable(jsonMaskFilt er);
233 if (maskFilter != nullptr) {
234 target->setMaskFilter(maskFilter);
235 maskFilter->unref();
236 }
237 }
238 }
239
240 static void apply_paint_xfermode(Json::Value& jsonPaint, SkPaint* target) {
241 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_XFERMODE)) {
242 Json::Value jsonXfermode = jsonPaint[SKJSONCANVAS_ATTRIBUTE_XFERMODE];
243 SkXfermode* xfermode = (SkXfermode*) load_flattenable(jsonXfermode);
244 if (xfermode != nullptr) {
245 target->setXfermode(xfermode);
246 xfermode->unref();
247 }
248 }
249 }
250
251 static void apply_paint_style(Json::Value& jsonPaint, SkPaint* target) {
118 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_STYLE)) { 252 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_STYLE)) {
119 const char* style = jsonPaint[SKJSONCANVAS_ATTRIBUTE_STYLE].asCString(); 253 const char* style = jsonPaint[SKJSONCANVAS_ATTRIBUTE_STYLE].asCString();
120 if (!strcmp(style, SKJSONCANVAS_STYLE_FILL)) { 254 if (!strcmp(style, SKJSONCANVAS_STYLE_FILL)) {
121 result->setStyle(SkPaint::kFill_Style); 255 target->setStyle(SkPaint::kFill_Style);
122 } 256 }
123 else if (!strcmp(style, SKJSONCANVAS_STYLE_STROKE)) { 257 else if (!strcmp(style, SKJSONCANVAS_STYLE_STROKE)) {
124 result->setStyle(SkPaint::kStroke_Style); 258 target->setStyle(SkPaint::kStroke_Style);
125 } 259 }
126 else if (!strcmp(style, SKJSONCANVAS_STYLE_STROKEANDFILL)) { 260 else if (!strcmp(style, SKJSONCANVAS_STYLE_STROKEANDFILL)) {
127 result->setStyle(SkPaint::kStrokeAndFill_Style); 261 target->setStyle(SkPaint::kStrokeAndFill_Style);
128 } 262 }
129 } 263 }
264 }
265
266 static void apply_paint_strokewidth(Json::Value& jsonPaint, SkPaint* target) {
130 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_STROKEWIDTH)) { 267 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_STROKEWIDTH)) {
131 float strokeWidth = jsonPaint[SKJSONCANVAS_ATTRIBUTE_STROKEWIDTH].asFloa t(); 268 float strokeWidth = jsonPaint[SKJSONCANVAS_ATTRIBUTE_STROKEWIDTH].asFloa t();
132 result->setStrokeWidth(strokeWidth); 269 target->setStrokeWidth(strokeWidth);
270 }
271 }
272
273 static void apply_paint_strokemiter(Json::Value& jsonPaint, SkPaint* target) {
274 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_STROKEMITER)) {
275 float strokeMiter = jsonPaint[SKJSONCANVAS_ATTRIBUTE_STROKEMITER].asFloa t();
276 target->setStrokeMiter(strokeMiter);
277 }
278 }
279
280 static void apply_paint_cap(Json::Value& jsonPaint, SkPaint* target) {
281 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_CAP)) {
282 const char* cap = jsonPaint[SKJSONCANVAS_ATTRIBUTE_CAP].asCString();
283 if (!strcmp(cap, SKJSONCANVAS_CAP_BUTT)) {
284 target->setStrokeCap(SkPaint::kButt_Cap);
285 }
286 else if (!strcmp(cap, SKJSONCANVAS_CAP_ROUND)) {
287 target->setStrokeCap(SkPaint::kRound_Cap);
288 }
289 else if (!strcmp(cap, SKJSONCANVAS_CAP_SQUARE)) {
290 target->setStrokeCap(SkPaint::kSquare_Cap);
291 }
133 } 292 }
293 }
294
295 static void apply_paint_antialias(Json::Value& jsonPaint, SkPaint* target) {
134 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_ANTIALIAS)) { 296 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_ANTIALIAS)) {
135 result->setAntiAlias(jsonPaint[SKJSONCANVAS_ATTRIBUTE_ANTIALIAS].asBool( )); 297 target->setAntiAlias(jsonPaint[SKJSONCANVAS_ATTRIBUTE_ANTIALIAS].asBool( ));
136 } 298 }
299 }
300
301 static void apply_paint_blur(Json::Value& jsonPaint, SkPaint* target) {
137 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_BLUR)) { 302 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_BLUR)) {
138 Json::Value blur = jsonPaint[SKJSONCANVAS_ATTRIBUTE_BLUR]; 303 Json::Value blur = jsonPaint[SKJSONCANVAS_ATTRIBUTE_BLUR];
139 SkScalar sigma = blur[SKJSONCANVAS_ATTRIBUTE_SIGMA].asFloat(); 304 SkScalar sigma = blur[SKJSONCANVAS_ATTRIBUTE_SIGMA].asFloat();
140 SkBlurStyle style; 305 SkBlurStyle style;
141 const char* jsonStyle = blur[SKJSONCANVAS_ATTRIBUTE_STYLE].asCString(); 306 const char* jsonStyle = blur[SKJSONCANVAS_ATTRIBUTE_STYLE].asCString();
142 if (!strcmp(jsonStyle, SKJSONCANVAS_BLURSTYLE_NORMAL)) { 307 if (!strcmp(jsonStyle, SKJSONCANVAS_BLURSTYLE_NORMAL)) {
143 style = SkBlurStyle::kNormal_SkBlurStyle; 308 style = SkBlurStyle::kNormal_SkBlurStyle;
144 } 309 }
145 else if (!strcmp(jsonStyle, SKJSONCANVAS_BLURSTYLE_SOLID)) { 310 else if (!strcmp(jsonStyle, SKJSONCANVAS_BLURSTYLE_SOLID)) {
146 style = SkBlurStyle::kSolid_SkBlurStyle; 311 style = SkBlurStyle::kSolid_SkBlurStyle;
(...skipping 13 matching lines...) Expand all
160 if (!strcmp(jsonQuality, SKJSONCANVAS_BLURQUALITY_LOW)) { 325 if (!strcmp(jsonQuality, SKJSONCANVAS_BLURQUALITY_LOW)) {
161 flags = SkBlurMaskFilter::BlurFlags::kNone_BlurFlag; 326 flags = SkBlurMaskFilter::BlurFlags::kNone_BlurFlag;
162 } 327 }
163 else if (!strcmp(jsonQuality, SKJSONCANVAS_BLURQUALITY_HIGH)) { 328 else if (!strcmp(jsonQuality, SKJSONCANVAS_BLURQUALITY_HIGH)) {
164 flags = SkBlurMaskFilter::BlurFlags::kHighQuality_BlurFlag; 329 flags = SkBlurMaskFilter::BlurFlags::kHighQuality_BlurFlag;
165 } 330 }
166 else { 331 else {
167 SkASSERT(false); 332 SkASSERT(false);
168 flags = SkBlurMaskFilter::BlurFlags::kNone_BlurFlag; 333 flags = SkBlurMaskFilter::BlurFlags::kNone_BlurFlag;
169 } 334 }
170 result->setMaskFilter(SkBlurMaskFilter::Create(style, sigma, flags)); 335 target->setMaskFilter(SkBlurMaskFilter::Create(style, sigma, flags));
171 } 336 }
337 }
338
339 static void apply_paint_dashing(Json::Value& jsonPaint, SkPaint* target) {
172 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_DASHING)) { 340 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_DASHING)) {
173 Json::Value dash = jsonPaint[SKJSONCANVAS_ATTRIBUTE_DASHING]; 341 Json::Value dash = jsonPaint[SKJSONCANVAS_ATTRIBUTE_DASHING];
174 Json::Value jsonIntervals = dash[SKJSONCANVAS_ATTRIBUTE_INTERVALS]; 342 Json::Value jsonIntervals = dash[SKJSONCANVAS_ATTRIBUTE_INTERVALS];
175 Json::ArrayIndex count = jsonIntervals.size(); 343 Json::ArrayIndex count = jsonIntervals.size();
176 SkScalar* intervals = (SkScalar*) sk_malloc_throw(count * sizeof(SkScala r)); 344 SkScalar* intervals = (SkScalar*) sk_malloc_throw(count * sizeof(SkScala r));
177 for (Json::ArrayIndex i = 0; i < count; i++) { 345 for (Json::ArrayIndex i = 0; i < count; i++) {
178 intervals[i] = jsonIntervals[i].asFloat(); 346 intervals[i] = jsonIntervals[i].asFloat();
179 } 347 }
180 SkScalar phase = dash[SKJSONCANVAS_ATTRIBUTE_PHASE].asFloat(); 348 SkScalar phase = dash[SKJSONCANVAS_ATTRIBUTE_PHASE].asFloat();
181 result->setPathEffect(SkDashPathEffect::Create(intervals, count, phase)) ; 349 target->setPathEffect(SkDashPathEffect::Create(intervals, count, phase)) ;
182 free(intervals); 350 free(intervals);
183 } 351 }
352 }
353
354 static void apply_paint_textalign(Json::Value& jsonPaint, SkPaint* target) {
184 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_TEXTALIGN)) { 355 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_TEXTALIGN)) {
185 SkPaint::Align textAlign; 356 SkPaint::Align textAlign;
186 const char* jsonAlign = jsonPaint[SKJSONCANVAS_ATTRIBUTE_TEXTALIGN].asCS tring(); 357 const char* jsonAlign = jsonPaint[SKJSONCANVAS_ATTRIBUTE_TEXTALIGN].asCS tring();
187 if (!strcmp(jsonAlign, SKJSONCANVAS_ALIGN_LEFT)) { 358 if (!strcmp(jsonAlign, SKJSONCANVAS_ALIGN_LEFT)) {
188 textAlign = SkPaint::kLeft_Align; 359 textAlign = SkPaint::kLeft_Align;
189 } 360 }
190 else if (!strcmp(jsonAlign, SKJSONCANVAS_ALIGN_CENTER)) { 361 else if (!strcmp(jsonAlign, SKJSONCANVAS_ALIGN_CENTER)) {
191 textAlign = SkPaint::kCenter_Align; 362 textAlign = SkPaint::kCenter_Align;
192 } 363 }
193 else if (!strcmp(jsonAlign, SKJSONCANVAS_ALIGN_RIGHT)) { 364 else if (!strcmp(jsonAlign, SKJSONCANVAS_ALIGN_RIGHT)) {
194 textAlign = SkPaint::kRight_Align; 365 textAlign = SkPaint::kRight_Align;
195 } 366 }
196 else { 367 else {
197 SkASSERT(false); 368 SkASSERT(false);
198 textAlign = SkPaint::kLeft_Align; 369 textAlign = SkPaint::kLeft_Align;
199 } 370 }
200 result->setTextAlign(textAlign); 371 target->setTextAlign(textAlign);
201 } 372 }
373 }
374
375 static void apply_paint_textsize(Json::Value& jsonPaint, SkPaint* target) {
202 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_TEXTSIZE)) { 376 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_TEXTSIZE)) {
203 float textSize = jsonPaint[SKJSONCANVAS_ATTRIBUTE_TEXTSIZE].asFloat(); 377 float textSize = jsonPaint[SKJSONCANVAS_ATTRIBUTE_TEXTSIZE].asFloat();
204 result->setTextSize(textSize); 378 target->setTextSize(textSize);
205 } 379 }
380 }
381
382 static void apply_paint_textscalex(Json::Value& jsonPaint, SkPaint* target) {
206 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_TEXTSCALEX)) { 383 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_TEXTSCALEX)) {
207 float textScaleX = jsonPaint[SKJSONCANVAS_ATTRIBUTE_TEXTSCALEX].asFloat( ); 384 float textScaleX = jsonPaint[SKJSONCANVAS_ATTRIBUTE_TEXTSCALEX].asFloat( );
208 result->setTextScaleX(textScaleX); 385 target->setTextScaleX(textScaleX);
209 } 386 }
387 }
388
389 static void apply_paint_textskewx(Json::Value& jsonPaint, SkPaint* target) {
210 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_TEXTSKEWX)) { 390 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_TEXTSKEWX)) {
211 float textSkewX = jsonPaint[SKJSONCANVAS_ATTRIBUTE_TEXTSKEWX].asFloat(); 391 float textSkewX = jsonPaint[SKJSONCANVAS_ATTRIBUTE_TEXTSKEWX].asFloat();
212 result->setTextSkewX(textSkewX); 392 target->setTextSkewX(textSkewX);
213 } 393 }
214 } 394 }
215 395
396 void Renderer::getPaint(Json::Value& command, SkPaint* result) {
397 Json::Value jsonPaint = command[SKJSONCANVAS_ATTRIBUTE_PAINT];
398 apply_paint_color(jsonPaint, result);
399 apply_paint_shader(jsonPaint, result);
400 apply_paint_patheffect(jsonPaint, result);
401 apply_paint_maskfilter(jsonPaint, result);
402 apply_paint_xfermode(jsonPaint, result);
403 apply_paint_style(jsonPaint, result);
404 apply_paint_strokewidth(jsonPaint, result);
405 apply_paint_strokemiter(jsonPaint, result);
406 apply_paint_cap(jsonPaint, result);
407 apply_paint_antialias(jsonPaint, result);
408 apply_paint_blur(jsonPaint, result);
409 apply_paint_dashing(jsonPaint, result);
410 apply_paint_textalign(jsonPaint, result);
411 apply_paint_textsize(jsonPaint, result);
412 apply_paint_textscalex(jsonPaint, result);
413 apply_paint_textskewx(jsonPaint, result);
414 }
415
216 void Renderer::getRect(Json::Value& command, const char* name, SkRect* result) { 416 void Renderer::getRect(Json::Value& command, const char* name, SkRect* result) {
217 Json::Value rect = command[name]; 417 Json::Value rect = command[name];
218 result->set(rect[0].asFloat(), rect[1].asFloat(), rect[2].asFloat(), rect[3] .asFloat()); 418 result->set(rect[0].asFloat(), rect[1].asFloat(), rect[2].asFloat(), rect[3] .asFloat());
219 } 419 }
220 420
221 void Renderer::getRRect(Json::Value& command, const char* name, SkRRect* result) { 421 void Renderer::getRRect(Json::Value& command, const char* name, SkRRect* result) {
222 Json::Value rrect = command[name]; 422 Json::Value rrect = command[name];
223 SkVector radii[4] = { 423 SkVector radii[4] = {
224 { rrect[1][0].asFloat(), rrect[1][1].asFloat() }, 424 { rrect[1][0].asFloat(), rrect[1][1].asFloat() },
225 { rrect[2][0].asFloat(), rrect[2][1].asFloat() }, 425 { rrect[2][0].asFloat(), rrect[2][1].asFloat() },
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
323 } 523 }
324 524
325 void Renderer::processSave(Json::Value& command, SkCanvas* target) { 525 void Renderer::processSave(Json::Value& command, SkCanvas* target) {
326 target->save(); 526 target->save();
327 } 527 }
328 528
329 void Renderer::processRestore(Json::Value& command, SkCanvas* target) { 529 void Renderer::processRestore(Json::Value& command, SkCanvas* target) {
330 target->restore(); 530 target->restore();
331 } 531 }
332 532
533 void Renderer::processSaveLayer(Json::Value& command, SkCanvas* target) {
534 SkCanvas::SaveLayerRec rec;
535 SkRect bounds;
536 if (command.isMember(SKJSONCANVAS_ATTRIBUTE_BOUNDS)) {
537 this->getRect(command, SKJSONCANVAS_ATTRIBUTE_BOUNDS, &bounds);
538 rec.fBounds = &bounds;
539 }
540 SkPaint paint;
541 if (command.isMember(SKJSONCANVAS_ATTRIBUTE_PAINT)) {
542 this->getPaint(command, &paint);
543 rec.fPaint = &paint;
544 }
545 if (command.isMember(SKJSONCANVAS_ATTRIBUTE_BACKDROP)) {
546 rec.fBackdrop = (SkImageFilter*) load_flattenable(command[SKJSONCANVAS_A TTRIBUTE_BACKDROP]);
547 }
548 target->saveLayer(rec);
549 if (rec.fBackdrop != nullptr) {
550 rec.fBackdrop->unref();
551 }
552 }
553
333 void Renderer::processPaint(Json::Value& command, SkCanvas* target) { 554 void Renderer::processPaint(Json::Value& command, SkCanvas* target) {
334 SkPaint paint; 555 SkPaint paint;
335 this->getPaint(command, &paint); 556 this->getPaint(command, &paint);
336 target->drawPaint(paint); 557 target->drawPaint(paint);
337 } 558 }
338 559
339 void Renderer::processRect(Json::Value& command, SkCanvas* target) { 560 void Renderer::processRect(Json::Value& command, SkCanvas* target) {
340 SkRect rect; 561 SkRect rect;
341 this->getRect(command, SKJSONCANVAS_ATTRIBUTE_COORDS, &rect); 562 this->getRect(command, SKJSONCANVAS_ATTRIBUTE_COORDS, &rect);
342 SkPaint paint; 563 SkPaint paint;
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
433 command[SKJSONCANVAS_ATTRIBUTE_ANTIALIAS].asBool()); 654 command[SKJSONCANVAS_ATTRIBUTE_ANTIALIAS].asBool());
434 } 655 }
435 656
436 void Renderer::processClipPath(Json::Value& command, SkCanvas* target) { 657 void Renderer::processClipPath(Json::Value& command, SkCanvas* target) {
437 SkPath path; 658 SkPath path;
438 this->getPath(command, &path); 659 this->getPath(command, &path);
439 target->clipPath(path, this->getRegionOp(command), 660 target->clipPath(path, this->getRegionOp(command),
440 command[SKJSONCANVAS_ATTRIBUTE_ANTIALIAS].asBool()); 661 command[SKJSONCANVAS_ATTRIBUTE_ANTIALIAS].asBool());
441 } 662 }
442 663
664 void Renderer::processImage(Json::Value& command, SkCanvas* target) {
665 SkImage* image = load_image(command[SKJSONCANVAS_ATTRIBUTE_IMAGE]);
666 if (image == nullptr) {
667 return;
668 }
669 Json::Value point = command[SKJSONCANVAS_ATTRIBUTE_COORDS];
670 SkPaint* paintPtr;
671 SkPaint paint;
672 if (command.isMember(SKJSONCANVAS_ATTRIBUTE_PAINT)) {
673 this->getPaint(command, &paint);
674 paintPtr = &paint;
675 }
676 else {
677 paintPtr = nullptr;
678 }
679 target->drawImage(image, point[0].asFloat(), point[1].asFloat(), paintPtr);
680 image->unref();
681 }
682
683 void Renderer::processImageRect(Json::Value& command, SkCanvas* target) {
684 SkImage* image = load_image(command[SKJSONCANVAS_ATTRIBUTE_IMAGE]);
685 if (image == nullptr) {
686 return;
687 }
688 SkRect dst;
689 this->getRect(command, SKJSONCANVAS_ATTRIBUTE_DST, &dst);
690 SkPaint* paintPtr;
691 SkPaint paint;
692 if (command.isMember(SKJSONCANVAS_ATTRIBUTE_PAINT)) {
693 this->getPaint(command, &paint);
694 paintPtr = &paint;
695 }
696 else {
697 paintPtr = nullptr;
698 }
699 SkCanvas::SrcRectConstraint constraint;
700 if (command.isMember(SKJSONCANVAS_ATTRIBUTE_STRICT) &&
701 command[SKJSONCANVAS_ATTRIBUTE_STRICT].asBool()) {
702 constraint = SkCanvas::kStrict_SrcRectConstraint;
703 }
704 else {
705 constraint = SkCanvas::kFast_SrcRectConstraint;
706 }
707 if (command.isMember(SKJSONCANVAS_ATTRIBUTE_SRC)) {
708 SkRect src;
709 this->getRect(command, SKJSONCANVAS_ATTRIBUTE_SRC, &src);
710 target->drawImageRect(image, src, dst, paintPtr, constraint);
711 }
712 else {
713 target->drawImageRect(image, dst, paintPtr, constraint);
714 }
715 image->unref();
716 }
717
718 void Renderer::processBitmap(Json::Value& command, SkCanvas* target) {
719 SkImage* image = load_image(command[SKJSONCANVAS_ATTRIBUTE_BITMAP]);
720 if (image == nullptr) {
721 return;
722 }
723 Json::Value point = command[SKJSONCANVAS_ATTRIBUTE_COORDS];
724 SkPaint* paintPtr;
725 SkPaint paint;
726 if (command.isMember(SKJSONCANVAS_ATTRIBUTE_PAINT)) {
727 this->getPaint(command, &paint);
728 paintPtr = &paint;
729 }
730 else {
731 paintPtr = nullptr;
732 }
733 target->drawImage(image, point[0].asFloat(), point[1].asFloat(), paintPtr);
734 image->unref();
735 }
736
737 void Renderer::processBitmapRect(Json::Value& command, SkCanvas* target) {
738 SkBitmap* bitmap = load_bitmap(command[SKJSONCANVAS_ATTRIBUTE_BITMAP]);
739 if (bitmap == nullptr) {
740 return;
741 }
742 SkRect dst;
743 this->getRect(command, SKJSONCANVAS_ATTRIBUTE_DST, &dst);
744 SkPaint* paintPtr;
745 SkPaint paint;
746 if (command.isMember(SKJSONCANVAS_ATTRIBUTE_PAINT)) {
747 this->getPaint(command, &paint);
748 paintPtr = &paint;
749 }
750 else {
751 paintPtr = nullptr;
752 }
753 SkCanvas::SrcRectConstraint constraint;
754 if (command.isMember(SKJSONCANVAS_ATTRIBUTE_STRICT) &&
755 command[SKJSONCANVAS_ATTRIBUTE_STRICT].asBool()) {
756 constraint = SkCanvas::kStrict_SrcRectConstraint;
757 }
758 else {
759 constraint = SkCanvas::kFast_SrcRectConstraint;
760 }
761 if (command.isMember(SKJSONCANVAS_ATTRIBUTE_SRC)) {
762 SkRect src;
763 this->getRect(command, SKJSONCANVAS_ATTRIBUTE_SRC, &src);
764 target->drawBitmapRect(*bitmap, src, dst, paintPtr, constraint);
765 }
766 else {
767 target->drawBitmapRect(*bitmap, dst, paintPtr, constraint);
768 }
769 free(bitmap);
770 }
771
443 void render(const char* json, SkCanvas* target) { 772 void render(const char* json, SkCanvas* target) {
444 Renderer renderer; 773 Renderer renderer;
445 Json::Reader reader; 774 Json::Reader reader;
446 Json::Value root; 775 Json::Value root;
447 if (reader.parse(std::string(json), root)) { 776 if (reader.parse(std::string(json), root)) {
448 SkASSERT(root[SKJSONCANVAS_VERSION].asInt() == 1); 777 SkASSERT(root[SKJSONCANVAS_VERSION].asInt() == 1);
449 Json::Value commands = root[SKJSONCANVAS_COMMANDS]; 778 Json::Value commands = root[SKJSONCANVAS_COMMANDS];
450 for (Json::ArrayIndex i = 0; i < commands.size(); i++) { 779 for (Json::ArrayIndex i = 0; i < commands.size(); i++) {
451 renderer.processCommand(commands[i], target); 780 renderer.processCommand(commands[i], target);
452 } 781 }
453 } 782 }
454 else { 783 else {
455 SkDebugf(json); 784 SkDebugf(json);
456 SkFAIL("json parse failure"); 785 SkFAIL("json parse failure");
457 } 786 }
458 } 787 }
459 788
460 } // namespace 789 } // namespace
OLDNEW
« no previous file with comments | « tools/json/SkJSONCanvas.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698