summaryrefslogtreecommitdiff
path: root/Build/source/libs/potrace/potrace-src/src/backend_svg.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/potrace/potrace-src/src/backend_svg.c')
-rw-r--r--Build/source/libs/potrace/potrace-src/src/backend_svg.c342
1 files changed, 0 insertions, 342 deletions
diff --git a/Build/source/libs/potrace/potrace-src/src/backend_svg.c b/Build/source/libs/potrace/potrace-src/src/backend_svg.c
deleted file mode 100644
index 717f58aa396..00000000000
--- a/Build/source/libs/potrace/potrace-src/src/backend_svg.c
+++ /dev/null
@@ -1,342 +0,0 @@
-/* Copyright (C) 2001-2017 Peter Selinger.
- This file is part of Potrace. It is free software and it is covered
- by the GNU General Public License. See the file COPYING for details. */
-
-
-/* The SVG backend of Potrace. */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdio.h>
-#include <stdarg.h>
-#include <string.h>
-#include <math.h>
-
-#include "potracelib.h"
-#include "curve.h"
-#include "main.h"
-#include "backend_svg.h"
-#include "lists.h"
-#include "auxiliary.h"
-
-/* ---------------------------------------------------------------------- */
-/* path-drawing auxiliary functions */
-
-/* coordinate quantization */
-static inline point_t unit(dpoint_t p) {
- point_t q;
-
- q.x = (long)(floor(p.x*info.unit+.5));
- q.y = (long)(floor(p.y*info.unit+.5));
- return q;
-}
-
-static point_t cur;
-static char lastop = 0;
-static int column = 0;
-static int newline = 1;
-
-static void shiptoken(FILE *fout, const char *token) {
- int c = strlen(token);
- if (!newline && column+c+1 > 75) {
- fprintf(fout, "\n");
- column = 0;
- newline = 1;
- } else if (!newline) {
- fprintf(fout, " ");
- column++;
- }
- fprintf(fout, "%s", token);
- column += c;
- newline = 0;
-}
-
-static void ship(FILE *fout, const char *fmt, ...) {
- va_list args;
- static char buf[4096]; /* static string limit is okay here because
- we only use constant format strings - for
- the same reason, it is okay to use
- vsprintf instead of vsnprintf below. */
- char *p, *q;
-
- va_start(args, fmt);
- vsprintf(buf, fmt, args);
- buf[4095] = 0;
- va_end(args);
-
- p = buf;
- while ((q = strchr(p, ' ')) != NULL) {
- *q = 0;
- shiptoken(fout, p);
- p = q+1;
- }
- shiptoken(fout, p);
-}
-
-static void svg_moveto(FILE *fout, dpoint_t p) {
- cur = unit(p);
-
- ship(fout, "M%ld %ld", cur.x, cur.y);
- lastop = 'M';
-}
-
-static void svg_rmoveto(FILE *fout, dpoint_t p) {
- point_t q;
-
- q = unit(p);
- ship(fout, "m%ld %ld", q.x-cur.x, q.y-cur.y);
- cur = q;
- lastop = 'm';
-}
-
-static void svg_lineto(FILE *fout, dpoint_t p) {
- point_t q;
-
- q = unit(p);
-
- if (lastop != 'l') {
- ship(fout, "l%ld %ld", q.x-cur.x, q.y-cur.y);
- } else {
- ship(fout, "%ld %ld", q.x-cur.x, q.y-cur.y);
- }
- cur = q;
- lastop = 'l';
-}
-
-static void svg_curveto(FILE *fout, dpoint_t p1, dpoint_t p2, dpoint_t p3) {
- point_t q1, q2, q3;
-
- q1 = unit(p1);
- q2 = unit(p2);
- q3 = unit(p3);
-
- if (lastop != 'c') {
- ship(fout, "c%ld %ld %ld %ld %ld %ld", q1.x-cur.x, q1.y-cur.y, q2.x-cur.x, q2.y-cur.y, q3.x-cur.x, q3.y-cur.y);
- } else {
- ship(fout, "%ld %ld %ld %ld %ld %ld", q1.x-cur.x, q1.y-cur.y, q2.x-cur.x, q2.y-cur.y, q3.x-cur.x, q3.y-cur.y);
- }
- cur = q3;
- lastop = 'c';
-}
-
-/* ---------------------------------------------------------------------- */
-/* functions for converting a path to an SVG path element */
-
-/* Explicit encoding. If abs is set, move to first coordinate
- absolutely. */
-static int svg_path(FILE *fout, potrace_curve_t *curve, int abs) {
- int i;
- dpoint_t *c;
- int m = curve->n;
-
- c = curve->c[m-1];
- if (abs) {
- svg_moveto(fout, c[2]);
- } else {
- svg_rmoveto(fout, c[2]);
- }
-
- for (i=0; i<m; i++) {
- c = curve->c[i];
- switch (curve->tag[i]) {
- case POTRACE_CORNER:
- svg_lineto(fout, c[1]);
- svg_lineto(fout, c[2]);
- break;
- case POTRACE_CURVETO:
- svg_curveto(fout, c[0], c[1], c[2]);
- break;
- }
- }
- newline = 1;
- shiptoken(fout, "z");
- return 0;
-}
-
-/* produce a jaggy path - for debugging. If abs is set, move to first
- coordinate absolutely. If abs is not set, move to first coordinate
- relatively, and traverse path in the opposite direction. */
-static int svg_jaggy_path(FILE *fout, point_t *pt, int n, int abs) {
- int i;
- point_t cur, prev;
-
- if (abs) {
- cur = prev = pt[n-1];
- svg_moveto(fout, dpoint(cur));
- for (i=0; i<n; i++) {
- if (pt[i].x != cur.x && pt[i].y != cur.y) {
- cur = prev;
- svg_lineto(fout, dpoint(cur));
- }
- prev = pt[i];
- }
- svg_lineto(fout, dpoint(pt[n-1]));
- } else {
- cur = prev = pt[0];
- svg_rmoveto(fout, dpoint(cur));
- for (i=n-1; i>=0; i--) {
- if (pt[i].x != cur.x && pt[i].y != cur.y) {
- cur = prev;
- svg_lineto(fout, dpoint(cur));
- }
- prev = pt[i];
- }
- svg_lineto(fout, dpoint(pt[0]));
- }
- newline = 1;
- shiptoken(fout, "z");
- return 0;
-}
-
-static void write_paths_opaque(FILE *fout, potrace_path_t *tree) {
- potrace_path_t *p, *q;
-
- for (p=tree; p; p=p->sibling) {
- if (info.grouping == 2) {
- fprintf(fout, "<g>\n");
- fprintf(fout, "<g>\n");
- }
- column = fprintf(fout, "<path fill=\"#%06x\" stroke=\"none\" d=\"", info.color);
- newline = 1;
- lastop = 0;
- if (info.debug == 1) {
- svg_jaggy_path(fout, p->priv->pt, p->priv->len, 1);
- } else {
- svg_path(fout, &p->curve, 1);
- }
- fprintf(fout, "\"/>\n");
- for (q=p->childlist; q; q=q->sibling) {
- column = fprintf(fout, "<path fill=\"#%06x\" stroke=\"none\" d=\"", info.fillcolor);
- newline = 1;
- lastop = 0;
- if (info.debug == 1) {
- svg_jaggy_path(fout, q->priv->pt, q->priv->len, 1);
- } else {
- svg_path(fout, &q->curve, 1);
- }
- fprintf(fout, "\"/>\n");
- }
- if (info.grouping == 2) {
- fprintf(fout, "</g>\n");
- }
- for (q=p->childlist; q; q=q->sibling) {
- write_paths_opaque(fout, q->childlist);
- }
- if (info.grouping == 2) {
- fprintf(fout, "</g>\n");
- }
- }
-}
-
-static void write_paths_transparent_rec(FILE *fout, potrace_path_t *tree) {
- potrace_path_t *p, *q;
-
- for (p=tree; p; p=p->sibling) {
- if (info.grouping == 2) {
- fprintf(fout, "<g>\n");
- }
- if (info.grouping != 0) {
- column = fprintf(fout, "<path d=\"");
- newline = 1;
- lastop = 0;
- }
- if (info.debug == 1) {
- svg_jaggy_path(fout, p->priv->pt, p->priv->len, 1);
- } else {
- svg_path(fout, &p->curve, 1);
- }
- for (q=p->childlist; q; q=q->sibling) {
- if (info.debug == 1) {
- svg_jaggy_path(fout, q->priv->pt, q->priv->len, 0);
- } else {
- svg_path(fout, &q->curve, 0);
- }
- }
- if (info.grouping != 0) {
- fprintf(fout, "\"/>\n");
- }
- for (q=p->childlist; q; q=q->sibling) {
- write_paths_transparent_rec(fout, q->childlist);
- }
- if (info.grouping == 2) {
- fprintf(fout, "</g>\n");
- }
- }
-}
-
-static void write_paths_transparent(FILE *fout, potrace_path_t *tree) {
- if (info.grouping == 0) {
- column = fprintf(fout, "<path d=\"");
- newline = 1;
- lastop = 0;
- }
- write_paths_transparent_rec(fout, tree);
- if (info.grouping == 0) {
- fprintf(fout, "\"/>\n");
- }
-}
-
-/* ---------------------------------------------------------------------- */
-/* Backend. */
-
-/* public interface for SVG */
-int page_svg(FILE *fout, potrace_path_t *plist, imginfo_t *imginfo) {
-
- double bboxx = imginfo->trans.bb[0]+imginfo->lmar+imginfo->rmar;
- double bboxy = imginfo->trans.bb[1]+imginfo->tmar+imginfo->bmar;
- double origx = imginfo->trans.orig[0] + imginfo->lmar;
- double origy = bboxy - imginfo->trans.orig[1] - imginfo->bmar;
- double scalex = imginfo->trans.scalex / info.unit;
- double scaley = -imginfo->trans.scaley / info.unit;
-
- /* header */
- fprintf(fout, "<?xml version=\"1.0\" standalone=\"no\"?>\n");
- fprintf(fout, "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 20010904//EN\"\n");
- fprintf(fout, " \"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd\">\n");
-
- /* set bounding box and namespace */
- fprintf(fout, "<svg version=\"1.0\" xmlns=\"http://www.w3.org/2000/svg\"\n");
- fprintf(fout, " width=\"%fpt\" height=\"%fpt\" viewBox=\"0 0 %f %f\"\n",
- bboxx, bboxy, bboxx, bboxy);
- fprintf(fout, " preserveAspectRatio=\"xMidYMid meet\">\n");
-
- /* metadata: creator */
- fprintf(fout, "<metadata>\n");
- fprintf(fout, "Created by " POTRACE " " VERSION ", written by Peter Selinger 2001-2017\n");
- fprintf(fout, "</metadata>\n");
-
- /* use a "group" tag to establish coordinate system and style */
- fprintf(fout, "<g transform=\"");
- if (origx != 0 || origy != 0) {
- fprintf(fout, "translate(%f,%f) ", origx, origy);
- }
- if (info.angle != 0) {
- fprintf(fout, "rotate(%.2f) ", -info.angle);
- }
- fprintf(fout, "scale(%f,%f)", scalex, scaley);
- fprintf(fout, "\"\n");
- fprintf(fout, "fill=\"#%06x\" stroke=\"none\">\n", info.color);
-
- if (info.opaque) {
- write_paths_opaque(fout, plist);
- } else {
- write_paths_transparent(fout, plist);
- }
-
- /* write footer */
- fprintf(fout, "</g>\n");
- fprintf(fout, "</svg>\n");
- fflush(fout);
-
- return 0;
-}
-
-/* the Gimppath backend is identical, except that it disables
- --opaque, enables --flat, and the dimensions are pixel-based */
-int page_gimp(FILE *fout, potrace_path_t *plist, imginfo_t *imginfo) {
- info.opaque = 0;
- info.grouping = 0;
- return page_svg(fout, plist, imginfo);
-}