0
@@ -505,20 +505,23 @@ shoes_control_show_ref(SHOES_CONTROL_REF ref)
0
canvas->cy = canvas->endy; \
0
+#define PATTERN_DIM(self_t, x) (self_t->cached != NULL ? self_t->cached->x : 1)
0
+#define PATTERN(self_t) (self_t->cached != NULL ? self_t->cached->pattern : self_t->pattern)
0
#define PATTERN_SCALE(self_t) \
0
- if (self_t->
width == 1.0 && self_t->height == 1.0) \
0
+ if (self_t->
cached == NULL) \
0
- cairo_pattern_get_matrix(self_t->pattern, &matrix1); \
0
- cairo_pattern_get_matrix(self_t->pattern, &matrix2); \
0
+ cairo_pattern_get_matrix(PATTERN(self_t), &matrix1); \
0
+ cairo_pattern_get_matrix(PATTERN(self_t), &matrix2); \
0
cairo_matrix_scale(&matrix2, 1. / (place.iw + (sw * 2.)), 1. / (place.ih + (sw * 2.))); \
0
if (sw != 0.0) cairo_matrix_translate(&matrix2, sw, sw); \
0
- cairo_pattern_set_matrix(
self_t->pattern, &matrix2); \
0
+ cairo_pattern_set_matrix(
PATTERN(self_t), &matrix2); \
0
#define PATTERN_RESET(self_t) \
0
- if (self_t->
width == 1.0 && self_t->height == 1.0) \
0
+ if (self_t->
cached == NULL) \
0
- cairo_pattern_set_matrix(
self_t->pattern, &matrix1); \
0
+ cairo_pattern_set_matrix(
PATTERN(self_t), &matrix1); \
0
@@ -702,7 +705,6 @@ shoes_image_new(VALUE klass, VALUE path, VALUE realpath, VALUE attr, VALUE paren
0
- cairo_surface_t *surf;
0
obj = shoes_image_alloc(klass);
0
Data_Get_Struct(obj, shoes_image, image);
0
@@ -712,9 +714,10 @@ shoes_image_new(VALUE klass, VALUE path, VALUE realpath, VALUE attr, VALUE paren
0
Data_Get_Struct(path, shoes_image, image2);
0
-
cairo_surface_reference(image->surface = image2->surface);
0
+
image->cached = image2->cached;
0
+ /* TODO: cached image blocks
0
else if (rb_obj_is_kind_of(path, cImageBlock))
0
@@ -722,16 +725,11 @@ shoes_image_new(VALUE klass, VALUE path, VALUE realpath, VALUE attr, VALUE paren
0
cairo_surface_reference(image->surface = cairo_get_target(c->cr));
0
- image->surface = shoes_load_image(realpath, &image->width, &image->height, TRUE);
0
- if (image->surface != NULL && image->width == 0)
0
- image->width = cairo_image_surface_get_width(image->surface);
0
- image->height = cairo_image_surface_get_height(image->surface);
0
+ image->cached = shoes_load_image(realpath);
0
cairo_matrix_init_identity(image->tf);
0
@@ -763,14 +761,14 @@ VALUE
0
shoes_image_get_full_width(VALUE self)
0
GET_STRUCT(image, image);
0
- return INT2NUM(image->
width);
0
+ return INT2NUM(image->
cached->width);
0
shoes_image_get_full_height(VALUE self)
0
GET_STRUCT(image, image);
0
- return INT2NUM(image->
height);
0
+ return INT2NUM(image->
cached->height);
0
@@ -785,8 +783,7 @@ shoes_image_set_path(VALUE self, VALUE path)
0
GET_STRUCT(image, image);
0
- image->surface = shoes_load_image(path, &image->width, &image->height, TRUE);
0
- shoes_canvas_repaint_all(image->parent);
0
+ image->cached = shoes_load_image(path);
0
@@ -813,7 +810,7 @@ shoes_image_set_path(VALUE self, VALUE path)
0
shoes_image_draw(VALUE self, VALUE c, VALUE actual)
0
- SHOES_IMAGE_PLACE(image, self_t->
width, self_t->height, self_t->surface);
0
+ SHOES_IMAGE_PLACE(image, self_t->
cached->width, self_t->cached->height, self_t->cached->surface);
0
@@ -860,9 +857,7 @@ VALUE
0
shoes_image_size(VALUE self)
0
GET_STRUCT(image, self_t);
0
- INT2NUM(cairo_image_surface_get_width(self_t->surface)),
0
- INT2NUM(cairo_image_surface_get_height(self_t->surface)));
0
+ return rb_ary_new3(2, INT2NUM(self_t->cached->width), INT2NUM(self_t->cached->height));
0
@@ -1108,7 +1103,7 @@ shoes_image_motion(VALUE self, int x, int y, char *touch)
0
GET_STRUCT(image, self_t);
0
click = ATTR(self_t->attr, click);
0
- if (self_t->
surface == NULL) return Qnil;
0
+ if (self_t->
cached == NULL) return Qnil;
0
if (IS_INSIDE(self_t, x, y))
0
@@ -1466,7 +1461,8 @@ shoes_pattern_mark(shoes_pattern *pattern)
0
shoes_pattern_free(shoes_pattern *pattern)
0
- cairo_pattern_destroy(pattern->pattern);
0
+ if (pattern->pattern != NULL)
0
+ cairo_pattern_destroy(pattern->pattern);
0
RUBY_CRITICAL(free(pattern));
0
@@ -1501,7 +1497,6 @@ shoes_pattern_gradient(shoes_pattern *pattern, VALUE r1, VALUE r2, VALUE attr)
0
shoes_color_grad_stop(pattern->pattern, 0.0, r1);
0
shoes_color_grad_stop(pattern->pattern, 1.0, r2);
0
- pattern->width = pattern->height = 1.;
0
@@ -1544,13 +1539,13 @@ shoes_pattern_new(VALUE klass, VALUE source, VALUE attr, VALUE parent)
0
if (rb_obj_is_kind_of(source, cColor))
0
pattern->pattern = shoes_color_pattern(source);
0
- pattern->width = pattern->height = 1.;
0
-
cairo_surface_t *surface = shoes_load_image(source, &pattern->width, &pattern->height, TRUE);
0
+
pattern->cached = shoes_load_image(source);
0
pattern->source = source;
0
- pattern->pattern = cairo_pattern_create_for_surface(surface);
0
+ if (pattern->cached->pattern == NULL)
0
+ pattern->cached->pattern = cairo_pattern_create_for_surface(pattern->cached->surface);
0
cairo_pattern_set_extend(pattern->pattern, CAIRO_EXTEND_REPEAT);
0
@@ -1584,7 +1579,7 @@ shoes_background_draw(VALUE self, VALUE c, VALUE actual)
0
cairo_matrix_t matrix1, matrix2;
0
double r = 0., sw = 1.;
0
- SETUP(shoes_pattern, REL_TILE,
self_t->width, self_t->height);
0
+ SETUP(shoes_pattern, REL_TILE,
PATTERN_DIM(self_t, width), PATTERN_DIM(self_t, height));
0
r = ATTR2(dbl, self_t->attr, curve, 0.);
0
@@ -1593,7 +1588,7 @@ shoes_background_draw(VALUE self, VALUE c, VALUE actual)
0
cairo_translate(canvas->cr, place.ix + place.dx, place.iy + place.dy);
0
shoes_cairo_rect(canvas->cr, 0, 0, place.iw, place.ih, r);
0
- cairo_set_source(canvas->cr,
self_t->pattern);
0
+ cairo_set_source(canvas->cr,
PATTERN(self_t));
0
cairo_fill(canvas->cr);
0
cairo_restore(canvas->cr);
0
@@ -1608,7 +1603,7 @@ shoes_border_draw(VALUE self, VALUE c, VALUE actual)
0
cairo_matrix_t matrix1, matrix2;
0
double r = 0., sw = 1.;
0
- SETUP(shoes_pattern, REL_TILE,
self_t->width, self_t->height);
0
+ SETUP(shoes_pattern, REL_TILE,
PATTERN_DIM(self_t, width), PATTERN_DIM(self_t, height));
0
r = ATTR2(dbl, self_t->attr, curve, 0.);
0
sw = ATTR2(dbl, self_t->attr, strokewidth, 1.);
0
@@ -1622,7 +1617,7 @@ shoes_border_draw(VALUE self, VALUE c, VALUE actual)
0
cairo_save(canvas->cr);
0
cairo_translate(canvas->cr, place.ix + place.dx, place.iy + place.dy);
0
- cairo_set_source(canvas->cr,
self_t->pattern);
0
+ cairo_set_source(canvas->cr,
PATTERN(self_t));
0
shoes_cairo_rect(canvas->cr, 0, 0, place.iw, place.ih, r);
0
cairo_set_antialias(canvas->cr, CAIRO_ANTIALIAS_NONE);
0
cairo_set_line_width(canvas->cr, sw);
0
@@ -1643,10 +1638,9 @@ shoes_subpattern_new(VALUE klass, VALUE pat, VALUE parent)
0
Data_Get_Struct(obj, shoes_pattern, back);
0
Data_Get_Struct(pat, shoes_pattern, pattern);
0
back->source = pattern->source;
0
+ back->cached = pattern->cached;
0
back->pattern = pattern->pattern;
0
cairo_pattern_reference(back->pattern);
0
- back->width = pattern->width;
0
- back->height = pattern->height;
0
back->attr = pattern->attr;
Comments
No one has commented yet.