From ba64d5da3ab706b4243e95c80677e6a19d0fd181 Mon Sep 17 00:00:00 2001 From: kramm Date: Wed, 26 Mar 2008 12:56:08 +0000 Subject: [PATCH] *** empty log message *** --- lib/devices/arts.c | 347 ----------------------------------------------- lib/devices/arts.h | 40 ------ lib/devices/artsutils.c | 317 ------------------------------------------- lib/devices/artsutils.h | 22 --- 4 files changed, 726 deletions(-) delete mode 100644 lib/devices/arts.c delete mode 100644 lib/devices/arts.h delete mode 100644 lib/devices/artsutils.c delete mode 100644 lib/devices/artsutils.h diff --git a/lib/devices/arts.c b/lib/devices/arts.c deleted file mode 100644 index ca03a80..0000000 --- a/lib/devices/arts.c +++ /dev/null @@ -1,347 +0,0 @@ -/* arts.c - - Part of the swftools package. - - Copyright (c) 2005 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#include -#include -#include -#ifndef WIN32 -#include -#endif -#include -#include -#include -#include "../mem.h" -#include "../gfxdevice.h" -#include "../gfxtools.h" -#include "../art/libart.h" -#include "arts.h" -#include "artsutils.h" - -typedef struct _clip { - ArtSVP*svp; - struct _clip*next; -} clip_t; - -typedef struct _internal { - gfxdevice_t*out; - clip_t*clip; - ArtSVP*svpunion; -} internal_t; - -static int verbose = 0; - -static void dbg(char*format, ...) -{ - if(!verbose) - return; - char buf[1024]; - int l; - va_list arglist; - va_start(arglist, format); - vsprintf(buf, format, arglist); - va_end(arglist); - l = strlen(buf); - while(l && buf[l-1]=='\n') { - buf[l-1] = 0; - l--; - } - printf("(device-arts) %s\n", buf); - fflush(stdout); -} - -int arts_setparameter(struct _gfxdevice*dev, const char*key, const char*value) -{ - dbg("arts_setparameter"); - internal_t*i = (internal_t*)dev->internal; - if(i->out) return i->out->setparameter(i->out,key,value); - else return 0; -} - -void arts_startpage(struct _gfxdevice*dev, int width, int height) -{ - dbg("arts_startpage"); - internal_t*i = (internal_t*)dev->internal; - if(i->out) i->out->startpage(i->out,width,height); -} - -void arts_startclip(struct _gfxdevice*dev, gfxline_t*line) -{ - dbg("arts_startclip"); - internal_t*i = (internal_t*)dev->internal; - ArtSVP* svp = gfxfillToSVP(line, 1); - - svp = art_svp_rewind_uncrossed(art_svp_uncross(svp),ART_WIND_RULE_ODDEVEN); /*FIXME*/ - - if(i->clip) { - ArtSVP*old = i->clip->svp; - clip_t*n = i->clip; - i->clip = (clip_t*)rfx_calloc(sizeof(clip_t)); - i->clip->next = n; - i->clip->svp = art_svp_intersect(svp, old); - art_svp_free(svp); - } else { - i->clip = (clip_t*)rfx_calloc(sizeof(clip_t)); - i->clip->svp = svp; - } -} - -void arts_endclip(struct _gfxdevice*dev) -{ - dbg("arts_endclip"); - internal_t*i = (internal_t*)dev->internal; - - if(i->clip) { - clip_t*old = i->clip; - i->clip = i->clip->next; - art_svp_free(old->svp);old->svp = 0; - old->next = 0;free(old); - } else { - fprintf(stderr, "Error: endclip without startclip\n"); - } -} - -void addtounion(struct _gfxdevice*dev, ArtSVP*svp) -{ - internal_t*i = (internal_t*)dev->internal; - if(i->svpunion) { - ArtSVP*old = i->svpunion; - i->svpunion = art_svp_union(svp,i->svpunion); - art_svp_free(old); - } -} - -void arts_stroke(struct _gfxdevice*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit) -{ - dbg("arts_stroke"); - internal_t*i = (internal_t*)dev->internal; - //i->out->stroke(i->out, line, width, color, cap_style, joint_style, miterLimit); - ArtSVP* svp = gfxstrokeToSVP(line, width, cap_style, joint_style, miterLimit); - if(i->clip) { - ArtSVP*old = svp; - svp = art_svp_intersect(svp, i->clip->svp); - art_svp_free(old); - } - addtounion(dev,svp); - gfxline_t*gfxline = SVPtogfxline(svp); - if(i->out) i->out->fill(i->out, gfxline, color); - free(gfxline); - art_svp_free(svp); -} - -void arts_fill(struct _gfxdevice*dev, gfxline_t*line, gfxcolor_t*color) -{ - dbg("arts_fill"); - internal_t*i = (internal_t*)dev->internal; - ArtSVP* svp = gfxfillToSVP(line, 1); - - if (svp->n_segs > 500) - { - int lineParts = 0; - gfxline_t* lineCursor = line; - while(lineCursor != NULL) - { - if(lineCursor->type != gfx_moveTo) ++lineParts; - lineCursor = lineCursor->next; - } - fprintf(stderr, "arts_fill abandonning shape with %d segments (%d line parts)\n", svp->n_segs, lineParts); - art_svp_free(svp); - return; - } - - svp = art_svp_rewind_uncrossed(art_svp_uncross(svp),ART_WIND_RULE_ODDEVEN); /*FIXME*/ - - if(i->clip) { - ArtSVP*old = svp; - svp = art_svp_intersect(svp, i->clip->svp); - art_svp_free(old); - } - addtounion(dev,svp); - gfxline_t*gfxline = SVPtogfxline(svp); - if(i->out) i->out->fill(i->out, gfxline, color); - free(gfxline); - art_svp_free(svp); -} - -void arts_fillbitmap(struct _gfxdevice*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*matrix, gfxcxform_t*cxform) -{ - dbg("arts_fillbitmap"); - internal_t*i = (internal_t*)dev->internal; - ArtSVP* svp = gfxfillToSVP(line, 1); - - if(i->clip) { - ArtSVP*old = svp; - svp = art_svp_intersect(svp, i->clip->svp); - art_svp_free(old); - } - addtounion(dev,svp); - gfxline_t*gfxline = SVPtogfxline(svp); - if(i->out) i->out->fillbitmap(i->out, gfxline, img, matrix, cxform); - free(gfxline); - art_svp_free(svp); -} - -void arts_fillgradient(struct _gfxdevice*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*matrix) -{ - dbg("arts_fillgradient"); - internal_t*i = (internal_t*)dev->internal; - ArtSVP* svp = gfxfillToSVP(line, 1); - if(i->clip) { - ArtSVP*old = svp; - svp = art_svp_intersect(svp, i->clip->svp); - art_svp_free(old); - } - addtounion(dev,svp); - gfxline_t*gfxline = SVPtogfxline(svp); - if(i->out) i->out->fillgradient(i->out, gfxline, gradient, type, matrix); - free(gfxline); - art_svp_free(svp); -} - -void arts_addfont(struct _gfxdevice*dev, gfxfont_t*font) -{ - dbg("arts_addfont"); - internal_t*i = (internal_t*)dev->internal; - if(i->out) i->out->addfont(i->out, font); -} - -void arts_drawchar(struct _gfxdevice*dev, gfxfont_t*font, int glyphnr, gfxcolor_t*color, gfxmatrix_t*matrix) -{ - dbg("arts_drawchar"); - if(!font) - return; - internal_t*i = (internal_t*)dev->internal; - gfxline_t*glyph = gfxline_clone(font->glyphs[glyphnr].line); - gfxline_transform(glyph, matrix); - - if(i->clip) { - gfxbbox_t bbox = gfxline_getbbox(glyph); - ArtSVP*dummybox = boxToSVP(bbox.xmin,bbox.ymin,bbox.xmax,bbox.ymax); - ArtSVP*svp = art_svp_intersect(dummybox, i->clip->svp); - gfxline_t*gfxline = SVPtogfxline(svp); - gfxbbox_t bbox2 = gfxline_getbbox(gfxline); - double w = bbox2.xmax - bbox2.xmin; - double h = bbox2.ymax - bbox2.ymin; - - addtounion(dev, svp); // TODO: use the whole char, not just the bbox - - if(w < 0.001 || h < 0.001) /* character was clipped completely */ { - } else if(fabs((bbox.xmax - bbox.xmin) - w) > 0.05 || - fabs((bbox.ymax - bbox.ymin) - h) > 0.05) { - /* notable change in character size: character was clipped - TODO: handle diagonal cuts - */ - arts_fill(dev, glyph, color); - } else { - if(i->out) i->out->drawchar(i->out, font, glyphnr, color, matrix); - } - } else { - if(i->out) i->out->drawchar(i->out, font, glyphnr, color, matrix); - } - - gfxline_free(glyph); -} - -void arts_drawlink(struct _gfxdevice*dev, gfxline_t*line, const char*action) -{ - dbg("arts_drawlink"); - internal_t*i = (internal_t*)dev->internal; - if(i->out) i->out->drawlink(i->out, line, action); -} - -void arts_endpage(struct _gfxdevice*dev) -{ - dbg("arts_endpage"); - internal_t*i = (internal_t*)dev->internal; - if(i->out) i->out->endpage(i->out); -} - -gfxresult_t* arts_finish(struct _gfxdevice*dev) -{ - dbg("arts_finish"); - internal_t*i = (internal_t*)dev->internal; - if(i->out) { - return i->out->finish(i->out); - } else { - return 0; - } -} - -gfxline_t*gfxdevice_union_getunion(struct _gfxdevice*dev) -{ - internal_t*i = (internal_t*)dev->internal; - return SVPtogfxline(i->svpunion); -} - -void gfxdevice_removeclippings_init(gfxdevice_t*dev, gfxdevice_t*out) -{ - dbg("gfxdevice_removeclippings_init"); - internal_t*i = (internal_t*)rfx_calloc(sizeof(internal_t)); - memset(dev, 0, sizeof(gfxdevice_t)); - - dev->name = "removeclippings"; - - dev->internal = i; - - dev->setparameter = arts_setparameter; - dev->startpage = arts_startpage; - dev->startclip = arts_startclip; - dev->endclip = arts_endclip; - dev->stroke = arts_stroke; - dev->fill = arts_fill; - dev->fillbitmap = arts_fillbitmap; - dev->fillgradient = arts_fillgradient; - dev->addfont = arts_addfont; - dev->drawchar = arts_drawchar; - dev->drawlink = arts_drawlink; - dev->endpage = arts_endpage; - dev->finish = arts_finish; - - i->out = out; - i->svpunion = 0; -} - -void gfxdevice_union_init(gfxdevice_t*dev,gfxdevice_t*out) -{ - dbg("gfxdevice_getunion_init"); - internal_t*i = (internal_t*)rfx_calloc(sizeof(internal_t)); - memset(dev, 0, sizeof(gfxdevice_t)); - - dev->name = "union"; - - dev->internal = i; - - dev->setparameter = arts_setparameter; - dev->startpage = arts_startpage; - dev->startclip = arts_startclip; - dev->endclip = arts_endclip; - dev->stroke = arts_stroke; - dev->fill = arts_fill; - dev->fillbitmap = arts_fillbitmap; - dev->fillgradient = arts_fillgradient; - dev->addfont = arts_addfont; - dev->drawchar = arts_drawchar; - dev->drawlink = arts_drawlink; - dev->endpage = arts_endpage; - dev->finish = arts_finish; - - i->out = out; - i->svpunion = gfxstrokeToSVP(0, 0, gfx_capButt, gfx_joinMiter, 0); -} - diff --git a/lib/devices/arts.h b/lib/devices/arts.h deleted file mode 100644 index 2e2c6c0..0000000 --- a/lib/devices/arts.h +++ /dev/null @@ -1,40 +0,0 @@ -/* swfoutput.h - Header file for swfoutput.cc (and swfoutput_x11.cc). - - Part of the swftools package. - - Copyright (c) 2001,2002,2003 Matthias Kramm - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#ifndef __gfxdevice_arts_h__ -#define __gfxdevice_arts_h__ - -#include "../gfxdevice.h" - - -#ifdef __cplusplus -extern "C" { -#endif - -void gfxdevice_removeclippings_init(gfxdevice_t*self, gfxdevice_t*dest); -void gfxdevice_union_init(gfxdevice_t*self, gfxdevice_t*dest); -gfxline_t*gfxdevice_union_getunion(struct _gfxdevice*dev); - -#ifdef __cplusplus -} -#endif - -#endif //__gfxdevice_arts_h__ diff --git a/lib/devices/artsutils.c b/lib/devices/artsutils.c deleted file mode 100644 index 6b284e6..0000000 --- a/lib/devices/artsutils.c +++ /dev/null @@ -1,317 +0,0 @@ -#include "../../config.h" -#include "../rfxswf.h" -#include "../gfxdevice.h" -#include "../gfxtools.h" -#include "../art/libart.h" -#include "artsutils.h" -#include -#include - -ArtVpath* gfxline_to_ArtVpath(gfxline_t*line) -{ - ArtVpath *vec = NULL; - int pos=0,len=0; - gfxline_t*l2; - double x=0,y=0; - - /* factor which determines into how many line fragments a spline is converted */ - double subfraction = 2.4;//0.3 - - l2 = line; - while(l2) { - if(l2->type == gfx_moveTo) { - pos ++; - } if(l2->type == gfx_lineTo) { - pos ++; - } if(l2->type == gfx_splineTo) { - int parts = (int)(sqrt(fabs(l2->x-2*l2->sx+x) + fabs(l2->y-2*l2->sy+y))*subfraction); - if(!parts) parts = 1; - pos += parts + 1; - } - x = l2->x; - y = l2->y; - l2 = l2->next; - } - pos++; - len = pos; - - vec = art_new (ArtVpath, len+1); - - pos = 0; - l2 = line; - while(l2) { - if(l2->type == gfx_moveTo) { - vec[pos].code = ART_MOVETO; - vec[pos].x = l2->x; - vec[pos].y = l2->y; - pos++; - assert(pos<=len); - } else if(l2->type == gfx_lineTo) { - vec[pos].code = ART_LINETO; - vec[pos].x = l2->x; - vec[pos].y = l2->y; - pos++; - assert(pos<=len); - } else if(l2->type == gfx_splineTo) { - int i; - int parts = (int)(sqrt(fabs(l2->x-2*l2->sx+x) + fabs(l2->y-2*l2->sy+y))*subfraction); - double stepsize = parts?1.0/parts:0; - for(i=0;i<=parts;i++) { - double t = (double)i*stepsize; - vec[pos].code = ART_LINETO; - vec[pos].x = l2->x*t*t + 2*l2->sx*t*(1-t) + x*(1-t)*(1-t); - vec[pos].y = l2->y*t*t + 2*l2->sy*t*(1-t) + y*(1-t)*(1-t); - pos++; - assert(pos<=len); - } - } - x = l2->x; - y = l2->y; - l2 = l2->next; - } - vec[pos].code = ART_END; - - /* fix "dotted" lines */ - int t; - char linepending=0; - for(t=0;vec[t].code!=ART_END;t++) { - if(t>0 && vec[t-1].code==ART_MOVETO && vec[t].code==ART_LINETO - && vec[t+1].code!=ART_LINETO - && vec[t-1].x == vec[t].x - && vec[t-1].y == vec[t].y) { - vec[t].x += 0.01; - } - if(vec[t].code==ART_MOVETO) - linepending=0; - x = vec[t].x; - y = vec[t].y; - } - - // Spot adjacent identical points - t = 1; - while(t < pos) - { - if ((vec[t-1].x == vec[t].x) && (vec[t-1].y == vec[t].y)) { - // adjacent identical points; remove one - memcpy(&(vec[t]), &(vec[t + 1]), sizeof(vec[t]) * (pos - t)); - pos--; - } else { - t++; - } - } - - /* adjacency remover disabled for now, pending code inspection */ - return vec; - - // Check for further non-adjacent identical points. We don't want any - // points other than the first and last points to exactly match. - // - // If we do find matching points, move the second point slightly. This - // currently moves the duplicate 2% towards the midpoint of its neighbours - // (easier to calculate than 2% down the perpendicular to the line joining - // the neighbours) but limiting the change to 0.1 twips to avoid visual - // problems when the shapes are large. Note that there is no minimum - // change: if the neighbouring points are colinear and equally spaced, - // e.g. they were generated as part of a straight spline, then the - // duplicate point may not actually move. - // - // The scan for duplicates algorithm is quadratic in the number of points: - // there's probably a better method but the numbers of points is generally - // small so this will do for now. - { - int i = 1, j; - for(; i < (pos - 1); ++i) - { - for (j = 0; j < i; ++j) - { - if ((vec[i].x == vec[j].x) - && (vec[i].y == vec[j].y)) - { - // points match; shuffle point - double dx = (vec[i-1].x + vec[i+1].x - (vec[i].x * 2.0)) / 100.0; - double dy = (vec[i-1].y + vec[i+1].y - (vec[i].y * 2.0)) / 100.0; - double dxxyy = (dx*dx) + (dy*dy); - if (dxxyy > 0.01) - { - // This is more than 0.1 twip's distance; scale down - double dscale = sqrt(dxxyy) * 10.0; - dx /= dscale; - dy /= dscale; - }; - vec[i].x += dx; - vec[i].y += dy; - break; - } - } - } - } - - return vec; -} - -void show_path(ArtSVP*path) -{ - int t; - printf("Segments: %d\n", path->n_segs); - for(t=0;tn_segs;t++) { - ArtSVPSeg* seg = &path->segs[t]; - printf("Segment %d: %d points, %s, BBox: (%f,%f,%f,%f)\n", - t, seg->n_points, seg->dir==0?"UP ":"DOWN", - seg->bbox.x0, seg->bbox.y0, seg->bbox.x1, seg->bbox.y1); - int p; - for(p=0;pn_points;p++) { - ArtPoint* point = &seg->points[p]; - printf(" (%f,%f)\n", point->x, point->y); - } - } - printf("\n"); -} - -ArtSVP* gfxfillToSVP(gfxline_t*line, int perturb) -{ - ArtVpath* vec = gfxline_to_ArtVpath(line); - if(perturb) { - ArtVpath* vec2 = art_vpath_perturb(vec); - free(vec); - vec = vec2; - } - ArtSVP *svp = art_svp_from_vpath(vec); - free(vec); - - // We need to make sure that the SVP we now have bounds an area (i.e. the - // source line wound anticlockwise) rather than excludes an area (i.e. the - // line wound clockwise). It seems that PDF (or xpdf) is less strict about - // this for bitmaps than it is for fill areas. - // - // To check this, we'll sum the cross products of all pairs of adjacent - // lines. If the result is positive, the direction is correct; if not, we - // need to reverse the sense of the SVP generated. The easiest way to do - // this is to flip the up/down flags of all the segments. - // - // This is approximate; since the gfxline_t structure can contain any - // combination of moveTo, lineTo and splineTo in any order, not all pairs - // of lines in the shape that share a point need be described next to each - // other in the sequence. For ease, we'll consider only pairs of lines - // stored as lineTos and splineTos without intervening moveTos. - // - // TODO is this a valid algorithm? My vector maths is rusty. - // - // It may be more correct to instead reverse the line before we feed it - // into gfxfilltoSVP. However, this seems equivalent and is easier to - // implement! - double total_cross_product = 0.0; - gfxline_t* cursor = line; - if (cursor != NULL) - { - double x_last = cursor->x; - double y_last = cursor->y; - cursor = cursor->next; - - while((cursor != NULL) && (cursor->next != NULL)) - { - if (((cursor->type == gfx_lineTo) || (cursor->type == gfx_splineTo)) - && ((cursor->next->type == gfx_lineTo) || (cursor->next->type == gfx_splineTo))) - { - // Process these lines - // - // In this space (x right, y down) the cross-product is - // (x1 * y0) - (x0 * y1) - double x0 = cursor->x - x_last; - double y0 = cursor->y - y_last; - double x1 = cursor->next->x - cursor->x; - double y1 = cursor->next->y - cursor->y; - total_cross_product += (x1 * y0) - (x0 * y1); - } - - x_last = cursor->x; - y_last = cursor->y; - cursor = cursor->next; - } - } - if (total_cross_product < 0.0) - { - int i = 0; - for(; i < svp->n_segs; ++i) - { - if (svp->segs[i].dir != 0) - svp->segs[i].dir = 0; - else - svp->segs[i].dir = 1; - } - } - return svp; -} -ArtSVP* boxToSVP(double x1, double y1,double x2, double y2) -{ - ArtVpath *vec = art_new (ArtVpath, 5+1); - vec[0].code = ART_MOVETO; - vec[0].x = x1; - vec[0].y = y1; - vec[1].code = ART_LINETO; - vec[1].x = x1; - vec[1].y = y2; - vec[2].code = ART_LINETO; - vec[2].x = x2; - vec[2].y = y2; - vec[3].code = ART_LINETO; - vec[3].x = x2; - vec[3].y = y1; - vec[4].code = ART_LINETO; - vec[4].x = x1; - vec[4].y = y1; - vec[5].code = ART_END; - vec[5].x = 0; - vec[5].y = 0; - ArtSVP *svp = art_svp_from_vpath(vec); - free(vec); - return svp; -} - -ArtSVP* gfxstrokeToSVP(gfxline_t*line, gfxcoord_t width, gfx_capType cap_style, gfx_joinType joint_style, double miterLimit) -{ - ArtVpath* vec = gfxline_to_ArtVpath(line); - - ArtSVP *svp = art_svp_vpath_stroke (vec, - (joint_style==gfx_joinMiter)?ART_PATH_STROKE_JOIN_MITER: - ((joint_style==gfx_joinRound)?ART_PATH_STROKE_JOIN_ROUND: - ((joint_style==gfx_joinBevel)?ART_PATH_STROKE_JOIN_BEVEL:ART_PATH_STROKE_JOIN_BEVEL)), - (cap_style==gfx_capButt)?ART_PATH_STROKE_CAP_BUTT: - ((cap_style==gfx_capRound)?ART_PATH_STROKE_CAP_ROUND: - ((cap_style==gfx_capSquare)?ART_PATH_STROKE_CAP_SQUARE:ART_PATH_STROKE_CAP_SQUARE)), - width, //line_width - miterLimit, //miter_limit - 0.05 //flatness - ); - free(vec); - return svp; -} - -gfxline_t* SVPtogfxline(ArtSVP*svp) -{ - int size = 0; - int t; - int pos = 0; - for(t=0;tn_segs;t++) { - size += svp->segs[t].n_points + 1; - } - gfxline_t* lines = (gfxline_t*)rfx_alloc(sizeof(gfxline_t)*size); - - for(t=0;tn_segs;t++) { - ArtSVPSeg* seg = &svp->segs[t]; - int p; - for(p=0;pn_points;p++) { - lines[pos].type = p==0?gfx_moveTo:gfx_lineTo; - ArtPoint* point = &seg->points[p]; - lines[pos].x = point->x; - lines[pos].y = point->y; - lines[pos].next = &lines[pos+1]; - pos++; - } - } - if(pos) { - lines[pos-1].next = 0; - return lines; - } else { - return 0; - } -} diff --git a/lib/devices/artsutils.h b/lib/devices/artsutils.h deleted file mode 100644 index 640527f..0000000 --- a/lib/devices/artsutils.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef __artsutils_h__ -#define __artsutils_h__ - -#include "../../config.h" -#include "../art/libart.h" - -#ifdef __cplusplus -extern "C" { -#endif - -ArtVpath* gfxline_to_ArtVpath(gfxline_t*line); -ArtSVP* gfxfillToSVP(gfxline_t*line, int perturb); -void show_path(ArtSVP*path); -ArtSVP* boxToSVP(double x1, double y1,double x2, double y2); -ArtSVP* gfxstrokeToSVP(gfxline_t*line, gfxcoord_t width, gfx_capType cap_style, gfx_joinType joint_style, double miterLimit); -gfxline_t* SVPtogfxline(ArtSVP*svp); - -#ifdef __cplusplus -} -#endif - -#endif -- 1.7.10.4