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

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

Issue 1662063003: Improved support for images/bitmaps in SkJSONCanvas (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"
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
152 return size; 152 return size;
153 } 153 }
154 154
155 static SkFlattenable* load_flattenable(Json::Value jsonFlattenable) { 155 static SkFlattenable* load_flattenable(Json::Value jsonFlattenable) {
156 if (!jsonFlattenable.isMember(SKJSONCANVAS_ATTRIBUTE_NAME)) { 156 if (!jsonFlattenable.isMember(SKJSONCANVAS_ATTRIBUTE_NAME)) {
157 return nullptr; 157 return nullptr;
158 } 158 }
159 const char* name = jsonFlattenable[SKJSONCANVAS_ATTRIBUTE_NAME].asCString(); 159 const char* name = jsonFlattenable[SKJSONCANVAS_ATTRIBUTE_NAME].asCString();
160 SkFlattenable::Factory factory = SkFlattenable::NameToFactory(name); 160 SkFlattenable::Factory factory = SkFlattenable::NameToFactory(name);
161 if (factory == nullptr) { 161 if (factory == nullptr) {
162 SkDebugf("no factory for loading '%s'\n", name);
162 return nullptr; 163 return nullptr;
163 } 164 }
164 void* data; 165 void* data;
165 int size = decode_data(jsonFlattenable[SKJSONCANVAS_ATTRIBUTE_BYTES], &data) ; 166 int size = decode_data(jsonFlattenable[SKJSONCANVAS_ATTRIBUTE_BYTES], &data) ;
166 SkValidatingReadBuffer buffer(data, size); 167 SkValidatingReadBuffer buffer(data, size);
167 SkFlattenable* result = factory(buffer); 168 SkFlattenable* result = factory(buffer);
168 free(data); 169 free(data);
169 if (!buffer.isValid()) { 170 if (!buffer.isValid()) {
171 SkDebugf("invalid buffer loading flattenable\n");
170 return nullptr; 172 return nullptr;
171 } 173 }
172 return result; 174 return result;
173 } 175 }
174 176
177 static SkColorType colortype_from_name(const char* name) {
178 if (!strcmp(name, SKJSONCANVAS_COLORTYPE_ARGB4444)) {
179 return kARGB_4444_SkColorType;
180 }
181 else if (!strcmp(name, SKJSONCANVAS_COLORTYPE_RGBA8888)) {
182 return kRGBA_8888_SkColorType;
183 }
184 else if (!strcmp(name, SKJSONCANVAS_COLORTYPE_BGRA8888)) {
185 return kBGRA_8888_SkColorType;
186 }
187 else if (!strcmp(name, SKJSONCANVAS_COLORTYPE_565)) {
188 return kRGB_565_SkColorType;
189 }
190 else if (!strcmp(name, SKJSONCANVAS_COLORTYPE_GRAY8)) {
191 return kGray_8_SkColorType;
192 }
193 else if (!strcmp(name, SKJSONCANVAS_COLORTYPE_INDEX8)) {
194 return kIndex_8_SkColorType;
195 }
196 else if (!strcmp(name, SKJSONCANVAS_COLORTYPE_ALPHA8)) {
197 return kAlpha_8_SkColorType;
198 }
199 SkASSERT(false);
200 return kN32_SkColorType;
201 }
202
203 static SkBitmap* convert_colortype(SkBitmap* bitmap, SkColorType colorType) {
204 if (bitmap->colorType() == colorType ) {
205 return bitmap;
206 }
207 SkBitmap* dst = new SkBitmap();
208 if (bitmap->copyTo(dst, colorType)) {
209 delete bitmap;
210 return dst;
211 }
212 SkASSERT(false);
213 delete dst;
214 return bitmap;
215 }
216
175 // caller is responsible for freeing return value 217 // caller is responsible for freeing return value
176 static SkBitmap* load_bitmap(Json::Value jsonBitmap) { 218 static SkBitmap* load_bitmap(const Json::Value& jsonBitmap) {
177 if (!jsonBitmap.isMember(SKJSONCANVAS_ATTRIBUTE_BYTES)) { 219 if (!jsonBitmap.isMember(SKJSONCANVAS_ATTRIBUTE_BYTES)) {
220 SkDebugf("invalid bitmap\n");
178 return nullptr; 221 return nullptr;
179 } 222 }
180 void* data; 223 void* data;
181 int size = decode_data(jsonBitmap[SKJSONCANVAS_ATTRIBUTE_BYTES], &data); 224 int size = decode_data(jsonBitmap[SKJSONCANVAS_ATTRIBUTE_BYTES], &data);
182 SkMemoryStream stream(data, size); 225 SkMemoryStream stream(data, size);
183 SkImageDecoder* decoder = SkImageDecoder::Factory(&stream); 226 SkImageDecoder* decoder = SkImageDecoder::Factory(&stream);
184 SkBitmap* bitmap = new SkBitmap(); 227 SkBitmap* bitmap = new SkBitmap();
185 SkImageDecoder::Result result = decoder->decode(&stream, bitmap, 228 SkImageDecoder::Result result = decoder->decode(&stream, bitmap,
186 SkImageDecoder::kDecodePixel s_Mode); 229 SkImageDecoder::kDecodePixel s_Mode);
187 free(decoder); 230 free(decoder);
188 if (result != SkImageDecoder::kFailure) { 231 if (result != SkImageDecoder::kFailure) {
189 free(data); 232 free(data);
233 if (jsonBitmap.isMember(SKJSONCANVAS_ATTRIBUTE_COLOR)) {
234 const char* ctName = jsonBitmap[SKJSONCANVAS_ATTRIBUTE_COLOR].asCStr ing();
235 SkColorType ct = colortype_from_name(ctName);
236 if (ct != kIndex_8_SkColorType) {
237 bitmap = convert_colortype(bitmap, ct);
238 }
239 }
190 return bitmap; 240 return bitmap;
191 } 241 }
192 SkDebugf("image decode failed"); 242 SkDebugf("image decode failed\n");
193 free(data); 243 free(data);
194 return nullptr; 244 return nullptr;
195 } 245 }
196 246
197 static SkImage* load_image(Json::Value jsonImage) { 247 static SkImage* load_image(const Json::Value& jsonImage) {
198 SkBitmap* bitmap = load_bitmap(jsonImage); 248 SkBitmap* bitmap = load_bitmap(jsonImage);
199 if (bitmap == nullptr) { 249 if (bitmap == nullptr) {
200 return nullptr; 250 return nullptr;
201 } 251 }
202 SkImage* result = SkImage::NewFromBitmap(*bitmap); 252 SkImage* result = SkImage::NewFromBitmap(*bitmap);
203 free(bitmap); 253 delete bitmap;
204 return result; 254 return result;
205 } 255 }
206 256
207 static void apply_paint_shader(Json::Value& jsonPaint, SkPaint* target) { 257 static void apply_paint_shader(Json::Value& jsonPaint, SkPaint* target) {
208 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_SHADER)) { 258 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_SHADER)) {
209 Json::Value jsonShader = jsonPaint[SKJSONCANVAS_ATTRIBUTE_SHADER]; 259 Json::Value jsonShader = jsonPaint[SKJSONCANVAS_ATTRIBUTE_SHADER];
210 SkShader* shader = (SkShader*) load_flattenable(jsonShader); 260 SkShader* shader = (SkShader*) load_flattenable(jsonShader);
211 if (shader != nullptr) { 261 if (shader != nullptr) {
212 target->setShader(shader); 262 target->setShader(shader);
213 shader->unref(); 263 shader->unref();
(...skipping 27 matching lines...) Expand all
241 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_XFERMODE)) { 291 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_XFERMODE)) {
242 Json::Value jsonXfermode = jsonPaint[SKJSONCANVAS_ATTRIBUTE_XFERMODE]; 292 Json::Value jsonXfermode = jsonPaint[SKJSONCANVAS_ATTRIBUTE_XFERMODE];
243 SkXfermode* xfermode = (SkXfermode*) load_flattenable(jsonXfermode); 293 SkXfermode* xfermode = (SkXfermode*) load_flattenable(jsonXfermode);
244 if (xfermode != nullptr) { 294 if (xfermode != nullptr) {
245 target->setXfermode(xfermode); 295 target->setXfermode(xfermode);
246 xfermode->unref(); 296 xfermode->unref();
247 } 297 }
248 } 298 }
249 } 299 }
250 300
301 static void apply_paint_imagefilter(Json::Value& jsonPaint, SkPaint* target) {
302 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_IMAGEFILTER)) {
303 Json::Value jsonImageFilter = jsonPaint[SKJSONCANVAS_ATTRIBUTE_IMAGEFILT ER];
304 SkImageFilter* imageFilter = (SkImageFilter*) load_flattenable(jsonImage Filter);
305 if (imageFilter != nullptr) {
306 target->setImageFilter(imageFilter);
307 imageFilter->unref();
308 }
309 }
310 }
311
251 static void apply_paint_style(Json::Value& jsonPaint, SkPaint* target) { 312 static void apply_paint_style(Json::Value& jsonPaint, SkPaint* target) {
252 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_STYLE)) { 313 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_STYLE)) {
253 const char* style = jsonPaint[SKJSONCANVAS_ATTRIBUTE_STYLE].asCString(); 314 const char* style = jsonPaint[SKJSONCANVAS_ATTRIBUTE_STYLE].asCString();
254 if (!strcmp(style, SKJSONCANVAS_STYLE_FILL)) { 315 if (!strcmp(style, SKJSONCANVAS_STYLE_FILL)) {
255 target->setStyle(SkPaint::kFill_Style); 316 target->setStyle(SkPaint::kFill_Style);
256 } 317 }
257 else if (!strcmp(style, SKJSONCANVAS_STYLE_STROKE)) { 318 else if (!strcmp(style, SKJSONCANVAS_STYLE_STROKE)) {
258 target->setStyle(SkPaint::kStroke_Style); 319 target->setStyle(SkPaint::kStroke_Style);
259 } 320 }
260 else if (!strcmp(style, SKJSONCANVAS_STYLE_STROKEANDFILL)) { 321 else if (!strcmp(style, SKJSONCANVAS_STYLE_STROKEANDFILL)) {
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
393 } 454 }
394 } 455 }
395 456
396 void Renderer::getPaint(Json::Value& command, SkPaint* result) { 457 void Renderer::getPaint(Json::Value& command, SkPaint* result) {
397 Json::Value jsonPaint = command[SKJSONCANVAS_ATTRIBUTE_PAINT]; 458 Json::Value jsonPaint = command[SKJSONCANVAS_ATTRIBUTE_PAINT];
398 apply_paint_color(jsonPaint, result); 459 apply_paint_color(jsonPaint, result);
399 apply_paint_shader(jsonPaint, result); 460 apply_paint_shader(jsonPaint, result);
400 apply_paint_patheffect(jsonPaint, result); 461 apply_paint_patheffect(jsonPaint, result);
401 apply_paint_maskfilter(jsonPaint, result); 462 apply_paint_maskfilter(jsonPaint, result);
402 apply_paint_xfermode(jsonPaint, result); 463 apply_paint_xfermode(jsonPaint, result);
464 apply_paint_imagefilter(jsonPaint, result);
403 apply_paint_style(jsonPaint, result); 465 apply_paint_style(jsonPaint, result);
404 apply_paint_strokewidth(jsonPaint, result); 466 apply_paint_strokewidth(jsonPaint, result);
405 apply_paint_strokemiter(jsonPaint, result); 467 apply_paint_strokemiter(jsonPaint, result);
406 apply_paint_cap(jsonPaint, result); 468 apply_paint_cap(jsonPaint, result);
407 apply_paint_antialias(jsonPaint, result); 469 apply_paint_antialias(jsonPaint, result);
408 apply_paint_blur(jsonPaint, result); 470 apply_paint_blur(jsonPaint, result);
409 apply_paint_dashing(jsonPaint, result); 471 apply_paint_dashing(jsonPaint, result);
410 apply_paint_textalign(jsonPaint, result); 472 apply_paint_textalign(jsonPaint, result);
411 apply_paint_textsize(jsonPaint, result); 473 apply_paint_textsize(jsonPaint, result);
412 apply_paint_textscalex(jsonPaint, result); 474 apply_paint_textscalex(jsonPaint, result);
(...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after
780 renderer.processCommand(commands[i], target); 842 renderer.processCommand(commands[i], target);
781 } 843 }
782 } 844 }
783 else { 845 else {
784 SkDebugf(json); 846 SkDebugf(json);
785 SkFAIL("json parse failure"); 847 SkFAIL("json parse failure");
786 } 848 }
787 } 849 }
788 850
789 } // namespace 851 } // 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