diff options
author | Brian Osman <brianosman@google.com> | 2018-05-29 13:38:07 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-05-29 19:22:06 +0000 |
commit | 8363be1a00b154082e6be178f37de4b8fa78dde0 (patch) | |
tree | b8ceb23d60d9a95430a61f43a169414294b73224 /tools/debugger | |
parent | cdbec8f197e3a75185e95ff66afb3edb49097bde (diff) |
SkDrawCommand cleanup
- Remove fromJSON factories. These were unused, and many were
incomplete or incorrect.
- Remove accessor methods (all unused) on command classes.
- Some commands used SkTLazy for optional params, others used
manually initialized storage + pointer. (A few used strange
sentinel values like empty rect or identity matrix). Switch
to SkTLazy everywhere, and use the constructor that takes a
pointer to simplify initialization in all cases.
- Use RAII for more fields (SkTDArray and sk_sp). There are a
few of these left in the drawText commands, but that's it.
Change-Id: I34a87ad27c5efe0b94e5ae74b59a99f66a4e4cfa
Reviewed-on: https://skia-review.googlesource.com/130510
Reviewed-by: Mike Klein <mtklein@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
Diffstat (limited to 'tools/debugger')
-rw-r--r-- | tools/debugger/SkDrawCommand.cpp | 1473 | ||||
-rw-r--r-- | tools/debugger/SkDrawCommand.h | 137 |
2 files changed, 101 insertions, 1509 deletions
diff --git a/tools/debugger/SkDrawCommand.cpp b/tools/debugger/SkDrawCommand.cpp index 4740b4bf27..001911c975 100644 --- a/tools/debugger/SkDrawCommand.cpp +++ b/tools/debugger/SkDrawCommand.cpp @@ -200,15 +200,11 @@ #define SKDEBUGCANVAS_SHADOWFLAG_TRANSPARENT_OCC "transparentOccluder" #define SKDEBUGCANVAS_SHADOWFLAG_GEOMETRIC_ONLY "geometricOnly" -typedef SkDrawCommand* (*FROM_JSON)(Json::Value&, UrlDataManager&); - static SkString* str_append(SkString* str, const SkRect& r) { str->appendf(" [%g %g %g %g]", r.left(), r.top(), r.right(), r.bottom()); return str; } -// TODO(chudy): Refactor into non subclass model. - SkDrawCommand::SkDrawCommand(OpType type) : fOpType(type) , fVisible(true) { @@ -272,58 +268,6 @@ Json::Value SkDrawCommand::toJSON(UrlDataManager& urlDataManager) const { return result; } -#define INSTALL_FACTORY(name) factories.set(SkString(GetCommandString(k ## name ##_OpType)), \ - (FROM_JSON) Sk ## name ## Command::fromJSON) -SkDrawCommand* SkDrawCommand::fromJSON(Json::Value& command, UrlDataManager& urlDataManager) { - static SkTHashMap<SkString, FROM_JSON> factories; - static bool initialized = false; - if (!initialized) { - initialized = true; - INSTALL_FACTORY(Restore); - INSTALL_FACTORY(Clear); - INSTALL_FACTORY(ClipPath); - INSTALL_FACTORY(ClipRegion); - INSTALL_FACTORY(ClipRect); - INSTALL_FACTORY(ClipRRect); - INSTALL_FACTORY(Concat); - INSTALL_FACTORY(DrawAnnotation); - INSTALL_FACTORY(DrawBitmap); - INSTALL_FACTORY(DrawBitmapNine); - INSTALL_FACTORY(DrawBitmapRect); - INSTALL_FACTORY(DrawImage); - INSTALL_FACTORY(DrawImageLattice); - INSTALL_FACTORY(DrawImageNine); - INSTALL_FACTORY(DrawImageRect); - INSTALL_FACTORY(DrawOval); - INSTALL_FACTORY(DrawArc); - INSTALL_FACTORY(DrawPaint); - INSTALL_FACTORY(DrawPath); - INSTALL_FACTORY(DrawPoints); - INSTALL_FACTORY(DrawRegion); - INSTALL_FACTORY(DrawText); - INSTALL_FACTORY(DrawPosText); - INSTALL_FACTORY(DrawPosTextH); - INSTALL_FACTORY(DrawTextOnPath); - INSTALL_FACTORY(DrawTextRSXform); - INSTALL_FACTORY(DrawTextBlob); - INSTALL_FACTORY(DrawShadow); - INSTALL_FACTORY(DrawRect); - INSTALL_FACTORY(DrawRRect); - INSTALL_FACTORY(DrawDRRect); - INSTALL_FACTORY(DrawPatch); - INSTALL_FACTORY(Save); - INSTALL_FACTORY(SaveLayer); - INSTALL_FACTORY(SetMatrix); - } - SkString name = SkString(command[SKDEBUGCANVAS_ATTRIBUTE_COMMAND].asCString()); - FROM_JSON* factory = factories.find(name); - if (factory == nullptr) { - SkDebugf("no JSON factory for '%s'\n", name.c_str()); - return nullptr; - } - return (*factory)(command, urlDataManager); -} - namespace { void xlate_and_scale_to_bounds(SkCanvas* canvas, const SkRect& bounds) { @@ -526,19 +470,6 @@ void apply_paint_blend_mode(const SkPaint& paint, Json::Value* target) { } } -void extract_json_paint_blend_mode(Json::Value& jsonPaint, SkPaint* target) { - if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_BLENDMODE)) { - const char* mode = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_BLENDMODE].asCString(); - - for (size_t i = 0; i < SK_ARRAY_COUNT(gBlendModeMap); ++i) { - if (!strcmp(mode, gBlendModeMap[i])) { - target->setBlendMode(static_cast<SkBlendMode>(i)); - break; - } - } - } -} - }; Json::Value SkDrawCommand::MakeJsonColor(const SkColor color) { @@ -890,119 +821,6 @@ static const char* alpha_type_name(SkAlphaType alphaType) { } } -static Json::ArrayIndex decode_data(Json::Value data, UrlDataManager& urlDataManager, - const void** target) { - UrlDataManager::UrlData* urlData = urlDataManager.getDataFromUrl(SkString(data.asCString())); - if (urlData == nullptr) { - SkASSERT(false); - *target = nullptr; - return 0; - } - *target = urlData->fData->data(); - // cast should be safe for any reasonably-sized object... - return (Json::ArrayIndex) urlData->fData->size(); -} - -static SkFlattenable* load_flattenable(Json::Value jsonFlattenable, - UrlDataManager& urlDataManager) { - if (!jsonFlattenable.isMember(SKDEBUGCANVAS_ATTRIBUTE_NAME)) { - return nullptr; - } - const char* name = jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_NAME].asCString(); - SkFlattenable::Factory factory = SkFlattenable::NameToFactory(name); - if (factory == nullptr) { - SkDebugf("no factory for loading '%s'\n", name); - return nullptr; - } - const void* data; - int size = decode_data(jsonFlattenable[SKDEBUGCANVAS_ATTRIBUTE_DATA], urlDataManager, &data); - SkReadBuffer buffer(data, size); - sk_sp<SkFlattenable> result = factory(buffer); - if (!buffer.isValid()) { - SkDebugf("invalid buffer loading flattenable\n"); - return nullptr; - } - return result.release(); -} - -static SkColorType colortype_from_name(const char* name) { - if (!strcmp(name, SKDEBUGCANVAS_COLORTYPE_ARGB4444)) { - return kARGB_4444_SkColorType; - } - else if (!strcmp(name, SKDEBUGCANVAS_COLORTYPE_RGBA8888)) { - return kRGBA_8888_SkColorType; - } - else if (!strcmp(name, SKDEBUGCANVAS_COLORTYPE_BGRA8888)) { - return kBGRA_8888_SkColorType; - } - else if (!strcmp(name, SKDEBUGCANVAS_COLORTYPE_565)) { - return kRGB_565_SkColorType; - } - else if (!strcmp(name, SKDEBUGCANVAS_COLORTYPE_GRAY8)) { - return kGray_8_SkColorType; - } - else if (!strcmp(name, SKDEBUGCANVAS_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 (dst->tryAllocPixels(bitmap->info().makeColorType(colorType)) && - bitmap->readPixels(dst->info(), dst->getPixels(), dst->rowBytes(), 0, 0)) - { - delete bitmap; - return dst; - } - SkASSERT(false); - delete dst; - return bitmap; -} - -// caller is responsible for freeing return value -static SkBitmap* load_bitmap(const Json::Value& jsonBitmap, UrlDataManager& urlDataManager) { - if (!jsonBitmap.isMember(SKDEBUGCANVAS_ATTRIBUTE_DATA)) { - SkDebugf("invalid bitmap\n"); - return nullptr; - } - const void* data; - int size = decode_data(jsonBitmap[SKDEBUGCANVAS_ATTRIBUTE_DATA], urlDataManager, &data); - sk_sp<SkData> encoded(SkData::MakeWithoutCopy(data, size)); - sk_sp<SkImage> image(SkImage::MakeFromEncoded(std::move(encoded), nullptr)); - - std::unique_ptr<SkBitmap> bitmap(new SkBitmap()); - if (nullptr != image) { - if (!image->asLegacyBitmap(bitmap.get())) { - SkDebugf("image decode failed\n"); - return nullptr; - } - - if (jsonBitmap.isMember(SKDEBUGCANVAS_ATTRIBUTE_COLOR)) { - const char* ctName = jsonBitmap[SKDEBUGCANVAS_ATTRIBUTE_COLOR].asCString(); - SkColorType ct = colortype_from_name(ctName); - bitmap.reset(convert_colortype(bitmap.release(), ct)); - } - return bitmap.release(); - } - SkDebugf("image decode failed\n"); - return nullptr; -} - -static sk_sp<SkImage> load_image(const Json::Value& jsonImage, UrlDataManager& urlDataManager) { - SkBitmap* bitmap = load_bitmap(jsonImage, urlDataManager); - if (bitmap == nullptr) { - return nullptr; - } - auto result = SkImage::MakeFromBitmap(*bitmap); - delete bitmap; - return result; -} - bool SkDrawCommand::flatten(const SkBitmap& bitmap, Json::Value* target, UrlDataManager& urlDataManager) { sk_sp<SkImage> image(SkImage::MakeFromBitmap(bitmap)); @@ -1330,493 +1148,6 @@ Json::Value SkDrawCommand::MakeJsonLattice(const SkCanvas::Lattice& lattice) { return result; } -static SkPoint get_json_point(Json::Value point) { - return SkPoint::Make(point[0].asFloat(), point[1].asFloat()); -} - -static SkPoint3 get_json_point3(Json::Value point) { - return SkPoint3::Make(point[0].asFloat(), point[1].asFloat(), point[2].asFloat()); -} - -static SkColor get_json_color(Json::Value color) { - return SkColorSetARGB(color[0].asInt(), color[1].asInt(), color[2].asInt(), color[3].asInt()); -} - -static void extract_json_paint_color(Json::Value& jsonPaint, SkPaint* target) { - if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_COLOR)) { - target->setColor(get_json_color(jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_COLOR])); - } -} - -static void extract_json_paint_shader(Json::Value& jsonPaint, UrlDataManager& urlDataManager, - SkPaint* target) { - if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_SHADER)) { - Json::Value jsonShader = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_SHADER]; - SkShader* shader = (SkShader*) load_flattenable(jsonShader, urlDataManager); - if (shader != nullptr) { - target->setShader(sk_ref_sp(shader)); - } - } -} - -static void extract_json_paint_patheffect(Json::Value& jsonPaint, UrlDataManager& urlDataManager, - SkPaint* target) { - if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_PATHEFFECT)) { - Json::Value jsonPathEffect = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_PATHEFFECT]; - sk_sp<SkPathEffect> pathEffect((SkPathEffect*)load_flattenable(jsonPathEffect, - urlDataManager)); - if (pathEffect != nullptr) { - target->setPathEffect(pathEffect); - } - } -} - -static void extract_json_paint_maskfilter(Json::Value& jsonPaint, UrlDataManager& urlDataManager, - SkPaint* target) { - if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_MASKFILTER)) { - Json::Value jsonMaskFilter = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_MASKFILTER]; - sk_sp<SkMaskFilter> maskFilter((SkMaskFilter*)load_flattenable(jsonMaskFilter, - urlDataManager)); - if (maskFilter) { - target->setMaskFilter(std::move(maskFilter)); - } - } -} - -static void extract_json_paint_colorfilter(Json::Value& jsonPaint, UrlDataManager& urlDataManager, - SkPaint* target) { - if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_COLORFILTER)) { - Json::Value jsonColorFilter = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_COLORFILTER]; - sk_sp<SkColorFilter> colorFilter((SkColorFilter*)load_flattenable(jsonColorFilter, - urlDataManager)); - if (colorFilter != nullptr) { - target->setColorFilter(colorFilter); - } - } -} - -static void extract_json_paint_looper(Json::Value& jsonPaint, UrlDataManager& urlDataManager, - SkPaint* target) { - if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_LOOPER)) { - Json::Value jsonLooper = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_LOOPER]; - sk_sp<SkDrawLooper> looper((SkDrawLooper*) load_flattenable(jsonLooper, urlDataManager)); - if (looper != nullptr) { - target->setLooper(std::move(looper)); - } - } -} - -static void extract_json_paint_imagefilter(Json::Value& jsonPaint, UrlDataManager& urlDataManager, - SkPaint* target) { - if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_IMAGEFILTER)) { - Json::Value jsonImageFilter = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_IMAGEFILTER]; - sk_sp<SkImageFilter> imageFilter((SkImageFilter*) load_flattenable(jsonImageFilter, - urlDataManager)); - if (imageFilter != nullptr) { - target->setImageFilter(imageFilter); - } - } -} - -static void extract_json_paint_typeface(Json::Value& jsonPaint, UrlDataManager& urlDataManager, - SkPaint* target) { - if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_TYPEFACE)) { - Json::Value jsonTypeface = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_TYPEFACE]; - Json::Value jsonData = jsonTypeface[SKDEBUGCANVAS_ATTRIBUTE_DATA]; - const void* data; - Json::ArrayIndex length = decode_data(jsonData, urlDataManager, &data); - SkMemoryStream buffer(data, length); - target->setTypeface(SkTypeface::MakeDeserialize(&buffer)); - } -} - -static void extract_json_paint_hinting(Json::Value& jsonPaint, SkPaint* target) { - if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_HINTING)) { - const char* hinting = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_HINTING].asCString(); - if (!strcmp(hinting, SKDEBUGCANVAS_HINTING_NONE)) { - target->setHinting(SkPaint::kNo_Hinting); - } else if (!strcmp(hinting, SKDEBUGCANVAS_HINTING_SLIGHT)) { - target->setHinting(SkPaint::kSlight_Hinting); - } else if (!strcmp(hinting, SKDEBUGCANVAS_HINTING_NORMAL)) { - target->setHinting(SkPaint::kNormal_Hinting); - } else if (!strcmp(hinting, SKDEBUGCANVAS_HINTING_FULL)) { - target->setHinting(SkPaint::kFull_Hinting); - } - } -} - -static void extract_json_paint_style(Json::Value& jsonPaint, SkPaint* target) { - if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_STYLE)) { - const char* style = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_STYLE].asCString(); - if (!strcmp(style, SKDEBUGCANVAS_STYLE_FILL)) { - target->setStyle(SkPaint::kFill_Style); - } - else if (!strcmp(style, SKDEBUGCANVAS_STYLE_STROKE)) { - target->setStyle(SkPaint::kStroke_Style); - } - else if (!strcmp(style, SKDEBUGCANVAS_STYLE_STROKEANDFILL)) { - target->setStyle(SkPaint::kStrokeAndFill_Style); - } - } -} - -static void extract_json_paint_strokewidth(Json::Value& jsonPaint, SkPaint* target) { - if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_STROKEWIDTH)) { - float strokeWidth = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_STROKEWIDTH].asFloat(); - target->setStrokeWidth(strokeWidth); - } -} - -static void extract_json_paint_strokemiter(Json::Value& jsonPaint, SkPaint* target) { - if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_STROKEMITER)) { - float strokeMiter = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_STROKEMITER].asFloat(); - target->setStrokeMiter(strokeMiter); - } -} - -static void extract_json_paint_strokejoin(Json::Value& jsonPaint, SkPaint* target) { - if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN)) { - const char* join = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_STROKEJOIN].asCString(); - if (!strcmp(join, SKDEBUGCANVAS_MITER_JOIN)) { - target->setStrokeJoin(SkPaint::kMiter_Join); - } - else if (!strcmp(join, SKDEBUGCANVAS_ROUND_JOIN)) { - target->setStrokeJoin(SkPaint::kRound_Join); - } - else if (!strcmp(join, SKDEBUGCANVAS_BEVEL_JOIN)) { - target->setStrokeJoin(SkPaint::kBevel_Join); - } - else { - SkASSERT(false); - } - } -} - -static void extract_json_paint_cap(Json::Value& jsonPaint, SkPaint* target) { - if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_CAP)) { - const char* cap = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_CAP].asCString(); - if (!strcmp(cap, SKDEBUGCANVAS_CAP_BUTT)) { - target->setStrokeCap(SkPaint::kButt_Cap); - } - else if (!strcmp(cap, SKDEBUGCANVAS_CAP_ROUND)) { - target->setStrokeCap(SkPaint::kRound_Cap); - } - else if (!strcmp(cap, SKDEBUGCANVAS_CAP_SQUARE)) { - target->setStrokeCap(SkPaint::kSquare_Cap); - } - } -} - -static void extract_json_paint_filterquality(Json::Value& jsonPaint, SkPaint* target) { - if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY)) { - const char* quality = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_FILTERQUALITY].asCString(); - if (!strcmp(quality, SKDEBUGCANVAS_FILTERQUALITY_NONE)) { - target->setFilterQuality(kNone_SkFilterQuality); - } - else if (!strcmp(quality, SKDEBUGCANVAS_FILTERQUALITY_LOW)) { - target->setFilterQuality(kLow_SkFilterQuality); - } - else if (!strcmp(quality, SKDEBUGCANVAS_FILTERQUALITY_MEDIUM)) { - target->setFilterQuality(kMedium_SkFilterQuality); - } - else if (!strcmp(quality, SKDEBUGCANVAS_FILTERQUALITY_HIGH)) { - target->setFilterQuality(kHigh_SkFilterQuality); - } - } -} - -static void extract_json_paint_antialias(Json::Value& jsonPaint, SkPaint* target) { - if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS)) { - target->setAntiAlias(jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS].asBool()); - } -} - -static void extract_json_paint_dither(Json::Value& jsonPaint, SkPaint* target) { - if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_DITHER)) { - target->setDither(jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_DITHER].asBool()); - } -} - -static void extract_json_paint_fakeboldtext(Json::Value& jsonPaint, SkPaint* target) { - if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_FAKEBOLDTEXT)) { - target->setFakeBoldText(jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_FAKEBOLDTEXT].asBool()); - } -} - -static void extract_json_paint_lineartext(Json::Value& jsonPaint, SkPaint* target) { - if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_LINEARTEXT)) { - target->setLinearText(jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_LINEARTEXT].asBool()); - } -} - -static void extract_json_paint_subpixeltext(Json::Value& jsonPaint, SkPaint* target) { - if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_SUBPIXELTEXT)) { - target->setSubpixelText(jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_SUBPIXELTEXT].asBool()); - } -} - -static void extract_json_paint_devkerntext(Json::Value& jsonPaint, SkPaint* target) { - if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_DEVKERNTEXT)) { - target->setDevKernText(jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_DEVKERNTEXT].asBool()); - } -} - -static void extract_json_paint_lcdrendertext(Json::Value& jsonPaint, SkPaint* target) { - if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_LCDRENDERTEXT)) { - target->setLCDRenderText(jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_LCDRENDERTEXT].asBool()); - } -} - -static void extract_json_paint_embeddedbitmaptext(Json::Value& jsonPaint, SkPaint* target) { - if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_EMBEDDEDBITMAPTEXT)) { - target->setEmbeddedBitmapText(jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_EMBEDDEDBITMAPTEXT].asBool()); - } -} - -static void extract_json_paint_autohinting(Json::Value& jsonPaint, SkPaint* target) { - if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_AUTOHINTING)) { - target->setAutohinted(jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_AUTOHINTING].asBool()); - } -} - -static void extract_json_paint_verticaltext(Json::Value& jsonPaint, SkPaint* target) { - if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_VERTICALTEXT)) { - target->setVerticalText(jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_VERTICALTEXT].asBool()); - } -} - -static void extract_json_paint_blur(Json::Value& jsonPaint, SkPaint* target) { - if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_BLUR)) { - Json::Value blur = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_BLUR]; - SkScalar sigma = blur[SKDEBUGCANVAS_ATTRIBUTE_SIGMA].asFloat(); - SkBlurStyle style; - const char* jsonStyle = blur[SKDEBUGCANVAS_ATTRIBUTE_STYLE].asCString(); - if (!strcmp(jsonStyle, SKDEBUGCANVAS_BLURSTYLE_NORMAL)) { - style = SkBlurStyle::kNormal_SkBlurStyle; - } - else if (!strcmp(jsonStyle, SKDEBUGCANVAS_BLURSTYLE_SOLID)) { - style = SkBlurStyle::kSolid_SkBlurStyle; - } - else if (!strcmp(jsonStyle, SKDEBUGCANVAS_BLURSTYLE_OUTER)) { - style = SkBlurStyle::kOuter_SkBlurStyle; - } - else if (!strcmp(jsonStyle, SKDEBUGCANVAS_BLURSTYLE_INNER)) { - style = SkBlurStyle::kInner_SkBlurStyle; - } - else { - SkASSERT(false); - style = SkBlurStyle::kNormal_SkBlurStyle; - } - target->setMaskFilter(SkMaskFilter::MakeBlur(style, sigma)); - } -} - -static void extract_json_paint_dashing(Json::Value& jsonPaint, SkPaint* target) { - if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_DASHING)) { - Json::Value dash = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_DASHING]; - Json::Value jsonIntervals = dash[SKDEBUGCANVAS_ATTRIBUTE_INTERVALS]; - Json::ArrayIndex count = jsonIntervals.size(); - SkScalar* intervals = (SkScalar*) sk_malloc_throw(count * sizeof(SkScalar)); - for (Json::ArrayIndex i = 0; i < count; i++) { - intervals[i] = jsonIntervals[i].asFloat(); - } - SkScalar phase = dash[SKDEBUGCANVAS_ATTRIBUTE_PHASE].asFloat(); - target->setPathEffect(SkDashPathEffect::Make(intervals, count, phase)); - sk_free(intervals); - } -} - -static void extract_json_paint_textalign(Json::Value& jsonPaint, SkPaint* target) { - if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_TEXTALIGN)) { - SkPaint::Align textAlign; - const char* jsonAlign = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_TEXTALIGN].asCString(); - if (!strcmp(jsonAlign, SKDEBUGCANVAS_ALIGN_LEFT)) { - textAlign = SkPaint::kLeft_Align; - } - else if (!strcmp(jsonAlign, SKDEBUGCANVAS_ALIGN_CENTER)) { - textAlign = SkPaint::kCenter_Align; - } - else if (!strcmp(jsonAlign, SKDEBUGCANVAS_ALIGN_RIGHT)) { - textAlign = SkPaint::kRight_Align; - } - else { - SkASSERT(false); - textAlign = SkPaint::kLeft_Align; - } - target->setTextAlign(textAlign); - } -} - -static void extract_json_paint_textsize(Json::Value& jsonPaint, SkPaint* target) { - if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_TEXTSIZE)) { - float textSize = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_TEXTSIZE].asFloat(); - target->setTextSize(textSize); - } -} - -static void extract_json_paint_textscalex(Json::Value& jsonPaint, SkPaint* target) { - if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX)) { - float textScaleX = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_TEXTSCALEX].asFloat(); - target->setTextScaleX(textScaleX); - } -} - -static void extract_json_paint_textskewx(Json::Value& jsonPaint, SkPaint* target) { - if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_TEXTSKEWX)) { - float textSkewX = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_TEXTSKEWX].asFloat(); - target->setTextSkewX(textSkewX); - } -} - -static void extract_json_paint(Json::Value& paint, UrlDataManager& urlDataManager, - SkPaint* result) { - extract_json_paint_hinting(paint, result); - extract_json_paint_color(paint, result); - extract_json_paint_shader(paint, urlDataManager, result); - extract_json_paint_patheffect(paint, urlDataManager, result); - extract_json_paint_maskfilter(paint, urlDataManager, result); - extract_json_paint_colorfilter(paint, urlDataManager, result); - extract_json_paint_looper(paint, urlDataManager, result); - extract_json_paint_imagefilter(paint, urlDataManager, result); - extract_json_paint_typeface(paint, urlDataManager, result); - extract_json_paint_style(paint, result); - extract_json_paint_blend_mode(paint, result); - extract_json_paint_strokewidth(paint, result); - extract_json_paint_strokemiter(paint, result); - extract_json_paint_strokejoin(paint, result); - extract_json_paint_cap(paint, result); - extract_json_paint_filterquality(paint, result); - extract_json_paint_antialias(paint, result); - extract_json_paint_dither(paint, result); - extract_json_paint_fakeboldtext(paint, result); - extract_json_paint_lineartext(paint, result); - extract_json_paint_subpixeltext(paint, result); - extract_json_paint_devkerntext(paint, result); - extract_json_paint_lcdrendertext(paint, result); - extract_json_paint_embeddedbitmaptext(paint, result); - extract_json_paint_autohinting(paint, result); - extract_json_paint_verticaltext(paint, result); - extract_json_paint_blur(paint, result); - extract_json_paint_dashing(paint, result); - extract_json_paint_textalign(paint, result); - extract_json_paint_textsize(paint, result); - extract_json_paint_textscalex(paint, result); - extract_json_paint_textskewx(paint, result); -} - -static void extract_json_rect(Json::Value& rect, SkRect* result) { - result->set(rect[0].asFloat(), rect[1].asFloat(), rect[2].asFloat(), rect[3].asFloat()); -} - -static void extract_json_irect(Json::Value& rect, SkIRect* result) { - result->set(rect[0].asInt(), rect[1].asInt(), rect[2].asInt(), rect[3].asInt()); -} - -static void extract_json_rrect(Json::Value& rrect, SkRRect* result) { - SkVector radii[4] = { - { rrect[1][0].asFloat(), rrect[1][1].asFloat() }, - { rrect[2][0].asFloat(), rrect[2][1].asFloat() }, - { rrect[3][0].asFloat(), rrect[3][1].asFloat() }, - { rrect[4][0].asFloat(), rrect[4][1].asFloat() } - }; - result->setRectRadii(SkRect::MakeLTRB(rrect[0][0].asFloat(), rrect[0][1].asFloat(), - rrect[0][2].asFloat(), rrect[0][3].asFloat()), - radii); -} - -static void extract_json_matrix(Json::Value& matrix, SkMatrix* result) { - SkScalar values[] = { - matrix[0][0].asFloat(), matrix[0][1].asFloat(), matrix[0][2].asFloat(), - matrix[1][0].asFloat(), matrix[1][1].asFloat(), matrix[1][2].asFloat(), - matrix[2][0].asFloat(), matrix[2][1].asFloat(), matrix[2][2].asFloat() - }; - result->set9(values); -} - -static void extract_json_path(Json::Value& path, SkPath* result) { - const char* fillType = path[SKDEBUGCANVAS_ATTRIBUTE_FILLTYPE].asCString(); - if (!strcmp(fillType, SKDEBUGCANVAS_FILLTYPE_WINDING)) { - result->setFillType(SkPath::kWinding_FillType); - } - else if (!strcmp(fillType, SKDEBUGCANVAS_FILLTYPE_EVENODD)) { - result->setFillType(SkPath::kEvenOdd_FillType); - } - else if (!strcmp(fillType, SKDEBUGCANVAS_FILLTYPE_INVERSEWINDING)) { - result->setFillType(SkPath::kInverseWinding_FillType); - } - else if (!strcmp(fillType, SKDEBUGCANVAS_FILLTYPE_INVERSEEVENODD)) { - result->setFillType(SkPath::kInverseEvenOdd_FillType); - } - Json::Value verbs = path[SKDEBUGCANVAS_ATTRIBUTE_VERBS]; - for (Json::ArrayIndex i = 0; i < verbs.size(); i++) { - Json::Value verb = verbs[i]; - if (verb.isString()) { - SkASSERT(!strcmp(verb.asCString(), SKDEBUGCANVAS_VERB_CLOSE)); - result->close(); - } - else { - if (verb.isMember(SKDEBUGCANVAS_VERB_MOVE)) { - Json::Value move = verb[SKDEBUGCANVAS_VERB_MOVE]; - result->moveTo(move[0].asFloat(), move[1].asFloat()); - } - else if (verb.isMember(SKDEBUGCANVAS_VERB_LINE)) { - Json::Value line = verb[SKDEBUGCANVAS_VERB_LINE]; - result->lineTo(line[0].asFloat(), line[1].asFloat()); - } - else if (verb.isMember(SKDEBUGCANVAS_VERB_QUAD)) { - Json::Value quad = verb[SKDEBUGCANVAS_VERB_QUAD]; - result->quadTo(quad[0][0].asFloat(), quad[0][1].asFloat(), - quad[1][0].asFloat(), quad[1][1].asFloat()); - } - else if (verb.isMember(SKDEBUGCANVAS_VERB_CUBIC)) { - Json::Value cubic = verb[SKDEBUGCANVAS_VERB_CUBIC]; - result->cubicTo(cubic[0][0].asFloat(), cubic[0][1].asFloat(), - cubic[1][0].asFloat(), cubic[1][1].asFloat(), - cubic[2][0].asFloat(), cubic[2][1].asFloat()); - } - else if (verb.isMember(SKDEBUGCANVAS_VERB_CONIC)) { - Json::Value conic = verb[SKDEBUGCANVAS_VERB_CONIC]; - result->conicTo(conic[0][0].asFloat(), conic[0][1].asFloat(), - conic[1][0].asFloat(), conic[1][1].asFloat(), - conic[2].asFloat()); - } - else { - SkASSERT(false); - } - } - } -} - -static void extract_json_region(Json::Value& region, SkRegion* result) { - SkPath path; - extract_json_path(region, &path); - result->setPath(path, SkRegion(path.getBounds().roundOut())); -} - -SkClipOp get_json_clipop(Json::Value& jsonOp) { - const char* op = jsonOp.asCString(); - if (!strcmp(op, SKDEBUGCANVAS_REGIONOP_DIFFERENCE)) { - return kDifference_SkClipOp; - } - else if (!strcmp(op, SKDEBUGCANVAS_REGIONOP_INTERSECT)) { - return kIntersect_SkClipOp; - } - else if (!strcmp(op, SKDEBUGCANVAS_REGIONOP_UNION)) { - return kUnion_SkClipOp; - } - else if (!strcmp(op, SKDEBUGCANVAS_REGIONOP_XOR)) { - return kXOR_SkClipOp; - } - else if (!strcmp(op, SKDEBUGCANVAS_REGIONOP_REVERSE_DIFFERENCE)) { - return kReverseDifference_SkClipOp; - } - else if (!strcmp(op, SKDEBUGCANVAS_REGIONOP_REPLACE)) { - return kReplace_SkClipOp; - } - SkASSERT(false); - return kIntersect_SkClipOp; -} - SkClearCommand::SkClearCommand(SkColor color) : INHERITED(kClear_OpType) { fColor = color; } @@ -1831,11 +1162,6 @@ Json::Value SkClearCommand::toJSON(UrlDataManager& urlDataManager) const { return result; } - SkClearCommand* SkClearCommand::fromJSON(Json::Value& command, UrlDataManager& urlDataManager) { - Json::Value color = command[SKDEBUGCANVAS_ATTRIBUTE_COLOR]; - return new SkClearCommand(get_json_color(color)); -} - SkClipPathCommand::SkClipPathCommand(const SkPath& path, SkClipOp op, bool doAA) : INHERITED(kClipPath_OpType) { fPath = path; @@ -1860,14 +1186,6 @@ Json::Value SkClipPathCommand::toJSON(UrlDataManager& urlDataManager) const { return result; } -SkClipPathCommand* SkClipPathCommand::fromJSON(Json::Value& command, - UrlDataManager& urlDataManager) { - SkPath path; - extract_json_path(command[SKDEBUGCANVAS_ATTRIBUTE_PATH], &path); - return new SkClipPathCommand(path, get_json_clipop(command[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP]), - command[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS].asBool()); -} - SkClipRegionCommand::SkClipRegionCommand(const SkRegion& region, SkClipOp op) : INHERITED(kClipRegion_OpType) { fRegion = region; @@ -1885,14 +1203,6 @@ Json::Value SkClipRegionCommand::toJSON(UrlDataManager& urlDataManager) const { return result; } -SkClipRegionCommand* SkClipRegionCommand::fromJSON(Json::Value& command, - UrlDataManager& urlDataManager) { - SkRegion region; - extract_json_region(command[SKDEBUGCANVAS_ATTRIBUTE_REGION], ®ion); - return new SkClipRegionCommand(region, - get_json_clipop(command[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP])); -} - SkClipRectCommand::SkClipRectCommand(const SkRect& rect, SkClipOp op, bool doAA) : INHERITED(kClipRect_OpType) { fRect = rect; @@ -1916,14 +1226,6 @@ Json::Value SkClipRectCommand::toJSON(UrlDataManager& urlDataManager) const { return result; } -SkClipRectCommand* SkClipRectCommand::fromJSON(Json::Value& command, - UrlDataManager& urlDataManager) { - SkRect rect; - extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_COORDS], &rect); - return new SkClipRectCommand(rect, get_json_clipop(command[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP]), - command[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS].asBool()); -} - SkClipRRectCommand::SkClipRRectCommand(const SkRRect& rrect, SkClipOp op, bool doAA) : INHERITED(kClipRRect_OpType) { fRRect = rrect; @@ -1948,15 +1250,6 @@ Json::Value SkClipRRectCommand::toJSON(UrlDataManager& urlDataManager) const { return result; } -SkClipRRectCommand* SkClipRRectCommand::fromJSON(Json::Value& command, - UrlDataManager& urlDataManager) { - SkRRect rrect; - extract_json_rrect(command[SKDEBUGCANVAS_ATTRIBUTE_COORDS], &rrect); - return new SkClipRRectCommand(rrect, - get_json_clipop(command[SKDEBUGCANVAS_ATTRIBUTE_REGIONOP]), - command[SKDEBUGCANVAS_ATTRIBUTE_ANTIALIAS].asBool()); -} - SkConcatCommand::SkConcatCommand(const SkMatrix& matrix) : INHERITED(kConcat_OpType) { fMatrix = matrix; @@ -1972,12 +1265,6 @@ Json::Value SkConcatCommand::toJSON(UrlDataManager& urlDataManager) const { return result; } -SkConcatCommand* SkConcatCommand::fromJSON(Json::Value& command, UrlDataManager& urlDataManager) { - SkMatrix matrix; - extract_json_matrix(command[SKDEBUGCANVAS_ATTRIBUTE_MATRIX], &matrix); - return new SkConcatCommand(matrix); -} - //// SkDrawAnnotationCommand::SkDrawAnnotationCommand(const SkRect& rect, const char key[], @@ -2009,32 +1296,18 @@ Json::Value SkDrawAnnotationCommand::toJSON(UrlDataManager& urlDataManager) cons return result; } -SkDrawAnnotationCommand* SkDrawAnnotationCommand::fromJSON(Json::Value& command, - UrlDataManager& urlDataManager) { - SkRect rect; - extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_COORDS], &rect); - sk_sp<SkData> data(nullptr); // TODO: extract "value" from the Json - return new SkDrawAnnotationCommand(rect, command["key"].asCString(), data); -} - //// SkDrawBitmapCommand::SkDrawBitmapCommand(const SkBitmap& bitmap, SkScalar left, SkScalar top, const SkPaint* paint) - : INHERITED(kDrawBitmap_OpType) { - fBitmap = bitmap; - fLeft = left; - fTop = top; - if (paint) { - fPaint = *paint; - fPaintPtr = &fPaint; - } else { - fPaintPtr = nullptr; - } -} + : INHERITED(kDrawBitmap_OpType) + , fBitmap(bitmap) + , fLeft(left) + , fTop(top) + , fPaint(paint) {} void SkDrawBitmapCommand::execute(SkCanvas* canvas) const { - canvas->drawBitmap(fBitmap, fLeft, fTop, fPaintPtr); + canvas->drawBitmap(fBitmap, fLeft, fTop, fPaint.getMaybeNull()); } bool SkDrawBitmapCommand::render(SkCanvas* canvas) const { @@ -2049,47 +1322,21 @@ Json::Value SkDrawBitmapCommand::toJSON(UrlDataManager& urlDataManager) const { Json::Value command(Json::objectValue); result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded; result[SKDEBUGCANVAS_ATTRIBUTE_COORDS] = MakeJsonPoint(fLeft, fTop); - if (fPaintPtr != nullptr) { - result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaintPtr, urlDataManager); + if (fPaint.isValid()) { + result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager); } } return result; } -SkDrawBitmapCommand* SkDrawBitmapCommand::fromJSON(Json::Value& command, - UrlDataManager& urlDataManager) { - SkBitmap* bitmap = load_bitmap(command[SKDEBUGCANVAS_ATTRIBUTE_BITMAP], urlDataManager); - if (bitmap == nullptr) { - return nullptr; - } - Json::Value point = command[SKDEBUGCANVAS_ATTRIBUTE_COORDS]; - SkPaint* paintPtr; - SkPaint paint; - if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_PAINT)) { - extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint); - paintPtr = &paint; - } - else { - paintPtr = nullptr; - } - SkDrawBitmapCommand* result = new SkDrawBitmapCommand(*bitmap, point[0].asFloat(), - point[1].asFloat(), paintPtr); - delete bitmap; - return result; -} - SkDrawBitmapLatticeCommand::SkDrawBitmapLatticeCommand(const SkBitmap& bitmap, const SkCanvas::Lattice& lattice, const SkRect& dst, const SkPaint* paint) : INHERITED(kDrawBitmapLattice_OpType) , fBitmap(bitmap) , fLattice(lattice) - , fDst(dst) { - - if (paint) { - fPaint.set(*paint); - } -} + , fDst(dst) + , fPaint(paint) {} void SkDrawBitmapLatticeCommand::execute(SkCanvas* canvas) const { canvas->drawBitmapLattice(fBitmap, fLattice, fDst, fPaint.getMaybeNull()); @@ -2123,28 +1370,16 @@ Json::Value SkDrawBitmapLatticeCommand::toJSON(UrlDataManager& urlDataManager) c return result; } -SkDrawBitmapLatticeCommand* SkDrawBitmapLatticeCommand::fromJSON(Json::Value& command, - UrlDataManager& urlDataManager) { - SkDEBUGFAIL("Not implemented yet."); - return nullptr; -} - SkDrawBitmapNineCommand::SkDrawBitmapNineCommand(const SkBitmap& bitmap, const SkIRect& center, const SkRect& dst, const SkPaint* paint) - : INHERITED(kDrawBitmapNine_OpType) { - fBitmap = bitmap; - fCenter = center; - fDst = dst; - if (paint) { - fPaint = *paint; - fPaintPtr = &fPaint; - } else { - fPaintPtr = nullptr; - } -} + : INHERITED(kDrawBitmapNine_OpType) + , fBitmap(bitmap) + , fCenter(center) + , fDst(dst) + , fPaint(paint) {} void SkDrawBitmapNineCommand::execute(SkCanvas* canvas) const { - canvas->drawBitmapNine(fBitmap, fCenter, fDst, fPaintPtr); + canvas->drawBitmapNine(fBitmap, fCenter, fDst, fPaint.getMaybeNull()); } bool SkDrawBitmapNineCommand::render(SkCanvas* canvas) const { @@ -2160,64 +1395,30 @@ Json::Value SkDrawBitmapNineCommand::toJSON(UrlDataManager& urlDataManager) cons result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded; result[SKDEBUGCANVAS_ATTRIBUTE_CENTER] = MakeJsonIRect(fCenter); result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst); - if (fPaintPtr != nullptr) { - result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaintPtr, urlDataManager); + if (fPaint.isValid()) { + result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager); } } return result; } -SkDrawBitmapNineCommand* SkDrawBitmapNineCommand::fromJSON(Json::Value& command, - UrlDataManager& urlDataManager) { - SkBitmap* bitmap = load_bitmap(command[SKDEBUGCANVAS_ATTRIBUTE_BITMAP], urlDataManager); - if (bitmap == nullptr) { - return nullptr; - } - SkIRect center; - extract_json_irect(command[SKDEBUGCANVAS_ATTRIBUTE_CENTER], ¢er); - SkRect dst; - extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_DST], &dst); - SkPaint* paintPtr; - SkPaint paint; - if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_PAINT)) { - extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint); - paintPtr = &paint; - } - else { - paintPtr = nullptr; - } - SkDrawBitmapNineCommand* result = new SkDrawBitmapNineCommand(*bitmap, center, dst, paintPtr); - delete bitmap; - return result; -} - SkDrawBitmapRectCommand::SkDrawBitmapRectCommand(const SkBitmap& bitmap, const SkRect* src, const SkRect& dst, const SkPaint* paint, SkCanvas::SrcRectConstraint constraint) - : INHERITED(kDrawBitmapRect_OpType) { - fBitmap = bitmap; - if (src) { - fSrc = *src; - } else { - fSrc.setEmpty(); - } - fDst = dst; - - if (paint) { - fPaint = *paint; - fPaintPtr = &fPaint; - } else { - fPaintPtr = nullptr; - } - fConstraint = constraint; -} + : INHERITED(kDrawBitmapRect_OpType) + , fBitmap(bitmap) + , fSrc(src) + , fDst(dst) + , fPaint(paint) + , fConstraint(constraint) {} void SkDrawBitmapRectCommand::execute(SkCanvas* canvas) const { - canvas->legacy_drawBitmapRect(fBitmap, this->srcRect(), fDst, fPaintPtr, fConstraint); + canvas->legacy_drawBitmapRect(fBitmap, fSrc.getMaybeNull(), fDst, fPaint.getMaybeNull(), + fConstraint); } bool SkDrawBitmapRectCommand::render(SkCanvas* canvas) const { - render_bitmap(canvas, fBitmap, this->srcRect()); + render_bitmap(canvas, fBitmap, fSrc.getMaybeNull()); return true; } @@ -2226,12 +1427,12 @@ Json::Value SkDrawBitmapRectCommand::toJSON(UrlDataManager& urlDataManager) cons Json::Value encoded; if (flatten(fBitmap, &encoded, urlDataManager)) { result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded; - if (!fSrc.isEmpty()) { - result[SKDEBUGCANVAS_ATTRIBUTE_SRC] = MakeJsonRect(fSrc); + if (fSrc.isValid()) { + result[SKDEBUGCANVAS_ATTRIBUTE_SRC] = MakeJsonRect(*fSrc.get()); } result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst); - if (fPaintPtr != nullptr) { - result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaintPtr, urlDataManager); + if (fPaint.isValid()) { + result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager); } if (fConstraint == SkCanvas::kStrict_SrcRectConstraint) { result[SKDEBUGCANVAS_ATTRIBUTE_STRICT] = Json::Value(true); @@ -2244,57 +1445,13 @@ Json::Value SkDrawBitmapRectCommand::toJSON(UrlDataManager& urlDataManager) cons return result; } -SkDrawBitmapRectCommand* SkDrawBitmapRectCommand::fromJSON(Json::Value& command, - UrlDataManager& urlDataManager) { - SkBitmap* bitmap = load_bitmap(command[SKDEBUGCANVAS_ATTRIBUTE_BITMAP], urlDataManager); - if (bitmap == nullptr) { - return nullptr; - } - SkRect dst; - extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_DST], &dst); - SkPaint* paintPtr; - SkPaint paint; - if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_PAINT)) { - extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint); - paintPtr = &paint; - } - else { - paintPtr = nullptr; - } - SkCanvas::SrcRectConstraint constraint; - if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_STRICT) && - command[SKDEBUGCANVAS_ATTRIBUTE_STRICT].asBool()) { - constraint = SkCanvas::kStrict_SrcRectConstraint; - } - else { - constraint = SkCanvas::kFast_SrcRectConstraint; - } - SkRect* srcPtr; - SkRect src; - if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_SRC)) { - extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_SRC], &src); - srcPtr = &src; - } - else { - srcPtr = nullptr; - } - SkDrawBitmapRectCommand* result = new SkDrawBitmapRectCommand(*bitmap, srcPtr, dst, paintPtr, - constraint); - delete bitmap; - return result; -} - SkDrawImageCommand::SkDrawImageCommand(const SkImage* image, SkScalar left, SkScalar top, const SkPaint* paint) : INHERITED(kDrawImage_OpType) , fImage(SkRef(image)) , fLeft(left) - , fTop(top) { - - if (paint) { - fPaint.set(*paint); - } -} + , fTop(top) + , fPaint(paint) {} void SkDrawImageCommand::execute(SkCanvas* canvas) const { canvas->drawImage(fImage.get(), fLeft, fTop, fPaint.getMaybeNull()); @@ -2342,39 +1499,14 @@ Json::Value SkDrawImageCommand::toJSON(UrlDataManager& urlDataManager) const { return result; } -SkDrawImageCommand* SkDrawImageCommand::fromJSON(Json::Value& command, - UrlDataManager& urlDataManager) { - sk_sp<SkImage> image = load_image(command[SKDEBUGCANVAS_ATTRIBUTE_IMAGE], urlDataManager); - if (image == nullptr) { - return nullptr; - } - Json::Value point = command[SKDEBUGCANVAS_ATTRIBUTE_COORDS]; - SkPaint* paintPtr; - SkPaint paint; - if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_PAINT)) { - extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint); - paintPtr = &paint; - } - else { - paintPtr = nullptr; - } - SkDrawImageCommand* result = new SkDrawImageCommand(image.get(), point[0].asFloat(), - point[1].asFloat(), paintPtr); - return result; -} - SkDrawImageLatticeCommand::SkDrawImageLatticeCommand(const SkImage* image, const SkCanvas::Lattice& lattice, const SkRect& dst, const SkPaint* paint) : INHERITED(kDrawImageLattice_OpType) , fImage(SkRef(image)) , fLattice(lattice) - , fDst(dst) { - - if (paint) { - fPaint.set(*paint); - } -} + , fDst(dst) + , fPaint(paint) {} void SkDrawImageLatticeCommand::execute(SkCanvas* canvas) const { canvas->drawImageLattice(fImage.get(), fLattice, fDst, fPaint.getMaybeNull()); @@ -2408,28 +1540,15 @@ Json::Value SkDrawImageLatticeCommand::toJSON(UrlDataManager& urlDataManager) co return result; } -SkDrawImageLatticeCommand* SkDrawImageLatticeCommand::fromJSON(Json::Value& command, - UrlDataManager& urlDataManager) { - SkDEBUGFAIL("Not implemented yet."); - return nullptr; -} - SkDrawImageRectCommand::SkDrawImageRectCommand(const SkImage* image, const SkRect* src, const SkRect& dst, const SkPaint* paint, SkCanvas::SrcRectConstraint constraint) : INHERITED(kDrawImageRect_OpType) , fImage(SkRef(image)) + , fSrc(src) , fDst(dst) - , fConstraint(constraint) { - - if (src) { - fSrc.set(*src); - } - - if (paint) { - fPaint.set(*paint); - } -} + , fPaint(paint) + , fConstraint(constraint) {} void SkDrawImageRectCommand::execute(SkCanvas* canvas) const { canvas->legacy_drawImageRect(fImage.get(), fSrc.getMaybeNull(), fDst, @@ -2469,61 +1588,16 @@ Json::Value SkDrawImageRectCommand::toJSON(UrlDataManager& urlDataManager) const return result; } -SkDrawImageRectCommand* SkDrawImageRectCommand::fromJSON(Json::Value& command, - UrlDataManager& urlDataManager) { - sk_sp<SkImage> image = load_image(command[SKDEBUGCANVAS_ATTRIBUTE_IMAGE], urlDataManager); - if (image == nullptr) { - return nullptr; - } - SkRect dst; - extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_DST], &dst); - SkPaint* paintPtr; - SkPaint paint; - if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_PAINT)) { - extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint); - paintPtr = &paint; - } - else { - paintPtr = nullptr; - } - SkCanvas::SrcRectConstraint constraint; - if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_STRICT) && - command[SKDEBUGCANVAS_ATTRIBUTE_STRICT].asBool()) { - constraint = SkCanvas::kStrict_SrcRectConstraint; - } - else { - constraint = SkCanvas::kFast_SrcRectConstraint; - } - SkRect* srcPtr; - SkRect src; - if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_SRC)) { - extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_SRC], &src); - srcPtr = &src; - } - else { - srcPtr = nullptr; - } - SkDrawImageRectCommand* result = new SkDrawImageRectCommand(image.get(), srcPtr, dst, paintPtr, - constraint); - return result; -} - SkDrawImageNineCommand::SkDrawImageNineCommand(const SkImage* image, const SkIRect& center, const SkRect& dst, const SkPaint* paint) - : INHERITED(kDrawImageNine_OpType) - , fImage(SkRef(image)) - , fCenter(center) - , fDst(dst) { - if (paint) { - fPaint = *paint; - fPaintPtr = &fPaint; - } else { - fPaintPtr = nullptr; - } -} + : INHERITED(kDrawImageNine_OpType) + , fImage(SkRef(image)) + , fCenter(center) + , fDst(dst) + , fPaint(paint) {} void SkDrawImageNineCommand::execute(SkCanvas* canvas) const { - canvas->drawImageNine(fImage.get(), fCenter, fDst, fPaintPtr); + canvas->drawImageNine(fImage.get(), fCenter, fDst, fPaint.getMaybeNull()); } bool SkDrawImageNineCommand::render(SkCanvas* canvas) const { @@ -2543,35 +1617,13 @@ Json::Value SkDrawImageNineCommand::toJSON(UrlDataManager& urlDataManager) const result[SKDEBUGCANVAS_ATTRIBUTE_IMAGE] = encoded; result[SKDEBUGCANVAS_ATTRIBUTE_CENTER] = MakeJsonIRect(fCenter); result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst); - if (fPaintPtr != nullptr) { - result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaintPtr, urlDataManager); + if (fPaint.isValid()) { + result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager); } } return result; } -SkDrawImageNineCommand* SkDrawImageNineCommand::fromJSON(Json::Value& command, - UrlDataManager& urlDataManager) { - sk_sp<SkImage> image = load_image(command[SKDEBUGCANVAS_ATTRIBUTE_IMAGE], urlDataManager); - if (image == nullptr) { - return nullptr; - } - SkIRect center; - extract_json_irect(command[SKDEBUGCANVAS_ATTRIBUTE_CENTER], ¢er); - SkRect dst; - extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_DST], &dst); - SkPaint* paintPtr; - SkPaint paint; - if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_PAINT)) { - extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint); - paintPtr = &paint; - } else { - paintPtr = nullptr; - } - SkDrawImageNineCommand* result = new SkDrawImageNineCommand(image.get(), center, dst, paintPtr); - return result; -} - SkDrawOvalCommand::SkDrawOvalCommand(const SkRect& oval, const SkPaint& paint) : INHERITED(kDrawOval_OpType) { fOval = oval; @@ -2605,15 +1657,6 @@ Json::Value SkDrawOvalCommand::toJSON(UrlDataManager& urlDataManager) const { return result; } -SkDrawOvalCommand* SkDrawOvalCommand::fromJSON(Json::Value& command, - UrlDataManager& urlDataManager) { - SkRect coords; - extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_COORDS], &coords); - SkPaint paint; - extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint); - return new SkDrawOvalCommand(coords, paint); -} - SkDrawArcCommand::SkDrawArcCommand(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle, bool useCenter, const SkPaint& paint) : INHERITED(kDrawArc_OpType) { @@ -2654,18 +1697,6 @@ Json::Value SkDrawArcCommand::toJSON(UrlDataManager& urlDataManager) const { return result; } -SkDrawArcCommand* SkDrawArcCommand::fromJSON(Json::Value& command, - UrlDataManager& urlDataManager) { - SkRect coords; - extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_COORDS], &coords); - SkScalar startAngle = command[SKDEBUGCANVAS_ATTRIBUTE_STARTANGLE].asFloat(); - SkScalar sweepAngle = command[SKDEBUGCANVAS_ATTRIBUTE_SWEEPANGLE].asFloat(); - bool useCenter = command[SKDEBUGCANVAS_ATTRIBUTE_USECENTER].asBool(); - SkPaint paint; - extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint); - return new SkDrawArcCommand(coords, startAngle, sweepAngle, useCenter, paint); -} - SkDrawPaintCommand::SkDrawPaintCommand(const SkPaint& paint) : INHERITED(kDrawPaint_OpType) { fPaint = paint; @@ -2687,13 +1718,6 @@ Json::Value SkDrawPaintCommand::toJSON(UrlDataManager& urlDataManager) const { return result; } -SkDrawPaintCommand* SkDrawPaintCommand::fromJSON(Json::Value& command, - UrlDataManager& urlDataManager) { - SkPaint paint; - extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint); - return new SkDrawPaintCommand(paint); -} - SkDrawPathCommand::SkDrawPathCommand(const SkPath& path, const SkPaint& paint) : INHERITED(kDrawPath_OpType) { fPath = path; @@ -2716,15 +1740,6 @@ Json::Value SkDrawPathCommand::toJSON(UrlDataManager& urlDataManager) const { return result; } -SkDrawPathCommand* SkDrawPathCommand::fromJSON(Json::Value& command, - UrlDataManager& urlDataManager) { - SkPath path; - extract_json_path(command[SKDEBUGCANVAS_ATTRIBUTE_PATH], &path); - SkPaint paint; - extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint); - return new SkDrawPathCommand(path, paint); -} - SkDrawRegionCommand::SkDrawRegionCommand(const SkRegion& region, const SkPaint& paint) : INHERITED(kDrawRegion_OpType) { fRegion = region; @@ -2747,28 +1762,13 @@ Json::Value SkDrawRegionCommand::toJSON(UrlDataManager& urlDataManager) const { return result; } -SkDrawRegionCommand* SkDrawRegionCommand::fromJSON(Json::Value& command, - UrlDataManager& urlDataManager) { - SkRegion region; - extract_json_region(command[SKDEBUGCANVAS_ATTRIBUTE_REGION], ®ion); - SkPaint paint; - extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint); - return new SkDrawRegionCommand(region, paint); -} - SkBeginDrawPictureCommand::SkBeginDrawPictureCommand(const SkPicture* picture, const SkMatrix* matrix, const SkPaint* paint) : INHERITED(kBeginDrawPicture_OpType) - , fPicture(SkRef(picture)) { - if (matrix) { - fMatrix.set(*matrix); - } - - if (paint) { - fPaint.set(*paint); - } -} + , fPicture(SkRef(picture)) + , fMatrix(matrix) + , fPaint(paint) {} void SkBeginDrawPictureCommand::execute(SkCanvas* canvas) const { if (fPaint.isValid()) { @@ -2811,16 +1811,13 @@ void SkEndDrawPictureCommand::execute(SkCanvas* canvas) const { SkDrawPointsCommand::SkDrawPointsCommand(SkCanvas::PointMode mode, size_t count, const SkPoint pts[], const SkPaint& paint) - : INHERITED(kDrawPoints_OpType) { - fMode = mode; - fCount = count; - fPts = new SkPoint[count]; - memcpy(fPts, pts, count * sizeof(SkPoint)); - fPaint = paint; -} + : INHERITED(kDrawPoints_OpType) + , fMode(mode) + , fPts(pts, count) + , fPaint(paint) {} void SkDrawPointsCommand::execute(SkCanvas* canvas) const { - canvas->drawPoints(fMode, fCount, fPts, fPaint); + canvas->drawPoints(fMode, fPts.count(), fPts.begin(), fPaint); } bool SkDrawPointsCommand::render(SkCanvas* canvas) const { @@ -2830,7 +1827,7 @@ bool SkDrawPointsCommand::render(SkCanvas* canvas) const { SkRect bounds; bounds.setEmpty(); - for (unsigned int i = 0; i < fCount; ++i) { + for (int i = 0; i < fPts.count(); ++i) { SkRectPriv::GrowToInclude(&bounds, fPts[i]); } @@ -2840,7 +1837,7 @@ bool SkDrawPointsCommand::render(SkCanvas* canvas) const { p.setColor(SK_ColorBLACK); p.setStyle(SkPaint::kStroke_Style); - canvas->drawPoints(fMode, fCount, fPts, p); + canvas->drawPoints(fMode, fPts.count(), fPts.begin(), p); canvas->restore(); return true; @@ -2850,7 +1847,7 @@ Json::Value SkDrawPointsCommand::toJSON(UrlDataManager& urlDataManager) const { Json::Value result = INHERITED::toJSON(urlDataManager); result[SKDEBUGCANVAS_ATTRIBUTE_MODE] = make_json_pointmode(fMode); Json::Value points(Json::arrayValue); - for (size_t i = 0; i < fCount; i++) { + for (int i = 0; i < fPts.count(); i++) { points.append(MakeJsonPoint(fPts[i])); } result[SKDEBUGCANVAS_ATTRIBUTE_POINTS] = points; @@ -2858,36 +1855,6 @@ Json::Value SkDrawPointsCommand::toJSON(UrlDataManager& urlDataManager) const { return result; } -SkDrawPointsCommand* SkDrawPointsCommand::fromJSON(Json::Value& command, - UrlDataManager& urlDataManager) { - SkCanvas::PointMode mode; - const char* jsonMode = command[SKDEBUGCANVAS_ATTRIBUTE_MODE].asCString(); - if (!strcmp(jsonMode, SKDEBUGCANVAS_POINTMODE_POINTS)) { - mode = SkCanvas::kPoints_PointMode; - } - else if (!strcmp(jsonMode, SKDEBUGCANVAS_POINTMODE_LINES)) { - mode = SkCanvas::kLines_PointMode; - } - else if (!strcmp(jsonMode, SKDEBUGCANVAS_POINTMODE_POLYGON)) { - mode = SkCanvas::kPolygon_PointMode; - } - else { - SkASSERT(false); - return nullptr; - } - Json::Value jsonPoints = command[SKDEBUGCANVAS_ATTRIBUTE_POINTS]; - int count = (int) jsonPoints.size(); - SkPoint* points = (SkPoint*) sk_malloc_throw(count * sizeof(SkPoint)); - for (int i = 0; i < count; i++) { - points[i] = SkPoint::Make(jsonPoints[i][0].asFloat(), jsonPoints[i][1].asFloat()); - } - SkPaint paint; - extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint); - SkDrawPointsCommand* result = new SkDrawPointsCommand(mode, count, points, paint); - sk_free(points); - return result; -} - SkDrawPosTextCommand::SkDrawPosTextCommand(const void* text, size_t byteLength, const SkPoint pos[], const SkPaint& paint) : INHERITED(kDrawPosText_OpType) { @@ -2921,20 +1888,6 @@ Json::Value SkDrawPosTextCommand::toJSON(UrlDataManager& urlDataManager) const { return result; } -SkDrawPosTextCommand* SkDrawPosTextCommand::fromJSON(Json::Value& command, - UrlDataManager& urlDataManager) { - const char* text = command[SKDEBUGCANVAS_ATTRIBUTE_TEXT].asCString(); - SkPaint paint; - extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint); - Json::Value coords = command[SKDEBUGCANVAS_ATTRIBUTE_COORDS]; - int count = (int) coords.size(); - SkPoint* points = (SkPoint*) sk_malloc_throw(count * sizeof(SkPoint)); - for (int i = 0; i < count; i++) { - points[i] = SkPoint::Make(coords[i][0].asFloat(), coords[i][1].asFloat()); - } - return new SkDrawPosTextCommand(text, strlen(text), points, paint); -} - SkDrawPosTextHCommand::SkDrawPosTextHCommand(const void* text, size_t byteLength, const SkScalar xpos[], SkScalar constY, const SkPaint& paint) @@ -2971,21 +1924,6 @@ Json::Value SkDrawPosTextHCommand::toJSON(UrlDataManager& urlDataManager) const return result; } -SkDrawPosTextHCommand* SkDrawPosTextHCommand::fromJSON(Json::Value& command, - UrlDataManager& urlDataManager) { - const char* text = command[SKDEBUGCANVAS_ATTRIBUTE_TEXT].asCString(); - SkPaint paint; - extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint); - Json::Value jsonXpos = command[SKDEBUGCANVAS_ATTRIBUTE_POSITIONS]; - int count = (int) jsonXpos.size(); - SkScalar* xpos = (SkScalar*) sk_malloc_throw(count * sizeof(SkScalar)); - for (int i = 0; i < count; i++) { - xpos[i] = jsonXpos[i].asFloat(); - } - SkScalar y = command[SKDEBUGCANVAS_ATTRIBUTE_Y].asFloat(); - return new SkDrawPosTextHCommand(text, strlen(text), xpos, y, paint); -} - SkDrawTextBlobCommand::SkDrawTextBlobCommand(sk_sp<SkTextBlob> blob, SkScalar x, SkScalar y, const SkPaint& paint) : INHERITED(kDrawTextBlob_OpType) @@ -3062,55 +2000,6 @@ Json::Value SkDrawTextBlobCommand::toJSON(UrlDataManager& urlDataManager) const return result; } -SkDrawTextBlobCommand* SkDrawTextBlobCommand::fromJSON(Json::Value& command, - UrlDataManager& urlDataManager) { - SkTextBlobBuilder builder; - Json::Value runs = command[SKDEBUGCANVAS_ATTRIBUTE_RUNS]; - for (Json::ArrayIndex i = 0 ; i < runs.size(); i++) { - Json::Value run = runs[i]; - SkPaint font; - font.setTextEncoding(SkPaint::kGlyphID_TextEncoding); - extract_json_paint(run[SKDEBUGCANVAS_ATTRIBUTE_FONT], urlDataManager, &font); - Json::Value glyphs = run[SKDEBUGCANVAS_ATTRIBUTE_GLYPHS]; - int count = glyphs.size(); - Json::Value coords = run[SKDEBUGCANVAS_ATTRIBUTE_COORDS]; - SkScalar x = coords[0].asFloat(); - SkScalar y = coords[1].asFloat(); - SkRect bounds; - extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_COORDS], &bounds); - - if (run.isMember(SKDEBUGCANVAS_ATTRIBUTE_POSITIONS)) { - Json::Value positions = run[SKDEBUGCANVAS_ATTRIBUTE_POSITIONS]; - if (positions.size() > 0 && positions[0].isNumeric()) { - SkTextBlobBuilder::RunBuffer buffer = builder.allocRunPosH(font, count, y, &bounds); - 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, &bounds); - 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, &bounds); - for (int j = 0; j < count; j++) { - buffer.glyphs[j] = glyphs[j].asUInt(); - } - } - } - SkScalar x = command[SKDEBUGCANVAS_ATTRIBUTE_X].asFloat(); - SkScalar y = command[SKDEBUGCANVAS_ATTRIBUTE_Y].asFloat(); - SkPaint paint; - extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint); - return new SkDrawTextBlobCommand(builder.make(), x, y, paint); -} - SkDrawPatchCommand::SkDrawPatchCommand(const SkPoint cubics[12], const SkColor colors[4], const SkPoint texCoords[4], SkBlendMode bmode, const SkPaint& paint) @@ -3162,45 +2051,6 @@ Json::Value SkDrawPatchCommand::toJSON(UrlDataManager& urlDataManager) const { return result; } -SkDrawPatchCommand* SkDrawPatchCommand::fromJSON(Json::Value& command, - UrlDataManager& urlDataManager) { - Json::Value jsonCubics = command[SKDEBUGCANVAS_ATTRIBUTE_CUBICS]; - SkPoint cubics[12]; - for (int i = 0; i < 12; i++) { - cubics[i] = get_json_point(jsonCubics[i]); - } - SkColor* colorsPtr; - SkColor colors[4]; - if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_COLORS)) { - Json::Value jsonColors = command[SKDEBUGCANVAS_ATTRIBUTE_COLORS]; - for (int i = 0; i < 4; i++) { - colors[i] = get_json_color(jsonColors[i]); - } - colorsPtr = colors; - } - else { - colorsPtr = nullptr; - } - SkPoint* texCoordsPtr; - SkPoint texCoords[4]; - if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_TEXTURECOORDS)) { - Json::Value jsonTexCoords = command[SKDEBUGCANVAS_ATTRIBUTE_TEXTURECOORDS]; - for (int i = 0; i < 4; i++) { - texCoords[i] = get_json_point(jsonTexCoords[i]); - } - texCoordsPtr = texCoords; - } - else { - texCoordsPtr = nullptr; - } - - SkBlendMode bmode = SkBlendMode::kSrcOver; // TODO: extract from json - - SkPaint paint; - extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint); - return new SkDrawPatchCommand(cubics, colorsPtr, texCoordsPtr, bmode, paint); -} - SkDrawRectCommand::SkDrawRectCommand(const SkRect& rect, const SkPaint& paint) : INHERITED(kDrawRect_OpType) { fRect = rect; @@ -3222,15 +2072,6 @@ Json::Value SkDrawRectCommand::toJSON(UrlDataManager& urlDataManager) const { return result; } -SkDrawRectCommand* SkDrawRectCommand::fromJSON(Json::Value& command, - UrlDataManager& urlDataManager) { - SkRect coords; - extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_COORDS], &coords); - SkPaint paint; - extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint); - return new SkDrawRectCommand(coords, paint); -} - SkDrawRRectCommand::SkDrawRRectCommand(const SkRRect& rrect, const SkPaint& paint) : INHERITED(kDrawRRect_OpType) { fRRect = rrect; @@ -3253,15 +2094,6 @@ Json::Value SkDrawRRectCommand::toJSON(UrlDataManager& urlDataManager) const { return result; } -SkDrawRRectCommand* SkDrawRRectCommand::fromJSON(Json::Value& command, - UrlDataManager& urlDataManager) { - SkRRect coords; - extract_json_rrect(command[SKDEBUGCANVAS_ATTRIBUTE_COORDS], &coords); - SkPaint paint; - extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint); - return new SkDrawRRectCommand(coords, paint); -} - SkDrawDRRectCommand::SkDrawDRRectCommand(const SkRRect& outer, const SkRRect& inner, const SkPaint& paint) @@ -3288,17 +2120,6 @@ Json::Value SkDrawDRRectCommand::toJSON(UrlDataManager& urlDataManager) const { return result; } -SkDrawDRRectCommand* SkDrawDRRectCommand::fromJSON(Json::Value& command, - UrlDataManager& urlDataManager) { - SkRRect outer; - extract_json_rrect(command[SKDEBUGCANVAS_ATTRIBUTE_INNER], &outer); - SkRRect inner; - extract_json_rrect(command[SKDEBUGCANVAS_ATTRIBUTE_INNER], &inner); - SkPaint paint; - extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint); - return new SkDrawDRRectCommand(outer, inner, paint); -} - SkDrawShadowCommand::SkDrawShadowCommand(const SkPath& path, const SkDrawShadowRec& rec) : INHERITED(kDrawShadow_OpType) { fPath = path; @@ -3333,29 +2154,6 @@ Json::Value SkDrawShadowCommand::toJSON(UrlDataManager& urlDataManager) const { return result; } -SkDrawShadowCommand* SkDrawShadowCommand::fromJSON(Json::Value& command, - UrlDataManager& urlDataManager) { - SkPath path; - extract_json_path(command[SKDEBUGCANVAS_ATTRIBUTE_PATH], &path); - SkDrawShadowRec rec; - rec.fZPlaneParams = get_json_point3(command[SKDEBUGCANVAS_ATTRIBUTE_ZPLANE]); - rec.fLightPos = get_json_point3(command[SKDEBUGCANVAS_ATTRIBUTE_LIGHTPOSITION]); - rec.fLightRadius = command[SKDEBUGCANVAS_ATTRIBUTE_LIGHTRADIUS].asFloat(); - rec.fAmbientColor = get_json_color(command[SKDEBUGCANVAS_ATTRIBUTE_AMBIENTCOLOR]); - rec.fSpotColor = get_json_color(command[SKDEBUGCANVAS_ATTRIBUTE_SPOTCOLOR]); - - rec.fFlags = SkShadowFlags::kNone_ShadowFlag; - if (command.isMember(SKDEBUGCANVAS_SHADOWFLAG_TRANSPARENT_OCC) - && command[SKDEBUGCANVAS_SHADOWFLAG_TRANSPARENT_OCC].asBool()) { - rec.fFlags |= SkShadowFlags::kTransparentOccluder_ShadowFlag; - } - if (command.isMember(SKDEBUGCANVAS_SHADOWFLAG_GEOMETRIC_ONLY) - && command[SKDEBUGCANVAS_SHADOWFLAG_GEOMETRIC_ONLY].asBool()) { - rec.fFlags |= SkShadowFlags::kGeometricOnly_ShadowFlag; - } - return new SkDrawShadowCommand(path, rec); -} - SkDrawTextCommand::SkDrawTextCommand(const void* text, size_t byteLength, SkScalar x, SkScalar y, const SkPaint& paint) : INHERITED(kDrawText_OpType) { @@ -3381,38 +2179,22 @@ Json::Value SkDrawTextCommand::toJSON(UrlDataManager& urlDataManager) const { return result; } -SkDrawTextCommand* SkDrawTextCommand::fromJSON(Json::Value& command, - UrlDataManager& urlDataManager) { - const char* text = command[SKDEBUGCANVAS_ATTRIBUTE_TEXT].asCString(); - SkPaint paint; - extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint); - Json::Value coords = command[SKDEBUGCANVAS_ATTRIBUTE_COORDS]; - return new SkDrawTextCommand(text, strlen(text), coords[0].asFloat(), coords[1].asFloat(), - paint); -} - /////////////////////////////////////////////////////////////////////////////////////////////////// SkDrawTextOnPathCommand::SkDrawTextOnPathCommand(const void* text, size_t byteLength, const SkPath& path, const SkMatrix* matrix, const SkPaint& paint) - : INHERITED(kDrawTextOnPath_OpType) { + : INHERITED(kDrawTextOnPath_OpType) + , fMatrix(matrix) { fText = new char[byteLength]; memcpy(fText, text, byteLength); fByteLength = byteLength; fPath = path; - if (matrix) { - fMatrix = *matrix; - } else { - fMatrix.setIdentity(); - } fPaint = paint; } void SkDrawTextOnPathCommand::execute(SkCanvas* canvas) const { - canvas->drawTextOnPath(fText, fByteLength, fPath, - fMatrix.isIdentity() ? nullptr : &fMatrix, - fPaint); + canvas->drawTextOnPath(fText, fByteLength, fPath, fMatrix.getMaybeNull(), fPaint); } Json::Value SkDrawTextOnPathCommand::toJSON(UrlDataManager& urlDataManager) const { @@ -3421,38 +2203,20 @@ Json::Value SkDrawTextOnPathCommand::toJSON(UrlDataManager& urlDataManager) cons ((const char*) fText) + fByteLength); Json::Value coords(Json::arrayValue); result[SKDEBUGCANVAS_ATTRIBUTE_PATH] = MakeJsonPath(fPath); - if (!fMatrix.isIdentity()) { - result[SKDEBUGCANVAS_ATTRIBUTE_MATRIX] = MakeJsonMatrix(fMatrix); + if (fMatrix.isValid()) { + result[SKDEBUGCANVAS_ATTRIBUTE_MATRIX] = MakeJsonMatrix(*fMatrix.get()); } result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(fPaint, urlDataManager); return result; } -SkDrawTextOnPathCommand* SkDrawTextOnPathCommand::fromJSON(Json::Value& command, - UrlDataManager& urlDataManager) { - const char* text = command[SKDEBUGCANVAS_ATTRIBUTE_TEXT].asCString(); - SkPaint paint; - extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint); - SkPath path; - extract_json_path(command[SKDEBUGCANVAS_ATTRIBUTE_PATH], &path); - SkMatrix* matrixPtr; - SkMatrix matrix; - if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_MATRIX)) { - extract_json_matrix(command[SKDEBUGCANVAS_ATTRIBUTE_MATRIX], &matrix); - matrixPtr = &matrix; - } - else { - matrixPtr = nullptr; - } - return new SkDrawTextOnPathCommand(text, strlen(text), path, matrixPtr, paint); -} - /////////////////////////////////////////////////////////////////////////////////////////////////// SkDrawTextRSXformCommand::SkDrawTextRSXformCommand(const void* text, size_t byteLength, const SkRSXform xform[], const SkRect* cull, const SkPaint& paint) : INHERITED(kDrawTextRSXform_OpType) + , fCull(cull) { fText = new char[byteLength]; memcpy(fText, text, byteLength); @@ -3460,17 +2224,11 @@ SkDrawTextRSXformCommand::SkDrawTextRSXformCommand(const void* text, size_t byte int count = paint.countText(text, byteLength); fXform = new SkRSXform[count]; memcpy(fXform, xform, count * sizeof(SkRSXform)); - if (cull) { - fCullStorage = *cull; - fCull = &fCullStorage; - } else { - fCull = nullptr; - } fPaint = paint; } void SkDrawTextRSXformCommand::execute(SkCanvas* canvas) const { - canvas->drawTextRSXform(fText, fByteLength, fXform, fCull, fPaint); + canvas->drawTextRSXform(fText, fByteLength, fXform, fCull.getMaybeNull(), fPaint); } Json::Value SkDrawTextRSXformCommand::toJSON(UrlDataManager& urlDataManager) const { @@ -3481,23 +2239,6 @@ Json::Value SkDrawTextRSXformCommand::toJSON(UrlDataManager& urlDataManager) con return result; } -SkDrawTextRSXformCommand* SkDrawTextRSXformCommand::fromJSON(Json::Value& command, - UrlDataManager& urlDataManager) { - const char* text = command[SKDEBUGCANVAS_ATTRIBUTE_TEXT].asCString(); - size_t byteLength = strlen(text); - SkPaint paint; - extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint); - - // TODO: handle xform and cull - int count = paint.countText(text, byteLength); - SkAutoTArray<SkRSXform> xform(count); - for (int i = 0; i < count; ++i) { - xform[i].fSCos = 1; - xform[i].fSSin = xform[i].fTx = xform[i].fTy = 0; - } - return new SkDrawTextRSXformCommand(text, byteLength, &xform[0], nullptr, paint); -} - /////////////////////////////////////////////////////////////////////////////////////////////////// SkDrawVerticesCommand::SkDrawVerticesCommand(sk_sp<SkVertices> vertices, SkBlendMode bmode, @@ -3541,10 +2282,6 @@ void SkRestoreCommand::execute(SkCanvas* canvas) const { canvas->restore(); } -SkRestoreCommand* SkRestoreCommand::fromJSON(Json::Value& command, UrlDataManager& urlDataManager) { - return new SkRestoreCommand(); -} - SkSaveCommand::SkSaveCommand() : INHERITED(kSave_OpType) { } @@ -3553,58 +2290,29 @@ void SkSaveCommand::execute(SkCanvas* canvas) const { canvas->save(); } -SkSaveCommand* SkSaveCommand::fromJSON(Json::Value& command, UrlDataManager& urlDataManager) { - return new SkSaveCommand(); -} - SkSaveLayerCommand::SkSaveLayerCommand(const SkCanvas::SaveLayerRec& rec) - : INHERITED(kSaveLayer_OpType) { - if (rec.fBounds) { - fBounds = *rec.fBounds; - } else { - fBounds.setEmpty(); - } - - if (rec.fPaint) { - fPaint = *rec.fPaint; - fPaintPtr = &fPaint; - } else { - fPaintPtr = nullptr; - } - fSaveLayerFlags = rec.fSaveLayerFlags; - - if (rec.fBackdrop) { - fBackdrop = rec.fBackdrop; - fBackdrop->ref(); - } else { - fBackdrop = nullptr; - } -} - -SkSaveLayerCommand::~SkSaveLayerCommand() { - if (fBackdrop != nullptr) { - fBackdrop->unref(); - } -} + : INHERITED(kSaveLayer_OpType) + , fBounds(rec.fBounds) + , fPaint(rec.fPaint) + , fBackdrop(SkSafeRef(rec.fBackdrop)) + , fSaveLayerFlags(rec.fSaveLayerFlags) {} void SkSaveLayerCommand::execute(SkCanvas* canvas) const { - canvas->saveLayer(SkCanvas::SaveLayerRec(fBounds.isEmpty() ? nullptr : &fBounds, - fPaintPtr, + canvas->saveLayer(SkCanvas::SaveLayerRec(fBounds.getMaybeNull(), fPaint.getMaybeNull(), fSaveLayerFlags)); } Json::Value SkSaveLayerCommand::toJSON(UrlDataManager& urlDataManager) const { Json::Value result = INHERITED::toJSON(urlDataManager); - if (!fBounds.isEmpty()) { - result[SKDEBUGCANVAS_ATTRIBUTE_BOUNDS] = MakeJsonRect(fBounds); + if (fBounds.isValid()) { + result[SKDEBUGCANVAS_ATTRIBUTE_BOUNDS] = MakeJsonRect(*fBounds.get()); } - if (fPaintPtr != nullptr) { - result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaintPtr, - urlDataManager); + if (fPaint.isValid()) { + result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager); } if (fBackdrop != nullptr) { Json::Value jsonBackdrop; - flatten(fBackdrop, &jsonBackdrop, urlDataManager); + flatten(fBackdrop.get(), &jsonBackdrop, urlDataManager); result[SKDEBUGCANVAS_ATTRIBUTE_BACKDROP] = jsonBackdrop; } if (fSaveLayerFlags != 0) { @@ -3614,30 +2322,6 @@ Json::Value SkSaveLayerCommand::toJSON(UrlDataManager& urlDataManager) const { return result; } -SkSaveLayerCommand* SkSaveLayerCommand::fromJSON(Json::Value& command, - UrlDataManager& urlDataManager) { - SkCanvas::SaveLayerRec rec; - SkRect bounds; - if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_BOUNDS)) { - extract_json_rect(command[SKDEBUGCANVAS_ATTRIBUTE_BOUNDS], &bounds); - rec.fBounds = &bounds; - } - SkPaint paint; - if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_PAINT)) { - extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint); - rec.fPaint = &paint; - } - if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_BACKDROP)) { - Json::Value backdrop = command[SKDEBUGCANVAS_ATTRIBUTE_BACKDROP]; - rec.fBackdrop = (SkImageFilter*) load_flattenable(backdrop, urlDataManager); - } - SkSaveLayerCommand* result = new SkSaveLayerCommand(rec); - if (rec.fBackdrop != nullptr) { - rec.fBackdrop->unref(); - } - return result; -} - SkSetMatrixCommand::SkSetMatrixCommand(const SkMatrix& matrix) : INHERITED(kSetMatrix_OpType) { fMatrix = matrix; @@ -3652,10 +2336,3 @@ Json::Value SkSetMatrixCommand::toJSON(UrlDataManager& urlDataManager) const { result[SKDEBUGCANVAS_ATTRIBUTE_MATRIX] = MakeJsonMatrix(fMatrix); return result; } - -SkSetMatrixCommand* SkSetMatrixCommand::fromJSON(Json::Value& command, - UrlDataManager& urlDataManager) { - SkMatrix matrix; - extract_json_matrix(command[SKDEBUGCANVAS_ATTRIBUTE_MATRIX], &matrix); - return new SkSetMatrixCommand(matrix); -} diff --git a/tools/debugger/SkDrawCommand.h b/tools/debugger/SkDrawCommand.h index 5a14c4fbff..7bac9e4858 100644 --- a/tools/debugger/SkDrawCommand.h +++ b/tools/debugger/SkDrawCommand.h @@ -93,12 +93,6 @@ public: virtual Json::Value toJSON(UrlDataManager& urlDataManager) const; - /* Converts a JSON representation of a command into a newly-allocated SkDrawCommand object. It - * is the caller's responsibility to delete this object. This method may return null if an error - * occurs. - */ - static SkDrawCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); - static const char* GetCommandString(OpType type); // Helper methods for converting things to JSON @@ -132,7 +126,6 @@ class SkRestoreCommand : public SkDrawCommand { public: SkRestoreCommand(); void execute(SkCanvas* canvas) const override; - static SkRestoreCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: typedef SkDrawCommand INHERITED; @@ -143,7 +136,6 @@ public: SkClearCommand(SkColor color); void execute(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; - static SkClearCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: SkColor fColor; @@ -157,7 +149,6 @@ public: void execute(SkCanvas* canvas) const override; bool render(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; - static SkClipPathCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: SkPath fPath; @@ -172,7 +163,6 @@ public: SkClipRegionCommand(const SkRegion& region, SkClipOp op); void execute(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; - static SkClipRegionCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: SkRegion fRegion; @@ -186,11 +176,6 @@ public: SkClipRectCommand(const SkRect& rect, SkClipOp op, bool doAA); void execute(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; - static SkClipRectCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); - - const SkRect& rect() const { return fRect; } - SkClipOp op() const { return fOp; } - bool doAA() const { return fDoAA; } private: SkRect fRect; @@ -206,11 +191,6 @@ public: void execute(SkCanvas* canvas) const override; bool render(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; - static SkClipRRectCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); - - const SkRRect& rrect() const { return fRRect; } - SkClipOp op() const { return fOp; } - bool doAA() const { return fDoAA; } private: SkRRect fRRect; @@ -225,7 +205,6 @@ public: SkConcatCommand(const SkMatrix& matrix); void execute(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; - static SkConcatCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: SkMatrix fMatrix; @@ -238,7 +217,6 @@ public: SkDrawAnnotationCommand(const SkRect&, const char key[], sk_sp<SkData> value); void execute(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; - static SkDrawAnnotationCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: SkRect fRect; @@ -255,14 +233,12 @@ public: void execute(SkCanvas* canvas) const override; bool render(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; - static SkDrawBitmapCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: - SkBitmap fBitmap; - SkScalar fLeft; - SkScalar fTop; - SkPaint fPaint; - SkPaint* fPaintPtr; + SkBitmap fBitmap; + SkScalar fLeft; + SkScalar fTop; + SkTLazy<SkPaint> fPaint; typedef SkDrawCommand INHERITED; }; @@ -274,8 +250,6 @@ public: void execute(SkCanvas* canvas) const override; bool render(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; - static SkDrawBitmapLatticeCommand* fromJSON(Json::Value& command, - UrlDataManager& urlDataManager); private: SkBitmap fBitmap; @@ -293,14 +267,12 @@ public: void execute(SkCanvas* canvas) const override; bool render(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; - static SkDrawBitmapNineCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: - SkBitmap fBitmap; - SkIRect fCenter; - SkRect fDst; - SkPaint fPaint; - SkPaint* fPaintPtr; + SkBitmap fBitmap; + SkIRect fCenter; + SkRect fDst; + SkTLazy<SkPaint> fPaint; typedef SkDrawCommand INHERITED; }; @@ -313,34 +285,12 @@ public: void execute(SkCanvas* canvas) const override; bool render(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; - static SkDrawBitmapRectCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); - - const SkBitmap& bitmap() const { return fBitmap; } - - // The non-const 'paint' method allows modification of this object's - // SkPaint. For this reason the ctor and setPaint method make a local copy. - // The 'fPaintPtr' member acts a signal that the local SkPaint is valid - // (since only an SkPaint* is passed into the ctor). - const SkPaint* paint() const { return fPaintPtr; } - SkPaint* paint() { return fPaintPtr; } - - void setPaint(const SkPaint& paint) { fPaint = paint; fPaintPtr = &fPaint; } - - const SkRect* srcRect() const { return fSrc.isEmpty() ? nullptr : &fSrc; } - void setSrcRect(const SkRect& src) { fSrc = src; } - - const SkRect& dstRect() const { return fDst; } - void setDstRect(const SkRect& dst) { fDst = dst; } - - SkCanvas::SrcRectConstraint constraint() const { return fConstraint; } - void setConstraint(SkCanvas::SrcRectConstraint constraint) { fConstraint = constraint; } private: SkBitmap fBitmap; - SkRect fSrc; + SkTLazy<SkRect> fSrc; SkRect fDst; - SkPaint fPaint; - SkPaint* fPaintPtr; + SkTLazy<SkPaint> fPaint; SkCanvas::SrcRectConstraint fConstraint; typedef SkDrawCommand INHERITED; @@ -352,7 +302,6 @@ public: void execute(SkCanvas* canvas) const override; bool render(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; - static SkDrawImageCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: sk_sp<const SkImage> fImage; @@ -370,8 +319,6 @@ public: void execute(SkCanvas* canvas) const override; bool render(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; - static SkDrawImageLatticeCommand* fromJSON(Json::Value& command, - UrlDataManager& urlDataManager); private: sk_sp<const SkImage> fImage; @@ -389,14 +336,12 @@ public: void execute(SkCanvas* canvas) const override; bool render(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; - static SkDrawImageNineCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: sk_sp<const SkImage> fImage; SkIRect fCenter; SkRect fDst; - SkPaint fPaint; - SkPaint* fPaintPtr; + SkTLazy<SkPaint> fPaint; typedef SkDrawCommand INHERITED; }; @@ -408,7 +353,6 @@ public: void execute(SkCanvas* canvas) const override; bool render(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; - static SkDrawImageRectCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: sk_sp<const SkImage> fImage; @@ -426,7 +370,6 @@ public: void execute(SkCanvas* canvas) const override; bool render(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; - static SkDrawOvalCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: SkRect fOval; @@ -442,7 +385,6 @@ public: void execute(SkCanvas* canvas) const override; bool render(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; - static SkDrawArcCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: SkRect fOval; @@ -460,7 +402,6 @@ public: void execute(SkCanvas* canvas) const override; bool render(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; - static SkDrawPaintCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: SkPaint fPaint; @@ -474,7 +415,6 @@ public: void execute(SkCanvas* canvas) const override; bool render(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; - static SkDrawPathCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: SkPath fPath; @@ -516,16 +456,13 @@ class SkDrawPointsCommand : public SkDrawCommand { public: SkDrawPointsCommand(SkCanvas::PointMode mode, size_t count, const SkPoint pts[], const SkPaint& paint); - ~SkDrawPointsCommand() override { delete [] fPts; } void execute(SkCanvas* canvas) const override; bool render(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; - static SkDrawPointsCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: SkCanvas::PointMode fMode; - size_t fCount; - SkPoint* fPts; + SkTDArray<SkPoint> fPts; SkPaint fPaint; typedef SkDrawCommand INHERITED; @@ -537,7 +474,6 @@ public: void execute(SkCanvas* canvas) const override; bool render(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; - static SkDrawRegionCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: SkRegion fRegion; @@ -553,7 +489,6 @@ public: ~SkDrawTextCommand() override { delete [] fText; } void execute(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; - static SkDrawTextCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: char* fText; @@ -572,7 +507,6 @@ public: ~SkDrawPosTextCommand() override { delete [] fPos; delete [] fText; } void execute(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; - static SkDrawPosTextCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: char* fText; @@ -590,14 +524,13 @@ public: ~SkDrawTextOnPathCommand() override { delete [] fText; } void execute(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; - static SkDrawTextOnPathCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: - char* fText; - size_t fByteLength; - SkPath fPath; - SkMatrix fMatrix; - SkPaint fPaint; + char* fText; + size_t fByteLength; + SkPath fPath; + SkTLazy<SkMatrix> fMatrix; + SkPaint fPaint; typedef SkDrawCommand INHERITED; }; @@ -609,15 +542,13 @@ public: ~SkDrawTextRSXformCommand() override { delete[] fText; delete[] fXform; } void execute(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; - static SkDrawTextRSXformCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: - char* fText; - size_t fByteLength; - SkRSXform* fXform; - SkRect* fCull; - SkRect fCullStorage; - SkPaint fPaint; + char* fText; + size_t fByteLength; + SkRSXform* fXform; + SkTLazy<SkRect> fCull; + SkPaint fPaint; typedef SkDrawCommand INHERITED; }; @@ -629,7 +560,6 @@ public: ~SkDrawPosTextHCommand() override { delete [] fXpos; delete [] fText; } void execute(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; - static SkDrawPosTextHCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: SkScalar* fXpos; @@ -648,7 +578,6 @@ public: void execute(SkCanvas* canvas) const override; bool render(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; - static SkDrawTextBlobCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: sk_sp<SkTextBlob> fBlob; @@ -666,7 +595,6 @@ public: const SkPaint& paint); void execute(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; - static SkDrawPatchCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: SkPoint fCubics[12]; @@ -686,10 +614,7 @@ public: SkDrawRectCommand(const SkRect& rect, const SkPaint& paint); void execute(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; - static SkDrawRectCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); - const SkRect& rect() const { return fRect; } - const SkPaint& paint() const { return fPaint; } private: SkRect fRect; SkPaint fPaint; @@ -703,7 +628,6 @@ public: void execute(SkCanvas* canvas) const override; bool render(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; - static SkDrawRRectCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: SkRRect fRRect; @@ -719,7 +643,6 @@ public: void execute(SkCanvas* canvas) const override; bool render(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; - static SkDrawDRRectCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: SkRRect fOuter; @@ -766,7 +689,6 @@ class SkSaveCommand : public SkDrawCommand { public: SkSaveCommand(); void execute(SkCanvas* canvas) const override; - static SkSaveCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: typedef SkDrawCommand INHERITED; @@ -775,19 +697,14 @@ private: class SkSaveLayerCommand : public SkDrawCommand { public: SkSaveLayerCommand(const SkCanvas::SaveLayerRec&); - ~SkSaveLayerCommand() override; void execute(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; - static SkSaveLayerCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); - - const SkPaint* paint() const { return fPaintPtr; } private: - SkRect fBounds; - SkPaint fPaint; - SkPaint* fPaintPtr; - const SkImageFilter* fBackdrop; - uint32_t fSaveLayerFlags; + SkTLazy<SkRect> fBounds; + SkTLazy<SkPaint> fPaint; + sk_sp<const SkImageFilter> fBackdrop; + uint32_t fSaveLayerFlags; typedef SkDrawCommand INHERITED; }; @@ -797,7 +714,6 @@ public: SkSetMatrixCommand(const SkMatrix& matrix); void execute(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; - static SkSetMatrixCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: SkMatrix fMatrix; @@ -811,7 +727,6 @@ public: void execute(SkCanvas* canvas) const override; bool render(SkCanvas* canvas) const override; Json::Value toJSON(UrlDataManager& urlDataManager) const override; - static SkDrawShadowCommand* fromJSON(Json::Value& command, UrlDataManager& urlDataManager); private: SkPath fPath; |