/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * */ #include #include #include #include #include #include namespace svgio::svgreader { SvgDrawVisitor::SvgDrawVisitor() : mpDrawRoot(std::make_shared()) , mpCurrent(mpDrawRoot) { } void SvgDrawVisitor::visit(svgio::svgreader::SvgNode const& rNode) { switch (rNode.getType()) { case svgio::svgreader::SVGToken::Svg: { auto const& rSvgNode = static_cast(rNode); basegfx::B2DRange aRange = rSvgNode.getCurrentViewPort(); static_cast(mpCurrent.get())->maRectangle = aRange; } break; case svgio::svgreader::SVGToken::Rect: { auto const& rRectNode = static_cast(rNode); double x = rRectNode.getX().getNumber(); double y = rRectNode.getY().getNumber(); double w = rRectNode.getWidth().getNumber(); double h = rRectNode.getHeight().getNumber(); auto pRectangle = std::make_shared(basegfx::B2DRange(x, y, x + w, y + h)); pRectangle->mnRx = rRectNode.getRx().getNumber(); pRectangle->mnRy = rRectNode.getRy().getNumber(); pRectangle->mnStrokeWidth = rRectNode.getSvgStyleAttributes()->getStrokeWidth().getNumber(); pRectangle->mnOpacity = rRectNode.getSvgStyleAttributes()->getOpacity().getNumber(); const basegfx::BColor* pFillColor = rRectNode.getSvgStyleAttributes()->getFill(); const SvgGradientNode* pFillGradient = rRectNode.getSvgStyleAttributes()->getSvgGradientNodeFill(); if (pFillColor) { pRectangle->mpFillColor = std::make_shared(*pFillColor); } else if (pFillGradient) { drawinglayer::primitive2d::SvgGradientEntryVector aSvgGradientEntryVector; pFillGradient->collectGradientEntries(aSvgGradientEntryVector); if (!aSvgGradientEntryVector.empty()) { auto aGradientInfo = std::make_shared(); aGradientInfo->x1 = pFillGradient->getX1().getNumber(); aGradientInfo->y1 = pFillGradient->getY1().getNumber(); aGradientInfo->x2 = pFillGradient->getX2().getNumber(); aGradientInfo->y2 = pFillGradient->getY2().getNumber(); std::optional pGradientTransform = pFillGradient->getGradientTransform(); if (pGradientTransform) { aGradientInfo->maMatrix = *pGradientTransform; } pRectangle->mpFillGradient = aGradientInfo; for (auto const& rEntry : aSvgGradientEntryVector) { gfx::GradientStop aStop; aStop.maColor = rEntry.getColor(); aStop.mfOffset = rEntry.getOffset(); aStop.mfOpacity = rEntry.getOpacity(); pRectangle->mpFillGradient->maGradientStops.push_back(aStop); } } } const basegfx::BColor* pStrokeColor = rRectNode.getSvgStyleAttributes()->getStroke(); if (pStrokeColor) pRectangle->mpStrokeColor = std::make_shared(*pStrokeColor); mpCurrent->maChildren.push_back(pRectangle); } break; case svgio::svgreader::SVGToken::Path: { auto const& rPathNode = static_cast(rNode); auto pPath = rPathNode.getPath(); if (pPath) { auto pDrawPath = std::make_shared(*pPath); pDrawPath->mnStrokeWidth = rPathNode.getSvgStyleAttributes()->getStrokeWidth().getNumber(); pDrawPath->mnOpacity = rPathNode.getSvgStyleAttributes()->getOpacity().getNumber(); const basegfx::BColor* pFillColor = rPathNode.getSvgStyleAttributes()->getFill(); if (pFillColor) pDrawPath->mpFillColor = std::make_shared(*pFillColor); const basegfx::BColor* pStrokeColor = rPathNode.getSvgStyleAttributes()->getStroke(); if (pStrokeColor) pDrawPath->mpStrokeColor = std::make_shared(*pStrokeColor); mpCurrent->maChildren.push_back(pDrawPath); } } break; default: break; } goToChildren(rNode); } void SvgDrawVisitor::goToChildren(svgio::svgreader::SvgNode const& rNode) { for (auto& rChild : rNode.getChildren()) { rChild->accept(*this); } } } // end of namespace svgio::svgreader /* vim:set shiftwidth=4 softtabstop=4 expandtab: */