GitHub Sale: sign up for any paid plan this week and pay nothing until January 1, 2009!  [ hide ]

public
Description: a tiny graphical app kit for ruby
Homepage: http://code.whytheluckystiff.net/shoes
Clone URL: git://github.com/why/shoes.git
 * shoes/ruby.c: add the outer/inner glow effect for image blocks.
why (author)
Sun May 11 23:24:25 -0700 2008
commit  879069d618e4475d23906a17c5aa6d8b14407c71
tree    482386a006a329476b7db48fc7cb54d8c122140a
parent  5d85bb6a5cc8b827fa591fb22511fa0bd7537efb
...
703
704
705
706
707
708
 
 
 
 
 
 
 
 
709
710
711
...
713
714
715
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
716
717
718
...
721
722
723
724
725
726
727
 
 
 
 
 
 
 
 
 
728
729
730
...
703
704
705
 
 
 
706
707
708
709
710
711
712
713
714
715
716
...
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
...
749
750
751
 
 
 
 
752
753
754
755
756
757
758
759
760
761
762
763
0
@@ -703,9 +703,14 @@ shoes_canvas_blur(int argc, VALUE *argv, VALUE self)
0
   rb_scan_args(argc, argv, "02", &x, &y);
0
   if (NIL_P(y)) y = x;
0
 
0
- attr = rb_hash_new();
0
- if (!NIL_P(x)) rb_hash_aset(attr, ID2SYM(s_width), x);
0
- if (!NIL_P(y)) rb_hash_aset(attr, ID2SYM(s_height), y);
0
+ if (rb_obj_is_kind_of(x, rb_cHash))
0
+ attr = x;
0
+ else
0
+ {
0
+ attr = rb_hash_new();
0
+ if (!NIL_P(x)) rb_hash_aset(attr, ID2SYM(s_width), x);
0
+ if (!NIL_P(y)) rb_hash_aset(attr, ID2SYM(s_height), y);
0
+ }
0
 
0
   fx = shoes_effect_new(cBlur, attr, self);
0
   rb_ary_push(canvas->contents, fx);
0
@@ -713,6 +718,29 @@ shoes_canvas_blur(int argc, VALUE *argv, VALUE self)
0
 }
0
 
0
 VALUE
0
+shoes_canvas_glow(int argc, VALUE *argv, VALUE self)
0
+{
0
+ VALUE x, y, fx, attr;
0
+ SETUP();
0
+
0
+ rb_scan_args(argc, argv, "02", &x, &y);
0
+ if (NIL_P(y)) y = x;
0
+
0
+ if (rb_obj_is_kind_of(x, rb_cHash))
0
+ attr = x;
0
+ else
0
+ {
0
+ attr = rb_hash_new();
0
+ if (!NIL_P(x)) rb_hash_aset(attr, ID2SYM(s_width), x);
0
+ if (!NIL_P(y)) rb_hash_aset(attr, ID2SYM(s_height), y);
0
+ }
0
+
0
+ fx = shoes_effect_new(cGlow, attr, self);
0
+ rb_ary_push(canvas->contents, fx);
0
+ return fx;
0
+}
0
+
0
+VALUE
0
 shoes_canvas_shadow(int argc, VALUE *argv, VALUE self)
