1 /*
2  * << Haru Free PDF Library >> -- hpdf_gstate.c
3  *
4  * URL: http://libharu.org
5  *
6  * Copyright (c) 1999-2006 Takeshi Kanno <takeshi_kanno@est.hi-ho.ne.jp>
7  * Copyright (c) 2007-2009 Antony Dovgal <tony@daylessday.org>
8  *
9  * Permission to use, copy, modify, distribute and sell this software
10  * and its documentation for any purpose is hereby granted without fee,
11  * provided that the above copyright notice appear in all copies and
12  * that both that copyright notice and this permission notice appear
13  * in supporting documentation.
14  * It is provided "as is" without express or implied warranty.
15  *
16  */
17 
18 #include "hpdf_conf.h"
19 #include "hpdf_utils.h"
20 #include "hpdf_gstate.h"
21 
22 HPDF_GState
HPDF_GState_New(HPDF_MMgr mmgr,HPDF_GState current)23 HPDF_GState_New  (HPDF_MMgr    mmgr,
24                   HPDF_GState  current)
25 {
26     HPDF_GState  gstate;
27 
28     if (current && current->depth >= HPDF_LIMIT_MAX_GSTATE) {
29         HPDF_SetError (mmgr->error, HPDF_EXCEED_GSTATE_LIMIT, 0);
30 
31         return NULL;
32     }
33 
34     gstate = HPDF_GetMem (mmgr, sizeof(HPDF_GState_Rec));
35     if (!gstate)
36         return NULL;
37 
38     if (current) {
39         gstate->trans_matrix = current->trans_matrix;
40         gstate->line_width =  current->line_width;
41         gstate->line_cap =  current->line_cap;
42         gstate->line_join =  current->line_join;
43         gstate->miter_limit =  current->miter_limit;
44         gstate->dash_mode = current->dash_mode;
45         gstate->flatness = current->flatness;
46 
47         gstate->char_space = current->char_space;
48         gstate->word_space = current->word_space;
49         gstate->h_scalling = current->h_scalling;
50         gstate->text_leading = current->text_leading;
51         gstate->rendering_mode = current->rendering_mode;
52         gstate->text_rise = current->text_rise;
53 
54         gstate->cs_stroke = current->cs_stroke;
55         gstate->cs_fill = current->cs_fill;
56         gstate->rgb_fill = current->rgb_fill;
57         gstate->rgb_stroke = current->rgb_stroke;
58         gstate->cmyk_fill = current->cmyk_fill;
59         gstate->cmyk_stroke = current->cmyk_stroke;
60         gstate->gray_fill = current->gray_fill;
61         gstate->gray_stroke = current->gray_stroke;
62 
63         gstate->font = current->font;
64         gstate->font_size = current->font_size;
65         gstate->writing_mode = current->writing_mode;
66 
67         gstate->prev = current;
68         gstate->depth = current->depth + 1;
69     } else {
70         HPDF_TransMatrix DEF_MATRIX = {1, 0, 0, 1, 0, 0};
71         HPDF_RGBColor DEF_RGB_COLOR = {0, 0, 0};
72         HPDF_CMYKColor DEF_CMYK_COLOR = {0, 0, 0, 0};
73         HPDF_DashMode DEF_DASH_MODE = {{0, 0, 0, 0, 0, 0, 0, 0}, 0, 0};
74 
75         gstate->trans_matrix = DEF_MATRIX;
76         gstate->line_width = HPDF_DEF_LINEWIDTH;
77         gstate->line_cap = HPDF_DEF_LINECAP;
78         gstate->line_join = HPDF_DEF_LINEJOIN;
79         gstate->miter_limit = HPDF_DEF_MITERLIMIT;
80         gstate->dash_mode = DEF_DASH_MODE;
81         gstate->flatness = HPDF_DEF_FLATNESS;
82 
83         gstate->char_space = HPDF_DEF_CHARSPACE;
84         gstate->word_space = HPDF_DEF_WORDSPACE;
85         gstate->h_scalling = HPDF_DEF_HSCALING;
86         gstate->text_leading = HPDF_DEF_LEADING;
87         gstate->rendering_mode = HPDF_DEF_RENDERING_MODE;
88         gstate->text_rise = HPDF_DEF_RISE;
89 
90         gstate->cs_stroke = HPDF_CS_DEVICE_GRAY;
91         gstate->cs_fill = HPDF_CS_DEVICE_GRAY;
92         gstate->rgb_fill = DEF_RGB_COLOR;
93         gstate->rgb_stroke = DEF_RGB_COLOR;
94         gstate->cmyk_fill = DEF_CMYK_COLOR;
95         gstate->cmyk_stroke = DEF_CMYK_COLOR;
96         gstate->gray_fill = 0;
97         gstate->gray_stroke = 0;
98 
99         gstate->font = NULL;
100         gstate->font_size = 0;
101         gstate->writing_mode = HPDF_WMODE_HORIZONTAL;
102 
103         gstate->prev = NULL;
104         gstate->depth = 1;
105     }
106 
107     return gstate;
108 }
109 
110 HPDF_GState
HPDF_GState_Free(HPDF_MMgr mmgr,HPDF_GState gstate)111 HPDF_GState_Free  (HPDF_MMgr    mmgr,
112                    HPDF_GState  gstate)
113 {
114     HPDF_GState current = NULL;
115 
116     if (gstate) {
117       current = gstate->prev;
118       HPDF_FreeMem (mmgr, gstate);
119     }
120 
121     return current;
122 }
123 
124