180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* 380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2006 The Android Open Source Project 480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be 680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file. 780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkSVGSVG.h" 1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkParse.h" 1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkRect.h" 1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkSVGParser.h" 1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruconst SkSVGAttribute SkSVGSVG::gAttributes[] = { 1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SVG_LITERAL_ATTRIBUTE(enable-background, f_enable_background), 1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SVG_ATTRIBUTE(height), 1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SVG_ATTRIBUTE(overflow), 1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SVG_ATTRIBUTE(width), 2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SVG_ATTRIBUTE(version), 2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SVG_ATTRIBUTE(viewBox), 2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SVG_ATTRIBUTE(x), 2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SVG_LITERAL_ATTRIBUTE(xml:space, f_xml_space), 2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SVG_ATTRIBUTE(xmlns), 2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SVG_LITERAL_ATTRIBUTE(xmlns:xlink, f_xml_xlink), 2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SVG_ATTRIBUTE(y), 2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruDEFINE_SVG_INFO(SVG) 3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkSVGSVG::isFlushable() { 3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return false; 3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkSVGSVG::translate(SkSVGParser& parser, bool defState) { 3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalar height, width; 3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalar viewBox[4]; 3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const char* hSuffix = SkParse::FindScalar(f_height.c_str(), &height); 4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (strcmp(hSuffix, "pt") == 0) 4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru height = SkScalarMulDiv(height, SK_Scalar1 * 72, SK_Scalar1 * 96); 4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const char* wSuffix = SkParse::FindScalar(f_width.c_str(), &width); 4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (strcmp(wSuffix, "pt") == 0) 4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru width = SkScalarMulDiv(width, SK_Scalar1 * 72, SK_Scalar1 * 96); 4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkParse::FindScalars(f_viewBox.c_str(), viewBox, 4); 4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkRect box; 4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru box.fLeft = SkScalarDiv(viewBox[0], width); 4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru box.fTop = SkScalarDiv(viewBox[1], height); 4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru box.fRight = SkScalarDiv(viewBox[2], width); 5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru box.fBottom = SkScalarDiv(viewBox[3], height); 5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (box.fLeft == 0 && box.fTop == 0 && 5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru box.fRight == SK_Scalar1 && box.fBottom == SK_Scalar1) 5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return; 5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru parser._startElement("matrix"); 5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (box.fLeft != 0) { 5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkString x; 5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru x.appendScalar(box.fLeft); 5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru parser._addAttributeLen("translateX", x.c_str(), x.size()); 5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (box.fTop != 0) { 6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkString y; 6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru y.appendScalar(box.fTop); 6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru parser._addAttributeLen("translateY", y.c_str(), y.size()); 6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (box.fRight != SK_Scalar1) { 6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkString x; 6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru x.appendScalar(box.fRight); 6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru parser._addAttributeLen("scaleX", x.c_str(), x.size()); 6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (box.fBottom != SK_Scalar1) { 7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkString y; 7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru y.appendScalar(box.fBottom); 7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru parser._addAttributeLen("scaleY", y.c_str(), y.size()); 7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru parser._endElement(); 7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 77