diff --git a/.gitignore b/.gitignore
index dfc25cc3..6faf2c73 100644
--- a/.gitignore
+++ b/.gitignore
@@ -32,6 +32,7 @@
*.bat
build
svg-reader
+external/samples/gradient
!docs/latex/code_documentation.pdf
*.json
*.jar
diff --git a/external/samples/TestCases/Firefox_logo,_2019.svg b/external/samples/TestCases/Firefox_logo_2019.svg
similarity index 100%
rename from external/samples/TestCases/Firefox_logo,_2019.svg
rename to external/samples/TestCases/Firefox_logo_2019.svg
diff --git a/external/samples/gradient/linear.svg b/external/samples/gradient/linear.svg
deleted file mode 100644
index 5b112a35..00000000
--- a/external/samples/gradient/linear.svg
+++ /dev/null
@@ -1,24 +0,0 @@
-
\ No newline at end of file
diff --git a/external/samples/gradient/radial.svg b/external/samples/gradient/radial.svg
deleted file mode 100644
index de22070e..00000000
--- a/external/samples/gradient/radial.svg
+++ /dev/null
@@ -1,24 +0,0 @@
-
\ No newline at end of file
diff --git a/external/samples/mixed/sample12.svg b/external/samples/mixed/sample11.svg
similarity index 100%
rename from external/samples/mixed/sample12.svg
rename to external/samples/mixed/sample11.svg
diff --git a/external/samples/pic.svg b/external/samples/pic.svg
deleted file mode 100644
index 7cfefb62..00000000
--- a/external/samples/pic.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
\ No newline at end of file
diff --git a/src/Parser.cpp b/src/Parser.cpp
index b1bce775..aefa7532 100644
--- a/src/Parser.cpp
+++ b/src/Parser.cpp
@@ -168,7 +168,7 @@ Parser::Parser(const std::string &file_name) {
Group *Parser::getRoot() { return dynamic_cast< Group * >(root); }
-Attributes xmlToString(xml_attribute<> *attribute) {
+Attributes xmlToString(rapidxml::xml_attribute<> *attribute) {
Attributes attributes;
while (attribute) {
attributes.push_back(
@@ -179,14 +179,14 @@ Attributes xmlToString(xml_attribute<> *attribute) {
}
SVGElement *Parser::parseElements(std::string file_name) {
- xml_document<> doc;
+ rapidxml::xml_document<> doc;
std::ifstream file(file_name);
std::vector< char > buffer((std::istreambuf_iterator< char >(file)),
std::istreambuf_iterator< char >());
buffer.push_back('\0');
doc.parse< 0 >(&buffer[0]);
- xml_node<> *svg = doc.first_node();
+ rapidxml::xml_node<> *svg = doc.first_node();
viewBox.second.x = getFloatAttribute(svg, "width");
viewBox.second.y = getFloatAttribute(svg, "height");
std::string viewBox = getAttribute(svg, "viewBox");
@@ -195,8 +195,8 @@ SVGElement *Parser::parseElements(std::string file_name) {
ss >> this->viewBox.first.x >> this->viewBox.first.y >>
this->viewBox.second.x >> this->viewBox.second.y;
}
- xml_node<> *node = svg->first_node();
- xml_node<> *prev = NULL;
+ rapidxml::xml_node<> *node = svg->first_node();
+ rapidxml::xml_node<> *prev = NULL;
SVGElement *root = new Group();
SVGElement *current = root;
@@ -230,7 +230,7 @@ SVGElement *Parser::parseElements(std::string file_name) {
doc.allocate_string(group_attribute.first.c_str());
char *value =
doc.allocate_string(group_attribute.second.c_str());
- xml_attribute<> *new_attribute =
+ rapidxml::xml_attribute<> *new_attribute =
doc.allocate_attribute(name, value);
node->append_attribute(new_attribute);
}
@@ -265,7 +265,7 @@ SVGElement *Parser::parseElements(std::string file_name) {
doc.allocate_string(group_attribute.first.c_str());
char *value =
doc.allocate_string(group_attribute.second.c_str());
- xml_attribute<> *new_attribute =
+ rapidxml::xml_attribute<> *new_attribute =
doc.allocate_attribute(name, value);
node->append_attribute(new_attribute);
}
@@ -293,7 +293,7 @@ SVGElement *Parser::parseElements(std::string file_name) {
return root;
}
-std::string Parser::getAttribute(xml_node<> *node, std::string name) {
+std::string Parser::getAttribute(rapidxml::xml_node<> *node, std::string name) {
if (name == "text") return removeExtraSpaces(node->value());
std::string result;
if (node->first_attribute(name.c_str()) == NULL) {
@@ -314,7 +314,7 @@ std::string Parser::getAttribute(xml_node<> *node, std::string name) {
return result;
}
-float Parser::getFloatAttribute(xml_node<> *node, std::string name) {
+float Parser::getFloatAttribute(rapidxml::xml_node<> *node, std::string name) {
float result;
if (node->first_attribute(name.c_str()) == NULL) {
if (std::string(node->name()).find("Gradient") != std::string::npos) {
@@ -348,7 +348,8 @@ float Parser::getFloatAttribute(xml_node<> *node, std::string name) {
return result;
}
-mColor Parser::parseColor(xml_node<> *node, std::string name, std::string &id) {
+mColor Parser::parseColor(rapidxml::xml_node<> *node, std::string name,
+ std::string &id) {
std::string color = getAttribute(node, name);
color.erase(std::remove(color.begin(), color.end(), ' '), color.end());
if (color.find("url") == std::string::npos) {
@@ -397,9 +398,9 @@ Gradient *Parser::parseGradient(std::string id) {
return gradients.at(id);
}
-std::vector< Stop > Parser::getGradientStops(xml_node<> *node) {
+std::vector< Stop > Parser::getGradientStops(rapidxml::xml_node<> *node) {
std::vector< Stop > stops;
- xml_node<> *stop_node = node->first_node();
+ rapidxml::xml_node<> *stop_node = node->first_node();
while (stop_node) {
if (std::string(stop_node->name()) == "stop") {
std::string id = "";
@@ -413,8 +414,8 @@ std::vector< Stop > Parser::getGradientStops(xml_node<> *node) {
return stops;
}
-void Parser::GetGradients(xml_node<> *node) {
- xml_node<> *gradient_node = node->first_node();
+void Parser::GetGradients(rapidxml::xml_node<> *node) {
+ rapidxml::xml_node<> *gradient_node = node->first_node();
while (gradient_node) {
if (std::string(gradient_node->name()).find("Gradient") !=
std::string::npos) {
@@ -463,7 +464,7 @@ void Parser::GetGradients(xml_node<> *node) {
}
}
-std::vector< Vector2Df > Parser::parsePoints(xml_node<> *node) {
+std::vector< Vector2Df > Parser::parsePoints(rapidxml::xml_node<> *node) {
std::vector< Vector2Df > points;
std::string points_string = getAttribute(node, "points");
@@ -479,7 +480,7 @@ std::vector< Vector2Df > Parser::parsePoints(xml_node<> *node) {
return points;
}
-std::vector< PathPoint > Parser::parsePathPoints(xml_node<> *node) {
+std::vector< PathPoint > Parser::parsePathPoints(rapidxml::xml_node<> *node) {
std::vector< PathPoint > points;
std::string path_string = getAttribute(node, "d");
@@ -622,7 +623,8 @@ std::vector< PathPoint > Parser::parsePathPoints(xml_node<> *node) {
return handle_points;
}
-std::vector< std::string > Parser::getTransformOrder(xml_node<> *node) {
+std::vector< std::string > Parser::getTransformOrder(
+ rapidxml::xml_node<> *node) {
std::string transform_tag;
if (std::string(node->name()).find("Gradient") != std::string::npos)
transform_tag = getAttribute(node, "gradientTransform");
@@ -651,7 +653,7 @@ std::vector< std::string > Parser::getTransformOrder(xml_node<> *node) {
return order;
}
-SVGElement *Parser::parseShape(xml_node<> *node) {
+SVGElement *Parser::parseShape(rapidxml::xml_node<> *node) {
SVGElement *shape = NULL;
std::string type = node->name();
std::string id = "";
@@ -694,7 +696,7 @@ SVGElement *Parser::parseShape(xml_node<> *node) {
return shape;
}
-Line *Parser::parseLine(xml_node<> *node, const mColor &stroke_color,
+Line *Parser::parseLine(rapidxml::xml_node<> *node, const mColor &stroke_color,
float stroke_width) {
Line *shape = new Line(
Vector2Df(getFloatAttribute(node, "x1"), getFloatAttribute(node, "y1")),
@@ -703,7 +705,7 @@ Line *Parser::parseLine(xml_node<> *node, const mColor &stroke_color,
return shape;
}
-Rect *Parser::parseRect(xml_node<> *node, const mColor &fill_color,
+Rect *Parser::parseRect(rapidxml::xml_node<> *node, const mColor &fill_color,
const mColor &stroke_color, float stroke_width) {
float x = getFloatAttribute(node, "x");
float y = getFloatAttribute(node, "y");
@@ -716,7 +718,8 @@ Rect *Parser::parseRect(xml_node<> *node, const mColor &fill_color,
return shape;
}
-Circle *Parser::parseCircle(xml_node<> *node, const mColor &fill_color,
+Circle *Parser::parseCircle(rapidxml::xml_node<> *node,
+ const mColor &fill_color,
const mColor &stroke_color, float stroke_width) {
float cx = getFloatAttribute(node, "cx");
float cy = getFloatAttribute(node, "cy");
@@ -726,7 +729,7 @@ Circle *Parser::parseCircle(xml_node<> *node, const mColor &fill_color,
return shape;
}
-Ell *Parser::parseEllipse(xml_node<> *node, const mColor &fill_color,
+Ell *Parser::parseEllipse(rapidxml::xml_node<> *node, const mColor &fill_color,
const mColor &stroke_color, float stroke_width) {
float radius_x = getFloatAttribute(node, "rx");
float radius_y = getFloatAttribute(node, "ry");
@@ -737,7 +740,8 @@ Ell *Parser::parseEllipse(xml_node<> *node, const mColor &fill_color,
return shape;
}
-Plygon *Parser::parsePolygon(xml_node<> *node, const mColor &fill_color,
+Plygon *Parser::parsePolygon(rapidxml::xml_node<> *node,
+ const mColor &fill_color,
const mColor &stroke_color, float stroke_width) {
Plygon *shape = new Plygon(fill_color, stroke_color, stroke_width);
std::vector< Vector2Df > points = parsePoints(node);
@@ -751,7 +755,8 @@ Plygon *Parser::parsePolygon(xml_node<> *node, const mColor &fill_color,
return shape;
}
-Plyline *Parser::parsePolyline(xml_node<> *node, const mColor &fill_color,
+Plyline *Parser::parsePolyline(rapidxml::xml_node<> *node,
+ const mColor &fill_color,
const mColor &stroke_color, float stroke_width) {
Plyline *shape = new Plyline(fill_color, stroke_color, stroke_width);
std::vector< Vector2Df > points = parsePoints(node);
@@ -765,7 +770,7 @@ Plyline *Parser::parsePolyline(xml_node<> *node, const mColor &fill_color,
return shape;
}
-Text *Parser::parseText(xml_node<> *node, const mColor &fill_color,
+Text *Parser::parseText(rapidxml::xml_node<> *node, const mColor &fill_color,
const mColor &stroke_color, float stroke_width) {
float x = getFloatAttribute(node, "x");
float y = getFloatAttribute(node, "y");
@@ -788,7 +793,7 @@ Text *Parser::parseText(xml_node<> *node, const mColor &fill_color,
return shape;
}
-Path *Parser::parsePath(xml_node<> *node, const mColor &fill_color,
+Path *Parser::parsePath(rapidxml::xml_node<> *node, const mColor &fill_color,
const mColor &stroke_color, float stroke_width) {
Path *shape = new Path(fill_color, stroke_color, stroke_width);
std::vector< PathPoint > points = parsePathPoints(node);
diff --git a/src/Parser.hpp b/src/Parser.hpp
index 11f28ddb..c1b20dd9 100644
--- a/src/Parser.hpp
+++ b/src/Parser.hpp
@@ -13,8 +13,6 @@
#include "../external/rapidxml/rapidxml.hpp"
#include "Graphics.hpp"
-using namespace rapidxml;
-
typedef std::vector< std::pair< std::string, std::string > > Attributes;
/**
@@ -68,7 +66,7 @@ class Parser {
*
* @return The attributes of the node.
*/
- std::string getAttribute(xml_node<>* node, std::string name);
+ std::string getAttribute(rapidxml::xml_node<>* node, std::string name);
/**
* @brief Gets the floating point attributes of a node.
@@ -78,7 +76,7 @@ class Parser {
*
* @return The floating point attributes of the node.
*/
- float getFloatAttribute(xml_node<>* node, std::string name);
+ float getFloatAttribute(rapidxml::xml_node<>* node, std::string name);
/**
* @brief Gets the gradient stops of a node.
@@ -86,14 +84,14 @@ class Parser {
* @param node The node to be parsed.
* @return The gradient stops of the node.
*/
- std::vector< Stop > getGradientStops(xml_node<>* node);
+ std::vector< Stop > getGradientStops(rapidxml::xml_node<>* node);
/**
* @brief Gets the gradients of a node.
*
* @param node The node to be parsed.
*/
- void GetGradients(xml_node<>* node);
+ void GetGradients(rapidxml::xml_node<>* node);
/**
* @brief Gets the gradient of a node.
@@ -111,7 +109,8 @@ class Parser {
* @param id The id to check if the color is a reference.
* @return The color attributes of the node.
*/
- mColor parseColor(xml_node<>* node, std::string color, std::string& id);
+ mColor parseColor(rapidxml::xml_node<>* node, std::string color,
+ std::string& id);
/**
* @brief Gets the points of the element
@@ -119,7 +118,7 @@ class Parser {
* @param node The node to be parsed.
* @return The points of the element
*/
- std::vector< Vector2Df > parsePoints(xml_node<>* node);
+ std::vector< Vector2Df > parsePoints(rapidxml::xml_node<>* node);
/**
* @brief Gets the points of the path element
@@ -127,7 +126,7 @@ class Parser {
* @param node The node to be parsed.
* @return The points of the path element
*/
- std::vector< PathPoint > parsePathPoints(xml_node<>* node);
+ std::vector< PathPoint > parsePathPoints(rapidxml::xml_node<>* node);
/**
* @brief Gets the transform order of the element
@@ -135,7 +134,7 @@ class Parser {
* @param node The node to be parsed.
* @return The transform order of the element
*/
- std::vector< std::string > getTransformOrder(xml_node<>* node);
+ std::vector< std::string > getTransformOrder(rapidxml::xml_node<>* node);
/**
* @brief Parses the line element
@@ -145,7 +144,7 @@ class Parser {
* @param stroke_width The width of the stroke
* @return The line element
*/
- Line* parseLine(xml_node<>* node, const mColor& stroke_color,
+ Line* parseLine(rapidxml::xml_node<>* node, const mColor& stroke_color,
float stroke_width);
/**
@@ -157,7 +156,7 @@ class Parser {
* @param stroke_width The width of the stroke
* @return The rect element
*/
- Rect* parseRect(xml_node<>* node, const mColor& fill_color,
+ Rect* parseRect(rapidxml::xml_node<>* node, const mColor& fill_color,
const mColor& stroke_color, float stroke_width);
/**
@@ -169,7 +168,8 @@ class Parser {
* @param stroke_width The width of the stroke
* @return The polyline element
*/
- class Plyline* parsePolyline(xml_node<>* node, const mColor& fill_color,
+ class Plyline* parsePolyline(rapidxml::xml_node<>* node,
+ const mColor& fill_color,
const mColor& stroke_color,
float stroke_width);
@@ -182,7 +182,8 @@ class Parser {
* @param stroke_width The width of the stroke
* @return The polygon element
*/
- class Plygon* parsePolygon(xml_node<>* node, const mColor& fill_color,
+ class Plygon* parsePolygon(rapidxml::xml_node<>* node,
+ const mColor& fill_color,
const mColor& stroke_color, float stroke_width);
/**
@@ -194,7 +195,7 @@ class Parser {
* @param stroke_width The width of the stroke
* @return The circle element
*/
- Circle* parseCircle(xml_node<>* node, const mColor& fill_color,
+ Circle* parseCircle(rapidxml::xml_node<>* node, const mColor& fill_color,
const mColor& stroke_color, float stroke_width);
/**
@@ -206,7 +207,8 @@ class Parser {
* @param stroke_width The width of the stroke
* @return The ellipse element
*/
- class Ell* parseEllipse(xml_node<>* node, const mColor& fill_color,
+ class Ell* parseEllipse(rapidxml::xml_node<>* node,
+ const mColor& fill_color,
const mColor& stroke_color, float stroke_width);
/**
@@ -218,7 +220,7 @@ class Parser {
* @param stroke_width The width of the stroke
* @return The path element
*/
- Path* parsePath(xml_node<>* node, const mColor& fill_color,
+ Path* parsePath(rapidxml::xml_node<>* node, const mColor& fill_color,
const mColor& stroke_color, float stroke_width);
/**
@@ -229,7 +231,7 @@ class Parser {
* @param stroke_width The width of the stroke
* @return The text element
*/
- Text* parseText(xml_node<>* node, const mColor& fill_color,
+ Text* parseText(rapidxml::xml_node<>* node, const mColor& fill_color,
const mColor& stroke_color, float stroke_width);
/**
@@ -238,7 +240,7 @@ class Parser {
* @param node The node to be parsed.
* @return The group of elements
*/
- SVGElement* parseShape(xml_node<>* node);
+ SVGElement* parseShape(rapidxml::xml_node<>* node);
private:
static Parser* instance; ///< The instance of the Parser.
diff --git a/src/Renderer.cpp b/src/Renderer.cpp
index e26cd25a..09e8a500 100644
--- a/src/Renderer.cpp
+++ b/src/Renderer.cpp
@@ -1,6 +1,8 @@
#include "Renderer.hpp"
#include
+#include
+#include
Renderer* Renderer::instance = nullptr;
@@ -262,8 +264,6 @@ void Renderer::drawPolygon(Gdiplus::Graphics& graphics, Plygon* polygon) const {
delete polygon_fill;
}
-#include
-#include
void Renderer::drawText(Gdiplus::Graphics& graphics, Text* text) const {
mColor outline_color = text->getOutlineColor();
graphics.SetTextRenderingHint(Gdiplus::TextRenderingHintAntiAliasGridFit);
@@ -343,13 +343,13 @@ void Renderer::drawPolyline(Gdiplus::Graphics& graphics,
Gdiplus::RectF bound(min_bound.x, min_bound.y, max_bound.x - min_bound.x,
max_bound.y - min_bound.y);
Gdiplus::Brush* polyline_fill = getBrush(polyline, bound);
- // if (Gdiplus::PathGradientBrush* brush =
- // dynamic_cast< Gdiplus::PathGradientBrush* >(polyline_fill)) {
- // mColor color = polyline->getGradient()->getStops().back().getColor();
- // Gdiplus::SolidBrush corner_fill(
- // Gdiplus::Color(color.a, color.r, color.g, color.b));
- // graphics.FillPath(&corner_fill, &path);
- // }
+ if (Gdiplus::PathGradientBrush* brush =
+ dynamic_cast< Gdiplus::PathGradientBrush* >(polyline_fill)) {
+ mColor color = polyline->getGradient()->getStops().back().getColor();
+ Gdiplus::SolidBrush corner_fill(
+ Gdiplus::Color(color.a, color.r, color.g, color.b));
+ graphics.FillPath(&corner_fill, &path);
+ }
graphics.FillPath(polyline_fill, &path);
graphics.DrawPath(&polyline_outline, &path);
delete polyline_fill;
@@ -509,23 +509,23 @@ void Renderer::drawPath(Gdiplus::Graphics& graphics, Path* path) const {
center.y =
(cosAngle * cosAngle + sinAngle * sinAngle) * point2.y + Y;
- float startAngle =
+ float start_angle =
atan2((point1.y - point2.y) / ry, (point1.x - point2.x) / rx);
- float endAngle =
+ float end_angle =
atan2((-point1.y - point2.y) / ry, (-point1.x - point2.x) / rx);
- float deltaAngle = endAngle - startAngle;
+ float delta_angle = end_angle - start_angle;
- if (sweep_flag && deltaAngle < 0) {
- deltaAngle += 2.0 * acos(-1);
- } else if (!sweep_flag && deltaAngle > 0) {
- deltaAngle -= 2.0 * acos(-1);
+ if (sweep_flag && delta_angle < 0) {
+ delta_angle += 2.0 * acos(-1);
+ } else if (!sweep_flag && delta_angle > 0) {
+ delta_angle -= 2.0 * acos(-1);
}
float start_angle_degree =
- std::fmod((startAngle * 180.0) / acos(-1), 360);
+ std::fmod((start_angle * 180.0) / acos(-1), 360);
float delta_angle_degree =
- std::fmod((deltaAngle * 180.0) / acos(-1), 360);
+ std::fmod((delta_angle * 180.0) / acos(-1), 360);
gdi_path.AddArc(center.x - rx, center.y - ry, 2.0 * rx, 2.0 * ry,
start_angle_degree, delta_angle_degree);
@@ -635,7 +635,7 @@ Gdiplus::Brush* Renderer::getBrush(SVGElement* shape,
Gdiplus::Color(color.a, color.r, color.g, color.b));
return fill;
}
- return NULL;
+ return nullptr;
}
void Renderer::applyTransformsOnBrush(
diff --git a/src/graphics/Line.cpp b/src/graphics/Line.cpp
index 71a56a26..dd053c36 100644
--- a/src/graphics/Line.cpp
+++ b/src/graphics/Line.cpp
@@ -16,5 +16,5 @@ void Line::setDirection(const Vector2Df& direction) {
Vector2Df Line::getDirection() const { return direction; }
float Line::getLength() const {
- return std::sqrt(std::pow(direction.x, 2) + std::pow(direction.y, 2));
+ return std::sqrt(direction.x * direction.x + direction.y * direction.y);
}
\ No newline at end of file