xref: /plan9-contrib/sys/src/cmd/gs/src/gzspotan.h (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
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