FLTK logo

[master] d9d3406 - Upgrade the bundled nanosvg library to current version

FLTK matrix user chat room
(using Element browser app)   FLTK gitter user chat room   GitHub FLTK Project   FLTK News RSS Feed  
  FLTK Apps      FLTK Library      Forums      Links     Login 
 All Forums  |  Back to fltk.commit  ]
 
Previous Message ]Next Message ]

[master] d9d3406 - Upgrade the bundled nanosvg library to current version "Albrecht Schlosser" Jul 09, 2022  
 
commit d9d3406be8640e30108dcef6d8b1111635fa189a
Author:     Albrecht Schlosser <albrechts.fltk@online.de>
AuthorDate: Sat Jul 9 14:37:46 2022 +0200
Commit:     Albrecht Schlosser <albrechts.fltk@online.de>
CommitDate: Sat Jul 9 14:37:46 2022 +0200

    Upgrade the bundled nanosvg library to current version
    
    For details see README.bundled-libs.txt.

 README.bundled-libs.txt | 69 +++++++++++++++++++++++++++++++++++++++++++++++--
 nanosvg/nanosvg.h       | 65 +++++++++++++++++++++++++++++++++++++---------
 nanosvg/nanosvgrast.h   | 16 ++++++++----
 3 files changed, 131 insertions(+), 19 deletions(-)

diff --git README.bundled-libs.txt README.bundled-libs.txt
index 10b91ad..ceeb927 100644
--- README.bundled-libs.txt
+++ README.bundled-libs.txt
@@ -20,12 +20,12 @@ Current versions of bundled libraries (as of Sep 13, 2021):
   Library       Version            Release date         FLTK Version
   --------------------------------------------------------------------------
   jpeg          jpeg-9d            2020-01-12           1.4.0
-  nanosvg       461ad7de70 [1]     2021-09-13           1.4.0
+  nanosvg       06a9113e29 [1]     2022-07-09           1.4.0
   png           libpng-1.6.37      2019-04-14           1.4.0
   zlib          zlib-1.2.11        2017-01-15           1.4.0
   --------------------------------------------------------------------------
 
-Previous versions of bundled libraries:
+Previous versions of bundled libraries (FLTK 1.3.x):
 
   Library       Version            Release date         FLTK Version
   ------------------------------------------------------------------
@@ -271,3 +271,68 @@ nanosvg:
 
     nanosvg.h:     Merge or download from FLTK's fork (see above).
     nanosvgrast.h: Merge or download from FLTK's fork (see above).
+
+  Maintaining branch 'fltk' in FLTK's fork of nanosvg (fltk/nanosvg):
+
+    Only maintainers with write access on fltk/nanosvg can do this.
+    Others can fork our fltk/nanosvg fork in their own GitHub account
+    and either open a PR on fltk/nanosvg or tell us about their
+    changes in fltk.development.
+
+    Use something similar to the following commands to update FLTK's
+    fork of nanosvg to the latest version. Commands are only examples,
+    you may need to change more or less, depending on the outstanding
+    updates.
+
+    Step 1: clone the fltk/nanosvg fork, set the remote 'upstream',
+    and update the 'master' branch:
+
+    $ cd /to/your/dev/dir
+    $ git clone https://github.com/fltk/nanosvg.git nanosvg-fltk
+    $ cd nanosvg-fltk
+    $ git remote add upstream https://github.com/memononen/nanosvg
+    $ git checkout master
+    $ git pull upstream master
+
+    Note: the 'master' branch must never be changed, i.e. it must
+    always be the same as 'upstream/master'. Never commit your own
+    (FLTK specific) changes to branch 'master'.
+
+    Step 2: rebase branch 'fltk' on the new master (upstream/master),
+    fix potential conflicts, and tag the new branch.
+
+    It is important to keep the individual FLTK specific patches intact
+    (one commit per patch) because this will preserve the history and
+    the committer and make it easier to skip single patches when they
+    are accepted upstream.
+
+    $ git checkout fltk
+    $ git rebase upstream/master
+
+    At this point you may need to fix conflicts! Do whatever is
+    necessary to update the branch 'fltk'.
+
+    Now `git tag' the 'fltk' branch for later reference.
+
+    Hint: use `git show <any-older-tag-name>' to see its contents.
+    I like to write a summary of commits in the tag comment.
+
+    $ git tag -a fltk_yyyy-mm-dd fltk
+
+    Replace 'yyyy-mm-dd' with the current date and add a comment
+    when asked for it (your editor will open an empty file).
+
+    Step 3: at this point it is recommended to copy the changed
+    header files to your working copy of the FLTK library and test
+    the changes. If anything is wrong, go back, fix the bugs
+    and change the git tag (delete and create a new one).
+
+    Step 4: push the new branch 'fltk' and the tag to the fltk/nanosvg
+    repository:
+
+    $ git push -f origin fltk
+    $ git push origin fltk_yyyy-mm-dd
+
+    Step 5: copy the changed files to your working copy of the FLTK
+    repository (if not done already), update this file accordingly,
+    and commit/push the update to the fltk/fltk repository.
diff --git nanosvg/nanosvg.h nanosvg/nanosvg.h
index 0175ade..24bdd46 100644
--- nanosvg/nanosvg.h
+++ nanosvg/nanosvg.h
@@ -181,12 +181,11 @@ void nsvgDelete(NSVGimage* image);
 #endif
 #endif
 
