skia2/experimental/svg/model/SkSVGTransformableNode.cpp
Florin Malita ce8840e384 [SVGDom] ClipPath support
* clip-path attribute handling
  * clipPath container element
  * asPath() SkSVGNode virtual for capturing subtree geometry

R=robertphillips@google.com,stephana@google.com

Change-Id: I9597534fe3047b631da6309eafac055dff5696e9
Reviewed-on: https://skia-review.googlesource.com/5650
Reviewed-by: Robert Phillips <robertphillips@google.com>
Commit-Queue: Florin Malita <fmalita@chromium.org>
2016-12-08 15:00:18 +00:00

52 lines
1.2 KiB
C++

/*
* Copyright 2016 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "SkCanvas.h"
#include "SkSVGRenderContext.h"
#include "SkSVGTransformableNode.h"
#include "SkSVGValue.h"
SkSVGTransformableNode::SkSVGTransformableNode(SkSVGTag tag)
: INHERITED(tag)
, fTransform(SkMatrix::I()) { }
bool SkSVGTransformableNode::onPrepareToRender(SkSVGRenderContext* ctx) const {
if (!fTransform.value().isIdentity()) {
ctx->canvas()->save();
ctx->canvas()->concat(fTransform);
}
return this->INHERITED::onPrepareToRender(ctx);
}
void SkSVGTransformableNode::onSetAttribute(SkSVGAttribute attr, const SkSVGValue& v) {
switch (attr) {
case SkSVGAttribute::kTransform:
if (const auto* transform = v.as<SkSVGTransformValue>()) {
this->setTransform(*transform);
}
break;
default:
this->INHERITED::onSetAttribute(attr, v);
break;
}
}
void SkSVGTransformableNode::mapToParent(SkPath* path) const {
if (fTransform.value().isIdentity()) {
return;
}
SkMatrix inv;
if (!fTransform.value().invert(&inv)) {
return;
}
path->transform(inv);
}