aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--dm/DM.cpp1
-rw-r--r--dm/DMSrcSink.cpp25
-rw-r--r--dm/DMSrcSink.h6
-rw-r--r--include/core/SkSize.h3
-rw-r--r--src/fonts/SkTestScalerContext.cpp2
-rw-r--r--src/svg/SkSVGDevice.cpp13
-rw-r--r--src/xml/SkDOM.cpp2
7 files changed, 44 insertions, 8 deletions
diff --git a/dm/DM.cpp b/dm/DM.cpp
index 81506a78cc..3dced058d0 100644
--- a/dm/DM.cpp
+++ b/dm/DM.cpp
@@ -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) {}