1 /* Copyright (C) 2001-2006 Artifex Software, Inc.
2    All Rights Reserved.
3 
4    This software is provided AS-IS with no warranty, either express or
5    implied.
6 
7    This software is distributed under license and may not be copied, modified
8    or distributed except as expressly authorized under the terms of that
9    license.  Refer to licensing information at http://www.artifex.com/
10    or contact Artifex Software, Inc.,  7 Mt. Lassen Drive - Suite A-134,
11    San Rafael, CA  94903, U.S.A., +1(415)492-9861, for further information.
12 */
13 
14 /* $Id: gdevpdts.h 9248 2008-11-27 15:05:37Z ken $ */
15 /* Text state structure and API for pdfwrite */
16 
17 #ifndef gdevpdts_INCLUDED
18 #  define gdevpdts_INCLUDED
19 
20 #include "gsmatrix.h"
21 
22 /*
23  * See gdevpdtt.h for a discussion of the multiple coordinate systems that
24  * the text code must use.
25  */
26 
27 /* ================ Types and structures ================ */
28 
29 #ifndef pdf_text_state_DEFINED
30 #  define pdf_text_state_DEFINED
31 typedef struct pdf_text_state_s pdf_text_state_t;
32 #endif
33 
34 /*
35  * Clients pass in the text state values; the implementation decides when
36  * (and, in the case of text positioning, how) to emit PDF commands to
37  * set them in the output.
38  */
39 typedef struct pdf_text_state_values_s {
40     float character_spacing;	/* Tc */
41     pdf_font_resource_t *pdfont; /* for Tf */
42     double size;		/* for Tf */
43     /*
44      * The matrix is the transformation from text space to user space, which
45      * in pdfwrite text output is the same as device space.  Thus this
46      * matrix combines the effect of the PostScript CTM and the FontMatrix,
47      * scaled by the inverse of the font size value.
48      */
49     gs_matrix matrix;		/* Tm et al */
50     int render_mode;		/* Tr */
51     float word_spacing;		/* Tw */
52 } pdf_text_state_values_t;
53 #define TEXT_STATE_VALUES_DEFAULT\
54     0,				/* character_spacing */\
55     NULL,			/* font */\
56     0,				/* size */\
57     { identity_matrix_body },	/* matrix */\
58     0,				/* render_mode */\
59     0				/* word_spacing */
60 
61 /* ================ Procedures ================ */
62 
63 /* ------ Exported for gdevpdfu.c ------ */
64 
65 /*
66  * Transition from stream context to text context.
67  */
68 int pdf_from_stream_to_text(gx_device_pdf *pdev);
69 
70 /*
71  * Transition from string context to text context.
72  */
73 int pdf_from_string_to_text(gx_device_pdf *pdev);
74 
75 /*
76  * Close the text aspect of the current contents part.
77  */
78 void pdf_close_text_contents(gx_device_pdf *pdev); /* gdevpdts.h */
79 
80 /* ------ Used only within the text code ------ */
81 
82 /*
83  * Test whether a change in render_mode requires resetting the stroke
84  * parameters.
85  */
86 bool pdf_render_mode_uses_stroke(const gx_device_pdf *pdev,
87 				 const pdf_text_state_values_t *ptsv);
88 
89 /*
90  * Read the stored client view of text state values.
91  */
92 void pdf_get_text_state_values(gx_device_pdf *pdev,
93 			       pdf_text_state_values_t *ptsv);
94 
95 /*
96  * Set wmode to text state.
97  */
98 void pdf_set_text_wmode(gx_device_pdf *pdev, int wmode);
99 
100 
101 /*
102  * Set the stored client view of text state values.
103  */
104 int pdf_set_text_state_values(gx_device_pdf *pdev,
105 			      const pdf_text_state_values_t *ptsv);
106 
107 /*
108  * Transform a distance from unscaled text space (text space ignoring the
109  * scaling implied by the font size) to device space.
110  */
111 int pdf_text_distance_transform(floatp wx, floatp wy,
112 				const pdf_text_state_t *pts,
113 				gs_point *ppt);
114 
115 /*
116  * Return the current (x,y) text position as seen by the client, in
117  * unscaled text space.
118  */
119 void pdf_text_position(const gx_device_pdf *pdev, gs_point *ppt);
120 
121 /*
122  * Append characters to text being accumulated, giving their advance width
123  * in device space.
124  */
125 int pdf_append_chars(gx_device_pdf * pdev, const byte * str, uint size,
126 		     floatp wx, floatp wy, bool nobreak);
127 
128 bool pdf_compare_text_state_for_charpath(pdf_text_state_t *pts, gx_device_pdf *pdev,
129 			     gs_imager_state *pis, gs_font *font,
130 			     const gs_text_params_t *text);
131 
132 int pdf_get_text_render_mode(pdf_text_state_t *pts);
133 void pdf_set_text_render_mode(pdf_text_state_t *pts, int mode);
134 int pdf_modify_text_render_mode(pdf_text_state_t *pts, int render_mode);
135 int pdf_set_PaintType0_params (gx_device_pdf *pdev, gs_imager_state *pis,
136 			       float size, double scaled_width,
137 			       const pdf_text_state_values_t *ptsv);
138 #endif /* gdevpdts_INCLUDED */
139