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