Index: tools/json/SkJSONRenderer.cpp |
diff --git a/tools/json/SkJSONRenderer.cpp b/tools/json/SkJSONRenderer.cpp |
index a44503af5e5ae1bbdea208a68fec7b7311cdecbf..6332b2ae2912aed409ff63dd861fe9c7d788d153 100644 |
--- a/tools/json/SkJSONRenderer.cpp |
+++ b/tools/json/SkJSONRenderer.cpp |
@@ -12,6 +12,8 @@ |
#include "SkJSONCanvas.h" |
#include "SkJSONCPP.h" |
#include "SkPath.h" |
+#include "SkTextBlob.h" |
+#include "SkTypeface.h" |
#include "SkValidatingReadBuffer.h" |
namespace SkJSONRenderer { |
@@ -60,6 +62,8 @@ public: |
void processTextOnPath(Json::Value& command, SkCanvas* target); |
+ void processTextBlob(Json::Value& command, SkCanvas* target); |
+ |
void processPoints(Json::Value& command, SkCanvas* target); |
void processImage(Json::Value& command, SkCanvas* target); |
@@ -122,6 +126,9 @@ void Renderer::processCommand(Json::Value& command, SkCanvas* target) { |
else if (!strcmp(name, SKJSONCANVAS_COMMAND_TEXTONPATH)) { |
this->processTextOnPath(command, target); |
} |
+ else if (!strcmp(name, SKJSONCANVAS_COMMAND_TEXTBLOB)) { |
+ this->processTextBlob(command, target); |
+ } |
else if (!strcmp(name, SKJSONCANVAS_COMMAND_POINTS)) { |
this->processPoints(command, target); |
} |
@@ -304,6 +311,17 @@ static void apply_paint_maskfilter(Json::Value& jsonPaint, SkPaint* target) { |
} |
} |
+static void apply_paint_colorfilter(Json::Value& jsonPaint, SkPaint* target) { |
+ if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_COLORFILTER)) { |
+ Json::Value jsonColorFilter = jsonPaint[SKJSONCANVAS_ATTRIBUTE_COLORFILTER]; |
+ SkColorFilter* colorFilter = (SkColorFilter*) load_flattenable(jsonColorFilter); |
+ if (colorFilter != nullptr) { |
+ target->setColorFilter(colorFilter); |
+ colorFilter->unref(); |
+ } |
+ } |
+} |
+ |
static void apply_paint_xfermode(Json::Value& jsonPaint, SkPaint* target) { |
if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_XFERMODE)) { |
Json::Value jsonXfermode = jsonPaint[SKJSONCANVAS_ATTRIBUTE_XFERMODE]; |
@@ -471,11 +489,25 @@ static void apply_paint_textskewx(Json::Value& jsonPaint, SkPaint* target) { |
} |
} |
+static void apply_paint_typeface(Json::Value& jsonPaint, SkPaint* target) { |
+ if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_TYPEFACE)) { |
+ Json::Value jsonTypeface = jsonPaint[SKJSONCANVAS_ATTRIBUTE_TYPEFACE]; |
+ Json::Value bytes = jsonTypeface[SKJSONCANVAS_ATTRIBUTE_BYTES]; |
+ void* data; |
+ Json::ArrayIndex length = decode_data(bytes, &data); |
+ SkMemoryStream buffer(data, length); |
+ SkTypeface* typeface = SkTypeface::Deserialize(&buffer); |
+ free(data); |
+ target->setTypeface(typeface); |
+ } |
+} |
+ |
void Renderer::getPaint(Json::Value& paint, SkPaint* result) { |
apply_paint_color(paint, result); |
apply_paint_shader(paint, result); |
apply_paint_patheffect(paint, result); |
apply_paint_maskfilter(paint, result); |
+ apply_paint_colorfilter(paint, result); |
apply_paint_xfermode(paint, result); |
apply_paint_imagefilter(paint, result); |
apply_paint_style(paint, result); |
@@ -489,6 +521,7 @@ void Renderer::getPaint(Json::Value& paint, SkPaint* result) { |
apply_paint_textsize(paint, result); |
apply_paint_textscalex(paint, result); |
apply_paint_textskewx(paint, result); |
+ apply_paint_typeface(paint, result); |
} |
void Renderer::getRect(Json::Value& rect, SkRect* result) { |
@@ -717,6 +750,51 @@ void Renderer::processTextOnPath(Json::Value& command, SkCanvas* target) { |
target->drawTextOnPath(text, strlen(text), path, matrixPtr, paint); |
} |
+void Renderer::processTextBlob(Json::Value& command, SkCanvas* target) { |
+ SkTextBlobBuilder builder; |
+ Json::Value runs = command[SKJSONCANVAS_ATTRIBUTE_RUNS]; |
+ for (Json::ArrayIndex i = 0 ; i < runs.size(); i++) { |
+ Json::Value run = runs[i]; |
+ SkPaint font; |
+ font.setTextEncoding(SkPaint::kGlyphID_TextEncoding); |
+ this->getPaint(run[SKJSONCANVAS_ATTRIBUTE_FONT], &font); |
+ Json::Value glyphs = run[SKJSONCANVAS_ATTRIBUTE_GLYPHS]; |
+ int count = glyphs.size(); |
+ Json::Value coords = run[SKJSONCANVAS_ATTRIBUTE_COORDS]; |
+ SkScalar x = coords[0].asFloat(); |
+ SkScalar y = coords[1].asFloat(); |
+ if (run.isMember(SKJSONCANVAS_ATTRIBUTE_POSITIONS)) { |
+ Json::Value positions = run[SKJSONCANVAS_ATTRIBUTE_POSITIONS]; |
+ if (positions.size() > 0 && positions[0].isNumeric()) { |
+ SkTextBlobBuilder::RunBuffer buffer = builder.allocRunPosH(font, count, y); |
+ for (int j = 0; j < count; j++) { |
+ buffer.glyphs[j] = glyphs[j].asUInt(); |
+ buffer.pos[j] = positions[j].asFloat(); |
+ } |
+ } |
+ else { |
+ SkTextBlobBuilder::RunBuffer buffer = builder.allocRunPos(font, count); |
+ for (int j = 0; j < count; j++) { |
+ buffer.glyphs[j] = glyphs[j].asUInt(); |
+ buffer.pos[j * 2] = positions[j][0].asFloat(); |
+ buffer.pos[j * 2 + 1] = positions[j][1].asFloat(); |
+ } |
+ } |
+ } |
+ else { |
+ SkTextBlobBuilder::RunBuffer buffer = builder.allocRun(font, count, x, y); |
+ for (int j = 0; j < count; j++) { |
+ buffer.glyphs[j] = glyphs[j].asUInt(); |
+ } |
+ } |
+ } |
+ SkScalar x = command[SKJSONCANVAS_ATTRIBUTE_X].asFloat(); |
+ SkScalar y = command[SKJSONCANVAS_ATTRIBUTE_Y].asFloat(); |
+ SkPaint paint; |
+ this->getPaint(command[SKJSONCANVAS_ATTRIBUTE_PAINT], &paint); |
+ target->drawTextBlob(builder.build(), x, y, paint); |
+} |
+ |
void Renderer::processPoints(Json::Value& command, SkCanvas* target) { |
SkCanvas::PointMode mode; |
const char* jsonMode = command[SKJSONCANVAS_ATTRIBUTE_MODE].asCString(); |