[Bf-blender-cvs] [3fbe6f513d1] master: Move NanoSVG lib to extern

Antonio Vazquez noreply at git.blender.org
Fri Aug 6 15:29:57 CEST 2021


Commit: 3fbe6f513d11563339e16d501708fc361d265f3b
Author: Antonio Vazquez
Date:   Fri Aug 6 15:18:32 2021 +0200
Branches: master
https://developer.blender.org/rB3fbe6f513d11563339e16d501708fc361d265f3b

Move NanoSVG lib to extern

The library has some modifications and it has been included in a diff.

Reviewed By: campbellbarton

Differential Revision: https://developer.blender.org/D12142

(Some minor changes done in the patch)

===================================================================

A	extern/nanosvg/README.blender
R100	source/blender/io/gpencil/nanosvg/nanosvg.h	extern/nanosvg/nanosvg.h
A	extern/nanosvg/patches/NanoSVG.diff
M	source/blender/io/gpencil/CMakeLists.txt
M	source/blender/io/gpencil/intern/gpencil_io_import_svg.cc

===================================================================

diff --git a/extern/nanosvg/README.blender b/extern/nanosvg/README.blender
new file mode 100644
index 00000000000..3772cc106c8
--- /dev/null
+++ b/extern/nanosvg/README.blender
@@ -0,0 +1,7 @@
+Project: NanoSVG
+URL: https://github.com/memononen/nanosvg
+License: zlib
+Upstream version: 
+Local modifications: Added some functionality to manage grease pencil layers
+
+Added a fix to SVG import arc and float errors (https://developer.blender.org/rB11dc674c78b49fc4e0b7c134c375b6c8b8eacbcc)
\ No newline at end of file
diff --git a/source/blender/io/gpencil/nanosvg/nanosvg.h b/extern/nanosvg/nanosvg.h
similarity index 100%
rename from source/blender/io/gpencil/nanosvg/nanosvg.h
rename to extern/nanosvg/nanosvg.h
diff --git a/extern/nanosvg/patches/NanoSVG.diff b/extern/nanosvg/patches/NanoSVG.diff
new file mode 100644
index 00000000000..68dbb18573b
--- /dev/null
+++ b/extern/nanosvg/patches/NanoSVG.diff
@@ -0,0 +1,86 @@
+diff --git a/c:/tmp/nanosvg_original.h b/c:/tmp/nanosvg_modif.h
+index 24a01a86d3d..eca0d07e79d 100644
+--- a/c:/tmp/nanosvg_original.h
++++ b/c:/tmp/nanosvg_modif.h
+@@ -24,7 +24,8 @@
+  *
+  * Bounding box calculation based on http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html
+  *
+- */
++ * This is a modified version for Blender used by importers.
++ **/
+ 
+ #ifndef NANOSVG_H
+ #define NANOSVG_H
+@@ -148,6 +149,8 @@ extern "C" {
+ 	typedef struct NSVGshape
+ 	{
+ 		char id[64];				// Optional 'id' attr of the shape or its group
++		/* Blender: Parent ID used for layer creation. */
++  		char id_parent[64];		
+ 		NSVGpaint fill;				// Fill paint
+ 		NSVGpaint stroke;			// Stroke paint
+ 		float opacity;				// Opacity of the shape.
+@@ -370,6 +373,7 @@ int nsvg__parseXML(char* input,
+ /* Simple SVG parser. */
+ 
+ #define NSVG_MAX_ATTR 128
++#define NSVG_MAX_BREADCRUMB 5
+ 
+ enum NSVGgradientUnits
+ {
+@@ -471,6 +475,10 @@ typedef struct NSVGparser
+ 	float dpi;
+ 	char pathFlag;
+ 	char defsFlag;
++	/** Blender breadcrumb for layers. */
++  	char breadcrumb[NSVG_MAX_BREADCRUMB][64];
++  	/** Blender number of elements in breadcrumb. */
++  	int breadcrumb_len;
+ } NSVGparser;
+ 
+ static void nsvg__xformIdentity(float* t)
+@@ -980,6 +988,14 @@ static void nsvg__addShape(NSVGparser* p)
+ 	memset(shape, 0, sizeof(NSVGshape));
+ 
+ 	memcpy(shape->id, attr->id, sizeof shape->id);
++	/* Copy parent id from breadcrumb. */
++	if (p->breadcrumb_len > 0) {
++		memcpy(shape->id_parent, p->breadcrumb[0], sizeof shape->id_parent);
++	}
++	else {
++		memcpy(shape->id_parent, attr->id, sizeof shape->id_parent);
++	}
++
+ 	scale = nsvg__getAverageScale(attr->xform);
+ 	shape->strokeWidth = attr->strokeWidth * scale;
+ 	shape->strokeDashOffset = attr->strokeDashOffset * scale;
+@@ -2814,6 +2830,14 @@ static void nsvg__startElement(void* ud, const char* el, const char** attr)
+ 	if (strcmp(el, "g") == 0) {
+ 		nsvg__pushAttr(p);
+ 		nsvg__parseAttribs(p, attr);
++
++		/* Save the breadcrumb of groups. */
++		if (p->breadcrumb_len < NSVG_MAX_BREADCRUMB) {
++		NSVGattrib *attr_id = nsvg__getAttr(p);
++		memcpy(
++			p->breadcrumb[p->breadcrumb_len], attr_id->id, sizeof(p->breadcrumb[p->breadcrumb_len]));
++		p->breadcrumb_len++;
++		}
+ 	}
+ 	else if (strcmp(el, "path") == 0) {
+ 		if (p->pathFlag)	// Do not allow nested paths.
+@@ -2874,7 +2898,12 @@ static void nsvg__endElement(void* ud, const char* el)
+ 	NSVGparser* p = (NSVGparser*)ud;
+ 
+ 	if (strcmp(el, "g") == 0) {
+-		nsvg__popAttr(p);
++  		/* Remove the breadcrumb level. */
++    	if (p->breadcrumb_len > 0) {
++      		p->breadcrumb[p->breadcrumb_len - 1][0] = '\0';
++      		p->breadcrumb_len--;
++		}
++	  nsvg__popAttr(p);
+ 	}
+ 	else if (strcmp(el, "path") == 0) {
+ 		p->pathFlag = 0;
diff --git a/source/blender/io/gpencil/CMakeLists.txt b/source/blender/io/gpencil/CMakeLists.txt
index fec95be6aa8..4af8b506bd5 100644
--- a/source/blender/io/gpencil/CMakeLists.txt
+++ b/source/blender/io/gpencil/CMakeLists.txt
@@ -33,6 +33,7 @@ set(INC
   ../../../../intern/clog
   ../../../../intern/guardedalloc
   ../../../../intern/utfconv
+  ../../../../extern/nanosvg
 )
 
 set(INC_SYS
@@ -44,9 +45,6 @@ set(SRC
   intern/gpencil_io_import_base.cc
   intern/gpencil_io_import_svg.cc
 
-  # This line must be removed if NanoSVG is moved to extern
-  nanosvg/nanosvg.h
-
   gpencil_io.h
   intern/gpencil_io_base.hh
   intern/gpencil_io_export_base.hh
diff --git a/source/blender/io/gpencil/intern/gpencil_io_import_svg.cc b/source/blender/io/gpencil/intern/gpencil_io_import_svg.cc
index db6bbc7768e..941d1137f4d 100644
--- a/source/blender/io/gpencil/intern/gpencil_io_import_svg.cc
+++ b/source/blender/io/gpencil/intern/gpencil_io_import_svg.cc
@@ -42,7 +42,7 @@
 #define NANOSVG_ALL_COLOR_KEYWORDS
 #define NANOSVG_IMPLEMENTATION
 
-#include "nanosvg/nanosvg.h"
+#include "nanosvg.h"
 
 using blender::MutableSpan;



More information about the Bf-blender-cvs mailing list