17dd7cddfSDavid du Colombier /* Copyright (C) 1989, 1995, 1996, 1997, 1999 Aladdin Enterprises. All rights reserved.
27dd7cddfSDavid du Colombier
3*593dc095SDavid du Colombier This software is provided AS-IS with no warranty, either express or
4*593dc095SDavid du Colombier implied.
57dd7cddfSDavid du Colombier
6*593dc095SDavid du Colombier This software is distributed under license and may not be copied,
7*593dc095SDavid du Colombier modified or distributed except as expressly authorized under the terms
8*593dc095SDavid du Colombier of the license contained in the file LICENSE in this distribution.
97dd7cddfSDavid du Colombier
10*593dc095SDavid du Colombier For more information about licensing, please refer to
11*593dc095SDavid du Colombier http://www.ghostscript.com/licensing/. For information on
12*593dc095SDavid du Colombier commercial licensing, go to http://www.artifex.com/licensing/ or
13*593dc095SDavid du Colombier contact Artifex Software, Inc., 101 Lucas Valley Road #110,
14*593dc095SDavid du Colombier San Rafael, CA 94903, U.S.A., +1(415)492-9861.
157dd7cddfSDavid du Colombier */
167dd7cddfSDavid du Colombier
17*593dc095SDavid du Colombier /* $Id: gsline.c,v 1.4 2002/02/21 22:24:52 giles Exp $ */
187dd7cddfSDavid du Colombier /* Line parameter operators for Ghostscript library */
197dd7cddfSDavid du Colombier #include "math_.h"
207dd7cddfSDavid du Colombier #include "memory_.h"
217dd7cddfSDavid du Colombier #include "gx.h"
227dd7cddfSDavid du Colombier #include "gserrors.h"
237dd7cddfSDavid du Colombier #include "gxfixed.h" /* ditto */
247dd7cddfSDavid du Colombier #include "gxmatrix.h" /* for gzstate */
257dd7cddfSDavid du Colombier #include "gzstate.h"
267dd7cddfSDavid du Colombier #include "gscoord.h" /* for currentmatrix, setmatrix */
277dd7cddfSDavid du Colombier #include "gsline.h" /* for prototypes */
287dd7cddfSDavid du Colombier #include "gzline.h"
297dd7cddfSDavid du Colombier
307dd7cddfSDavid du Colombier /* ------ Device-independent parameters ------ */
317dd7cddfSDavid du Colombier
327dd7cddfSDavid du Colombier #define pgs_lp gs_currentlineparams_inline(pgs)
337dd7cddfSDavid du Colombier
347dd7cddfSDavid du Colombier /* setlinewidth */
357dd7cddfSDavid du Colombier int
gs_setlinewidth(gs_state * pgs,floatp width)367dd7cddfSDavid du Colombier gs_setlinewidth(gs_state * pgs, floatp width)
377dd7cddfSDavid du Colombier {
387dd7cddfSDavid du Colombier gx_set_line_width(pgs_lp, width);
397dd7cddfSDavid du Colombier return 0;
407dd7cddfSDavid du Colombier }
417dd7cddfSDavid du Colombier
427dd7cddfSDavid du Colombier /* currentlinewidth */
437dd7cddfSDavid du Colombier float
gs_currentlinewidth(const gs_state * pgs)447dd7cddfSDavid du Colombier gs_currentlinewidth(const gs_state * pgs)
457dd7cddfSDavid du Colombier {
467dd7cddfSDavid du Colombier return gx_current_line_width(pgs_lp);
477dd7cddfSDavid du Colombier }
487dd7cddfSDavid du Colombier
497dd7cddfSDavid du Colombier /* setlinecap */
507dd7cddfSDavid du Colombier int
gs_setlinecap(gs_state * pgs,gs_line_cap cap)517dd7cddfSDavid du Colombier gs_setlinecap(gs_state * pgs, gs_line_cap cap)
527dd7cddfSDavid du Colombier {
537dd7cddfSDavid du Colombier if ((uint) cap > gs_line_cap_max)
547dd7cddfSDavid du Colombier return_error(gs_error_rangecheck);
557dd7cddfSDavid du Colombier pgs_lp->cap = cap;
567dd7cddfSDavid du Colombier return 0;
577dd7cddfSDavid du Colombier }
587dd7cddfSDavid du Colombier
597dd7cddfSDavid du Colombier /* currentlinecap */
607dd7cddfSDavid du Colombier gs_line_cap
gs_currentlinecap(const gs_state * pgs)617dd7cddfSDavid du Colombier gs_currentlinecap(const gs_state * pgs)
627dd7cddfSDavid du Colombier {
637dd7cddfSDavid du Colombier return pgs_lp->cap;
647dd7cddfSDavid du Colombier }
657dd7cddfSDavid du Colombier
667dd7cddfSDavid du Colombier /* setlinejoin */
677dd7cddfSDavid du Colombier int
gs_setlinejoin(gs_state * pgs,gs_line_join join)687dd7cddfSDavid du Colombier gs_setlinejoin(gs_state * pgs, gs_line_join join)
697dd7cddfSDavid du Colombier {
707dd7cddfSDavid du Colombier if ((uint) join > gs_line_join_max)
717dd7cddfSDavid du Colombier return_error(gs_error_rangecheck);
727dd7cddfSDavid du Colombier pgs_lp->join = join;
737dd7cddfSDavid du Colombier return 0;
747dd7cddfSDavid du Colombier }
757dd7cddfSDavid du Colombier
767dd7cddfSDavid du Colombier /* currentlinejoin */
777dd7cddfSDavid du Colombier gs_line_join
gs_currentlinejoin(const gs_state * pgs)787dd7cddfSDavid du Colombier gs_currentlinejoin(const gs_state * pgs)
797dd7cddfSDavid du Colombier {
807dd7cddfSDavid du Colombier return pgs_lp->join;
817dd7cddfSDavid du Colombier }
827dd7cddfSDavid du Colombier
837dd7cddfSDavid du Colombier /* setmiterlimit */
847dd7cddfSDavid du Colombier int
gx_set_miter_limit(gx_line_params * plp,floatp limit)857dd7cddfSDavid du Colombier gx_set_miter_limit(gx_line_params * plp, floatp limit)
867dd7cddfSDavid du Colombier {
877dd7cddfSDavid du Colombier if (limit < 1.0)
887dd7cddfSDavid du Colombier return_error(gs_error_rangecheck);
897dd7cddfSDavid du Colombier plp->miter_limit = limit;
907dd7cddfSDavid du Colombier /*
917dd7cddfSDavid du Colombier * Compute the miter check value. The supplied miter limit is an
927dd7cddfSDavid du Colombier * upper bound on 1/sin(phi/2); we convert this to a lower bound on
937dd7cddfSDavid du Colombier * tan(phi). Note that if phi > pi/2, this is negative. We use the
947dd7cddfSDavid du Colombier * half-angle and angle-sum formulas here to avoid the trig functions.
957dd7cddfSDavid du Colombier * We also need a special check for phi/2 close to pi/4.
967dd7cddfSDavid du Colombier * Some C compilers can't handle this as a conditional expression....
977dd7cddfSDavid du Colombier */
987dd7cddfSDavid du Colombier {
997dd7cddfSDavid du Colombier double limit_squared = limit * limit;
1007dd7cddfSDavid du Colombier
1017dd7cddfSDavid du Colombier if (limit_squared < 2.0001 && limit_squared > 1.9999)
1027dd7cddfSDavid du Colombier plp->miter_check = 1.0e6;
1037dd7cddfSDavid du Colombier else
1047dd7cddfSDavid du Colombier plp->miter_check =
1057dd7cddfSDavid du Colombier sqrt(limit_squared - 1) * 2 / (limit_squared - 2);
1067dd7cddfSDavid du Colombier }
1077dd7cddfSDavid du Colombier return 0;
1087dd7cddfSDavid du Colombier }
1097dd7cddfSDavid du Colombier int
gs_setmiterlimit(gs_state * pgs,floatp limit)1107dd7cddfSDavid du Colombier gs_setmiterlimit(gs_state * pgs, floatp limit)
1117dd7cddfSDavid du Colombier {
1127dd7cddfSDavid du Colombier return gx_set_miter_limit(pgs_lp, limit);
1137dd7cddfSDavid du Colombier }
1147dd7cddfSDavid du Colombier
1157dd7cddfSDavid du Colombier /* currentmiterlimit */
1167dd7cddfSDavid du Colombier float
gs_currentmiterlimit(const gs_state * pgs)1177dd7cddfSDavid du Colombier gs_currentmiterlimit(const gs_state * pgs)
1187dd7cddfSDavid du Colombier {
1197dd7cddfSDavid du Colombier return pgs_lp->miter_limit;
1207dd7cddfSDavid du Colombier }
1217dd7cddfSDavid du Colombier
1227dd7cddfSDavid du Colombier /* setdash */
1237dd7cddfSDavid du Colombier int
gx_set_dash(gx_dash_params * dash,const float * pattern,uint length,floatp offset,gs_memory_t * mem)1247dd7cddfSDavid du Colombier gx_set_dash(gx_dash_params * dash, const float *pattern, uint length,
1257dd7cddfSDavid du Colombier floatp offset, gs_memory_t * mem)
1267dd7cddfSDavid du Colombier {
1277dd7cddfSDavid du Colombier uint n = length;
1287dd7cddfSDavid du Colombier const float *dfrom = pattern;
1297dd7cddfSDavid du Colombier bool ink = true;
1307dd7cddfSDavid du Colombier int index = 0;
1317dd7cddfSDavid du Colombier float pattern_length = 0.0;
1327dd7cddfSDavid du Colombier float dist_left;
1337dd7cddfSDavid du Colombier float *ppat = dash->pattern;
1347dd7cddfSDavid du Colombier
1357dd7cddfSDavid du Colombier /* Check the dash pattern. */
1367dd7cddfSDavid du Colombier while (n--) {
1377dd7cddfSDavid du Colombier float elt = *dfrom++;
1387dd7cddfSDavid du Colombier
1397dd7cddfSDavid du Colombier if (elt < 0)
1407dd7cddfSDavid du Colombier return_error(gs_error_rangecheck);
1417dd7cddfSDavid du Colombier pattern_length += elt;
1427dd7cddfSDavid du Colombier }
1437dd7cddfSDavid du Colombier if (length == 0) { /* empty pattern */
1447dd7cddfSDavid du Colombier dist_left = 0.0;
1457dd7cddfSDavid du Colombier if (mem && ppat) {
1467dd7cddfSDavid du Colombier gs_free_object(mem, ppat, "gx_set_dash(old pattern)");
1477dd7cddfSDavid du Colombier ppat = 0;
1487dd7cddfSDavid du Colombier }
1497dd7cddfSDavid du Colombier } else {
1507dd7cddfSDavid du Colombier uint size = length * sizeof(float);
1517dd7cddfSDavid du Colombier
1527dd7cddfSDavid du Colombier if (pattern_length == 0)
1537dd7cddfSDavid du Colombier return_error(gs_error_rangecheck);
1547dd7cddfSDavid du Colombier /* Compute the initial index, ink_on, and distance left */
1557dd7cddfSDavid du Colombier /* in the pattern, according to the offset. */
1567dd7cddfSDavid du Colombier #define f_mod(a, b) ((a) - floor((a) / (b)) * (b))
1577dd7cddfSDavid du Colombier if (length & 1) { /* Odd and even repetitions of the pattern */
1587dd7cddfSDavid du Colombier /* have opposite ink values! */
1597dd7cddfSDavid du Colombier float length2 = pattern_length * 2;
1607dd7cddfSDavid du Colombier
1617dd7cddfSDavid du Colombier dist_left = f_mod(offset, length2);
1627dd7cddfSDavid du Colombier if (dist_left >= pattern_length)
1637dd7cddfSDavid du Colombier dist_left -= pattern_length, ink = !ink;
1647dd7cddfSDavid du Colombier } else
1657dd7cddfSDavid du Colombier dist_left = f_mod(offset, pattern_length);
1667dd7cddfSDavid du Colombier while ((dist_left -= pattern[index]) >= 0 &&
1677dd7cddfSDavid du Colombier (dist_left > 0 || pattern[index] != 0)
1687dd7cddfSDavid du Colombier )
1697dd7cddfSDavid du Colombier ink = !ink, index++;
1707dd7cddfSDavid du Colombier if (mem) {
1717dd7cddfSDavid du Colombier if (ppat == 0)
1727dd7cddfSDavid du Colombier ppat = (float *)gs_alloc_bytes(mem, size,
1737dd7cddfSDavid du Colombier "gx_set_dash(pattern)");
1747dd7cddfSDavid du Colombier else if (length != dash->pattern_size)
1757dd7cddfSDavid du Colombier ppat = gs_resize_object(mem, ppat, size,
1767dd7cddfSDavid du Colombier "gx_set_dash(pattern)");
1777dd7cddfSDavid du Colombier if (ppat == 0)
1787dd7cddfSDavid du Colombier return_error(gs_error_VMerror);
1797dd7cddfSDavid du Colombier }
1807dd7cddfSDavid du Colombier memcpy(ppat, pattern, length * sizeof(float));
1817dd7cddfSDavid du Colombier }
1827dd7cddfSDavid du Colombier dash->pattern = ppat;
1837dd7cddfSDavid du Colombier dash->pattern_size = length;
1847dd7cddfSDavid du Colombier dash->offset = offset;
1857dd7cddfSDavid du Colombier dash->pattern_length = pattern_length;
1867dd7cddfSDavid du Colombier dash->init_ink_on = ink;
1877dd7cddfSDavid du Colombier dash->init_index = index;
1887dd7cddfSDavid du Colombier dash->init_dist_left = -dist_left;
1897dd7cddfSDavid du Colombier return 0;
1907dd7cddfSDavid du Colombier }
1917dd7cddfSDavid du Colombier int
gs_setdash(gs_state * pgs,const float * pattern,uint length,floatp offset)1927dd7cddfSDavid du Colombier gs_setdash(gs_state * pgs, const float *pattern, uint length, floatp offset)
1937dd7cddfSDavid du Colombier {
1947dd7cddfSDavid du Colombier return gx_set_dash(&pgs_lp->dash, pattern, length, offset,
1957dd7cddfSDavid du Colombier pgs->memory);
1967dd7cddfSDavid du Colombier }
1977dd7cddfSDavid du Colombier
1987dd7cddfSDavid du Colombier /* currentdash */
1997dd7cddfSDavid du Colombier uint
gs_currentdash_length(const gs_state * pgs)2007dd7cddfSDavid du Colombier gs_currentdash_length(const gs_state * pgs)
2017dd7cddfSDavid du Colombier {
2027dd7cddfSDavid du Colombier return pgs_lp->dash.pattern_size;
2037dd7cddfSDavid du Colombier }
2047dd7cddfSDavid du Colombier const float *
gs_currentdash_pattern(const gs_state * pgs)2057dd7cddfSDavid du Colombier gs_currentdash_pattern(const gs_state * pgs)
2067dd7cddfSDavid du Colombier {
2077dd7cddfSDavid du Colombier return pgs_lp->dash.pattern;
2087dd7cddfSDavid du Colombier }
2097dd7cddfSDavid du Colombier float
gs_currentdash_offset(const gs_state * pgs)2107dd7cddfSDavid du Colombier gs_currentdash_offset(const gs_state * pgs)
2117dd7cddfSDavid du Colombier {
2127dd7cddfSDavid du Colombier return pgs_lp->dash.offset;
2137dd7cddfSDavid du Colombier }
2147dd7cddfSDavid du Colombier
2157dd7cddfSDavid du Colombier /* Internal accessor for line parameters */
2167dd7cddfSDavid du Colombier const gx_line_params *
gs_currentlineparams(const gs_imager_state * pis)2177dd7cddfSDavid du Colombier gs_currentlineparams(const gs_imager_state * pis)
2187dd7cddfSDavid du Colombier {
2197dd7cddfSDavid du Colombier return gs_currentlineparams_inline(pis);
2207dd7cddfSDavid du Colombier }
2217dd7cddfSDavid du Colombier
2227dd7cddfSDavid du Colombier /* ------ Device-dependent parameters ------ */
2237dd7cddfSDavid du Colombier
2247dd7cddfSDavid du Colombier /* setflat */
2257dd7cddfSDavid du Colombier int
gs_imager_setflat(gs_imager_state * pis,floatp flat)2267dd7cddfSDavid du Colombier gs_imager_setflat(gs_imager_state * pis, floatp flat)
2277dd7cddfSDavid du Colombier {
2287dd7cddfSDavid du Colombier if (flat <= 0.2)
2297dd7cddfSDavid du Colombier flat = 0.2;
2307dd7cddfSDavid du Colombier else if (flat > 100)
2317dd7cddfSDavid du Colombier flat = 100;
2327dd7cddfSDavid du Colombier pis->flatness = flat;
2337dd7cddfSDavid du Colombier return 0;
2347dd7cddfSDavid du Colombier }
2357dd7cddfSDavid du Colombier int
gs_setflat(gs_state * pgs,floatp flat)2367dd7cddfSDavid du Colombier gs_setflat(gs_state * pgs, floatp flat)
2377dd7cddfSDavid du Colombier {
2387dd7cddfSDavid du Colombier return gs_imager_setflat((gs_imager_state *) pgs, flat);
2397dd7cddfSDavid du Colombier }
2407dd7cddfSDavid du Colombier
2417dd7cddfSDavid du Colombier /* currentflat */
2427dd7cddfSDavid du Colombier float
gs_currentflat(const gs_state * pgs)2437dd7cddfSDavid du Colombier gs_currentflat(const gs_state * pgs)
2447dd7cddfSDavid du Colombier {
2457dd7cddfSDavid du Colombier return pgs->flatness;
2467dd7cddfSDavid du Colombier }
2477dd7cddfSDavid du Colombier
2487dd7cddfSDavid du Colombier /* setstrokeadjust */
2497dd7cddfSDavid du Colombier int
gs_setstrokeadjust(gs_state * pgs,bool stroke_adjust)2507dd7cddfSDavid du Colombier gs_setstrokeadjust(gs_state * pgs, bool stroke_adjust)
2517dd7cddfSDavid du Colombier {
2527dd7cddfSDavid du Colombier pgs->stroke_adjust = stroke_adjust;
2537dd7cddfSDavid du Colombier return 0;
2547dd7cddfSDavid du Colombier }
2557dd7cddfSDavid du Colombier
2567dd7cddfSDavid du Colombier /* currentstrokeadjust */
2577dd7cddfSDavid du Colombier bool
gs_currentstrokeadjust(const gs_state * pgs)2587dd7cddfSDavid du Colombier gs_currentstrokeadjust(const gs_state * pgs)
2597dd7cddfSDavid du Colombier {
2607dd7cddfSDavid du Colombier return pgs->stroke_adjust;
2617dd7cddfSDavid du Colombier }
2627dd7cddfSDavid du Colombier
2637dd7cddfSDavid du Colombier /* ------ Extensions ------ */
2647dd7cddfSDavid du Colombier
2657dd7cddfSDavid du Colombier /* Device-independent */
2667dd7cddfSDavid du Colombier
2677dd7cddfSDavid du Colombier /* setdashadapt */
2687dd7cddfSDavid du Colombier void
gs_setdashadapt(gs_state * pgs,bool adapt)2697dd7cddfSDavid du Colombier gs_setdashadapt(gs_state * pgs, bool adapt)
2707dd7cddfSDavid du Colombier {
2717dd7cddfSDavid du Colombier pgs_lp->dash.adapt = adapt;
2727dd7cddfSDavid du Colombier }
2737dd7cddfSDavid du Colombier
2747dd7cddfSDavid du Colombier /* currentdashadapt */
2757dd7cddfSDavid du Colombier bool
gs_imager_currentdashadapt(const gs_imager_state * pis)2767dd7cddfSDavid du Colombier gs_imager_currentdashadapt(const gs_imager_state * pis)
2777dd7cddfSDavid du Colombier {
2787dd7cddfSDavid du Colombier return gs_currentlineparams_inline(pis)->dash.adapt;
2797dd7cddfSDavid du Colombier }
2807dd7cddfSDavid du Colombier bool
gs_currentdashadapt(const gs_state * pgs)2817dd7cddfSDavid du Colombier gs_currentdashadapt(const gs_state * pgs)
2827dd7cddfSDavid du Colombier {
2837dd7cddfSDavid du Colombier return gs_imager_currentdashadapt((const gs_imager_state *)pgs);
2847dd7cddfSDavid du Colombier }
2857dd7cddfSDavid du Colombier
2867dd7cddfSDavid du Colombier /* setcurvejoin */
2877dd7cddfSDavid du Colombier int
gs_setcurvejoin(gs_state * pgs,int join)2887dd7cddfSDavid du Colombier gs_setcurvejoin(gs_state * pgs, int join)
2897dd7cddfSDavid du Colombier {
2907dd7cddfSDavid du Colombier if (join < -1 || join > gs_line_join_max)
2917dd7cddfSDavid du Colombier return_error(gs_error_rangecheck);
2927dd7cddfSDavid du Colombier pgs_lp->curve_join = join;
2937dd7cddfSDavid du Colombier return 0;
2947dd7cddfSDavid du Colombier }
2957dd7cddfSDavid du Colombier
2967dd7cddfSDavid du Colombier /* currentcurvejoin */
2977dd7cddfSDavid du Colombier int
gs_currentcurvejoin(const gs_state * pgs)2987dd7cddfSDavid du Colombier gs_currentcurvejoin(const gs_state * pgs)
2997dd7cddfSDavid du Colombier {
3007dd7cddfSDavid du Colombier return pgs_lp->curve_join;
3017dd7cddfSDavid du Colombier }
3027dd7cddfSDavid du Colombier
3037dd7cddfSDavid du Colombier /* Device-dependent */
3047dd7cddfSDavid du Colombier
3057dd7cddfSDavid du Colombier /* setaccuratecurves */
3067dd7cddfSDavid du Colombier void
gs_setaccuratecurves(gs_state * pgs,bool accurate)3077dd7cddfSDavid du Colombier gs_setaccuratecurves(gs_state * pgs, bool accurate)
3087dd7cddfSDavid du Colombier {
3097dd7cddfSDavid du Colombier pgs->accurate_curves = accurate;
3107dd7cddfSDavid du Colombier }
3117dd7cddfSDavid du Colombier
3127dd7cddfSDavid du Colombier /* currentaccuratecurves */
3137dd7cddfSDavid du Colombier bool
gs_imager_currentaccuratecurves(const gs_imager_state * pis)3147dd7cddfSDavid du Colombier gs_imager_currentaccuratecurves(const gs_imager_state * pis)
3157dd7cddfSDavid du Colombier {
3167dd7cddfSDavid du Colombier return pis->accurate_curves;
3177dd7cddfSDavid du Colombier }
3187dd7cddfSDavid du Colombier bool
gs_currentaccuratecurves(const gs_state * pgs)3197dd7cddfSDavid du Colombier gs_currentaccuratecurves(const gs_state * pgs)
3207dd7cddfSDavid du Colombier {
3217dd7cddfSDavid du Colombier return gs_imager_currentaccuratecurves((const gs_imager_state *)pgs);
3227dd7cddfSDavid du Colombier }
3237dd7cddfSDavid du Colombier
3247dd7cddfSDavid du Colombier /* setdotlength */
3257dd7cddfSDavid du Colombier int
gx_set_dot_length(gx_line_params * plp,floatp length,bool absolute)3267dd7cddfSDavid du Colombier gx_set_dot_length(gx_line_params * plp, floatp length, bool absolute)
3277dd7cddfSDavid du Colombier {
3287dd7cddfSDavid du Colombier if (length < 0)
3297dd7cddfSDavid du Colombier return_error(gs_error_rangecheck);
3307dd7cddfSDavid du Colombier plp->dot_length = length;
3317dd7cddfSDavid du Colombier plp->dot_length_absolute = absolute;
3327dd7cddfSDavid du Colombier return 0;
3337dd7cddfSDavid du Colombier }
3347dd7cddfSDavid du Colombier int
gs_setdotlength(gs_state * pgs,floatp length,bool absolute)3357dd7cddfSDavid du Colombier gs_setdotlength(gs_state * pgs, floatp length, bool absolute)
3367dd7cddfSDavid du Colombier {
3377dd7cddfSDavid du Colombier return gx_set_dot_length(pgs_lp, length, absolute);
3387dd7cddfSDavid du Colombier }
3397dd7cddfSDavid du Colombier
3407dd7cddfSDavid du Colombier /* currentdotlength */
3417dd7cddfSDavid du Colombier float
gs_currentdotlength(const gs_state * pgs)3427dd7cddfSDavid du Colombier gs_currentdotlength(const gs_state * pgs)
3437dd7cddfSDavid du Colombier {
3447dd7cddfSDavid du Colombier return pgs_lp->dot_length;
3457dd7cddfSDavid du Colombier }
3467dd7cddfSDavid du Colombier bool
gs_currentdotlength_absolute(const gs_state * pgs)3477dd7cddfSDavid du Colombier gs_currentdotlength_absolute(const gs_state * pgs)
3487dd7cddfSDavid du Colombier {
3497dd7cddfSDavid du Colombier return pgs_lp->dot_length_absolute;
3507dd7cddfSDavid du Colombier }
3517dd7cddfSDavid du Colombier
3527dd7cddfSDavid du Colombier /* setdotorientation */
3537dd7cddfSDavid du Colombier int
gs_setdotorientation(gs_state * pgs)3547dd7cddfSDavid du Colombier gs_setdotorientation(gs_state *pgs)
3557dd7cddfSDavid du Colombier {
3567dd7cddfSDavid du Colombier if (is_xxyy(&pgs->ctm) || is_xyyx(&pgs->ctm))
3577dd7cddfSDavid du Colombier return gs_currentmatrix(pgs, &pgs_lp->dot_orientation);
3587dd7cddfSDavid du Colombier return_error(gs_error_rangecheck);
3597dd7cddfSDavid du Colombier }
3607dd7cddfSDavid du Colombier
3617dd7cddfSDavid du Colombier /* dotorientation */
3627dd7cddfSDavid du Colombier int
gs_dotorientation(gs_state * pgs)3637dd7cddfSDavid du Colombier gs_dotorientation(gs_state *pgs)
3647dd7cddfSDavid du Colombier {
3657dd7cddfSDavid du Colombier return gs_setmatrix(pgs, &pgs_lp->dot_orientation);
3667dd7cddfSDavid du Colombier }
367