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
22HPDF_GState
23HPDF_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
110HPDF_GState
111HPDF_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