1 /* Copyright (C) 2000-2008 by George Williams */ 2 /* 3 * Redistribution and use in source and binary forms, with or without 4 * modification, are permitted provided that the following conditions are met: 5 6 * Redistributions of source code must retain the above copyright notice, this 7 * list of conditions and the following disclaimer. 8 9 * Redistributions in binary form must reproduce the above copyright notice, 10 * this list of conditions and the following disclaimer in the documentation 11 * and/or other materials provided with the distribution. 12 13 * The name of the author may not be used to endorse or promote products 14 * derived from this software without specific prior written permission. 15 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 */ 27 #ifndef _SD_H 28 #define _SD_H 29 # include <gimage.h> 30 31 /* All coordinates are in millimeters */ 32 /* they will be displayed to the user scaled by the units field of the design */ 33 34 #include "splinefont.h" 35 36 struct epattern { 37 struct entity *tile; 38 real width, height; 39 DBounds bbox; 40 real transform[6]; 41 }; 42 43 typedef struct entpen { 44 Color col; 45 struct gradient *grad; 46 struct epattern *tile; 47 float scale; 48 float opacity; 49 } Pen; 50 51 typedef struct textunit { 52 unichar_t *text; 53 SplineFont *sf; 54 float size; /* in points */ 55 float kernafter; 56 Pen fill; 57 struct textunit *next; 58 } TextUnit; 59 60 typedef struct entity { 61 enum entity_type { et_splines, et_text, et_image, et_group } type; 62 union { 63 struct filledsplines { 64 SplineSet *splines; 65 unsigned int isfillable: 1; /* All splinesets are closed */ 66 Pen fill, stroke; /* A value of 0xffffffff means do not fill or stroke */ 67 float stroke_width; 68 enum linejoin join; 69 enum linecap cap; 70 real transform[6]; /* The stroke may be quite different depending on the transformation (ie. ellipse not circle, rotated, etc) */ 71 } splines; 72 struct text { 73 TextUnit *text; 74 real transform[6]; 75 struct entity *bound; 76 } text; 77 struct image { 78 GImage *image; 79 real transform[6]; 80 Color col; /* that gets poured into imagemasks */ 81 } image; 82 struct group { 83 struct entity *group; 84 } group; 85 } u; 86 SplineSet *clippath; 87 DBounds bb; 88 struct entity *next; 89 } Entity; 90 91 typedef struct entlayer { 92 Entity *entities; 93 char *name; 94 unsigned int isvisible: 1; 95 } EntLayer; 96 97 typedef struct tile { 98 Entity *tile; 99 struct tileinstance { real scale; struct gwindow *pixmap; struct tileinstance *next; } 100 *instances; 101 char *name; 102 } Tile; 103 104 typedef struct splinedesign { 105 int lcnt, lmax, active; 106 EntLayer *layers; 107 108 real width, height; /* in millimeters */ 109 int16 hpages, vpages; 110 real pwidth, pheight; /* in millimeters */ 111 real units; /* if user wants to see things in */ 112 /* centimeters then units will be 10, if inches then 25.4, if points */ 113 /* then 25.4/72, if 1/1200" then 25.4/1200, etc. */ 114 struct dview *dvs; 115 } SplineDesign, Design; 116 117 extern Entity *EntityInterpretPS(FILE *ps,int *width); 118 extern Entity *EntityInterpretSVG(char *filename,char *memory, int memlen, int em_size,int ascent); 119 extern Entity *EntityInterpretPDFPage(FILE *pdf,int select_page); 120 extern SplinePointList *SplinesFromEntities(Entity *ent,int *flags,int is_stroked); 121 extern void SCAppendEntityLayers(SplineChar *sc, Entity *ent); 122 123 /* Used for type3 fonts briefly */ 124 /* This is not a "real" structure. It is a temporary hack that encompasses */ 125 /* various possibilities, the combination of which won't occur in reality */ 126 typedef struct entitychar { 127 Entity *splines; 128 RefChar *refs; 129 int width, vwidth; 130 SplineChar *sc; 131 uint8 fromtype3; 132 } EntityChar; 133 134 struct pskeydict { 135 int16 cnt, max; 136 uint8 is_executable; 137 struct pskeyval *entries; 138 }; 139 140 struct psstack { 141 enum pstype { ps_void, ps_num, ps_bool, ps_string, ps_instr, ps_lit, 142 ps_mark, ps_array, ps_dict } type; 143 union vals { 144 real val; 145 int tf; 146 char *str; 147 struct pskeydict dict; /* and for arrays too */ 148 } u; 149 }; 150 151 struct pskeyval { 152 enum pstype type; 153 union vals u; 154 char *key; 155 }; 156 157 typedef struct retstack { 158 int max; 159 int cnt; 160 real *stack; 161 } RetStack; 162 163 #endif 164