SVGFitToViewBox.cpp [plain text]
#include "config.h"
#if ENABLE(SVG)
#include "SVGFitToViewBox.h"
#include "AffineTransform.h"
#include "FloatRect.h"
#include "SVGDocumentExtensions.h"
#include "SVGNames.h"
#include "SVGParserUtilities.h"
#include "SVGPreserveAspectRatio.h"
#include "StringImpl.h"
namespace WebCore {
SVGFitToViewBox::SVGFitToViewBox()
: m_viewBox()
, m_preserveAspectRatio(new SVGPreserveAspectRatio(0))
{
}
SVGFitToViewBox::~SVGFitToViewBox()
{
}
ANIMATED_PROPERTY_DEFINITIONS_WITH_CONTEXT(SVGFitToViewBox, FloatRect, Rect, rect, ViewBox, viewBox, SVGNames::viewBoxAttr.localName(), m_viewBox)
ANIMATED_PROPERTY_DEFINITIONS_WITH_CONTEXT(SVGFitToViewBox, SVGPreserveAspectRatio*, PreserveAspectRatio, preserveAspectRatio, PreserveAspectRatio, preserveAspectRatio, SVGNames::preserveAspectRatioAttr.localName(), m_preserveAspectRatio.get())
void SVGFitToViewBox::parseViewBox(const String& str)
{
double x = 0, y = 0, w = 0, h = 0;
const UChar* c = str.characters();
const UChar* end = c + str.length();
Document* doc = contextElement()->document();
skipOptionalSpaces(c, end);
if (!(parseNumber(c, end, x) && parseNumber(c, end, y) &&
parseNumber(c, end, w) && parseNumber(c, end, h, false))) {
doc->accessSVGExtensions()->reportWarning("Problem parsing viewBox=\"" + str + "\"");
return;
}
if (w < 0.0) doc->accessSVGExtensions()->reportError("A negative value for ViewBox width is not allowed");
else if (h < 0.0) doc->accessSVGExtensions()->reportError("A negative value for ViewBox height is not allowed");
else {
skipOptionalSpaces(c, end);
if (c < end) doc->accessSVGExtensions()->reportWarning("Problem parsing viewBox=\"" + str + "\"");
else
setViewBoxBaseValue(FloatRect::narrowPrecision(x, y, w, h));
}
}
AffineTransform SVGFitToViewBox::viewBoxToViewTransform(float viewWidth, float viewHeight) const
{
FloatRect viewBoxRect = viewBox();
if (!viewBoxRect.width() || !viewBoxRect.height())
return AffineTransform();
return preserveAspectRatio()->getCTM(viewBoxRect.x(),
viewBoxRect.y(), viewBoxRect.width(), viewBoxRect.height(),
0, 0, viewWidth, viewHeight);
}
bool SVGFitToViewBox::parseMappedAttribute(MappedAttribute* attr)
{
if (attr->name() == SVGNames::viewBoxAttr) {
parseViewBox(attr->value());
return true;
} else if (attr->name() == SVGNames::preserveAspectRatioAttr) {
preserveAspectRatioBaseValue()->parsePreserveAspectRatio(attr->value());
return true;
}
return false;
}
}
#endif // ENABLE(SVG)