| 
									
										
										
										
											2022-10-03 16:25:42 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright (c) 2020 Nwutobo Samuel Ugochukwu <sammycageagle@gmail.com> | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Permission is hereby granted, free of charge, to any person obtaining a copy | 
					
						
							|  |  |  |  * of this software and associated documentation files (the "Software"), to deal | 
					
						
							|  |  |  |  * in the Software without restriction, including without limitation the rights | 
					
						
							|  |  |  |  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | 
					
						
							|  |  |  |  * copies of the Software, and to permit persons to whom the Software is | 
					
						
							|  |  |  |  * furnished to do so, subject to the following conditions: | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * The above copyright notice and this permission notice shall be included in all | 
					
						
							|  |  |  |  * copies or substantial portions of the Software. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | 
					
						
							|  |  |  |  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | 
					
						
							|  |  |  |  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | 
					
						
							|  |  |  |  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | 
					
						
							|  |  |  |  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | 
					
						
							|  |  |  |  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | 
					
						
							|  |  |  |  * SOFTWARE. | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef LUNASVG_H
 | 
					
						
							|  |  |  | #define LUNASVG_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <memory>
 | 
					
						
							|  |  |  | #include <string>
 | 
					
						
							| 
									
										
										
										
											2023-05-08 17:53:29 +00:00
										 |  |  | #include <cstdint>
 | 
					
						
							| 
									
										
										
										
											2022-10-03 16:25:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-29 10:37:05 +00:00
										 |  |  | #if defined(_MSC_VER) && defined(LUNASVG_SHARED)
 | 
					
						
							|  |  |  | #ifdef LUNASVG_EXPORT
 | 
					
						
							|  |  |  | #define LUNASVG_API __declspec(dllexport)
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | #define LUNASVG_API __declspec(dllimport)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | #define LUNASVG_API
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2022-10-03 16:25:42 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace lunasvg { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Rect; | 
					
						
							| 
									
										
										
										
											2022-10-03 18:53:48 +00:00
										 |  |  | class Matrix; | 
					
						
							| 
									
										
										
										
											2022-10-03 16:25:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-29 10:37:05 +00:00
										 |  |  | class LUNASVG_API Box { | 
					
						
							| 
									
										
										
										
											2022-10-03 16:25:42 +00:00
										 |  |  | public: | 
					
						
							|  |  |  |     Box() = default; | 
					
						
							|  |  |  |     Box(double x, double y, double w, double h); | 
					
						
							|  |  |  |     Box(const Rect& rect); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-03 18:53:48 +00:00
										 |  |  |     Box& transform(const Matrix& matrix); | 
					
						
							|  |  |  |     Box transformed(const Matrix& matrix) const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-03 16:25:42 +00:00
										 |  |  | public: | 
					
						
							|  |  |  |     double x{0}; | 
					
						
							|  |  |  |     double y{0}; | 
					
						
							|  |  |  |     double w{0}; | 
					
						
							|  |  |  |     double h{0}; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Transform; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-29 10:37:05 +00:00
										 |  |  | class LUNASVG_API Matrix { | 
					
						
							| 
									
										
										
										
											2022-10-03 16:25:42 +00:00
										 |  |  | public: | 
					
						
							|  |  |  |     Matrix() = default; | 
					
						
							|  |  |  |     Matrix(double a, double b, double c, double d, double e, double f); | 
					
						
							|  |  |  |     Matrix(const Transform& transform); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Matrix& rotate(double angle); | 
					
						
							|  |  |  |     Matrix& rotate(double angle, double cx, double cy); | 
					
						
							|  |  |  |     Matrix& scale(double sx, double sy); | 
					
						
							|  |  |  |     Matrix& shear(double shx, double shy); | 
					
						
							|  |  |  |     Matrix& translate(double tx, double ty); | 
					
						
							|  |  |  |     Matrix& transform(double a, double b, double c, double d, double e, double f); | 
					
						
							|  |  |  |     Matrix& identity(); | 
					
						
							|  |  |  |     Matrix& invert(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Matrix& operator*=(const Matrix& matrix); | 
					
						
							|  |  |  |     Matrix& premultiply(const Matrix& matrix); | 
					
						
							|  |  |  |     Matrix& postmultiply(const Matrix& matrix); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Matrix inverted() const; | 
					
						
							|  |  |  |     Matrix operator*(const Matrix& matrix) const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     static Matrix rotated(double angle); | 
					
						
							|  |  |  |     static Matrix rotated(double angle, double cx, double cy); | 
					
						
							|  |  |  |     static Matrix scaled(double sx, double sy); | 
					
						
							|  |  |  |     static Matrix sheared(double shx, double shy); | 
					
						
							|  |  |  |     static Matrix translated(double tx, double ty); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |     double a{1}; | 
					
						
							|  |  |  |     double b{0}; | 
					
						
							|  |  |  |     double c{0}; | 
					
						
							|  |  |  |     double d{1}; | 
					
						
							|  |  |  |     double e{0}; | 
					
						
							|  |  |  |     double f{0}; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-29 10:37:05 +00:00
										 |  |  | class LUNASVG_API Bitmap { | 
					
						
							| 
									
										
										
										
											2022-10-03 16:25:42 +00:00
										 |  |  | public: | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * @note Bitmap format is ARGB Premultiplied. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     Bitmap(); | 
					
						
							|  |  |  |     Bitmap(std::uint8_t* data, std::uint32_t width, std::uint32_t height, std::uint32_t stride); | 
					
						
							|  |  |  |     Bitmap(std::uint32_t width, std::uint32_t height); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     void reset(std::uint8_t* data, std::uint32_t width, std::uint32_t height, std::uint32_t stride); | 
					
						
							|  |  |  |     void reset(std::uint32_t width, std::uint32_t height); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     std::uint8_t* data() const; | 
					
						
							|  |  |  |     std::uint32_t width() const; | 
					
						
							|  |  |  |     std::uint32_t height() const; | 
					
						
							|  |  |  |     std::uint32_t stride() const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     void clear(std::uint32_t color); | 
					
						
							|  |  |  |     void convert(int ri, int gi, int bi, int ai, bool unpremultiply); | 
					
						
							|  |  |  |     void convertToRGBA() { convert(0, 1, 2, 3, true); } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     bool valid() const { return !!m_impl; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  |     struct Impl; | 
					
						
							|  |  |  |     std::shared_ptr<Impl> m_impl; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class LayoutSymbol; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-29 10:37:05 +00:00
										 |  |  | class LUNASVG_API Document { | 
					
						
							| 
									
										
										
										
											2022-10-03 16:25:42 +00:00
										 |  |  | public: | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * @brief Creates a document from a file | 
					
						
							|  |  |  |      * @param filename - file to load | 
					
						
							|  |  |  |      * @return pointer to document on success, otherwise nullptr | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     static std::unique_ptr<Document> loadFromFile(const std::string& filename); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * @brief Creates a document from a string | 
					
						
							|  |  |  |      * @param string - string to load | 
					
						
							|  |  |  |      * @return pointer to document on success, otherwise nullptr | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     static std::unique_ptr<Document> loadFromData(const std::string& string); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * @brief Creates a document from a string data and size | 
					
						
							|  |  |  |      * @param data - string data to load | 
					
						
							|  |  |  |      * @param size - size of the data to load, in bytes | 
					
						
							|  |  |  |      * @return pointer to document on success, otherwise nullptr | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     static std::unique_ptr<Document> loadFromData(const char* data, std::size_t size); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * @brief Creates a document from a null terminated string data | 
					
						
							|  |  |  |      * @param data - null terminated string data to load | 
					
						
							|  |  |  |      * @return pointer to document on success, otherwise nullptr | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     static std::unique_ptr<Document> loadFromData(const char* data); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							| 
									
										
										
										
											2022-10-03 18:53:48 +00:00
										 |  |  |      * @brief Sets the current transformation matrix of the document | 
					
						
							|  |  |  |      * @param matrix - current transformation matrix | 
					
						
							| 
									
										
										
										
											2022-10-03 16:25:42 +00:00
										 |  |  |      */ | 
					
						
							|  |  |  |     void setMatrix(const Matrix& matrix); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * @brief Returns the current transformation matrix of the document | 
					
						
							|  |  |  |      * @return the current transformation matrix | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     Matrix matrix() const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * @brief Returns the smallest rectangle in which the document fits | 
					
						
							|  |  |  |      * @return the smallest rectangle in which the document fits | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     Box box() const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * @brief Returns width of the document | 
					
						
							|  |  |  |      * @return the width of the document in pixels | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     double width() const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * @brief Returns the height of the document | 
					
						
							|  |  |  |      * @return the height of the document in pixels | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     double height() const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * @brief Renders the document to a bitmap | 
					
						
							|  |  |  |      * @param matrix - the current transformation matrix | 
					
						
							|  |  |  |      * @param bitmap - target image on which the content will be drawn | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     void render(Bitmap bitmap, const Matrix& matrix = Matrix{}) const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * @brief Renders the document to a bitmap | 
					
						
							|  |  |  |      * @param width - maximum width, in pixels | 
					
						
							|  |  |  |      * @param height - maximum height, in pixels | 
					
						
							|  |  |  |      * @param backgroundColor - background color in 0xRRGGBBAA format | 
					
						
							|  |  |  |      * @return the raster representation of the document | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     Bitmap renderToBitmap(std::uint32_t width = 0, std::uint32_t height = 0, std::uint32_t backgroundColor = 0x00000000) const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ~Document(); | 
					
						
							| 
									
										
										
										
											2023-07-29 10:37:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-03 16:25:42 +00:00
										 |  |  | private: | 
					
						
							|  |  |  |     Document(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     std::unique_ptr<LayoutSymbol> root; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } //namespace lunasvg
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif // LUNASVG_H
 |