0
 {
0
   VALUE dist, x, y, fx, attr;
0
@@ -721,10 +749,15 @@ shoes_canvas_shadow(int argc, VALUE *argv, VALUE self)
0
   rb_scan_args(argc, argv, "03", &dist, &x, &y);
0
   if (NIL_P(y)) y = x;
0
 
0
- attr = rb_hash_new();
0
- if (!NIL_P(dist)) rb_hash_aset(attr, ID2SYM(s_distance), dist);
0
- if (!NIL_P(x)) rb_hash_aset(attr, ID2SYM(s_width), x);
0
- if (!NIL_P(y)) rb_hash_aset(attr, ID2SYM(s_height), y);
0
+ if (rb_obj_is_kind_of(x, rb_cHash))
0
+ attr = x;
0
+ else
0
+ {
0
+ attr = rb_hash_new();
0
+ if (!NIL_P(dist)) rb_hash_aset(attr, ID2SYM(s_distance), dist);
0
+ if (!NIL_P(x)) rb_hash_aset(attr, ID2SYM(s_width), x);
0
+ if (!NIL_P(y)) rb_hash_aset(attr, ID2SYM(s_height), y);
0
+ }
0
 
0
   fx = shoes_effect_new(cShadow, attr, self);
0
   rb_ary_push(canvas->contents, fx);
...
332
333
334
 
335
336
337
...
332
333
334
335
336
337
338
0
@@ -332,6 +332,7 @@ VALUE shoes_canvas_background(int, VALUE *, VALUE);
0
 VALUE shoes_canvas_border(int, VALUE *, VALUE);
0
 VALUE shoes_canvas_video(int, VALUE *, VALUE);
0
 VALUE shoes_canvas_blur(int, VALUE *, VALUE);
0
+VALUE shoes_canvas_glow(int, VALUE *, VALUE);
0
 VALUE shoes_canvas_shadow(int, VALUE *, VALUE);
0
 VALUE shoes_canvas_image(int, VALUE *, VALUE);
0
 VALUE shoes_canvas_animate(int, VALUE *, VALUE);
...
11
12
13
14
 
15
16
17
18
 
19
20
21
...
1076
1077
1078
1079
 
1080
1081
1082
...
1137
1138
1139
1140
1141
 
 
 
1142
 
1143
1144
1145
1146
1147
 
 
1148
1149
1150
1151
1152
1153
1154
 
 
 
 
 
 
 
 
 
1155
1156
1157
1158
 
1159
1160
1161
...
1163
1164
1165
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1166
1167
1168
...
1251
1252
1253
 
 
1254
1255
1256
...
4238
4239
4240
 
4241
4242
4243
4244
4245
4246
 
4247
4248
4249
...
4401
4402
4403
 
4404
4405
4406
...
11
12
13
 
14
15
16
17
 
18
19
20
21
...
1076
1077
1078
 
1079
1080
1081
1082
...
1137
1138
1139
 
 
1140
1141
1142
1143
1144
1145
1146
1147
1148
 
1149
1150
1151
1152
1153
1154
1155
 
 
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
 
1168
1169
1170
1171
...
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
...
1283
1284
1285
1286
1287
1288
1289
1290
...
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
...
4437
4438
4439
4440
4441
4442
4443
0
@@ -11,11 +11,11 @@
0
 #include "shoes/version.h"
0
 #include <math.h>
0
 
0
-VALUE cShoes, cApp, cDialog, cShoesWindow, cMouse, cCanvas, cFlow, cStack, cMask, cWidget, cShape, cImage, cImageBlock, cEffect, cBlur, cShadow, cVideo, cTimerBase, cTimer, cEvery, cAnim, cPattern, cBorder, cBackground, cTextBlock, cPara, cBanner, cTitle, cSubtitle, cTagline, cCaption, cInscription, cTextClass, cSpan, cDel, cStrong, cSub, cSup, cCode, cEm, cIns, cLinkUrl, cNative, cButton, cCheck, cRadio, cEditLine, cEditBox, cListBox, cProgress, cColor, cColors, cLink, cLinkHover, ssNestSlot;
0
+VALUE cShoes, cApp, cDialog, cShoesWindow, cMouse, cCanvas, cFlow, cStack, cMask, cWidget, cShape, cImage, cImageBlock, cEffect, cBlur, cShadow, cGlow, cVideo, cTimerBase, cTimer, cEvery, cAnim, cPattern, cBorder, cBackground, cTextBlock, cPara, cBanner, cTitle, cSubtitle, cTagline, cCaption, cInscription, cTextClass, cSpan, cDel, cStrong, cSub, cSup, cCode, cEm, cIns, cLinkUrl, cNative, cButton, cCheck, cRadio, cEditLine, cEditBox, cListBox, cProgress, cColor, cColors, cLink, cLinkHover, ssNestSlot;
0
 VALUE eVlcError, eImageError, eNotImpl;
0
 VALUE reHEX_SOURCE, reHEX3_SOURCE, reRGB_SOURCE, reRGBA_SOURCE, reGRAY_SOURCE, reGRAYA_SOURCE;
0
 VALUE symAltQuest, symAltSlash, symAltDot;
0
-ID s_aref, s_mult, s_perc, s_bind, s_keys, s_update, s_new, s_run, s_to_pattern, s_to_i, s_to_s, s_angle, s_arrow, s_autoplay, s_begin, s_call, s_center, s_change, s_choose, s_click, s_corner, s_distance, s_displace_left, s_displace_top, s_downcase, s_draw, s_end, s_font, s_hand, s_hidden, s_hover, s_href, s_insert, s_items, s_release, s_scroll, s_attach, s_leading, s_leave, s_match, s_text, s_title, s_top, s_right, s_bottom, s_left, s_height, s_resizable, s_remove, s_strokewidth, s_width, s_margin, s_margin_left, s_margin_right, s_margin_top, s_margin_bottom, s_radius, s_secret, s_now, s_debug, s_error, s_warn, s_info;
0
+ID s_aref, s_mult, s_perc, s_bind, s_keys, s_update, s_new, s_run, s_to_pattern, s_to_i, s_to_s, s_angle, s_arrow, s_autoplay, s_begin, s_call, s_center, s_change, s_choose, s_click, s_corner, s_distance, s_displace_left, s_displace_top, s_downcase, s_draw, s_end, s_fill, s_font, s_hand, s_hidden, s_hover, s_href, s_inner, s_insert, s_items, s_release, s_scroll, s_attach, s_leading, s_leave, s_match, s_text, s_title, s_top, s_right, s_bottom, s_left, s_height, s_resizable, s_remove, s_strokewidth, s_width, s_margin, s_margin_left, s_margin_right, s_margin_top, s_margin_bottom, s_radius, s_secret, s_now, s_debug, s_error, s_warn, s_info;
0
 
0
 //
0
 // Mauricio's instance_eval hack (he bested my cloaker back in 06 Jun 2006)
0
@@ -1076,7 +1076,7 @@ shoes_gaussian_blur_filter(cairo_t *cr, void *data)
0
 {
0
   shoes_effect *fx = (shoes_effect *)data;
0
   RAW_FILTER_START(fx);
0
- float blur_d = ATTR2(dbl, fx->attr, radius, 1.);
0
+ float blur_d = ATTR2(dbl, fx->attr, radius, 2.);
0
   float blur_x = ATTR2(dbl, fx->attr, width, blur_d);
0
   float blur_y = ATTR2(dbl, fx->attr, height, blur_d);
0
 
0
@@ -1137,25 +1137,35 @@ shoes_gaussian_blur_filter(cairo_t *cr, void *data)
0
   return cr;
0
 }
0
 
0
-cairo_t *
0
-shoes_shadow_filter(cairo_t *cr, void *data)
0
+static cairo_t *
0
+shoes_layer_blur_filter(cairo_t *cr, void *data, cairo_operator_t blur_op,
0
+ cairo_operator_t merge_op, int distance)
0
 {
0
+ shoes_canvas *canvas;
0
   shoes_effect *fx = (shoes_effect *)data;
0
   cairo_surface_t *source = cairo_get_target(cr);
0
   int width = cairo_image_surface_get_width(source);
0
   int height = cairo_image_surface_get_height(source);
0
- int distance = ATTR2(int, fx->attr, distance, 4);
0
+ VALUE fill = ATTR(fx->attr, fill);
0
+ Data_Get_Struct(fx->parent, shoes_canvas, canvas);
0
 
0
   cairo_surface_t *target = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height);
0
   cairo_t *cr2 = cairo_create(target);
0
   cairo_set_source_surface(cr2, source, distance, distance);
0
   cairo_paint(cr2);
0
- cairo_set_operator(cr2, CAIRO_OPERATOR_IN);
0
- cairo_set_source_rgb(cr2, 0., 0., 0.);
0
+ cairo_set_operator(cr2, blur_op);
0
+ if (NIL_P(canvas->bg))
0
+ cairo_set_source_rgb(cr2, 0., 0., 0.);
0
+ else
0
+ {
0
+ shoes_pattern *pattern;
0
+ Data_Get_Struct(canvas->bg, shoes_pattern, pattern);
0
+ cairo_set_source(cr2, pattern->pattern);
0
+ }
0
   cairo_rectangle(cr2, 0, 0, width, height);
0
   cairo_paint(cr2);
0
   cairo_t *cr3 = shoes_gaussian_blur_filter(cr2, data);
0
- cairo_set_operator(cr3, CAIRO_OPERATOR_OVER);
0
+ cairo_set_operator(cr3, merge_op);
0
   cairo_set_source_surface(cr3, source, 0, 0);
0
   cairo_paint(cr3);
0
 
0
@@ -1163,6 +1173,28 @@ shoes_shadow_filter(cairo_t *cr, void *data)
0
   return cr3;
0
 }
