OSDN Git Service

binding with libharu.
[putex/putex.git] / src / texsourc / lib / libhpdf / demo / text_demo.c
1 /*
2  * << Haru Free PDF Library 2.0.0 >> -- text_demo.c
3  *
4  * Copyright (c) 1999-2006 Takeshi Kanno <takeshi_kanno@est.hi-ho.ne.jp>
5  *
6  * Permission to use, copy, modify, distribute and sell this software
7  * and its documentation for any purpose is hereby granted without fee,
8  * provided that the above copyright notice appear in all copies and
9  * that both that copyright notice and this permission notice appear
10  * in supporting documentation.
11  * It is provided "as is" without express or implied warranty.
12  *
13  */
14
15 #include <stdlib.h>
16 #include <stdio.h>
17 #include <string.h>
18 #include <math.h>
19 #include <setjmp.h>
20 #include "hpdf.h"
21 #include "grid_sheet.h"
22
23 jmp_buf env;
24
25 #ifdef HPDF_DLL
26 void  __stdcall
27 #else
28 void
29 #endif
30 error_handler (HPDF_STATUS   error_no,
31                HPDF_STATUS   detail_no,
32                void         *user_data)
33 {
34     printf ("ERROR: error_no=%04X, detail_no=%u\n", (HPDF_UINT)error_no,
35                 (HPDF_UINT)detail_no);
36     longjmp(env, 1);
37 }
38
39 void
40 show_stripe_pattern  (HPDF_Page   page,
41                       HPDF_REAL   x,
42                       HPDF_REAL   y)
43 {
44     HPDF_UINT iy = 0;
45
46     while (iy < 50) {
47         HPDF_Page_SetRGBStroke (page, 0.0, 0.0, 0.5);
48         HPDF_Page_SetLineWidth (page, 1);
49         HPDF_Page_MoveTo (page, x, y + iy);
50         HPDF_Page_LineTo (page, x + HPDF_Page_TextWidth (page, "ABCabc123"),
51                     y + iy);
52         HPDF_Page_Stroke (page);
53         iy += 3;
54     }
55
56     HPDF_Page_SetLineWidth (page, 2.5);
57 }
58
59
60 void
61 show_description  (HPDF_Page          page,
62                    HPDF_REAL          x,
63                    HPDF_REAL          y,
64                    const char   *text)
65 {
66     float fsize = HPDF_Page_GetCurrentFontSize (page);
67     HPDF_Font font = HPDF_Page_GetCurrentFont (page);
68     HPDF_RGBColor c = HPDF_Page_GetRGBFill (page);
69
70     HPDF_Page_BeginText (page);
71     HPDF_Page_SetRGBFill (page, 0, 0, 0);
72     HPDF_Page_SetTextRenderingMode (page, HPDF_FILL);
73     HPDF_Page_SetFontAndSize (page, font, 10);
74     HPDF_Page_TextOut (page, x, y - 12, text);
75     HPDF_Page_EndText (page);
76
77     HPDF_Page_SetFontAndSize (page, font, fsize);
78     HPDF_Page_SetRGBFill (page, c.r, c.g, c.b);
79 }
80
81
82 int main (int argc, char **argv)
83 {
84     const char *page_title = "Text Demo";
85
86     HPDF_Doc  pdf;
87     HPDF_Font font;
88     HPDF_Page page;
89     char fname[256];
90
91     const char* samp_text = "abcdefgABCDEFG123!#$%&+-@?";
92     const char* samp_text2 = "The quick brown fox jumps over the lazy dog.";
93     float tw;
94     float fsize;
95     int i;
96     int len;
97
98     float angle1;
99     float angle2;
100     float rad1;
101     float rad2;
102
103     float ypos;
104
105     strcpy (fname, argv[0]);
106     strcat (fname, ".pdf");
107
108     pdf = HPDF_New (error_handler, NULL);
109     if (!pdf) {
110         printf ("error: cannot create PdfDoc object\n");
111         return 1;
112     }
113
114     if (setjmp(env)) {
115         HPDF_Free (pdf);
116         return 1;
117     }
118
119     /* set compression mode */
120     HPDF_SetCompressionMode (pdf, HPDF_COMP_ALL);
121
122     /* create default-font */
123     font = HPDF_GetFont (pdf, "Helvetica", NULL);
124
125     /* add a new page object. */
126     page = HPDF_AddPage (pdf);
127
128     /* draw grid to the page */
129     print_grid  (pdf, page);
130
131     /* print the lines of the page.
132     HPDF_Page_SetLineWidth (page, 1);
133     HPDF_Page_Rectangle (page, 50, 50, HPDF_Page_GetWidth(page) - 100,
134                 HPDF_Page_GetHeight (page) - 110);
135     HPDF_Page_Stroke (page);
136     */
137
138     /* print the title of the page (with positioning center). */
139     HPDF_Page_SetFontAndSize (page, font, 24);
140     tw = HPDF_Page_TextWidth (page, page_title);
141     HPDF_Page_BeginText (page);
142     HPDF_Page_TextOut (page, (HPDF_Page_GetWidth(page) - tw) / 2,
143                 HPDF_Page_GetHeight (page) - 50, page_title);
144     HPDF_Page_EndText (page);
145
146     HPDF_Page_BeginText (page);
147     HPDF_Page_MoveTextPos (page, 60, HPDF_Page_GetHeight(page) - 60);
148
149     /*
150      * font size
151      */
152     fsize = 8;
153     while (fsize < 60) {
154         char buf[50];
155         int len;
156
157         /* set style and size of font. */
158         HPDF_Page_SetFontAndSize(page, font, fsize);
159
160         /* set the position of the text. */
161         HPDF_Page_MoveTextPos (page, 0, -5 - fsize);
162
163         /* measure the number of characters which included in the page. */
164         strcpy(buf, samp_text);
165         len = HPDF_Page_MeasureText (page, samp_text,
166                         HPDF_Page_GetWidth(page) - 120, HPDF_FALSE, NULL);
167
168         /* truncate the text. */
169         buf[len] = 0x00;
170
171         HPDF_Page_ShowText (page, buf);
172
173         /* print the description. */
174         HPDF_Page_MoveTextPos (page, 0, -10);
175         HPDF_Page_SetFontAndSize(page, font, 8);
176         #ifdef __WIN32__
177         _snprintf(buf, 50, "Fontsize=%.0f", fsize);
178         #else
179         snprintf(buf, 50, "Fontsize=%.0f", fsize);
180         #endif
181         HPDF_Page_ShowText (page, buf);
182
183         fsize *= 1.5;
184     }
185
186     /*
187      * font color
188      */
189     HPDF_Page_SetFontAndSize(page, font, 8);
190     HPDF_Page_MoveTextPos (page, 0, -30);
191     HPDF_Page_ShowText (page, "Font color");
192
193     HPDF_Page_SetFontAndSize (page, font, 18);
194     HPDF_Page_MoveTextPos (page, 0, -20);
195     len = strlen (samp_text);
196     for (i = 0; i < len; i++) {
197         char buf[2];
198         float r = (float)i / (float)len;
199         float g = 1 - ((float)i / (float)len);
200         buf[0] = samp_text[i];
201         buf[1] = 0x00;
202
203         HPDF_Page_SetRGBFill (page, r, g, 0.0);
204         HPDF_Page_ShowText (page, buf);
205     }
206     HPDF_Page_MoveTextPos (page, 0, -25);
207
208     for (i = 0; i < len; i++) {
209         char buf[2];
210         float r = (float)i / (float)len;
211         float b = 1 - ((float)i / (float)len);
212         buf[0] = samp_text[i];
213         buf[1] = 0x00;
214
215         HPDF_Page_SetRGBFill (page, r, 0.0, b);
216         HPDF_Page_ShowText (page, buf);
217     }
218     HPDF_Page_MoveTextPos (page, 0, -25);
219
220     for (i = 0; i < len; i++) {
221         char buf[2];
222         float b = (float)i / (float)len;
223         float g = 1 - ((float)i / (float)len);
224         buf[0] = samp_text[i];
225         buf[1] = 0x00;
226
227         HPDF_Page_SetRGBFill (page, 0.0, g, b);
228         HPDF_Page_ShowText (page, buf);
229     }
230
231     HPDF_Page_EndText (page);
232
233     ypos = 450;
234
235     /*
236      * Font rendering mode
237      */
238     HPDF_Page_SetFontAndSize(page, font, 32);
239     HPDF_Page_SetRGBFill (page, 0.5, 0.5, 0.0);
240     HPDF_Page_SetLineWidth (page, 1.5);
241
242      /* PDF_FILL */
243     show_description (page,  60, ypos,
244                 "RenderingMode=PDF_FILL");
245     HPDF_Page_SetTextRenderingMode (page, HPDF_FILL);
246     HPDF_Page_BeginText (page);
247     HPDF_Page_TextOut (page, 60, ypos, "ABCabc123");
248     HPDF_Page_EndText (page);
249
250     /* PDF_STROKE */
251     show_description (page, 60, ypos - 50,
252                 "RenderingMode=PDF_STROKE");
253     HPDF_Page_SetTextRenderingMode (page, HPDF_STROKE);
254     HPDF_Page_BeginText (page);
255     HPDF_Page_TextOut (page, 60, ypos - 50, "ABCabc123");
256     HPDF_Page_EndText (page);
257
258     /* PDF_FILL_THEN_STROKE */
259     show_description (page, 60, ypos - 100,
260                 "RenderingMode=PDF_FILL_THEN_STROKE");
261     HPDF_Page_SetTextRenderingMode (page, HPDF_FILL_THEN_STROKE);
262     HPDF_Page_BeginText (page);
263     HPDF_Page_TextOut (page, 60, ypos - 100, "ABCabc123");
264     HPDF_Page_EndText (page);
265
266     /* PDF_FILL_CLIPPING */
267     show_description (page, 60, ypos - 150,
268                 "RenderingMode=PDF_FILL_CLIPPING");
269     HPDF_Page_GSave (page);
270     HPDF_Page_SetTextRenderingMode (page, HPDF_FILL_CLIPPING);
271     HPDF_Page_BeginText (page);
272     HPDF_Page_TextOut (page, 60, ypos - 150, "ABCabc123");
273     HPDF_Page_EndText (page);
274     show_stripe_pattern (page, 60, ypos - 150);
275     HPDF_Page_GRestore (page);
276
277     /* PDF_STROKE_CLIPPING */
278     show_description (page, 60, ypos - 200,
279                 "RenderingMode=PDF_STROKE_CLIPPING");
280     HPDF_Page_GSave (page);
281     HPDF_Page_SetTextRenderingMode (page, HPDF_STROKE_CLIPPING);
282     HPDF_Page_BeginText (page);
283     HPDF_Page_TextOut (page, 60, ypos - 200, "ABCabc123");
284     HPDF_Page_EndText (page);
285     show_stripe_pattern (page, 60, ypos - 200);
286     HPDF_Page_GRestore (page);
287
288     /* PDF_FILL_STROKE_CLIPPING */
289     show_description (page, 60, ypos - 250,
290                 "RenderingMode=PDF_FILL_STROKE_CLIPPING");
291     HPDF_Page_GSave (page);
292     HPDF_Page_SetTextRenderingMode (page, HPDF_FILL_STROKE_CLIPPING);
293     HPDF_Page_BeginText (page);
294     HPDF_Page_TextOut (page, 60, ypos - 250, "ABCabc123");
295     HPDF_Page_EndText (page);
296     show_stripe_pattern (page, 60, ypos - 250);
297     HPDF_Page_GRestore (page);
298
299     /* Reset text attributes */
300     HPDF_Page_SetTextRenderingMode (page, HPDF_FILL);
301     HPDF_Page_SetRGBFill (page, 0, 0, 0);
302     HPDF_Page_SetFontAndSize(page, font, 30);
303
304
305     /*
306      * Rotating text
307      */
308     angle1 = 30;                   /* A rotation of 30 degrees. */
309     rad1 = angle1 / 180 * 3.141592; /* Calcurate the radian value. */
310
311     show_description (page, 320, ypos - 60, "Rotating text");
312     HPDF_Page_BeginText (page);
313     HPDF_Page_SetTextMatrix (page, cos(rad1), sin(rad1), -sin(rad1), cos(rad1),
314                 330, ypos - 60);
315     HPDF_Page_ShowText (page, "ABCabc123");
316     HPDF_Page_EndText (page);
317
318
319     /*
320      * Skewing text.
321      */
322     show_description (page, 320, ypos - 120, "Skewing text");
323     HPDF_Page_BeginText (page);
324
325     angle1 = 10;
326     angle2 = 20;
327     rad1 = angle1 / 180 * 3.141592;
328     rad2 = angle2 / 180 * 3.141592;
329
330     HPDF_Page_SetTextMatrix (page, 1, tan(rad1), tan(rad2), 1, 320, ypos - 120);
331     HPDF_Page_ShowText (page, "ABCabc123");
332     HPDF_Page_EndText (page);
333
334
335     /*
336      * scaling text (X direction)
337      */
338     show_description (page, 320, ypos - 175, "Scaling text (X direction)");
339     HPDF_Page_BeginText (page);
340     HPDF_Page_SetTextMatrix (page, 1.5, 0, 0, 1, 320, ypos - 175);
341     HPDF_Page_ShowText (page, "ABCabc12");
342     HPDF_Page_EndText (page);
343
344
345     /*
346      * scaling text (Y direction)
347      */
348     show_description (page, 320, ypos - 250, "Scaling text (Y direction)");
349     HPDF_Page_BeginText (page);
350     HPDF_Page_SetTextMatrix (page, 1, 0, 0, 2, 320, ypos - 250);
351     HPDF_Page_ShowText (page, "ABCabc123");
352     HPDF_Page_EndText (page);
353
354
355     /*
356      * char spacing, word spacing
357      */
358
359     show_description (page, 60, 140, "char-spacing 0");
360     show_description (page, 60, 100, "char-spacing 1.5");
361     show_description (page, 60, 60, "char-spacing 1.5, word-spacing 2.5");
362
363     HPDF_Page_SetFontAndSize (page, font, 20);
364     HPDF_Page_SetRGBFill (page, 0.1, 0.3, 0.1);
365
366     /* char-spacing 0 */
367     HPDF_Page_BeginText (page);
368     HPDF_Page_TextOut (page, 60, 140, samp_text2);
369     HPDF_Page_EndText (page);
370
371     /* char-spacing 1.5 */
372     HPDF_Page_SetCharSpace (page, 1.5);
373
374     HPDF_Page_BeginText (page);
375     HPDF_Page_TextOut (page, 60, 100, samp_text2);
376     HPDF_Page_EndText (page);
377
378     /* char-spacing 1.5, word-spacing 3.5 */
379     HPDF_Page_SetWordSpace (page, 2.5);
380
381     HPDF_Page_BeginText (page);
382     HPDF_Page_TextOut (page, 60, 60, samp_text2);
383     HPDF_Page_EndText (page);
384
385     /* save the document to a file */
386     HPDF_SaveToFile (pdf, fname);
387
388     /* clean up */
389     HPDF_Free (pdf);
390
391     return 0;
392 }
393