1 /*
2 * << Haru Free PDF Library 2.0.0 >> -- ext_gstate_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 <setjmp.h>
19 #include "hpdf.h"
20 #include "grid_sheet.h"
21
22 jmp_buf env;
23
24 #ifdef HPDF_DLL
25 void __stdcall
26 #else
27 void
28 #endif
error_handler(HPDF_STATUS error_no,HPDF_STATUS detail_no,void * user_data)29 error_handler (HPDF_STATUS error_no,
30 HPDF_STATUS detail_no,
31 void *user_data)
32 {
33 printf ("ERROR: error_no=%04X, detail_no=%u\n", (HPDF_UINT)error_no,
34 (HPDF_UINT)detail_no);
35 longjmp(env, 1);
36 }
37
38
39 void
draw_circles(HPDF_Page page,const char * description,HPDF_REAL x,HPDF_REAL y)40 draw_circles (HPDF_Page page, const char *description, HPDF_REAL x, HPDF_REAL y)
41 {
42 HPDF_Page_SetLineWidth (page, 1.0f);
43 HPDF_Page_SetRGBStroke (page, 0.0f, 0.0f, 0.0f);
44 HPDF_Page_SetRGBFill (page, 1.0f, 0.0f, 0.0f);
45 HPDF_Page_Circle (page, x + 40, y + 40, 40);
46 HPDF_Page_ClosePathFillStroke (page);
47 HPDF_Page_SetRGBFill (page, 0.0f, 1.0f, 0.0f);
48 HPDF_Page_Circle (page, x + 100, y + 40, 40);
49 HPDF_Page_ClosePathFillStroke (page);
50 HPDF_Page_SetRGBFill (page, 0.0f, 0.0f, 1.0f);
51 HPDF_Page_Circle (page, x + 70, y + 74.64, 40);
52 HPDF_Page_ClosePathFillStroke (page);
53
54 HPDF_Page_SetRGBFill (page, 0.0f, 0.0f, 0.0f);
55 HPDF_Page_BeginText (page);
56 HPDF_Page_TextOut (page, x + 0.0f, y + 130.0f, description);
57 HPDF_Page_EndText (page);
58 }
59
60
61 int
main(int argc,char ** argv)62 main (int argc, char **argv)
63 {
64 HPDF_Doc pdf;
65 HPDF_Page page;
66 char fname[256];
67 HPDF_Font hfont;
68 HPDF_ExtGState gstate;
69 const HPDF_REAL PAGE_WIDTH = 600;
70 const HPDF_REAL PAGE_HEIGHT = 900;
71
72 strcpy (fname, argv[0]);
73 strcat (fname, ".pdf");
74
75 pdf = HPDF_New (error_handler, NULL);
76 if (!pdf) {
77 printf ("error: cannot create PdfDoc object\n");
78 return 1;
79 }
80
81 if (setjmp(env)) {
82 HPDF_Free (pdf);
83 return 1;
84 }
85
86 hfont = HPDF_GetFont (pdf, "Helvetica-Bold", NULL);
87
88 /* add a new page object. */
89 page = HPDF_AddPage (pdf);
90
91 HPDF_Page_SetFontAndSize (page, hfont, 10);
92
93 HPDF_Page_SetHeight (page, PAGE_HEIGHT);
94 HPDF_Page_SetWidth (page, PAGE_WIDTH);
95
96 /* normal */
97 HPDF_Page_GSave (page);
98 draw_circles (page, "normal", 40.0f, PAGE_HEIGHT - 170);
99 HPDF_Page_GRestore (page);
100
101 /* transparency (0.8) */
102 HPDF_Page_GSave (page);
103 gstate = HPDF_CreateExtGState (pdf);
104 HPDF_ExtGState_SetAlphaFill (gstate, 0.8);
105 HPDF_ExtGState_SetAlphaStroke (gstate, 0.8);
106 HPDF_Page_SetExtGState (page, gstate);
107 draw_circles (page, "alpha fill = 0.8", 230.0f, PAGE_HEIGHT - 170);
108 HPDF_Page_GRestore (page);
109
110 /* transparency (0.4) */
111 HPDF_Page_GSave (page);
112 gstate = HPDF_CreateExtGState (pdf);
113 HPDF_ExtGState_SetAlphaFill (gstate, 0.4);
114 HPDF_Page_SetExtGState (page, gstate);
115 draw_circles (page, "alpha fill = 0.4", 420.0f, PAGE_HEIGHT - 170);
116 HPDF_Page_GRestore (page);
117
118 /* blend-mode=HPDF_BM_MULTIPLY */
119 HPDF_Page_GSave (page);
120 gstate = HPDF_CreateExtGState (pdf);
121 HPDF_ExtGState_SetBlendMode (gstate, HPDF_BM_MULTIPLY);
122 HPDF_Page_SetExtGState (page, gstate);
123 draw_circles (page, "HPDF_BM_MULTIPLY", 40.0f, PAGE_HEIGHT - 340);
124 HPDF_Page_GRestore (page);
125
126 /* blend-mode=HPDF_BM_SCREEN */
127 HPDF_Page_GSave (page);
128 gstate = HPDF_CreateExtGState (pdf);
129 HPDF_ExtGState_SetBlendMode (gstate, HPDF_BM_SCREEN);
130 HPDF_Page_SetExtGState (page, gstate);
131 draw_circles (page, "HPDF_BM_SCREEN", 230.0f, PAGE_HEIGHT - 340);
132 HPDF_Page_GRestore (page);
133
134 /* blend-mode=HPDF_BM_OVERLAY */
135 HPDF_Page_GSave (page);
136 gstate = HPDF_CreateExtGState (pdf);
137 HPDF_ExtGState_SetBlendMode (gstate, HPDF_BM_OVERLAY);
138 HPDF_Page_SetExtGState (page, gstate);
139 draw_circles (page, "HPDF_BM_OVERLAY", 420.0f, PAGE_HEIGHT - 340);
140 HPDF_Page_GRestore (page);
141
142 /* blend-mode=HPDF_BM_DARKEN */
143 HPDF_Page_GSave (page);
144 gstate = HPDF_CreateExtGState (pdf);
145 HPDF_ExtGState_SetBlendMode (gstate, HPDF_BM_DARKEN);
146 HPDF_Page_SetExtGState (page, gstate);
147 draw_circles (page, "HPDF_BM_DARKEN", 40.0f, PAGE_HEIGHT - 510);
148 HPDF_Page_GRestore (page);
149
150 /* blend-mode=HPDF_BM_LIGHTEN */
151 HPDF_Page_GSave (page);
152 gstate = HPDF_CreateExtGState (pdf);
153 HPDF_ExtGState_SetBlendMode (gstate, HPDF_BM_LIGHTEN);
154 HPDF_Page_SetExtGState (page, gstate);
155 draw_circles (page, "HPDF_BM_LIGHTEN", 230.0f, PAGE_HEIGHT - 510);
156 HPDF_Page_GRestore (page);
157
158 /* blend-mode=HPDF_BM_COLOR_DODGE */
159 HPDF_Page_GSave (page);
160 gstate = HPDF_CreateExtGState (pdf);
161 HPDF_ExtGState_SetBlendMode (gstate, HPDF_BM_COLOR_DODGE);
162 HPDF_Page_SetExtGState (page, gstate);
163 draw_circles (page, "HPDF_BM_COLOR_DODGE", 420.0f, PAGE_HEIGHT - 510);
164 HPDF_Page_GRestore (page);
165
166
167 /* blend-mode=HPDF_BM_COLOR_BUM */
168 HPDF_Page_GSave (page);
169 gstate = HPDF_CreateExtGState (pdf);
170 HPDF_ExtGState_SetBlendMode (gstate, HPDF_BM_COLOR_BUM);
171 HPDF_Page_SetExtGState (page, gstate);
172 draw_circles (page, "HPDF_BM_COLOR_BUM", 40.0f, PAGE_HEIGHT - 680);
173 HPDF_Page_GRestore (page);
174
175 /* blend-mode=HPDF_BM_HARD_LIGHT */
176 HPDF_Page_GSave (page);
177 gstate = HPDF_CreateExtGState (pdf);
178 HPDF_ExtGState_SetBlendMode (gstate, HPDF_BM_HARD_LIGHT);
179 HPDF_Page_SetExtGState (page, gstate);
180 draw_circles (page, "HPDF_BM_HARD_LIGHT", 230.0f, PAGE_HEIGHT - 680);
181 HPDF_Page_GRestore (page);
182
183 /* blend-mode=HPDF_BM_SOFT_LIGHT */
184 HPDF_Page_GSave (page);
185 gstate = HPDF_CreateExtGState (pdf);
186 HPDF_ExtGState_SetBlendMode (gstate, HPDF_BM_SOFT_LIGHT);
187 HPDF_Page_SetExtGState (page, gstate);
188 draw_circles (page, "HPDF_BM_SOFT_LIGHT", 420.0f, PAGE_HEIGHT - 680);
189 HPDF_Page_GRestore (page);
190
191 /* blend-mode=HPDF_BM_DIFFERENCE */
192 HPDF_Page_GSave (page);
193 gstate = HPDF_CreateExtGState (pdf);
194 HPDF_ExtGState_SetBlendMode (gstate, HPDF_BM_DIFFERENCE);
195 HPDF_Page_SetExtGState (page, gstate);
196 draw_circles (page, "HPDF_BM_DIFFERENCE", 40.0f, PAGE_HEIGHT - 850);
197 HPDF_Page_GRestore (page);
198
199
200 /* blend-mode=HPDF_BM_EXCLUSHON */
201 HPDF_Page_GSave (page);
202 gstate = HPDF_CreateExtGState (pdf);
203 HPDF_ExtGState_SetBlendMode (gstate, HPDF_BM_EXCLUSHON);
204 HPDF_Page_SetExtGState (page, gstate);
205 draw_circles (page, "HPDF_BM_EXCLUSHON", 230.0f, PAGE_HEIGHT - 850);
206 HPDF_Page_GRestore (page);
207
208
209 /* save the document to a file */
210 HPDF_SaveToFile (pdf, fname);
211
212 /* clean up */
213 HPDF_Free (pdf);
214
215 return 0;
216 }
217
218