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