Index: tools/json/SkJSONRenderer.cpp |
diff --git a/tools/json/SkJSONRenderer.cpp b/tools/json/SkJSONRenderer.cpp |
index 734ce116b44f46a102be248f78642d503de7740b..4049770c6e08298886ae6d50d6f1a4210c555d3e 100644 |
--- a/tools/json/SkJSONRenderer.cpp |
+++ b/tools/json/SkJSONRenderer.cpp |
@@ -159,6 +159,7 @@ static SkFlattenable* load_flattenable(Json::Value jsonFlattenable) { |
const char* name = jsonFlattenable[SKJSONCANVAS_ATTRIBUTE_NAME].asCString(); |
SkFlattenable::Factory factory = SkFlattenable::NameToFactory(name); |
if (factory == nullptr) { |
+ SkDebugf("no factory for loading '%s'\n", name); |
return nullptr; |
} |
void* data; |
@@ -167,14 +168,56 @@ static SkFlattenable* load_flattenable(Json::Value jsonFlattenable) { |
SkFlattenable* result = factory(buffer); |
free(data); |
if (!buffer.isValid()) { |
+ SkDebugf("invalid buffer loading flattenable\n"); |
return nullptr; |
} |
return result; |
} |
+static SkColorType colortype_from_name(const char* name) { |
+ if (!strcmp(name, SKJSONCANVAS_COLORTYPE_ARGB4444)) { |
+ return kARGB_4444_SkColorType; |
+ } |
+ else if (!strcmp(name, SKJSONCANVAS_COLORTYPE_RGBA8888)) { |
+ return kRGBA_8888_SkColorType; |
+ } |
+ else if (!strcmp(name, SKJSONCANVAS_COLORTYPE_BGRA8888)) { |
+ return kBGRA_8888_SkColorType; |
+ } |
+ else if (!strcmp(name, SKJSONCANVAS_COLORTYPE_565)) { |
+ return kRGB_565_SkColorType; |
+ } |
+ else if (!strcmp(name, SKJSONCANVAS_COLORTYPE_GRAY8)) { |
+ return kGray_8_SkColorType; |
+ } |
+ else if (!strcmp(name, SKJSONCANVAS_COLORTYPE_INDEX8)) { |
+ return kIndex_8_SkColorType; |
+ } |
+ else if (!strcmp(name, SKJSONCANVAS_COLORTYPE_ALPHA8)) { |
+ return kAlpha_8_SkColorType; |
+ } |
+ SkASSERT(false); |
+ return kN32_SkColorType; |
+} |
+ |
+static SkBitmap* convert_colortype(SkBitmap* bitmap, SkColorType colorType) { |
+ if (bitmap->colorType() == colorType ) { |
+ return bitmap; |
+ } |
+ SkBitmap* dst = new SkBitmap(); |
+ if (bitmap->copyTo(dst, colorType)) { |
+ delete bitmap; |
+ return dst; |
+ } |
+ SkASSERT(false); |
+ delete dst; |
+ return bitmap; |
+} |
+ |
// caller is responsible for freeing return value |
-static SkBitmap* load_bitmap(Json::Value jsonBitmap) { |
+static SkBitmap* load_bitmap(const Json::Value& jsonBitmap) { |
if (!jsonBitmap.isMember(SKJSONCANVAS_ATTRIBUTE_BYTES)) { |
+ SkDebugf("invalid bitmap\n"); |
return nullptr; |
} |
void* data; |
@@ -187,20 +230,27 @@ static SkBitmap* load_bitmap(Json::Value jsonBitmap) { |
free(decoder); |
if (result != SkImageDecoder::kFailure) { |
free(data); |
+ if (jsonBitmap.isMember(SKJSONCANVAS_ATTRIBUTE_COLOR)) { |
+ const char* ctName = jsonBitmap[SKJSONCANVAS_ATTRIBUTE_COLOR].asCString(); |
+ SkColorType ct = colortype_from_name(ctName); |
+ if (ct != kIndex_8_SkColorType) { |
+ bitmap = convert_colortype(bitmap, ct); |
+ } |
+ } |
return bitmap; |
} |
- SkDebugf("image decode failed"); |
+ SkDebugf("image decode failed\n"); |
free(data); |
return nullptr; |
} |
-static SkImage* load_image(Json::Value jsonImage) { |
+static SkImage* load_image(const Json::Value& jsonImage) { |
SkBitmap* bitmap = load_bitmap(jsonImage); |
if (bitmap == nullptr) { |
return nullptr; |
} |
SkImage* result = SkImage::NewFromBitmap(*bitmap); |
- free(bitmap); |
+ delete bitmap; |
return result; |
} |
@@ -248,6 +298,17 @@ static void apply_paint_xfermode(Json::Value& jsonPaint, SkPaint* target) { |
} |
} |
+static void apply_paint_imagefilter(Json::Value& jsonPaint, SkPaint* target) { |
+ if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_IMAGEFILTER)) { |
+ Json::Value jsonImageFilter = jsonPaint[SKJSONCANVAS_ATTRIBUTE_IMAGEFILTER]; |
+ SkImageFilter* imageFilter = (SkImageFilter*) load_flattenable(jsonImageFilter); |
+ if (imageFilter != nullptr) { |
+ target->setImageFilter(imageFilter); |
+ imageFilter->unref(); |
+ } |
+ } |
+} |
+ |
static void apply_paint_style(Json::Value& jsonPaint, SkPaint* target) { |
if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_STYLE)) { |
const char* style = jsonPaint[SKJSONCANVAS_ATTRIBUTE_STYLE].asCString(); |
@@ -400,6 +461,7 @@ void Renderer::getPaint(Json::Value& command, SkPaint* result) { |
apply_paint_patheffect(jsonPaint, result); |
apply_paint_maskfilter(jsonPaint, result); |
apply_paint_xfermode(jsonPaint, result); |
+ apply_paint_imagefilter(jsonPaint, result); |
apply_paint_style(jsonPaint, result); |
apply_paint_strokewidth(jsonPaint, result); |
apply_paint_strokemiter(jsonPaint, result); |