1*593dc095SDavid du Colombier /* Copyright (C) 2003 Aladdin Enterprises. All rights reserved. 2*593dc095SDavid du Colombier 3*593dc095SDavid du Colombier This software is provided AS-IS with no warranty, either express or 4*593dc095SDavid du Colombier implied. 5*593dc095SDavid 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. 9*593dc095SDavid 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. 15*593dc095SDavid du Colombier */ 16*593dc095SDavid du Colombier 17*593dc095SDavid du Colombier /* $Id: gzspotan.h,v 1.6 2004/01/27 16:07:20 igor Exp $ */ 18*593dc095SDavid du Colombier /* State and interface definitions for a spot analyzer device. */ 19*593dc095SDavid du Colombier 20*593dc095SDavid du Colombier /* 21*593dc095SDavid du Colombier * A spot analyzer device performs an analyzis while handling an output 22*593dc095SDavid du Colombier * of the trapezoid fill algorithm for 2 purposes : 23*593dc095SDavid du Colombier * a glyph grid fitting, and 24*593dc095SDavid du Colombier * a glyph antialiased rendering any number of alpha bits. 25*593dc095SDavid du Colombier * Currently we only implement a vertical stem recognition for the grid fitting. 26*593dc095SDavid du Colombier */ 27*593dc095SDavid du Colombier 28*593dc095SDavid du Colombier #ifndef gzspotan_INCLUDED 29*593dc095SDavid du Colombier # define gzspotan_INCLUDED 30*593dc095SDavid du Colombier 31*593dc095SDavid du Colombier #include "gxdevcli.h" 32*593dc095SDavid du Colombier 33*593dc095SDavid du Colombier #ifndef segment_DEFINED 34*593dc095SDavid du Colombier # define segment_DEFINED 35*593dc095SDavid du Colombier typedef struct segment_s segment; /* gzpath.h */ 36*593dc095SDavid du Colombier #endif 37*593dc095SDavid du Colombier 38*593dc095SDavid du Colombier #ifndef gx_device_spot_analyzer_DEFINED 39*593dc095SDavid du Colombier # define gx_device_spot_analyzer_DEFINED 40*593dc095SDavid du Colombier typedef struct gx_device_spot_analyzer_s gx_device_spot_analyzer; 41*593dc095SDavid du Colombier #endif 42*593dc095SDavid du Colombier 43*593dc095SDavid du Colombier /* -------------- Structures ----------------------------- */ 44*593dc095SDavid du Colombier 45*593dc095SDavid du Colombier typedef struct gx_san_trap_s gx_san_trap; 46*593dc095SDavid du Colombier typedef struct gx_san_trap_contact_s gx_san_trap_contact; 47*593dc095SDavid du Colombier 48*593dc095SDavid du Colombier /* A trapezoid. */ 49*593dc095SDavid du Colombier struct gx_san_trap_s { 50*593dc095SDavid du Colombier /* Buffer link : */ 51*593dc095SDavid du Colombier gx_san_trap *link; /* Buffer link. */ 52*593dc095SDavid du Colombier /* The geometry : */ 53*593dc095SDavid du Colombier fixed ybot, ytop; 54*593dc095SDavid du Colombier fixed xlbot, xrbot, xltop, xrtop; 55*593dc095SDavid du Colombier /* The spot topology representation : */ 56*593dc095SDavid du Colombier gx_san_trap_contact *upper; /* Neighbours of the upper band. */ 57*593dc095SDavid du Colombier const segment *l; /* Outline pointer : left boundary. */ 58*593dc095SDavid du Colombier const segment *r; /* Outline pointer : right boundary. */ 59*593dc095SDavid du Colombier int dir_l, dir_r; /* Outline direction : left, right. */ 60*593dc095SDavid du Colombier bool leftmost, rightmost; 61*593dc095SDavid du Colombier /* The topology reconstrustor work data : */ 62*593dc095SDavid du Colombier gx_san_trap *next; /* Next with same ytop. */ 63*593dc095SDavid du Colombier gx_san_trap *prev; /* Prev with same ytop. */ 64*593dc095SDavid du Colombier /* The stem recognizer work data : */ 65*593dc095SDavid du Colombier bool visited; 66*593dc095SDavid du Colombier int fork; 67*593dc095SDavid du Colombier }; 68*593dc095SDavid du Colombier #define private_st_san_trap() /* When GC is invoked, only the buffer link is valid. */\ 69*593dc095SDavid du Colombier gs_private_st_ptrs1(st_san_trap, gx_san_trap, "gx_san_trap", \ 70*593dc095SDavid du Colombier san_trap_enum_ptrs, san_trap_reloc_ptrs, link) 71*593dc095SDavid du Colombier 72*593dc095SDavid du Colombier /* A contact of 2 trapezoids. */ 73*593dc095SDavid du Colombier /* Represents a neighbourship through a band boundary. */ 74*593dc095SDavid du Colombier struct gx_san_trap_contact_s { 75*593dc095SDavid du Colombier /* Buffer link : */ 76*593dc095SDavid du Colombier gx_san_trap_contact *link; /* Buffer link. */ 77*593dc095SDavid du Colombier gx_san_trap_contact *next; /* Next element of the same relation, a cyclic list. */ 78*593dc095SDavid du Colombier gx_san_trap_contact *prev; /* Prev element of the same relation, a cyclic list. */ 79*593dc095SDavid du Colombier gx_san_trap *upper, *lower; /* A contacting pair. */ 80*593dc095SDavid du Colombier }; 81*593dc095SDavid du Colombier #define private_st_san_trap_contact() /* When GC is invoked, only the buffer link is valid. */\ 82*593dc095SDavid du Colombier gs_private_st_ptrs1(st_san_trap_contact, gx_san_trap_contact, "gx_san_trap_contact",\ 83*593dc095SDavid du Colombier san_trap_contact_enum_ptrs, san_trap_contact_reloc_ptrs, link) 84*593dc095SDavid du Colombier 85*593dc095SDavid du Colombier /* A stem section. */ 86*593dc095SDavid du Colombier typedef struct gx_san_sect_s gx_san_sect; 87*593dc095SDavid du Colombier struct gx_san_sect_s { 88*593dc095SDavid du Colombier fixed xl, yl, xr, yr; 89*593dc095SDavid du Colombier const segment *l, *r; 90*593dc095SDavid du Colombier int side_mask; 91*593dc095SDavid du Colombier }; 92*593dc095SDavid du Colombier 93*593dc095SDavid du Colombier /* A spot analyzer device. */ 94*593dc095SDavid du Colombier struct gx_device_spot_analyzer_s { 95*593dc095SDavid du Colombier gx_device_common; 96*593dc095SDavid du Colombier int lock; 97*593dc095SDavid du Colombier /* Buffers : */ 98*593dc095SDavid du Colombier gx_san_trap *trap_buffer, *trap_buffer_last, *trap_free; 99*593dc095SDavid du Colombier gx_san_trap_contact *cont_buffer, *cont_buffer_last, *cont_free; 100*593dc095SDavid du Colombier int trap_buffer_count; 101*593dc095SDavid du Colombier int cont_buffer_count; 102*593dc095SDavid du Colombier /* The topology reconstrustor work data (no GC invocations) : */ 103*593dc095SDavid du Colombier gx_san_trap *bot_band; 104*593dc095SDavid du Colombier gx_san_trap *top_band; 105*593dc095SDavid du Colombier gx_san_trap *bot_current; 106*593dc095SDavid du Colombier /* The stem recognizer work data (no GC invocations) : */ 107*593dc095SDavid du Colombier fixed xmin, xmax; 108*593dc095SDavid du Colombier }; 109*593dc095SDavid du Colombier 110*593dc095SDavid du Colombier extern_st(st_device_spot_analyzer); 111*593dc095SDavid du Colombier #define public_st_device_spot_analyzer() /* When GC is invoked, only the buffer links are valid. */\ 112*593dc095SDavid du Colombier gs_public_st_suffix_add4_final(st_device_spot_analyzer, gx_device_spot_analyzer,\ 113*593dc095SDavid du Colombier "gx_device_spot_analyzer", device_spot_analyzer_enum_ptrs,\ 114*593dc095SDavid du Colombier device_spot_analyzer_reloc_ptrs, gx_device_finalize, st_device,\ 115*593dc095SDavid du Colombier trap_buffer, trap_buffer_last, cont_buffer, cont_buffer_last) 116*593dc095SDavid du Colombier 117*593dc095SDavid du Colombier /* -------------- Interface methods ----------------------------- */ 118*593dc095SDavid du Colombier 119*593dc095SDavid du Colombier /* Obtain a spot analyzer device. */ 120*593dc095SDavid du Colombier int gx_san__obtain(gs_memory_t *mem, gx_device_spot_analyzer **ppadev); 121*593dc095SDavid du Colombier 122*593dc095SDavid du Colombier /* Obtain a spot analyzer device. */ 123*593dc095SDavid du Colombier void gx_san__release(gx_device_spot_analyzer **ppadev); 124*593dc095SDavid du Colombier 125*593dc095SDavid du Colombier /* Start accumulating a path. */ 126*593dc095SDavid du Colombier void gx_san_begin(gx_device_spot_analyzer *padev); 127*593dc095SDavid du Colombier 128*593dc095SDavid du Colombier /* Store a tarpezoid. */ 129*593dc095SDavid du Colombier /* Assumes an Y-band scanning order with increasing X inside a band. */ 130*593dc095SDavid du Colombier int gx_san_trap_store(gx_device_spot_analyzer *padev, 131*593dc095SDavid du Colombier fixed ybot, fixed ytop, fixed xlbot, fixed xrbot, fixed xltop, fixed xrtop, 132*593dc095SDavid du Colombier const segment *l, const segment *r, int dir_l, int dir_r); 133*593dc095SDavid du Colombier 134*593dc095SDavid du Colombier /* Finish accumulating a path. */ 135*593dc095SDavid du Colombier void gx_san_end(const gx_device_spot_analyzer *padev); 136*593dc095SDavid du Colombier 137*593dc095SDavid du Colombier /* Generate stems. */ 138*593dc095SDavid du Colombier int gx_san_generate_stems(gx_device_spot_analyzer *padev, 139*593dc095SDavid du Colombier bool overall_hints, void *client_data, 140*593dc095SDavid du Colombier int (*handler)(void *client_data, gx_san_sect *ss)); 141*593dc095SDavid du Colombier 142*593dc095SDavid du Colombier #endif /* gzspotan_INCLUDED */ 143