0
 
0
+cairo_t *
0
+shoes_shadow_filter(cairo_t *cr, void *data)
0
+{
0
+ shoes_effect *fx = (shoes_effect *)data;
0
+ int distance = ATTR2(int, fx->attr, distance, 4);
0
+ return shoes_layer_blur_filter(cr, data, CAIRO_OPERATOR_IN, CAIRO_OPERATOR_OVER, distance);
0
+}
0
+
0
+cairo_t *
0
+shoes_glow_filter(cairo_t *cr, void *data)
0
+{
0
+ shoes_effect *fx = (shoes_effect *)data;
0
+ cairo_operator_t blur_op = CAIRO_OPERATOR_IN;
0
+ cairo_operator_t merge_op = CAIRO_OPERATOR_OVER;
0
+ if (RTEST(ATTR(fx->attr, inner)))
0
+ {
0
+ blur_op = CAIRO_OPERATOR_OUT;
0
+ merge_op = CAIRO_OPERATOR_DEST_ATOP;
0
+ }
0
+ return shoes_layer_blur_filter(cr, data, blur_op, merge_op, 0);
0
+}
0
+
0
 VALUE
0
 shoes_image_motion(VALUE self, int x, int y, int *touch)
0
 {
0
@@ -1251,6 +1283,8 @@ shoes_effect_new(VALUE klass, VALUE attr, VALUE parent)
0
     fx->filter = &shoes_gaussian_blur_filter;
0
   else if (klass == cShadow)
0
     fx->filter = &shoes_shadow_filter;
0
+ else if (klass == cGlow)
0
+ fx->filter = &shoes_glow_filter;
0
   return obj;
0
 }
