diff options
Diffstat (limited to 'fitz')
-rw-r--r-- | fitz/Jamfile | 5 | ||||
-rw-r--r-- | fitz/dev_trace.c | 132 | ||||
-rw-r--r-- | fitz/fitz_res.h | 59 | ||||
-rw-r--r-- | fitz/node_path.c | 82 | ||||
-rw-r--r-- | fitz/node_text.c | 1 |
5 files changed, 186 insertions, 93 deletions
diff --git a/fitz/Jamfile b/fitz/Jamfile index 14b15d74..f085507e 100644 --- a/fitz/Jamfile +++ b/fitz/Jamfile @@ -78,5 +78,8 @@ Library libfitz : res_font.c res_image.c res_shade.c + dev_trace.c + # dev_text.c + # dev_draw.c + # dev_ghost.c ; - diff --git a/fitz/dev_trace.c b/fitz/dev_trace.c new file mode 100644 index 00000000..85118e1b --- /dev/null +++ b/fitz/dev_trace.c @@ -0,0 +1,132 @@ +#include "fitz.h" + +static void fz_tracematrix(fz_matrix *ctm) +{ + printf("%g %g %g %g %g %g setmatrix\n", + ctm->a, ctm->b, ctm->c, ctm->d, ctm->e, ctm->f); +} + +static void fz_tracecolor(fz_colorspace *colorspace, float *color, float alpha) +{ + printf("... setcolor\n"); + printf("%g setalpha\n", alpha); +} + +void fz_tracefillpath(void *user, fz_path *path, fz_colorspace *colorspace, float *color, float alpha) +{ + fz_tracematrix(&path->ctm); + fz_printpath(path, 0); + if (path->winding == FZ_EVENODD) + printf("eofill\n"); + else + printf("fill\n"); +} + +void fz_tracestrokepath(void *user, fz_path *path, fz_colorspace *colorspace, float *color, float alpha) +{ + int i; + + fz_tracecolor(colorspace, color, alpha); + fz_tracematrix(&path->ctm); + + printf("%g setlinewidth\n", path->linewidth); + printf("%g setmiterlimit\n", path->miterlimit); + printf("%d setlinecap\n", path->linecap); + printf("%d setlinejoin\n", path->linejoin); + + if (path->dashlen) + { + printf("%g [ ", path->dashphase); + for (i = 0; i < path->dashlen; i++) + printf("%g ", path->dashlist[i]); + printf("] setdash\n"); + } + + fz_printpath(path, 0); + + printf("stroke\n"); +} + +void fz_traceclippath(void *user, fz_path *path) +{ + printf("gsave\n"); + fz_tracematrix(&path->ctm); + fz_printpath(path, 0); + if (path->winding == FZ_EVENODD) + printf("eoclip\n"); + else + printf("clip\n"); +} + +void fz_tracefilltext(void *user, fz_text *text, fz_colorspace *colorspace, float *color, float alpha) +{ + printf("/%s setfont\n", text->font->name); + fz_tracematrix(&text->trm); + fz_debugtext(text, 0); + printf("show\n"); +} + +void fz_tracestroketext(void *user, fz_text *text, fz_colorspace *colorspace, float *color, float alpha) +{ + printf("/%s setfont\n", text->font->name); + fz_tracematrix(&text->trm); + fz_debugtext(text, 0); + printf("charpath stroke\n"); +} + +void fz_tracecliptext(void *user, fz_text *text) +{ + printf("gsave\n"); + printf("/%s setfont\n", text->font->name); + fz_tracematrix(&text->trm); + fz_debugtext(text, 0); + printf("charpath clip\n"); +} + +void fz_traceignoretext(void *user, fz_text *text) +{ + printf("/%s setfont\n", text->font->name); + fz_tracematrix(&text->trm); + fz_debugtext(text, 0); + printf("invisibletext\n"); +} + +void fz_tracedrawimage(void *user, fz_image *image, fz_matrix *ctm) +{ + fz_tracematrix(ctm); + printf("drawimage\n"); +} + +void fz_tracedrawshade(void *user, fz_shade *shade, fz_matrix *ctm) +{ + fz_tracematrix(ctm); + printf("drawshade\n"); +} + +void fz_tracepopclip(void *user) +{ + printf("grestore\n"); +} + +fz_device *fz_newtracedevice(void) +{ + fz_device *dev = fz_malloc(sizeof(fz_device)); + dev->user = nil; + + dev->fillpath = fz_tracefillpath; + dev->strokepath = fz_tracestrokepath; + dev->clippath = fz_traceclippath; + + dev->filltext = fz_tracefilltext; + dev->stroketext = fz_tracestroketext; + dev->cliptext = fz_tracecliptext; + dev->ignoretext = fz_traceignoretext; + + dev->drawimage = fz_tracedrawimage; + dev->drawshade = fz_tracedrawshade; + + dev->popclip = fz_tracepopclip; + + return dev; +} + diff --git a/fitz/fitz_res.h b/fitz/fitz_res.h index 3c93d34f..d6120fcd 100644 --- a/fitz/fitz_res.h +++ b/fitz/fitz_res.h @@ -1,7 +1,7 @@ /* * */ - + typedef struct fz_path_s fz_path; typedef struct fz_text_s fz_text; typedef struct fz_font_s fz_font; @@ -9,6 +9,29 @@ typedef struct fz_image_s fz_image; typedef struct fz_shade_s fz_shade; typedef struct fz_colorspace_s fz_colorspace; +typedef struct fz_device_s fz_device; + +struct fz_device_s +{ + void *user; + + void (*fillpath)(void *, fz_path *, fz_colorspace *, float *color, float alpha); + void (*strokepath)(void *, fz_path *, fz_colorspace *, float *color, float alpha); + void (*clippath)(void *, fz_path *); + + void (*filltext)(void *, fz_text *, fz_colorspace *, float *color, float alpha); + void (*stroketext)(void *, fz_text *, fz_colorspace *, float *color, float alpha); + void (*cliptext)(void *, fz_text *); + void (*ignoretext)(void *, fz_text *); + + void (*drawimage)(void *, fz_image *img, fz_matrix *ctm); + void (*drawshade)(void *, fz_shade *shd, fz_matrix *ctm); + + void (*popclip)(void *); +}; + +fz_device *fz_newtracedevice(void); + typedef enum fz_blendkind_e { /* PDF 1.4 -- standard separable */ @@ -48,12 +71,11 @@ typedef struct fz_stroke_s fz_stroke; typedef struct fz_dash_s fz_dash; typedef union fz_pathel_s fz_pathel; -typedef enum fz_pathkind_e +typedef enum fz_pathwinding_e { - FZ_STROKE, - FZ_FILL, - FZ_EOFILL -} fz_pathkind; + FZ_EVENODD, + FZ_NONZERO, +} fz_pathwinding; typedef enum fz_pathelkind_e { @@ -63,21 +85,6 @@ typedef enum fz_pathelkind_e FZ_CLOSEPATH } fz_pathelkind; -struct fz_stroke_s -{ - int linecap; - int linejoin; - float linewidth; - float miterlimit; -}; - -struct fz_dash_s -{ - int len; - float phase; - float array[FZ_FLEX]; -}; - union fz_pathel_s { fz_pathelkind k; @@ -86,12 +93,15 @@ union fz_pathel_s struct fz_path_s { - fz_pathkind paint; - fz_dash *dash; + fz_matrix ctm; + fz_pathwinding winding; int linecap; int linejoin; float linewidth; float miterlimit; + float dashphase; + int dashlen; + float dashlist[32]; int len, cap; fz_pathel *els; }; @@ -103,11 +113,10 @@ void fz_curveto(fz_path*, float, float, float, float, float, float); void fz_curvetov(fz_path*, float, float, float, float); void fz_curvetoy(fz_path*, float, float, float, float); void fz_closepath(fz_path*); -void fz_setpathstate(fz_path*, fz_pathkind paint, fz_stroke *stroke, fz_dash *dash); void fz_resetpath(fz_path *path); void fz_freepath(fz_path *path); -fz_rect fz_boundpath(fz_path *, fz_matrix ctm); +fz_rect fz_boundpath(fz_path *, fz_matrix ctm, int dostroke); void fz_debugpath(fz_path *, int indent); void fz_printpath(fz_path *, int indent); diff --git a/fitz/node_path.c b/fitz/node_path.c index b2f22a89..9f581cd9 100644 --- a/fitz/node_path.c +++ b/fitz/node_path.c @@ -6,16 +6,17 @@ fz_newpath(void) fz_path *path; path = fz_malloc(sizeof(fz_path)); - path->dash = nil; - path->len = 0; - path->cap = 0; - path->els = nil; - - path->paint = FZ_FILL; + path->ctm = fz_identity(); + path->dashlen = 0; + path->dashphase = 0; + path->winding = FZ_NONZERO; path->linecap = 0; path->linejoin = 0; path->linewidth = 1.0; path->miterlimit = 10.0; + path->len = 0; + path->cap = 0; + path->els = nil; return path; } @@ -23,23 +24,22 @@ fz_newpath(void) void fz_freepath(fz_path *path) { - fz_free(path->dash); fz_free(path->els); + fz_free(path); } void fz_resetpath(fz_path *path) { - if (path->dash) - fz_free(path->dash); - path->dash = nil; - path->len = 0; - - path->paint = FZ_FILL; + path->ctm = fz_identity(); + path->dashlen = 0; + path->dashphase = 0; + path->winding = FZ_NONZERO; path->linecap = 0; path->linejoin = 0; path->linewidth = 1.0; path->miterlimit = 10.0; + path->len = 0; } static void @@ -113,20 +113,6 @@ fz_closepath(fz_path *path) path->els[path->len++].k = FZ_CLOSEPATH; } -void -fz_setpathstate(fz_path *path, fz_pathkind paint, fz_stroke *stroke, fz_dash *dash) -{ - path->paint = paint; - path->dash = dash; - if (stroke) - { - path->linecap = stroke->linecap; - path->linejoin = stroke->linejoin; - path->linewidth = stroke->linewidth; - path->miterlimit = stroke->miterlimit; - } -} - static inline fz_rect boundexpand(fz_rect r, fz_point p) { if (p.x < r.x0) r.x0 = p.x; @@ -137,7 +123,7 @@ static inline fz_rect boundexpand(fz_rect r, fz_point p) } fz_rect -fz_boundpath(fz_path *path, fz_matrix ctm) +fz_boundpath(fz_path *path, fz_matrix ctm, int dostroke) { fz_point p; fz_rect r = fz_emptyrect; @@ -174,7 +160,7 @@ fz_boundpath(fz_path *path, fz_matrix ctm) } } - if (path->paint == FZ_STROKE) + if (dostroke) { float miterlength = sin(path->miterlimit / 2.0); float linewidth = path->linewidth; @@ -225,22 +211,6 @@ fz_printpath(fz_path *path, int indent) printf("h\n"); } } - - for (n = 0; n < indent; n++) - putchar(' '); - - switch (path->paint) - { - case FZ_STROKE: - printf("S\n"); - break; - case FZ_FILL: - printf("f\n"); - break; - case FZ_EOFILL: - printf("f*\n"); - break; - } } void @@ -281,25 +251,3 @@ fz_debugpath(fz_path *path, int indent) } } } - -fz_dash * -fz_newdash(float phase, int len, float *array) -{ - fz_dash *dash; - int i; - - dash = fz_malloc(sizeof(fz_dash) + sizeof(float) * len); - dash->len = len; - dash->phase = phase; - for (i = 0; i < len; i++) - dash->array[i] = array[i]; - - return dash; -} - -void -fz_freedash(fz_dash *dash) -{ - fz_free(dash); -} - diff --git a/fitz/node_text.c b/fitz/node_text.c index 28ea3efc..d94f3de3 100644 --- a/fitz/node_text.c +++ b/fitz/node_text.c @@ -20,6 +20,7 @@ fz_freetext(fz_text *text) { fz_dropfont(text->font); fz_free(text->els); + fz_free(text); } fz_rect |