Enlightenment CVS committal Author : urandom Project : e17 Module : libs/etk
Dir : e17/libs/etk/src/lib Modified Files: etk_shadow.c Log Message: themers can specify the shadow and border colors of EtkShadow =================================================================== RCS file: /cvs/e/e17/libs/etk/src/lib/etk_shadow.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- etk_shadow.c 29 Oct 2006 11:39:54 -0000 1.3 +++ etk_shadow.c 3 Jan 2007 19:08:00 -0000 1.4 @@ -57,42 +57,42 @@ static Etk_Bool _etk_shadow_edge_visible(Etk_Shadow *shadow, Etk_Shadow_Object_Id object_id); static int _etk_shadow_gaussian_values[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, - 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, - 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, - 14, 15, 15, 16, 16, 17, 17, 17, 18, 18, 19, 19, 20, 20, 21, - 21, 22, 22, 23, 24, 24, 25, 25, 26, 26, 27, 28, 28, 29, 30, - 30, 31, 32, 32, 33, 34, 35, 35, 36, 37, 38, 38, 39, 40, 41, - 42, 42, 43, 44, 45, 46, 47, 48, 49, 50, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 76, 77, 78, 79, 80, 81, 83, 84, 85, 86, 88, - 89, 90, 91, 93, 94, 95, 96, 98, 99, 100, 101, 103, 104, 105, - 107, 108, 109, 110, 112, 113, 114, 116, 117, 118, 120, 121, - 122, 124, 125, 126, 128, 129, 130, 132, 133, 134, 136, 137, - 138, 140, 141, 142, 144, 145, 146, 147, 149, 150, 151, 153, - 154, 155, 156, 158, 159, 160, 161, 163, 164, 165, 166, 168, - 169, 170, 171, 173, 174, 175, 176, 177, 178, 180, 181, 182, - 183, 184, 185, 186, 187, 188, 190, 191, 192, 193, 194, 195, - 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 205, 206, - 207, 208, 209, 210, 211, 212, 212, 213, 214, 215, 216, 216, - 217, 218, 219, 219, 220, 221, 222, 222, 223, 224, 224, 225, - 226, 226, 227, 228, 228, 229, 229, 230, 230, 231, 232, 232, - 233, 233, 234, 234, 235, 235, 236, 236, 237, 237, 237, 238, - 238, 239, 239, 240, 240, 240, 241, 241, 241, 242, 242, 242, - 243, 243, 243, 244, 244, 244, 245, 245, 245, 245, 246, 246, - 246, 246, 247, 247, 247, 247, 248, 248, 248, 248, 248, 249, - 249, 249, 249, 249, 250, 250, 250, 250, 250, 250, 250, 251, - 251, 251, 251, 251, 251, 251, 251, 252, 252, 252, 252, 252, - 252, 252, 252, 252, 252, 252, 253, 253, 253, 253, 253, 253, - 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, + 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, + 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, + 14, 15, 15, 16, 16, 17, 17, 17, 18, 18, 19, 19, 20, 20, 21, + 21, 22, 22, 23, 24, 24, 25, 25, 26, 26, 27, 28, 28, 29, 30, + 30, 31, 32, 32, 33, 34, 35, 35, 36, 37, 38, 38, 39, 40, 41, + 42, 42, 43, 44, 45, 46, 47, 48, 49, 50, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 76, 77, 78, 79, 80, 81, 83, 84, 85, 86, 88, + 89, 90, 91, 93, 94, 95, 96, 98, 99, 100, 101, 103, 104, 105, + 107, 108, 109, 110, 112, 113, 114, 116, 117, 118, 120, 121, + 122, 124, 125, 126, 128, 129, 130, 132, 133, 134, 136, 137, + 138, 140, 141, 142, 144, 145, 146, 147, 149, 150, 151, 153, + 154, 155, 156, 158, 159, 160, 161, 163, 164, 165, 166, 168, + 169, 170, 171, 173, 174, 175, 176, 177, 178, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 205, 206, + 207, 208, 209, 210, 211, 212, 212, 213, 214, 215, 216, 216, + 217, 218, 219, 219, 220, 221, 222, 222, 223, 224, 224, 225, + 226, 226, 227, 228, 228, 229, 229, 230, 230, 231, 232, 232, + 233, 233, 234, 234, 235, 235, 236, 236, 237, 237, 237, 238, + 238, 239, 239, 240, 240, 240, 241, 241, 241, 242, 242, 242, + 243, 243, 243, 244, 244, 244, 245, 245, 245, 245, 246, 246, + 246, 246, 247, 247, 247, 247, 248, 248, 248, 248, 248, 249, + 249, 249, 249, 249, 250, 250, 250, 250, 250, 250, 250, 251, + 251, 251, 251, 251, 251, 251, 251, 252, 252, 252, 252, 252, + 252, 252, 252, 252, 252, 252, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 254, + 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, + 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, + 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, + 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 255 }; @@ -117,7 +117,7 @@ { shadow_type = etk_type_new("Etk_Shadow", ETK_BIN_TYPE, sizeof(Etk_Shadow), ETK_CONSTRUCTOR(_etk_shadow_constructor), NULL); - + etk_type_property_add(shadow_type, "shadow_type", ETK_SHADOW_SHADOW_TYPE_PROPERTY, ETK_PROPERTY_INT, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_int(ETK_SHADOW_NONE)); etk_type_property_add(shadow_type, "shadow_edges", ETK_SHADOW_SHADOW_EDGES_PROPERTY, @@ -136,7 +136,7 @@ ETK_PROPERTY_INT, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_int(0)); etk_type_property_add(shadow_type, "border_color", ETK_SHADOW_BORDER_COLOR_PROPERTY, ETK_PROPERTY_OTHER, ETK_PROPERTY_NO_ACCESS, NULL); - + shadow_type->property_set = _etk_shadow_property_set; shadow_type->property_get = _etk_shadow_property_get; } @@ -150,7 +150,7 @@ */ Etk_Widget *etk_shadow_new(void) { - return etk_widget_new(ETK_SHADOW_TYPE, NULL); + return etk_widget_new(ETK_SHADOW_TYPE, "theme_group", "shadow", NULL); } /** @@ -168,7 +168,7 @@ { if (!shadow) return; - + if (shadow->type != type) { shadow->type = type; @@ -199,7 +199,7 @@ shadow->color.a = ETK_CLAMP(opacity, 0, 255); etk_object_notify(ETK_OBJECT(shadow), "shadow_opacity"); } - + shadow->shadow_need_recalc = ETK_TRUE; etk_widget_size_recalc_queue(ETK_WIDGET(shadow)); } @@ -218,7 +218,7 @@ { if (!shadow) return; - + if (type) *type = shadow->type; if (edges) *edges = shadow->edges; if (radius) *radius = shadow->radius; @@ -237,14 +237,14 @@ void etk_shadow_shadow_color_set(Etk_Shadow *shadow, int r, int g, int b) { int i; - + if (!shadow) return; - + shadow->color.r = ETK_CLAMP(r, 0, 255); shadow->color.g = ETK_CLAMP(g, 0, 255); shadow->color.b = ETK_CLAMP(b, 0, 255); - + evas_color_argb_premul(shadow->color.a, &r, &g, &b); for (i = 0; i < 4; i++) { @@ -254,7 +254,7 @@ shadow->color.g, shadow->color.b, shadow->color.a); } } - + etk_object_notify(ETK_OBJECT(shadow), "shadow_color"); } @@ -269,7 +269,7 @@ { if (!shadow) return; - + if (r) *r = shadow->color.r; if (g) *g = shadow->color.g; if (b) *b = shadow->color.b; @@ -284,10 +284,10 @@ { if (!shadow || shadow->border_width == ETK_MAX(0, border_width)) return; - + shadow->border_width = ETK_MAX(0, border_width); etk_object_notify(ETK_OBJECT(shadow), "border"); - + shadow->border_need_recalc = ETK_TRUE; etk_widget_size_recalc_queue(ETK_WIDGET(shadow)); } @@ -316,15 +316,15 @@ void etk_shadow_border_color_set(Etk_Shadow *shadow, int r, int g, int b, int a) { int i; - + if (!shadow) return; - + shadow->border_color.r = ETK_CLAMP(r, 0, 255); shadow->border_color.g = ETK_CLAMP(g, 0, 255); shadow->border_color.b = ETK_CLAMP(b, 0, 255); shadow->border_color.a = ETK_CLAMP(a, 0, 255); - + for (i = 0; i < 4; i++) { if (shadow->border_objs[i]) @@ -333,7 +333,7 @@ shadow->border_color.g, shadow->border_color.b, shadow->border_color.a); } } - + etk_object_notify(ETK_OBJECT(shadow), "border_color"); } @@ -349,7 +349,7 @@ { if (!shadow) return; - + if (r) *r = shadow->border_color.r; if (g) *g = shadow->border_color.g; if (b) *b = shadow->border_color.b; @@ -366,38 +366,38 @@ static void _etk_shadow_constructor(Etk_Shadow *shadow) { int i; - + if (!shadow) return; - + shadow->type = ETK_SHADOW_NONE; shadow->edges = ETK_SHADOW_ALL; shadow->offset_x = 0; shadow->offset_y = 0; shadow->radius = 20; - shadow->color.r = 0; - shadow->color.g = 0; - shadow->color.b = 0; - shadow->color.a = 155; + shadow->color.r = -1; + shadow->color.g = -1; + shadow->color.b = -1; + shadow->color.a = -1; shadow->border_width = 0; - shadow->border_color.r = 0; - shadow->border_color.g = 0; - shadow->border_color.b = 0; - shadow->border_color.a = 255; - + shadow->border_color.r = -1; + shadow->border_color.g = -1; + shadow->border_color.b = -1; + shadow->border_color.a = -1; + shadow->shadow_need_recalc = ETK_FALSE; shadow->border_need_recalc = ETK_FALSE; - + shadow->clip = NULL; for (i = 0; i < 4; i++) { shadow->shadow_objs[i] = NULL; shadow->border_objs[i] = NULL; } - + ETK_WIDGET(shadow)->size_request = _etk_shadow_size_request; ETK_WIDGET(shadow)->size_allocate = _etk_shadow_size_allocate; - + etk_signal_connect("realize", ETK_OBJECT(shadow), ETK_CALLBACK(_etk_shadow_realized_cb), NULL); etk_signal_connect("unrealize", ETK_OBJECT(shadow), ETK_CALLBACK(_etk_shadow_unrealized_cb), NULL); } @@ -489,7 +489,7 @@ if (!(shadow = ETK_SHADOW(widget)) || !size) return; - + if (shadow->type == ETK_SHADOW_OUTSIDE) { size->w = 2 * shadow->radius; @@ -500,7 +500,7 @@ size->w = 0; size->h = 0; } - + container_width = etk_container_border_width_get(ETK_CONTAINER(shadow)); size->w += 2 * (shadow->border_width + container_width); size->h += 2 * (shadow->border_width + container_width); @@ -508,7 +508,7 @@ if ((child = etk_bin_child_get(ETK_BIN(shadow)))) { Etk_Size child_size; - + etk_widget_size_request(child, &child_size); size->w += child_size.w; size->h += child_size.h; @@ -524,22 +524,22 @@ if (!(shadow = ETK_SHADOW(widget))) return; - + evas_object_move(shadow->clip, geometry.x, geometry.y); evas_object_resize(shadow->clip, geometry.w, geometry.h); - + if (shadow->shadow_need_recalc) _etk_shadow_shadow_recalc(shadow); if (shadow->border_need_recalc) _etk_shadow_border_recalc(shadow); - + /* Render the shadow */ if (shadow->type != ETK_SHADOW_NONE) { Etk_Geometry geometries[4]; int offsets[4]; int i, j; - + offsets[ETK_SHADOW_LEFT_OBJECT] = -shadow->offset_x; offsets[ETK_SHADOW_RIGHT_OBJECT] = shadow->offset_x; offsets[ETK_SHADOW_TOP_OBJECT] = -shadow->offset_y; @@ -549,7 +549,7 @@ for (i = 0; i < 4; i++) offsets[i] = -offsets[i]; } - + /* Calculate the geometry of the shadow objects */ for (i = 0; i < 4; i++) { @@ -610,7 +610,7 @@ } } } - + /* Render the shadow objects */ for (i = 0; i < 4; i++) { @@ -621,7 +621,7 @@ evas_object_image_fill_set(obj, 0, 0, geometries[i].w, geometries[i].h); } } - + if (shadow->type == ETK_SHADOW_OUTSIDE) { geometry.x += shadow->radius - shadow->offset_x; @@ -630,8 +630,8 @@ geometry.h -= 2 * shadow->radius; } } - - + + /* Render the border */ if (shadow->border_width > 0) { @@ -655,25 +655,25 @@ evas_object_move(obj, geometry.x + shadow->border_width, geometry.y + geometry.h - shadow->border_width); evas_object_resize(obj, geometry.w - (2 * shadow->border_width), shadow->border_width); } - + geometry.x += shadow->border_width; geometry.y += shadow->border_width; geometry.w -= 2 * shadow->border_width; geometry.h -= 2 * shadow->border_width; } - + /* Allocate size for the child */ if ((child = etk_bin_child_get(ETK_BIN(shadow)))) { int container_border; - + container_border = etk_container_border_width_get(ETK_CONTAINER(shadow)); geometry.x += container_border; geometry.y += container_border; geometry.w -= 2 * container_border; geometry.h -= 2 * container_border; - + etk_widget_size_allocate(child, geometry); } } @@ -689,14 +689,43 @@ { Etk_Shadow *shadow; Evas *evas; - + if (!(shadow = ETK_SHADOW(object)) || !(evas = etk_widget_toplevel_evas_get(ETK_WIDGET(shadow)))) return; - + shadow->clip = evas_object_rectangle_add(evas); evas_object_show(shadow->clip); etk_widget_member_object_add(ETK_WIDGET(shadow), shadow->clip); - + + if (shadow->color.r == -1 || shadow->color.g == -1 || + shadow->color.b == -1 || shadow->color.a == -1) + { + if (etk_widget_theme_data_get(ETK_WIDGET(shadow), "color", "%d %d %d %d", + &shadow->color.r, &shadow->color.g, + &shadow->color.b, &shadow->color.a) != 4) + { + shadow->color.r = 0; + shadow->color.g = 0; + shadow->color.b = 0; + shadow->color.a = 155; + } + } + + if (shadow->border_color.r == -1 || shadow->border_color.g == -1 || + shadow->border_color.b == -1 || shadow->border_color.a == -1) + { + if (etk_widget_theme_data_get(ETK_WIDGET(shadow), + "border_color", "%d %d %d %d", + &shadow->border_color.r, &shadow->border_color.g, + &shadow->border_color.b, &shadow->border_color.a) != 4) + { + shadow->border_color.r = 0; + shadow->border_color.g = 0; + shadow->border_color.b = 0; + shadow->border_color.a = 255; + } + } + shadow->shadow_need_recalc = ETK_TRUE; shadow->border_need_recalc = ETK_TRUE; } @@ -706,10 +735,10 @@ { Etk_Shadow *shadow; int i; - + if (!(shadow = ETK_SHADOW(object))) return; - + shadow->clip = NULL; for (i = 0; i < 4; i++) { @@ -739,12 +768,12 @@ int size, prev_size, next_size; Etk_Size shadow_size; Etk_Color color; - + if (!shadow || !shadow->shadow_need_recalc) return; if (!(evas = etk_widget_toplevel_evas_get(ETK_WIDGET(shadow)))) return; - + for (i = 0; i < 4; i++) { if (shadow->shadow_objs[i]) @@ -753,10 +782,10 @@ shadow->shadow_objs[i] = NULL; } } - + if ((shadow->edges == ETK_SHADOW_NO_EDGE) || (blur_size = BLUR_SIZE_GET(shadow)) <= 0) return; - + /* Calculate the pixels of the shadow */ pixels = malloc(blur_size * sizeof(uint32_t)); for (i = 0; i < blur_size; i++) @@ -764,7 +793,7 @@ j = (i * _etk_shadow_num_gaussian_values) / blur_size; pixels[i] = _etk_shadow_gaussian_values[ETK_CLAMP(j, 0, _etk_shadow_num_gaussian_values - 1)]; } - + offsets[ETK_SHADOW_LEFT_OBJECT] = -shadow->offset_x; offsets[ETK_SHADOW_RIGHT_OBJECT] = shadow->offset_x; offsets[ETK_SHADOW_TOP_OBJECT] = -shadow->offset_y; @@ -774,22 +803,22 @@ for (i = 0; i < 4; i++) offsets[i] = -offsets[i]; } - + color = shadow->color; evas_color_argb_premul(color.a, &color.r, &color.g, &color.b); - + for (i = 0; i < 4; i++) { if (!_etk_shadow_edge_visible(shadow, i)) continue; - + prev_id = (i == 0) ? 3 : (i - 1); next_id = (i + 1) % 4; - + size = shadow->radius + offsets[i]; prev_size = shadow->radius + offsets[prev_id]; next_size = shadow->radius + offsets[next_id]; - + /* Calculate the size of the shadow object */ border_prev = 0; border_next = 0; @@ -797,7 +826,7 @@ border_prev = ETK_MAX(blur_size - prev_size, blur_size); if (_etk_shadow_edge_visible(shadow, next_id)) border_next = ETK_MAX(next_size, blur_size); - + if (IS_HORIZONTAL(i)) { shadow_size.w = border_prev + border_next + EDGE_SIZE; @@ -808,7 +837,7 @@ shadow_size.w = size; shadow_size.h = border_prev + border_next + EDGE_SIZE; } - + /* Create the shadow object */ obj = evas_object_image_add(evas); shadow->shadow_objs[i] = obj; @@ -817,10 +846,10 @@ evas_object_color_set(obj, color.r, color.g, color.b, color.a); evas_object_clip_set(obj, shadow->clip); evas_object_show(obj); - + evas_object_image_size_set(obj, shadow_size.w, shadow_size.h); evas_object_image_alpha_set(obj, 1); - + /* Calculate the pixels of the shadow */ if ((data = evas_object_image_data_get(obj, 1))) { @@ -838,7 +867,7 @@ c = PIXEL_COMBINE(c, PIXEL_GET(next_size, y)); else if (y >= shadow_size.h - border_prev) c = PIXEL_COMBINE(c, PIXEL_GET(prev_size, prev_size + shadow_size.h - y - 1)); - + *data = (c << 24) | (c << 16) | (c << 8) | c; data++; } @@ -856,7 +885,7 @@ c = PIXEL_COMBINE(c, PIXEL_GET(prev_size, x + prev_size)); else if (x >= shadow_size.w - border_next) c = PIXEL_COMBINE(c, PIXEL_GET(next_size, shadow_size.w - x - 1)); - + *data = (c << 24) | (c << 16) | (c << 8) | c; data++; } @@ -874,7 +903,7 @@ c = PIXEL_COMBINE(c, PIXEL_GET(prev_size, y + prev_size)); else if (y >= shadow_size.h - border_next) c = PIXEL_COMBINE(c, PIXEL_GET(next_size, shadow_size.h - y - 1)); - + *data = (c << 24) | (c << 16) | (c << 8) | c; data++; } @@ -892,7 +921,7 @@ c = PIXEL_COMBINE(c, PIXEL_GET(next_size, x)); else if (x >= shadow_size.w - border_prev) c = PIXEL_COMBINE(c, PIXEL_GET(prev_size, prev_size + shadow_size.w - x - 1)); - + *data = (c << 24) | (c << 16) | (c << 8) | c; data++; } @@ -904,7 +933,7 @@ evas_object_image_data_update_add(obj, 0, 0, shadow_size.w, shadow_size.h); } } - + free(pixels); shadow->shadow_need_recalc = ETK_FALSE; } @@ -915,12 +944,12 @@ Evas *evas; Evas_Object *obj; int i; - + if (!shadow || !shadow->border_need_recalc) return; if (!(evas = etk_widget_toplevel_evas_get(ETK_WIDGET(shadow)))) return; - + /* Create or destroy the border objects */ for (i = 0; i < 4; i++) { @@ -941,7 +970,7 @@ evas_object_show(obj); } } - + shadow->border_need_recalc = ETK_FALSE; } @@ -949,10 +978,10 @@ static Etk_Bool _etk_shadow_edge_visible(Etk_Shadow *shadow, Etk_Shadow_Object_Id object_id) { Etk_Shadow_Edges edge; - + if (!shadow) return ETK_FALSE; - + switch (object_id) { case ETK_SHADOW_LEFT_OBJECT: @@ -971,7 +1000,7 @@ edge = ETK_SHADOW_NO_EDGE; break; } - + return (shadow->edges & edge); } ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs