| Index: tools/json/SkJSONCanvas.cpp
|
| diff --git a/tools/json/SkJSONCanvas.cpp b/tools/json/SkJSONCanvas.cpp
|
| index 3a6a2697a8849326cee5334ea73b6d1441511a86..de7c40cca0277ed2b92b7c6dbefb0335521ee0ed 100644
|
| --- a/tools/json/SkJSONCanvas.cpp
|
| +++ b/tools/json/SkJSONCanvas.cpp
|
| @@ -6,12 +6,16 @@
|
| */
|
|
|
| #include "SkJSONCanvas.h"
|
| +#include "SkColorFilter.h"
|
| #include "SkImageFilter.h"
|
| #include "SkMaskFilter.h"
|
| #include "SkPaintDefaults.h"
|
| #include "SkPath.h"
|
| #include "SkPathEffect.h"
|
| #include "SkRRect.h"
|
| +#include "SkTextBlob.h"
|
| +#include "SkTextBlobRunIterator.h"
|
| +#include "SkTypeface.h"
|
| #include "SkWriteBuffer.h"
|
|
|
| SkJSONCanvas::SkJSONCanvas(int width, int height, SkWStream& out, bool sendBinaries)
|
| @@ -398,6 +402,25 @@ static void apply_paint_textalign(const SkPaint& paint, Json::Value* target) {
|
| }
|
| }
|
|
|
| +static void apply_paint_typeface(const SkPaint& paint, Json::Value* target,
|
| + bool sendBinaries) {
|
| + SkTypeface* typeface = paint.getTypeface();
|
| + if (typeface != nullptr) {
|
| + if (sendBinaries) {
|
| + Json::Value jsonTypeface;
|
| + SkDynamicMemoryWStream buffer;
|
| + typeface->serialize(&buffer);
|
| + void* data = sk_malloc_throw(buffer.bytesWritten());
|
| + buffer.copyTo(data);
|
| + Json::Value bytes;
|
| + encode_data(data, buffer.bytesWritten(), &bytes);
|
| + jsonTypeface[SKJSONCANVAS_ATTRIBUTE_BYTES] = bytes;
|
| + free(data);
|
| + (*target)[SKJSONCANVAS_ATTRIBUTE_TYPEFACE] = jsonTypeface;
|
| + }
|
| + }
|
| +}
|
| +
|
| static void apply_paint_shader(const SkPaint& paint, Json::Value* target, bool sendBinaries) {
|
| SkFlattenable* shader = paint.getShader();
|
| if (shader != nullptr) {
|
| @@ -425,6 +448,15 @@ static void apply_paint_imagefilter(const SkPaint& paint, Json::Value* target, b
|
| }
|
| }
|
|
|
| +static void apply_paint_colorfilter(const SkPaint& paint, Json::Value* target, bool sendBinaries) {
|
| + SkFlattenable* colorFilter = paint.getColorFilter();
|
| + if (colorFilter != nullptr) {
|
| + Json::Value jsonColorFilter;
|
| + flatten(colorFilter, &jsonColorFilter, sendBinaries);
|
| + (*target)[SKJSONCANVAS_ATTRIBUTE_COLORFILTER] = jsonColorFilter;
|
| + }
|
| +}
|
| +
|
| Json::Value SkJSONCanvas::makePaint(const SkPaint& paint) {
|
| Json::Value result(Json::objectValue);
|
| store_scalar(&result, SKJSONCANVAS_ATTRIBUTE_STROKEWIDTH, paint.getStrokeWidth(), 0.0f);
|
| @@ -444,6 +476,8 @@ Json::Value SkJSONCanvas::makePaint(const SkPaint& paint) {
|
| apply_paint_shader(paint, &result, fSendBinaries);
|
| apply_paint_xfermode(paint, &result, fSendBinaries);
|
| apply_paint_imagefilter(paint, &result, fSendBinaries);
|
| + apply_paint_colorfilter(paint, &result, fSendBinaries);
|
| + apply_paint_typeface(paint, &result, fSendBinaries);
|
| return result;
|
| }
|
|
|
| @@ -756,9 +790,45 @@ void SkJSONCanvas::onDrawTextOnPath(const void* text, size_t byteLength,
|
|
|
| void SkJSONCanvas::onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y,
|
| const SkPaint& paint) {
|
| - SkDebugf("unsupported: drawTextBlob\n");
|
| Json::Value command(Json::objectValue);
|
| command[SKJSONCANVAS_COMMAND] = Json::Value(SKJSONCANVAS_COMMAND_TEXTBLOB);
|
| + Json::Value runs(Json::arrayValue);
|
| + SkTextBlobRunIterator iter(blob);
|
| + while (!iter.done()) {
|
| + Json::Value run(Json::objectValue);
|
| + Json::Value jsonPositions(Json::arrayValue);
|
| + Json::Value jsonGlyphs(Json::arrayValue);
|
| + const SkScalar* iterPositions = iter.pos();
|
| + const uint16_t* iterGlyphs = iter.glyphs();
|
| + for (uint32_t i = 0; i < iter.glyphCount(); i++) {
|
| + switch (iter.positioning()) {
|
| + case SkTextBlob::kFull_Positioning:
|
| + jsonPositions.append(this->makePoint(iterPositions[i * 2],
|
| + iterPositions[i * 2 + 1]));
|
| + break;
|
| + case SkTextBlob::kHorizontal_Positioning:
|
| + jsonPositions.append(Json::Value(iterPositions[i]));
|
| + break;
|
| + case SkTextBlob::kDefault_Positioning:
|
| + break;
|
| + }
|
| + jsonGlyphs.append(Json::Value(iterGlyphs[i]));
|
| + }
|
| + if (iter.positioning() != SkTextBlob::kDefault_Positioning) {
|
| + run[SKJSONCANVAS_ATTRIBUTE_POSITIONS] = jsonPositions;
|
| + }
|
| + run[SKJSONCANVAS_ATTRIBUTE_GLYPHS] = jsonGlyphs;
|
| + SkPaint fontPaint;
|
| + iter.applyFontToPaint(&fontPaint);
|
| + run[SKJSONCANVAS_ATTRIBUTE_FONT] = this->makePaint(fontPaint);
|
| + run[SKJSONCANVAS_ATTRIBUTE_COORDS] = this->makePoint(iter.offset());
|
| + runs.append(run);
|
| + iter.next();
|
| + }
|
| + command[SKJSONCANVAS_ATTRIBUTE_RUNS] = runs;
|
| + command[SKJSONCANVAS_ATTRIBUTE_X] = Json::Value(x);
|
| + command[SKJSONCANVAS_ATTRIBUTE_Y] = Json::Value(y);
|
| + command[SKJSONCANVAS_ATTRIBUTE_PAINT] = this->makePaint(paint);
|
| fCommands.append(command);
|
| }
|
|
|
|
|