[SVGDom] Improved DM sizing
Rather than always using a 1000x1000 canvas, observe the SVG intrinsic size when available. If the intrinsic size is < 128x128, scale uniformly. R=robertphillips@google.com,stephana@google.com GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2342313003 Review-Url: https://codereview.chromium.org/2342313003
This commit is contained in:
parent
67ac33e1f1
commit
bdf3e5c034
@ -1056,30 +1056,57 @@ Name SKPSrc::name() const { return SkOSPath::Basename(fPath.c_str()); }
|
||||
|
||||
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
||||
#if defined(SK_XML)
|
||||
// Should we try to use the SVG intrinsic size instead?
|
||||
static const SkSize kSVGSize = SkSize::Make(1000, 1000);
|
||||
// Used when the image doesn't have an intrinsic size.
|
||||
static const SkSize kDefaultSVGSize = SkSize::Make(1000, 1000);
|
||||
|
||||
SVGSrc::SVGSrc(Path path) : fPath(path) {}
|
||||
// Used to force-scale tiny fixed-size images.
|
||||
static const SkSize kMinimumSVGSize = SkSize::Make(128, 128);
|
||||
|
||||
Error SVGSrc::draw(SkCanvas* canvas) const {
|
||||
SkFILEStream stream(fPath.c_str());
|
||||
if (!stream.isValid()) {
|
||||
return SkStringPrintf("Unable to open file: %s", fPath.c_str());
|
||||
SVGSrc::SVGSrc(Path path) : fPath(path), fScale(1) {}
|
||||
|
||||
Error SVGSrc::ensureDom() const {
|
||||
if (!fDom) {
|
||||
SkFILEStream stream(fPath.c_str());
|
||||
if (!stream.isValid()) {
|
||||
return SkStringPrintf("Unable to open file: %s", fPath.c_str());
|
||||
}
|
||||
fDom = SkSVGDOM::MakeFromStream(stream);
|
||||
if (!fDom) {
|
||||
return SkStringPrintf("Unable to parse file: %s", fPath.c_str());
|
||||
}
|
||||
|
||||
const SkSize& sz = fDom->containerSize();
|
||||
if (sz.isEmpty()) {
|
||||
// no intrinsic size
|
||||
fDom->setContainerSize(kDefaultSVGSize);
|
||||
} else {
|
||||
fScale = SkTMax(1.f, SkTMax(kMinimumSVGSize.width() / sz.width(),
|
||||
kMinimumSVGSize.height() / sz.height()));
|
||||
}
|
||||
}
|
||||
|
||||
sk_sp<SkSVGDOM> dom = SkSVGDOM::MakeFromStream(stream);
|
||||
if (!dom) {
|
||||
return SkStringPrintf("Unable to parse file: %s", fPath.c_str());
|
||||
}
|
||||
|
||||
dom->setContainerSize(kSVGSize);
|
||||
dom->render(canvas);
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
Error SVGSrc::draw(SkCanvas* canvas) const {
|
||||
Error err = this->ensureDom();
|
||||
if (err.isEmpty()) {
|
||||
SkAutoCanvasRestore acr(canvas, true);
|
||||
canvas->scale(fScale, fScale);
|
||||
fDom->render(canvas);
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
SkISize SVGSrc::size() const {
|
||||
return kSVGSize.toRound();
|
||||
Error err = this->ensureDom();
|
||||
if (!err.isEmpty()) {
|
||||
return SkISize::Make(0, 0);
|
||||
}
|
||||
|
||||
return SkSize::Make(fDom->containerSize().width() * fScale,
|
||||
fDom->containerSize().height() * fScale).toRound();
|
||||
}
|
||||
|
||||
Name SVGSrc::name() const { return SkOSPath::Basename(fPath.c_str()); }
|
||||
|
@ -249,6 +249,12 @@ private:
|
||||
};
|
||||
|
||||
#if defined(SK_XML)
|
||||
} // namespace DM
|
||||
|
||||
class SkSVGDOM;
|
||||
|
||||
namespace DM {
|
||||
|
||||
class SVGSrc : public Src {
|
||||
public:
|
||||
explicit SVGSrc(Path path);
|
||||
@ -259,7 +265,11 @@ public:
|
||||
bool veto(SinkFlags) const override;
|
||||
|
||||
private:
|
||||
Path fPath;
|
||||
Error ensureDom() const;
|
||||
|
||||
Path fPath;
|
||||
mutable sk_sp<SkSVGDOM> fDom;
|
||||
mutable SkScalar fScale;
|
||||
|
||||
typedef Src INHERITED;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user