[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
06/19: gnu: nanosvg: Add a patch for PrusaSlicer 2.6.
From: |
guix-commits |
Subject: |
06/19: gnu: nanosvg: Add a patch for PrusaSlicer 2.6. |
Date: |
Thu, 14 Sep 2023 17:45:21 -0400 (EDT) |
civodul pushed a commit to branch master
in repository guix.
commit 0a6ad454a3ec01e402403f500bb90fe55fc232b7
Author: Artyom V. Poptsov <poptsov.artyom@gmail.com>
AuthorDate: Sat Jul 8 11:50:16 2023 +0300
gnu: nanosvg: Add a patch for PrusaSlicer 2.6.
* gnu/packages/graphics.scm (nanosvg): Add a patch that is required to build
PrusaSlicer 2.6.
* gnu/packages/patches/nanosvg-prusa-slicer.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it.
Signed-off-by: Ludovic Courtès <ludo@gnu.org>
---
gnu/local.mk | 1 +
gnu/packages/graphics.scm | 8 +-
gnu/packages/patches/nanosvg-prusa-slicer.patch | 248 ++++++++++++++++++++++++
3 files changed, 256 insertions(+), 1 deletion(-)
diff --git a/gnu/local.mk b/gnu/local.mk
index 8dd363dd79..0d6e6846ee 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1636,6 +1636,7 @@ dist_patch_DATA =
\
%D%/packages/patches/mutter-fix-inverted-test.patch \
%D%/packages/patches/mutt-store-references.patch \
%D%/packages/patches/m17n-lib-1.8.0-use-pkg-config-for-freetype.patch
\
+ %D%/packages/patches/nanosvg-prusa-slicer.patch \
%D%/packages/patches/nautilus-extension-search-path.patch \
%D%/packages/patches/ncompress-fix-softlinks.patch \
%D%/packages/patches/ncftp-reproducible.patch \
diff --git a/gnu/packages/graphics.scm b/gnu/packages/graphics.scm
index 8edc93f702..9362666274 100644
--- a/gnu/packages/graphics.scm
+++ b/gnu/packages/graphics.scm
@@ -36,6 +36,7 @@
;;; Copyright © 2023 Sharlatan Hellseher <sharlatanus@gmail.com>
;;; Copyright © 2023 David Thompson <dthompson2@worcester.edu>
;;; Copyright © 2023 Eric Bavier <bavier@posteo.net>
+;;; Copyright © 2023 Artyom V. Poptsov <poptsov.artyom@gmail.com>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -2643,7 +2644,12 @@ a tetrahedral mesh, isovalue discretization and
Lagrangian movement;
(file-name (git-file-name name version))
(sha256
(base32
- "1pkzv75kavkhrbdd2kvq755jyr0vamgrfr7lc33dq3ipkzmqvs2l"))))
+ "1pkzv75kavkhrbdd2kvq755jyr0vamgrfr7lc33dq3ipkzmqvs2l"))
+ ;; This patch required to build PrusaSlicer 2.6.
+ ;;
+ ;; It is taken from
+ ;;
<https://github.com/fltk/nanosvg/commit/abcd277ea45e9098bed752cf9c6875b533c0892f.patch>
+ (patches (search-patches "nanosvg-prusa-slicer.patch"))))
(build-system cmake-build-system)
(arguments (list #:tests? #f ;no test suite
#:configure-flags #~(list "-DBUILD_SHARED_LIBS=ON")))
diff --git a/gnu/packages/patches/nanosvg-prusa-slicer.patch
b/gnu/packages/patches/nanosvg-prusa-slicer.patch
new file mode 100644
index 0000000000..dc11e9365c
--- /dev/null
+++ b/gnu/packages/patches/nanosvg-prusa-slicer.patch
@@ -0,0 +1,248 @@
+From abcd277ea45e9098bed752cf9c6875b533c0892f Mon Sep 17 00:00:00 2001
+From: AlbrechtS <AlbrechtS.svn@fltk.example.org>
+Date: Sun, 4 Feb 2018 23:47:38 +0100
+Subject: [PATCH] Modify rasterizer to support non-square X,Y axes scaling.
+
+Add new function nsvgRasterizeXY() similar to nsvgRasterize() but with
+separate scaling factors for x-axis and y-axis.
+---
+ src/nanosvgrast.h | 78 +++++++++++++++++++++++++++++++----------------
+ 1 file changed, 51 insertions(+), 27 deletions(-)
+
+diff --git a/src/nanosvgrast.h b/src/nanosvgrast.h
+index 17ba3b0..a83db27 100644
+--- a/src/nanosvgrast.h
++++ b/src/nanosvgrast.h
+@@ -22,6 +22,12 @@
+ *
+ */
+
++/* Modified by FLTK to support non-square X,Y axes scaling.
++ *
++ * Added: nsvgRasterizeXY()
++*/
++
++
+ #ifndef NANOSVGRAST_H
+ #define NANOSVGRAST_H
+
+@@ -46,6 +52,9 @@ typedef struct NSVGrasterizer NSVGrasterizer;
+ unsigned char* img = malloc(w*h*4);
+ // Rasterize
+ nsvgRasterize(rast, image, 0,0,1, img, w, h, w*4);
++
++ // For non-square X,Y scaling, use
++ nsvgRasterizeXY(rast, image, 0,0,1,1, img, w, h, w*4);
+ */
+
+ // Allocated rasterizer context.
+@@ -55,7 +64,7 @@ NSVGrasterizer* nsvgCreateRasterizer(void);
+ // r - pointer to rasterizer context
+ // image - pointer to image to rasterize
+ // tx,ty - image offset (applied after scaling)
+-// scale - image scale
++// scale - image scale (assumes square aspect ratio)
+ // dst - pointer to destination image data, 4 bytes per pixel (RGBA)
+ // w - width of the image to render
+ // h - height of the image to render
+@@ -64,6 +73,12 @@ void nsvgRasterize(NSVGrasterizer* r,
+ NSVGimage* image, float tx, float ty, float
scale,
+ unsigned char* dst, int w, int h, int
stride);
+
++// As above, but allow X and Y axes to scale independently for non-square
aspects
++void nsvgRasterizeXY(NSVGrasterizer* r,
++ NSVGimage* image, float tx, float ty,
++ float sx, float sy,
++ unsigned char* dst, int w, int h, int
stride);
++
+ // Deletes rasterizer context.
+ void nsvgDeleteRasterizer(NSVGrasterizer*);
+
+@@ -370,7 +385,7 @@ static void nsvg__flattenCubicBez(NSVGrasterizer* r,
+ nsvg__flattenCubicBez(r, x1234,y1234, x234,y234, x34,y34, x4,y4,
level+1, type);
+ }
+
+-static void nsvg__flattenShape(NSVGrasterizer* r, NSVGshape* shape, float
scale)
++static void nsvg__flattenShape(NSVGrasterizer* r, NSVGshape* shape, float sx,
float sy)
+ {
+ int i, j;
+ NSVGpath* path;
+@@ -378,13 +393,13 @@ static void nsvg__flattenShape(NSVGrasterizer* r,
NSVGshape* shape, float scale)
+ for (path = shape->paths; path != NULL; path = path->next) {
+ r->npoints = 0;
+ // Flatten path
+- nsvg__addPathPoint(r, path->pts[0]*scale, path->pts[1]*scale,
0);
++ nsvg__addPathPoint(r, path->pts[0]*sx, path->pts[1]*sy, 0);
+ for (i = 0; i < path->npts-1; i += 3) {
+ float* p = &path->pts[i*2];
+- nsvg__flattenCubicBez(r, p[0]*scale,p[1]*scale,
p[2]*scale,p[3]*scale, p[4]*scale,p[5]*scale, p[6]*scale,p[7]*scale, 0, 0);
++ nsvg__flattenCubicBez(r, p[0]*sx,p[1]*sy,
p[2]*sx,p[3]*sy, p[4]*sx,p[5]*sy, p[6]*sx,p[7]*sy, 0, 0);
+ }
+ // Close path
+- nsvg__addPathPoint(r, path->pts[0]*scale, path->pts[1]*scale,
0);
++ nsvg__addPathPoint(r, path->pts[0]*sx, path->pts[1]*sy, 0);
+ // Build edges
+ for (i = 0, j = r->npoints-1; i < r->npoints; j = i++)
+ nsvg__addEdge(r, r->points[j].x, r->points[j].y,
r->points[i].x, r->points[i].y);
+@@ -734,7 +749,7 @@ static void nsvg__prepareStroke(NSVGrasterizer* r, float
miterLimit, int lineJoi
+ }
+ }
+
+-static void nsvg__flattenShapeStroke(NSVGrasterizer* r, NSVGshape* shape,
float scale)
++static void nsvg__flattenShapeStroke(NSVGrasterizer* r, NSVGshape* shape,
float sx, float sy)
+ {
+ int i, j, closed;
+ NSVGpath* path;
+@@ -742,15 +757,16 @@ static void nsvg__flattenShapeStroke(NSVGrasterizer* r,
NSVGshape* shape, float
+ float miterLimit = shape->miterLimit;
+ int lineJoin = shape->strokeLineJoin;
+ int lineCap = shape->strokeLineCap;
+- float lineWidth = shape->strokeWidth * scale;
++ const float sw = (sx + sy) / 2; // average scaling factor
++ const float lineWidth = shape->strokeWidth * sw; // FIXME (?)
+
+ for (path = shape->paths; path != NULL; path = path->next) {
+ // Flatten path
+ r->npoints = 0;
+- nsvg__addPathPoint(r, path->pts[0]*scale, path->pts[1]*scale,
NSVG_PT_CORNER);
++ nsvg__addPathPoint(r, path->pts[0]*sx, path->pts[1]*sy,
NSVG_PT_CORNER);
+ for (i = 0; i < path->npts-1; i += 3) {
+ float* p = &path->pts[i*2];
+- nsvg__flattenCubicBez(r, p[0]*scale,p[1]*scale,
p[2]*scale,p[3]*scale, p[4]*scale,p[5]*scale, p[6]*scale,p[7]*scale, 0,
NSVG_PT_CORNER);
++ nsvg__flattenCubicBez(r, p[0]*sx,p[1]*sy,
p[2]*sx,p[3]*sy, p[4]*sx,p[5]*sy, p[6]*sx,p[7]*sy, 0, NSVG_PT_CORNER);
+ }
+ if (r->npoints < 2)
+ continue;
+@@ -796,7 +812,7 @@ static void nsvg__flattenShapeStroke(NSVGrasterizer* r,
NSVGshape* shape, float
+ dashOffset -= shape->strokeDashArray[idash];
+ idash = (idash + 1) % shape->strokeDashCount;
+ }
+- dashLen = (shape->strokeDashArray[idash] - dashOffset)
* scale;
++ dashLen = (shape->strokeDashArray[idash] - dashOffset)
* sw;
+
+ for (j = 1; j < r->npoints2; ) {
+ float dx = r->points2[j].x - cur.x;
+@@ -818,7 +834,7 @@ static void nsvg__flattenShapeStroke(NSVGrasterizer* r,
NSVGshape* shape, float
+ // Advance dash pattern
+ dashState = !dashState;
+ idash = (idash+1) %
shape->strokeDashCount;
+- dashLen = shape->strokeDashArray[idash]
* scale;
++ dashLen = shape->strokeDashArray[idash]
* sw;
+ // Restart
+ cur.x = x;
+ cur.y = y;
+@@ -987,7 +1003,7 @@ static inline int nsvg__div255(int x)
+ }
+
+ static void nsvg__scanlineSolid(unsigned char* dst, int count, unsigned char*
cover, int x, int y,
+- float tx, float
ty, float scale, NSVGcachedPaint* cache)
++ float tx, float
ty, float sx, float sy, NSVGcachedPaint* cache)
+ {
+
+ if (cache->type == NSVG_PAINT_COLOR) {
+@@ -1028,9 +1044,9 @@ static void nsvg__scanlineSolid(unsigned char* dst, int
count, unsigned char* co
+ int i, cr, cg, cb, ca;
+ unsigned int c;
+
+- fx = ((float)x - tx) / scale;
+- fy = ((float)y - ty) / scale;
+- dx = 1.0f / scale;
++ fx = ((float)x - tx) / sx;
++ fy = ((float)y - ty) / sy;
++ dx = 1.0f / sx;
+
+ for (i = 0; i < count; i++) {
+ int r,g,b,a,ia;
+@@ -1073,9 +1089,9 @@ static void nsvg__scanlineSolid(unsigned char* dst, int
count, unsigned char* co
+ int i, cr, cg, cb, ca;
+ unsigned int c;
+
+- fx = ((float)x - tx) / scale;
+- fy = ((float)y - ty) / scale;
+- dx = 1.0f / scale;
++ fx = ((float)x - tx) / sx;
++ fy = ((float)y - ty) / sy;
++ dx = 1.0f / sx;
+
+ for (i = 0; i < count; i++) {
+ int r,g,b,a,ia;
+@@ -1114,7 +1130,7 @@ static void nsvg__scanlineSolid(unsigned char* dst, int
count, unsigned char* co
+ }
+ }
+
+-static void nsvg__rasterizeSortedEdges(NSVGrasterizer *r, float tx, float ty,
float scale, NSVGcachedPaint* cache, char fillRule)
++static void nsvg__rasterizeSortedEdges(NSVGrasterizer *r, float tx, float ty,
float sx, float sy, NSVGcachedPaint* cache, char fillRule)
+ {
+ NSVGactiveEdge *active = NULL;
+ int y, s;
+@@ -1196,7 +1212,7 @@ static void nsvg__rasterizeSortedEdges(NSVGrasterizer
*r, float tx, float ty, fl
+ if (xmin < 0) xmin = 0;
+ if (xmax > r->width-1) xmax = r->width-1;
+ if (xmin <= xmax) {
+- nsvg__scanlineSolid(&r->bitmap[y * r->stride] + xmin*4,
xmax-xmin+1, &r->scanline[xmin], xmin, y, tx,ty, scale, cache);
++ nsvg__scanlineSolid(&r->bitmap[y * r->stride] + xmin*4,
xmax-xmin+1, &r->scanline[xmin], xmin, y, tx,ty, sx, sy, cache);
+ }
+ }
+
+@@ -1364,8 +1380,9 @@ static void dumpEdges(NSVGrasterizer* r, const char*
name)
+ }
+ */
+
+-void nsvgRasterize(NSVGrasterizer* r,
+- NSVGimage* image, float tx, float ty, float
scale,
++void nsvgRasterizeXY(NSVGrasterizer* r,
++ NSVGimage* image, float tx, float ty,
++ float sx, float sy,
+ unsigned char* dst, int w, int h, int stride)
+ {
+ NSVGshape *shape = NULL;
+@@ -1396,7 +1413,7 @@ void nsvgRasterize(NSVGrasterizer* r,
+ r->freelist = NULL;
+ r->nedges = 0;
+
+- nsvg__flattenShape(r, shape, scale);
++ nsvg__flattenShape(r, shape, sx, sy);
+
+ // Scale and translate edges
+ for (i = 0; i < r->nedges; i++) {
+@@ -1414,14 +1431,14 @@ void nsvgRasterize(NSVGrasterizer* r,
+ // now, traverse the scanlines and find the
intersections on each scanline, use non-zero rule
+ nsvg__initPaint(&cache, &shape->fill, shape->opacity);
+
+- nsvg__rasterizeSortedEdges(r, tx,ty,scale, &cache,
shape->fillRule);
++ nsvg__rasterizeSortedEdges(r, tx,ty, sx, sy, &cache,
shape->fillRule);
+ }
+- if (shape->stroke.type != NSVG_PAINT_NONE &&
(shape->strokeWidth * scale) > 0.01f) {
++ if (shape->stroke.type != NSVG_PAINT_NONE &&
(shape->strokeWidth * sx) > 0.01f) {
+ nsvg__resetPool(r);
+ r->freelist = NULL;
+ r->nedges = 0;
+
+- nsvg__flattenShapeStroke(r, shape, scale);
++ nsvg__flattenShapeStroke(r, shape, sx, sy);
+
+ // dumpEdges(r, "edge.svg");
+
+@@ -1441,7 +1458,7 @@ void nsvgRasterize(NSVGrasterizer* r,
+ // now, traverse the scanlines and find the
intersections on each scanline, use non-zero rule
+ nsvg__initPaint(&cache, &shape->stroke, shape->opacity);
+
+- nsvg__rasterizeSortedEdges(r, tx,ty,scale, &cache,
NSVG_FILLRULE_NONZERO);
++ nsvg__rasterizeSortedEdges(r, tx,ty,sx, sy, &cache,
NSVG_FILLRULE_NONZERO);
+ }
+ }
+
+@@ -1453,6 +1470,13 @@ void nsvgRasterize(NSVGrasterizer* r,
+ r->stride = 0;
+ }
+
++void nsvgRasterize(NSVGrasterizer* r,
++ NSVGimage* image, float tx, float ty, float
scale,
++ unsigned char* dst, int w, int h, int stride)
++{
++ nsvgRasterizeXY(r,image, tx, ty, scale, scale, dst, w, h, stride);
++}
++
+ #endif // NANOSVGRAST_IMPLEMENTATION
+
+ #endif // NANOSVGRAST_H
- 12/19: gnu: libftdi: Do not build example programs., (continued)
- 12/19: gnu: libftdi: Do not build example programs., guix-commits, 2023/09/14
- 16/19: gnu: libftdi: Build Python bindings., guix-commits, 2023/09/14
- 02/19: gnu: makefile2graph: fix cross-compile., guix-commits, 2023/09/14
- 03/19: gnu: uncrustify: Update to 0.77.1., guix-commits, 2023/09/14
- 01/19: gnu: openmpi: Enable PMIx., guix-commits, 2023/09/14
- 04/19: gnu: uncrustify: use new style and gexp., guix-commits, 2023/09/14
- 08/19: gnu: armagetronad: Update to 0.2.9.1.1., guix-commits, 2023/09/14
- 07/19: gnu: kwin: Unwrap executable name for desktop file search., guix-commits, 2023/09/14
- 10/19: gnu: libftdi: Update package style., guix-commits, 2023/09/14
- 19/19: gnu: go-ipfs: Update to 0.13.0., guix-commits, 2023/09/14
- 06/19: gnu: nanosvg: Add a patch for PrusaSlicer 2.6.,
guix-commits <=
- 15/19: gnu: libftdi: Build C++ bindings., guix-commits, 2023/09/14
- 18/19: gnu: libftdi: Build API documentation., guix-commits, 2023/09/14
- 13/19: gnu: libftdi: Install libraries to /lib instead of /lib64., guix-commits, 2023/09/14
- 17/19: gnu: libftdi: Update to 1.5., guix-commits, 2023/09/14
- 11/19: gnu: libftdi: Use HTTPS for package source., guix-commits, 2023/09/14