0
 
0
@@ -4238,12 +4272,14 @@ shoes_ruby_init()
0
   s_downcase = rb_intern("downcase");
0
   s_draw = rb_intern("draw");
0
   s_end = rb_intern("end");
0
+ s_fill = rb_intern("fill");
0
   s_font = rb_intern("font");
0
   s_hand = rb_intern("hand");
0
   s_hidden = rb_intern("hidden");
0
   s_hover = rb_intern("hover");
0
   s_href = rb_intern("href");
0
   s_insert = rb_intern("insert");
0
+ s_inner = rb_intern("inner");
0
   s_items = rb_intern("items");
0
   s_match = rb_intern("match");
0
   s_leading = rb_intern("leading");
0
@@ -4401,6 +4437,7 @@ shoes_ruby_init()
0
   rb_define_method(cEffect, "remove", CASTHOOK(shoes_effect_remove), 0);
0
   cBlur = rb_define_class_under(cShoes, "Blur", cEffect);
0
   cShadow = rb_define_class_under(cShoes, "Shadow", cEffect);
0
+ cGlow = rb_define_class_under(cShoes, "Glow", cEffect);
0
 
0
 #ifdef VIDEO
0
   cVideo = rb_define_class_under(cShoes, "Video", rb_cObject);
...
45
46
47
48
 
49
50
51
52
53
 
54
55
56
...
158
159
160
 
161
162
163
...
45
46
47
 
