comparison src/paint.c @ 881:a17c4e231e54 abs_n_rel_center

Transform positions of radient paints. cx, cy of radial and x1, y1, x2, y2 of linear gradient paints must be transformed with aggregated matrix of painted shapes. Pattern to user space transformation maybe used to get more precise color.
author Thinker K.F. Li <thinker@codemud.net>
date Sat, 25 Sep 2010 20:12:45 +0800
parents f41ac71266bc
children 7b4e80ab671a
comparison
equal deleted inserted replaced
880:ac3e8492ad74 881:a17c4e231e54
15 } paint_color_t; 15 } paint_color_t;
16 16
17 int _paint_color_size = sizeof(paint_color_t); 17 int _paint_color_size = sizeof(paint_color_t);
18 18
19 19
20 static void paint_color_prepare(paint_t *paint, mbe_t *cr) { 20 static void paint_color_prepare(paint_t *paint, mbe_t *cr, shape_t *sh) {
21 paint_color_t *color = (paint_color_t *)paint; 21 paint_color_t *color = (paint_color_t *)paint;
22 22
23 mbe_set_source_rgba(cr, color->r, color->g, color->b, color->a); 23 mbe_set_source_rgba(cr, color->r, color->g, color->b, color->a);
24 } 24 }
25 25
82 82
83 #define LIF_DIRTY 0x1 83 #define LIF_DIRTY 0x1
84 84
85 int _paint_linear_size = sizeof(paint_linear_t); 85 int _paint_linear_size = sizeof(paint_linear_t);
86 86
87 static void paint_linear_prepare(paint_t *paint, mbe_t *cr) { 87 static void paint_linear_prepare(paint_t *paint, mbe_t *cr, shape_t *sh) {
88 paint_linear_t *linear = (paint_linear_t *)paint; 88 paint_linear_t *linear = (paint_linear_t *)paint;
89 mbe_pattern_t *ptn; 89 mbe_pattern_t *ptn;
90 co_aix x1, y1;
91 co_aix x2, y2;
92 co_aix *mtx;
90 93
91 ptn = linear->ptn; 94 ptn = linear->ptn;
92 if(linear->flags & LIF_DIRTY) { 95 if(linear->flags & LIF_DIRTY) {
96 mtx = sh_get_aggr_matrix(sh);
97 x1 = linear->x1;
98 y1 = linear->y1;
99 matrix_trans_pos(mtx, &x1, &y1);
100 x2 = linear->x2;
101 y2 = linear->y2;
102 matrix_trans_pos(mtx, &x2, &y2);
103
93 if(ptn) 104 if(ptn)
94 mbe_pattern_destroy(ptn); 105 mbe_pattern_destroy(ptn);
95 linear->flags &= ~LIF_DIRTY; 106 linear->flags &= ~LIF_DIRTY;
96 ptn = mbe_pattern_create_linear(linear->x1, linear->y1, 107 ptn = mbe_pattern_create_linear(x1, y1, x2, y2,
97 linear->x2, linear->y2,
98 linear->stops, linear->n_stops); 108 linear->stops, linear->n_stops);
99 ASSERT(ptn != NULL); 109 ASSERT(ptn != NULL);
100 linear->ptn = ptn; 110 linear->ptn = ptn;
101 } 111 }
102 112
172 182
173 #define RDF_DIRTY 0x1 183 #define RDF_DIRTY 0x1
174 184
175 int _paint_radial_size = sizeof(paint_radial_t); 185 int _paint_radial_size = sizeof(paint_radial_t);
176 186
177 static void paint_radial_prepare(paint_t *paint, mbe_t *cr) { 187 static void paint_radial_prepare(paint_t *paint, mbe_t *cr, shape_t *sh) {
178 paint_radial_t *radial = (paint_radial_t *)paint; 188 paint_radial_t *radial = (paint_radial_t *)paint;
179 mbe_pattern_t *ptn; 189 mbe_pattern_t *ptn;
190 co_aix cx, cy;
191 co_aix *mtx;
180 192
181 if(radial->flags & RDF_DIRTY) { 193 if(radial->flags & RDF_DIRTY) {
182 ptn = mbe_pattern_create_radial(radial->cx, radial->cy, 0, 194 mtx = sh_get_aggr_matrix(sh);
183 radial->cx, radial->cy, 195 cx = radial->cx;
196 cy = radial->cy;
197 matrix_trans_pos(mtx, &cx, &cy);
198
199 ptn = mbe_pattern_create_radial(cx, cy, 0,
200 cx, cy,
184 radial->r, 201 radial->r,
185 radial->stops, 202 radial->stops,
186 radial->n_stops); 203 radial->n_stops);
187 ASSERT(ptn != NULL); 204 ASSERT(ptn != NULL);
188 mbe_pattern_destroy(radial->ptn); 205 mbe_pattern_destroy(radial->ptn);
254 } paint_image_t; 271 } paint_image_t;
255 272
256 int _paint_image_size = sizeof(paint_image_t); 273 int _paint_image_size = sizeof(paint_image_t);
257 274
258 static 275 static
259 void paint_image_prepare(paint_t *paint, mbe_t *cr) { 276 void paint_image_prepare(paint_t *paint, mbe_t *cr, shape_t *sh) {
260 paint_image_t *paint_img = (paint_image_t *)paint; 277 paint_image_t *paint_img = (paint_image_t *)paint;
261 mb_img_data_t *img_data; 278 mb_img_data_t *img_data;
262 279
263 img_data = paint_img->img; 280 img_data = paint_img->img;
264 mbe_set_source(cr, paint_img->ptn); 281 mbe_set_source(cr, paint_img->ptn);