diff options
-rw-r--r-- | dm/DM.cpp | 1 | ||||
-rw-r--r-- | dm/DMSrcSink.cpp | 25 | ||||
-rw-r--r-- | dm/DMSrcSink.h | 6 | ||||
-rw-r--r-- | include/core/SkSize.h | 3 | ||||
-rw-r--r-- | src/fonts/SkTestScalerContext.cpp | 2 | ||||
-rw-r--r-- | src/svg/SkSVGDevice.cpp | 13 | ||||
-rw-r--r-- | src/xml/SkDOM.cpp | 2 |
7 files changed, 44 insertions, 8 deletions
@@ -885,6 +885,7 @@ static Sink* create_via(const SkString& tag, Sink* wrapped) { VIA("lite", ViaLite, wrapped); VIA("pipe", ViaPipe, wrapped); VIA("twice", ViaTwice, wrapped); + VIA("svg", ViaSVG, wrapped); VIA("serialize", ViaSerialization, wrapped); VIA("pic", ViaPicture, wrapped); VIA("2ndpic", ViaSecondPicture, wrapped); diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp index d28c3a2ff2..6e84cc9885 100644 --- a/dm/DMSrcSink.cpp +++ b/dm/DMSrcSink.cpp @@ -1712,6 +1712,31 @@ Error ViaTwice::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkStri /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ +#include "SkXMLWriter.h" +#include "SkSVGCanvas.h" +#include "SkSVGDOM.h" + +Error ViaSVG::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkString* log) const { + auto size = src.size(); + return draw_to_canvas(fSink.get(), bitmap, stream, log, size, [&](SkCanvas* canvas) -> Error { + SkDynamicMemoryWStream wstream; + SkXMLStreamWriter writer(&wstream); + Error err = src.draw(SkSVGCanvas::Make(SkRect::Make(size), &writer).get()); + if (!err.isEmpty()) { + return err; + } + std::unique_ptr<SkStream> rstream(wstream.detachAsStream()); + auto dom = SkSVGDOM::MakeFromStream(*rstream); + if (dom) { + dom->setContainerSize(SkSize::Make(size)); + dom->render(canvas); + } + return ""; + }); +} + +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + // This is like SkRecords::Draw, in that it plays back SkRecords ops into a Canvas. // Unlike SkRecords::Draw, it builds a single-op sub-picture out of each Draw-type op. // This is an only-slightly-exaggerated simluation of Blink's Slimming Paint pictures. diff --git a/dm/DMSrcSink.h b/dm/DMSrcSink.h index cac8848307..f2b09f6134 100644 --- a/dm/DMSrcSink.h +++ b/dm/DMSrcSink.h @@ -467,6 +467,12 @@ public: Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; }; +class ViaSVG : public Via { +public: + explicit ViaSVG(Sink* sink) : Via(sink) {} + Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; +}; + class ViaMojo : public Via { public: explicit ViaMojo(Sink* sink) : Via(sink) {} diff --git a/include/core/SkSize.h b/include/core/SkSize.h index 7bc8c7165d..2efcfb59dc 100644 --- a/include/core/SkSize.h +++ b/include/core/SkSize.h @@ -82,6 +82,9 @@ struct SkSize : public SkTSize<SkScalar> { return s; } + static SkSize Make(const SkISize& src) { + return Make(SkIntToScalar(src.width()), SkIntToScalar(src.height())); + } SkSize& operator=(const SkISize& src) { this->set(SkIntToScalar(src.fWidth), SkIntToScalar(src.fHeight)); diff --git a/src/fonts/SkTestScalerContext.cpp b/src/fonts/SkTestScalerContext.cpp index 5067dfee0d..2af8c88d2f 100644 --- a/src/fonts/SkTestScalerContext.cpp +++ b/src/fonts/SkTestScalerContext.cpp @@ -188,7 +188,7 @@ void SkTestTypeface::onGetFamilyName(SkString* familyName) const { SkTypeface::LocalizedStrings* SkTestTypeface::onCreateFamilyNameIterator() const { SkString familyName(fTestFont->fName); SkString language("und"); //undetermined -SkASSERT(0); // incomplete +//SkASSERT(0); // incomplete return nullptr; // return new SkOTUtils::LocalizedStrings_SingleName(familyName, language); } diff --git a/src/svg/SkSVGDevice.cpp b/src/svg/SkSVGDevice.cpp index 261ad22d6d..360bb07d44 100644 --- a/src/svg/SkSVGDevice.cpp +++ b/src/svg/SkSVGDevice.cpp @@ -563,14 +563,15 @@ void SkSVGDevice::AutoElement::addTextAttributes(const SkPaint& paint) { sk_sp<SkTypeface::LocalizedStrings> familyNameIter(tface->createFamilyNameIterator()); SkTypeface::LocalizedString familyString; - while (familyNameIter->next(&familyString)) { - if (familySet.contains(familyString.fString)) { - continue; + if (familyNameIter) { + while (familyNameIter->next(&familyString)) { + if (familySet.contains(familyString.fString)) { + continue; + } + familySet.add(familyString.fString); + familyName.appendf((familyName.isEmpty() ? "%s" : ", %s"), familyString.fString.c_str()); } - familySet.add(familyString.fString); - familyName.appendf((familyName.isEmpty() ? "%s" : ", %s"), familyString.fString.c_str()); } - if (!familyName.isEmpty()) { this->addAttribute("font-family", familyName); } diff --git a/src/xml/SkDOM.cpp b/src/xml/SkDOM.cpp index 37b230b949..2e37dd7807 100644 --- a/src/xml/SkDOM.cpp +++ b/src/xml/SkDOM.cpp @@ -64,7 +64,7 @@ struct SkDOMNode { ///////////////////////////////////////////////////////////////////////// -#define kMinChunkSize 512 +#define kMinChunkSize 4096 SkDOM::SkDOM() : fAlloc(kMinChunkSize), fRoot(nullptr) {} |