48
49
50
51
52
 
53
54
55
56
...
158
159
160
161
162
163
164
0
@@ -45,12 +45,12 @@ typedef VALUE (*HOOK)();
0
 #define RSTRING_PTR(str) RSTRING(str)->ptr
0
 #endif
0
 
0
-extern VALUE cShoes, cApp, cDialog, cShoesWindow, cMouse, cCanvas, cFlow, cStack, cMask, cNative, cShape, cVideo, cImage, cImageBlock, cEffect, cBlur, cShadow, cEvery, cTimer, cAnim, cPattern, cBorder, cBackground, cPara, cBanner, cTitle, cSubtitle, cTagline, cCaption, cInscription, cLinkText, cTextBlock, cTextClass, cSpan, cStrong, cSub, cSup, cCode, cDel, cEm, cIns, cButton, cEditLine, cEditBox, cListBox, cProgress, cCheck, cRadio, cColor, cColors, cLink, cLinkHover, ssNestSlot;
0
+extern VALUE cShoes, cApp, cDialog, cShoesWindow, cMouse, cCanvas, cFlow, cStack, cMask, cNative, cShape, cVideo, cImage, cImageBlock, cEffect, cBlur, cShadow, cGlow, cEvery, cTimer, cAnim, cPattern, cBorder, cBackground, cPara, cBanner, cTitle, cSubtitle, cTagline, cCaption, cInscription, cLinkText, cTextBlock, cTextClass, cSpan, cStrong, cSub, cSup, cCode, cDel, cEm, cIns, cButton, cEditLine, cEditBox, cListBox, cProgress, cCheck, cRadio, cColor, cColors, cLink, cLinkHover, ssNestSlot;
0
 extern VALUE aMsgList;
0
 extern VALUE eNotImpl, eImageError;
0
 extern VALUE reHEX_SOURCE, reHEX3_SOURCE, reRGB_SOURCE, reRGBA_SOURCE, reGRAY_SOURCE, reGRAYA_SOURCE;
0
 extern VALUE symAltQuest, symAltSlash, symAltDot;
0
-extern ID s_aref, s_bind, s_keys, s_update, s_new, s_run, s_to_pattern, s_to_i, s_to_s, s_angle, s_arrow, s_attach, s_begin, s_call, s_center, s_change, s_click, s_corner, s_distance, s_displace_left, s_displace_top, s_downcase, s_draw, s_end, s_font, s_hand, s_hidden, s_href, s_insert, s_items, s_leading, s_match, s_release, s_scroll, s_text, s_title, s_top, s_right, s_bottom, s_left, s_height, s_remove, s_resizable, s_strokewidth, s_width, s_margin, s_margin_left, s_margin_right, s_margin_top, s_margin_bottom, s_radius, s_secret;
0
+extern ID s_aref, s_bind, s_keys, s_update, s_new, s_run, s_to_pattern, s_to_i, s_to_s, s_angle, s_arrow, s_attach, s_begin, s_call, s_center, s_change, s_click, s_corner, s_distance, s_displace_left, s_displace_top, s_downcase, s_draw, s_end, s_fill, s_font, s_hand, s_hidden, s_href, s_inner, s_insert, s_items, s_leading, s_match, s_release, s_scroll, s_text, s_title, s_top, s_right, s_bottom, s_left, s_height, s_remove, s_resizable, s_strokewidth, s_width, s_margin, s_margin_left, s_margin_right, s_margin_top, s_margin_bottom, s_radius, s_secret;
0
 extern VALUE instance_eval_proc;
0
 
0
 VALUE mfp_instance_eval(VALUE, VALUE);
0
@@ -158,6 +158,7 @@ void shoes_cairo_rect(cairo_t *, double, double, double, double, double);
0
   f("border", border, -1); \
0
   f("video", video, -1); \
0
   f("blur", blur, -1); \
0
+ f("glow", glow, -1); \
0
   f("shadow", shadow, -1); \
0
   f("image_file", image, -1); \
0
   f("imagesize", imagesize, 1); \

Comments

    No one has commented yet.