-#endif // NANOSVG_H
-
 #ifdef NANOSVG_IMPLEMENTATION
 
 #include <string.h>
 #include <stdlib.h>
+#include <stdio.h>
 #include <math.h>
 
 #define NSVG_PI (3.14159265358979323846264338327f)
@@ -1231,18 +1230,58 @@ static unsigned int nsvg__parseColorHex(const char* str)
 	return NSVG_RGB(128, 128, 128);
 }
 
+// Parse rgb color. The pointer 'str' must point at "rgb(" (4+ characters).
+// This function returns gray (rgb(128, 128, 128) == '#808080') on parse errors
+// for backwards compatibility. Note: other image viewers return black instead.
+
 static unsigned int nsvg__parseColorRGB(const char* str)
 {
-	unsigned int r=0, g=0, b=0;
-	if (sscanf(str, "rgb(%u, %u, %u)", &r, &g, &b) == 3)		// decimal integers
-		return NSVG_RGB(r, g, b);
-	if (sscanf(str, "rgb(%u%%, %u%%, %u%%)", &r, &g, &b) == 3) {	// decimal integer percentage
-		r = (r <= 100) ? ((r*255)/100) : 255;			// FLTK: clip percentages >100
-		g = (g <= 100) ? ((g*255)/100) : 255;
-		b = (b <= 100) ? ((b*255)/100) : 255;
-		return NSVG_RGB(r, g, b);
+	int i;
+	unsigned int rgbi[3];
+	float rgbf[3];
+	// try decimal integers first
+	if (sscanf(str, "rgb(%u, %u, %u)", &rgbi[0], &rgbi[1], &rgbi[2]) != 3) {
+		// integers failed, try percent values (float, locale independent)
+		const char delimiter[3] = {',', ',', ')'};
+		str += 4; // skip "rgb("
+		for (i = 0; i < 3; i++) {
+			while (*str && (nsvg__isspace(*str))) str++; 	// skip leading spaces
+			if (*str == '+') str++;				// skip '+' (don't allow '-')
+			if (!*str) break;
+			rgbf[i] = nsvg__atof(str);
+
+			// Note 1: it would be great if nsvg__atof() returned how many
+			// bytes it consumed but it doesn't. We need to skip the number,
+			// the '%' character, spaces, and the delimiter ',' or ')'.
+
+			// Note 2: The following code does not allow values like "33.%",
+			// i.e. a decimal point w/o fractional part, but this is consistent
+			// with other image viewers, e.g. firefox, chrome, eog, gimp.
+
+			while (*str && nsvg__isdigit(*str)) str++;		// skip integer part
+			if (*str == '.') {
+				str++;
+				if (!nsvg__isdigit(*str)) break;		// error: no digit after '.'
+				while (*str && nsvg__isdigit(*str)) str++;	// skip fractional part
+			}
+			if (*str == '%') str++; else break;
+			while (nsvg__isspace(*str)) str++;
+			if (*str == delimiter[i]) str++;
+			else break;
+		}
+		if (i == 3) {
+			rgbi[0] = roundf(rgbf[0] * 2.55f);
+			rgbi[1] = roundf(rgbf[1] * 2.55f);
+			rgbi[2] = roundf(rgbf[2] * 2.55f);
+		} else {
+			rgbi[0] = rgbi[1] = rgbi[2] = 128;
+		}
 	}
-	return NSVG_RGB(128, 128, 128);
+	// clip values as the CSS spec requires
+	for (i = 0; i < 3; i++) {
+		if (rgbi[i] > 255) rgbi[i] = 255;
+	}
+	return NSVG_RGB(rgbi[0], rgbi[1], rgbi[2]);
 }
 
 typedef struct NSVGNamedColor {
@@ -3017,4 +3056,6 @@ void nsvgDelete(NSVGimage* image)
 	free(image);
 }
 
-#endif
+#endif // NANOSVG_IMPLEMENTATION
+
+#endif // NANOSVG_H
diff --git nanosvg/nanosvgrast.h nanosvg/nanosvgrast.h
index 84a05a7..5298669 100644
--- nanosvg/nanosvgrast.h
+++ nanosvg/nanosvgrast.h
@@ -31,6 +31,8 @@
 #ifndef NANOSVGRAST_H
 #define NANOSVGRAST_H
 
+#include "nanosvg.h"
+
 #ifndef NANOSVGRAST_CPLUSPLUS
 #ifdef __cplusplus
 extern "C" {
@@ -87,11 +89,11 @@ void nsvgDeleteRasterizer(NSVGrasterizer*);
 #endif
 #endif
 
-#endif // NANOSVGRAST_H
-
 #ifdef NANOSVGRAST_IMPLEMENTATION
 
 #include <math.h>
+#include <stdlib.h>
+#include <string.h>
 
 #define NSVG__SUBSAMPLES	5
 #define NSVG__FIXSHIFT		10
@@ -972,7 +974,7 @@ static float nsvg__clampf(float a, float mn, float mx) { return a < mn ? mn : (a
 
 static unsigned int nsvg__RGBA(unsigned char r, unsigned char g, unsigned char b, unsigned char a)
 {
-	return (r) | (g << 8) | (b << 16) | (a << 24);
+	return ((unsigned int)r) | ((unsigned int)g << 8) | ((unsigned int)b << 16) | ((unsigned int)a << 24);
 }
 
 static unsigned int nsvg__lerpRGBA(unsigned int c0, unsigned int c1, float u)
@@ -1423,7 +1425,8 @@ void nsvgRasterizeXY(NSVGrasterizer* r,
 			}
 
 			// Rasterize edges
-			qsort(r->edges, r->nedges, sizeof(NSVGedge), nsvg__cmpEdge);
+			if (r->nedges != 0)
+				qsort(r->edges, r->nedges, sizeof(NSVGedge), nsvg__cmpEdge);
 
 			// now, traverse the scanlines and find the intersections on each scanline, use non-zero rule
 			nsvg__initPaint(&cache, &shape->fill, shape->opacity);
@@ -1449,7 +1452,8 @@ void nsvgRasterizeXY(NSVGrasterizer* r,
 			}
 
 			// Rasterize edges
-			qsort(r->edges, r->nedges, sizeof(NSVGedge), nsvg__cmpEdge);
+			if (r->nedges != 0)
+				qsort(r->edges, r->nedges, sizeof(NSVGedge), nsvg__cmpEdge);
 
 			// now, traverse the scanlines and find the intersections on each scanline, use non-zero rule
 			nsvg__initPaint(&cache, &shape->stroke, shape->opacity);
@@ -1474,3 +1478,5 @@ void nsvgRasterize(NSVGrasterizer* r,
 }
 
 #endif // NANOSVGRAST_IMPLEMENTATION
+
+#endif // NANOSVGRAST_H
Direct Link to Message ]
 
     
Previous Message ]Next Message ]
 
 

Comments are owned by the poster. All other content is copyright 1998-2024 by Bill Spitzak and others. This project is hosted by The FLTK Team. Please report site problems to 'erco@seriss.com'.