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