xref: /plan9/sys/src/cmd/gs/src/gdevpdts.h (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
1*593dc095SDavid du Colombier /* Copyright (C) 2002 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: gdevpdts.h,v 1.7 2003/04/08 16:31:56 igor Exp $ */
18*593dc095SDavid du Colombier /* Text state structure and API for pdfwrite */
19*593dc095SDavid du Colombier 
20*593dc095SDavid du Colombier #ifndef gdevpdts_INCLUDED
21*593dc095SDavid du Colombier #  define gdevpdts_INCLUDED
22*593dc095SDavid du Colombier 
23*593dc095SDavid du Colombier #include "gsmatrix.h"
24*593dc095SDavid du Colombier 
25*593dc095SDavid du Colombier /*
26*593dc095SDavid du Colombier  * See gdevpdtt.h for a discussion of the multiple coordinate systems that
27*593dc095SDavid du Colombier  * the text code must use.
28*593dc095SDavid du Colombier  */
29*593dc095SDavid du Colombier 
30*593dc095SDavid du Colombier /* ================ Types and structures ================ */
31*593dc095SDavid du Colombier 
32*593dc095SDavid du Colombier #ifndef pdf_text_state_DEFINED
33*593dc095SDavid du Colombier #  define pdf_text_state_DEFINED
34*593dc095SDavid du Colombier typedef struct pdf_text_state_s pdf_text_state_t;
35*593dc095SDavid du Colombier #endif
36*593dc095SDavid du Colombier 
37*593dc095SDavid du Colombier /*
38*593dc095SDavid du Colombier  * Clients pass in the text state values; the implementation decides when
39*593dc095SDavid du Colombier  * (and, in the case of text positioning, how) to emit PDF commands to
40*593dc095SDavid du Colombier  * set them in the output.
41*593dc095SDavid du Colombier  */
42*593dc095SDavid du Colombier typedef struct pdf_text_state_values_s {
43*593dc095SDavid du Colombier     float character_spacing;	/* Tc */
44*593dc095SDavid du Colombier     pdf_font_resource_t *pdfont; /* for Tf */
45*593dc095SDavid du Colombier     double size;		/* for Tf */
46*593dc095SDavid du Colombier     /*
47*593dc095SDavid du Colombier      * The matrix is the transformation from text space to user space, which
48*593dc095SDavid du Colombier      * in pdfwrite text output is the same as device space.  Thus this
49*593dc095SDavid du Colombier      * matrix combines the effect of the PostScript CTM and the FontMatrix,
50*593dc095SDavid du Colombier      * scaled by the inverse of the font size value.
51*593dc095SDavid du Colombier      */
52*593dc095SDavid du Colombier     gs_matrix matrix;		/* Tm et al */
53*593dc095SDavid du Colombier     int render_mode;		/* Tr */
54*593dc095SDavid du Colombier     float word_spacing;		/* Tw */
55*593dc095SDavid du Colombier } pdf_text_state_values_t;
56*593dc095SDavid du Colombier #define TEXT_STATE_VALUES_DEFAULT\
57*593dc095SDavid du Colombier     0,				/* character_spacing */\
58*593dc095SDavid du Colombier     NULL,			/* font */\
59*593dc095SDavid du Colombier     0,				/* size */\
60*593dc095SDavid du Colombier     { identity_matrix_body },	/* matrix */\
61*593dc095SDavid du Colombier     0,				/* render_mode */\
62*593dc095SDavid du Colombier     0				/* word_spacing */
63*593dc095SDavid du Colombier 
64*593dc095SDavid du Colombier /* ================ Procedures ================ */
65*593dc095SDavid du Colombier 
66*593dc095SDavid du Colombier /* ------ Exported for gdevpdfu.c ------ */
67*593dc095SDavid du Colombier 
68*593dc095SDavid du Colombier /*
69*593dc095SDavid du Colombier  * Transition from stream context to text context.
70*593dc095SDavid du Colombier  */
71*593dc095SDavid du Colombier int pdf_from_stream_to_text(gx_device_pdf *pdev);
72*593dc095SDavid du Colombier 
73*593dc095SDavid du Colombier /*
74*593dc095SDavid du Colombier  * Transition from string context to text context.
75*593dc095SDavid du Colombier  */
76*593dc095SDavid du Colombier int pdf_from_string_to_text(gx_device_pdf *pdev);
77*593dc095SDavid du Colombier 
78*593dc095SDavid du Colombier /*
79*593dc095SDavid du Colombier  * Close the text aspect of the current contents part.
80*593dc095SDavid du Colombier  */
81*593dc095SDavid du Colombier void pdf_close_text_contents(gx_device_pdf *pdev); /* gdevpdts.h */
82*593dc095SDavid du Colombier 
83*593dc095SDavid du Colombier /* ------ Used only within the text code ------ */
84*593dc095SDavid du Colombier 
85*593dc095SDavid du Colombier /*
86*593dc095SDavid du Colombier  * Test whether a change in render_mode requires resetting the stroke
87*593dc095SDavid du Colombier  * parameters.
88*593dc095SDavid du Colombier  */
89*593dc095SDavid du Colombier bool pdf_render_mode_uses_stroke(const gx_device_pdf *pdev,
90*593dc095SDavid du Colombier 				 const pdf_text_state_values_t *ptsv);
91*593dc095SDavid du Colombier 
92*593dc095SDavid du Colombier /*
93*593dc095SDavid du Colombier  * Read the stored client view of text state values.
94*593dc095SDavid du Colombier  */
95*593dc095SDavid du Colombier void pdf_get_text_state_values(gx_device_pdf *pdev,
96*593dc095SDavid du Colombier 			       pdf_text_state_values_t *ptsv);
97*593dc095SDavid du Colombier 
98*593dc095SDavid du Colombier /*
99*593dc095SDavid du Colombier  * Set wmode to text state.
100*593dc095SDavid du Colombier  */
101*593dc095SDavid du Colombier void pdf_set_text_wmode(gx_device_pdf *pdev, int wmode);
102*593dc095SDavid du Colombier 
103*593dc095SDavid du Colombier 
104*593dc095SDavid du Colombier /*
105*593dc095SDavid du Colombier  * Set the stored client view of text state values.
106*593dc095SDavid du Colombier  */
107*593dc095SDavid du Colombier int pdf_set_text_state_values(gx_device_pdf *pdev,
108*593dc095SDavid du Colombier 			      const pdf_text_state_values_t *ptsv);
109*593dc095SDavid du Colombier 
110*593dc095SDavid du Colombier /*
111*593dc095SDavid du Colombier  * Transform a distance from unscaled text space (text space ignoring the
112*593dc095SDavid du Colombier  * scaling implied by the font size) to device space.
113*593dc095SDavid du Colombier  */
114*593dc095SDavid du Colombier int pdf_text_distance_transform(floatp wx, floatp wy,
115*593dc095SDavid du Colombier 				const pdf_text_state_t *pts,
116*593dc095SDavid du Colombier 				gs_point *ppt);
117*593dc095SDavid du Colombier 
118*593dc095SDavid du Colombier /*
119*593dc095SDavid du Colombier  * Return the current (x,y) text position as seen by the client, in
120*593dc095SDavid du Colombier  * unscaled text space.
121*593dc095SDavid du Colombier  */
122*593dc095SDavid du Colombier void pdf_text_position(const gx_device_pdf *pdev, gs_point *ppt);
123*593dc095SDavid du Colombier 
124*593dc095SDavid du Colombier /*
125*593dc095SDavid du Colombier  * Append characters to text being accumulated, giving their advance width
126*593dc095SDavid du Colombier  * in device space.
127*593dc095SDavid du Colombier  */
128*593dc095SDavid du Colombier int pdf_append_chars(gx_device_pdf * pdev, const byte * str, uint size,
129*593dc095SDavid du Colombier 		     floatp wx, floatp wy, bool nobreak);
130*593dc095SDavid du Colombier 
131*593dc095SDavid du Colombier #endif /* gdevpdts_INCLUDED */
132