Enlightenment CVS committal

Author  : moom
Project : e17
Module  : proto

Dir     : e17/proto/etk/src/lib


Modified Files:
        etk_colorpicker.c 


Log Message:
* More work on the colorpicker, but it's still incomplete and a bit 
buggy.

It now uses its own optimized hsv <--> rgb conversion procedures from 
Jose. I haven't committed them to Evas because, for optimization 
purpose, they do not check if the params are valid.
Thanks Jose :)


===================================================================
RCS file: /cvs/e/e17/proto/etk/src/lib/etk_colorpicker.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -3 -r1.13 -r1.14
--- etk_colorpicker.c   18 May 2006 13:13:33 -0000      1.13
+++ etk_colorpicker.c   19 May 2006 14:17:31 -0000      1.14
@@ -45,6 +45,7 @@
 static void _etk_colorpicker_unrealize_cb(Etk_Object *object, void *data);
 static void _etk_colorpicker_slider_realize_cb(Etk_Object *object, void *data);
 static void _etk_colorpicker_slider_unrealize_cb(Etk_Object *object, void 
*data);
+static void _etk_colorpicker_slider_value_changed_cb(Etk_Object *object, 
double value, void *data);
 static void _etk_colorpicker_radio_toggled_cb(Etk_Object *object, void *data);
 
 static void _etk_colorpicker_sp_mouse_down_cb(void *data, Evas *e, Evas_Object 
*obj, void *event_info);
@@ -53,6 +54,7 @@
 static void _etk_colorpicker_vp_mouse_down_cb(void *data, Evas *e, Evas_Object 
*obj, void *event_info);
 static void _etk_colorpicker_vp_mouse_up_cb(void *data, Evas *e, Evas_Object 
*obj, void *event_info);
 static void _etk_colorpicker_vp_mouse_move_cb(void *data, Evas *e, Evas_Object 
*obj, void *event_info);
+static void _etk_colorpicker_slider_image_resize_cb(void *data, Evas *e, 
Evas_Object *obj, void *event_info);
 
 static Evas_Object *_etk_colorpicker_picker_object_add(Evas *evas, 
Etk_Colorpicker *cp, void (*move_resize)(Etk_Colorpicker *cp, int x, int y, int 
w, int h));
 static void _etk_colorpicker_picker_smart_add(Evas_Object *obj);
@@ -79,6 +81,9 @@
 static void _etk_colorpicker_vp_color_get(Etk_Colorpicker *cp, int i, int *r, 
int *g, int *b);
 static void _etk_colorpicker_color_calc(Etk_Colorpicker_Mode mode, float 
sp_xpos, float sp_ypos, float vp_pos, int *r, int *g, int *b);
 
+static void _etk_colorpicker_hsv_to_rgb(float h, float s, float v, int *r, int 
*g, int *b);
+static void _etk_colorpicker_rgb_to_hsv(int r, int g, int b, float *h, float 
*s, float *v);
+
 static Evas_Smart *_etk_colorpicker_picker_smart = NULL;
 static int _etk_colorpicker_picker_smart_use = 0;
 static Etk_Signal *_etk_colorpicker_signals[ETK_CP_NUM_SIGNALS];
@@ -154,26 +159,6 @@
 }
 
 /**
- * @brief Gets the color currently selected by the colorpicker
- * @param cp a colorpicker
- * @return Returns the color selected by the colorpicker
- */
-Etk_Color etk_colorpicker_current_color_get(Etk_Colorpicker *cp)
-{
-   if (!cp)
-   {
-      Etk_Color black;
-      black.r = 0;
-      black.g = 0;
-      black.b = 0;
-      black.a = 255;
-      return black;
-   }
-   
-   return cp->current_color;
-}
-
-/**
  * @brief Sets the color currently selected by the colorpicker
  * @param cp a colorpicker
  * @param color the color to set
@@ -183,10 +168,13 @@
    int r, g, b;
    float h, s, v;
    
+   if (cp->current_color.r == color.r && cp->current_color.g == color.g && 
cp->current_color.b == color.b)
+      return;
+   
    r = color.r;
    g = color.g;
    b = color.b;
-   evas_color_rgb_to_hsv(r, g, b, &h, &s, &v);
+   _etk_colorpicker_rgb_to_hsv(r, g, b, &h, &s, &v);
    
    switch (cp->mode)
    {
@@ -227,6 +215,26 @@
    _etk_colorpicker_update(cp, ETK_TRUE, ETK_TRUE, ETK_TRUE, ETK_TRUE);
 }
 
+/**
+ * @brief Gets the color currently selected by the colorpicker
+ * @param cp a colorpicker
+ * @return Returns the color selected by the colorpicker
+ */
+Etk_Color etk_colorpicker_current_color_get(Etk_Colorpicker *cp)
+{
+   if (!cp)
+   {
+      Etk_Color black;
+      black.r = 0;
+      black.g = 0;
+      black.b = 0;
+      black.a = 255;
+      return black;
+   }
+   
+   return cp->current_color;
+}
+
 /**************************
  *
  * Etk specific functions
@@ -290,16 +298,37 @@
       etk_widget_visibility_locked_set(cp->radios[i], ETK_TRUE);
       etk_widget_show(cp->radios[i]);
       
-      cp->sliders_image[i] = NULL;
-      cp->sliders[i] = etk_hslider_new(0.0, 1.0, 0.0, 1.0 / 255, 10.0 / 255);
+      switch (i)
+      {
+         case ETK_COLORPICKER_H:
+            cp->sliders[i] = etk_hslider_new(0.0, 360.0, 0.0, 1.0, 5.0);
+            break;
+         case ETK_COLORPICKER_S:
+         case ETK_COLORPICKER_V:
+            cp->sliders[i] = etk_hslider_new(0.0, 1.0, 0.0, 0.01, 0.05);
+            break;
+         case ETK_COLORPICKER_R:
+         case ETK_COLORPICKER_G:
+         case ETK_COLORPICKER_B:
+            cp->sliders[i] = etk_hslider_new(0.0, 255.0, 0.0, 1.0, 5.0);
+            break;
+         default:
+            break;
+      }
       etk_table_attach(ETK_TABLE(cp->table), cp->sliders[i], 1, 1, i, i,
          0, 0, ETK_FILL_POLICY_HFILL | ETK_FILL_POLICY_HEXPAND | 
ETK_FILL_POLICY_VEXPAND);
       etk_widget_visibility_locked_set(cp->sliders[i], ETK_TRUE);
       etk_widget_show(cp->sliders[i]);
+      cp->sliders_image[i] = NULL;
       
-      etk_signal_connect("toggled", ETK_OBJECT(cp->radios[i]), 
ETK_CALLBACK(_etk_colorpicker_radio_toggled_cb), cp);
-      etk_signal_connect("realize", ETK_OBJECT(cp->sliders[i]), 
ETK_CALLBACK(_etk_colorpicker_slider_realize_cb), cp);
-      etk_signal_connect("unrealize", ETK_OBJECT(cp->sliders[i]), 
ETK_CALLBACK(_etk_colorpicker_slider_unrealize_cb), cp);
+      etk_signal_connect("toggled", ETK_OBJECT(cp->radios[i]),
+         ETK_CALLBACK(_etk_colorpicker_radio_toggled_cb), cp);
+      etk_signal_connect("realize", ETK_OBJECT(cp->sliders[i]),
+         ETK_CALLBACK(_etk_colorpicker_slider_realize_cb), cp);
+      etk_signal_connect("unrealize", ETK_OBJECT(cp->sliders[i]),
+         ETK_CALLBACK(_etk_colorpicker_slider_unrealize_cb), cp);
+      etk_signal_connect("value_changed", ETK_OBJECT(cp->sliders[i]),
+         ETK_CALLBACK(_etk_colorpicker_slider_value_changed_cb), cp);
    }
    
    cp_widget->size_request = _etk_colorpicker_size_request;
@@ -495,7 +524,7 @@
    Evas *evas;
    int i;
    
-   if (!(slider = ETK_WIDGET(object)) || !(cp = ETK_COLORPICKER(data))  || 
!(evas = etk_widget_toplevel_evas_get(slider)))
+   if (!(slider = ETK_WIDGET(object)) || !(cp = ETK_COLORPICKER(data)) || 
!(evas = etk_widget_toplevel_evas_get(slider)))
       return;
    
    for (i = 0; i < 6; i++)
@@ -506,6 +535,9 @@
          evas_object_image_alpha_set(cp->sliders_image[i], 0);
          evas_object_image_size_set(cp->sliders_image[i], cp->sliders_res, 1);
          evas_object_show(cp->sliders_image[i]);
+         evas_object_event_callback_add(cp->sliders_image[i], 
EVAS_CALLBACK_RESIZE,
+            _etk_colorpicker_slider_image_resize_cb, NULL);
+         etk_widget_member_object_add(slider, cp->sliders_image[i]);
          etk_widget_theme_object_swallow(slider, "slider_image", 
cp->sliders_image[i]);
          
          _etk_colorpicker_update(cp, ETK_FALSE, ETK_FALSE, ETK_FALSE, 
ETK_FALSE);
@@ -532,6 +564,65 @@
    }
 }
 
+/* Called when the value of the slider is changed */
+static void _etk_colorpicker_slider_value_changed_cb(Etk_Object *object, 
double value, void *data)
+{
+   Etk_Widget *slider;
+   Etk_Colorpicker *cp;
+   Etk_Color color;
+   int r, g, b;
+   float h, s, v;
+   int i;
+   
+   if (!(slider = ETK_WIDGET(object)) || !(cp = ETK_COLORPICKER(data)))
+      return;
+   if (cp->sp_dragging || cp->vp_dragging)
+      return;
+   
+   r = cp->current_color.r;
+   g = cp->current_color.g;
+   b = cp->current_color.b;
+   _etk_colorpicker_rgb_to_hsv(r, g, b, &h, &s, &v);
+   
+   for (i = 0; i < 6; i++)
+   {
+      if (cp->sliders[i] == slider)
+      {
+         switch (i)
+         {
+            case ETK_COLORPICKER_H:
+               _etk_colorpicker_hsv_to_rgb(value, s, v, &color.r, &color.g, 
&color.b);
+               break;
+            case ETK_COLORPICKER_S:
+               _etk_colorpicker_hsv_to_rgb(h, value, v, &color.r, &color.g, 
&color.b);
+               break;
+            case ETK_COLORPICKER_V:
+               _etk_colorpicker_hsv_to_rgb(h, s, value, &color.r, &color.g, 
&color.b);
+               break;
+            case ETK_COLORPICKER_R:
+               color.r = (int)value;
+               color.g = g;
+               color.b = b;
+               break;
+            case ETK_COLORPICKER_G:
+               color.r = r;
+               color.g = (int)value;
+               color.b = b;
+               break;
+            case ETK_COLORPICKER_B:
+               color.r = r;
+               color.g = g;
+               color.b = (int)value;
+               break;
+            default:
+               break;
+         }
+         etk_colorpicker_current_color_set(cp, color);
+         return;
+      }
+   }
+}
+
 /* Called when the color mode is changed with the radio buttons */
 static void _etk_colorpicker_radio_toggled_cb(Etk_Object *object, void *data)
 {
@@ -640,6 +731,18 @@
    _etk_colorpicker_update(cp, ETK_TRUE, ETK_TRUE, ETK_TRUE, ETK_TRUE);
 }
 
+/* Called when the image of a slider of the colorpicker is resized */
+static void _etk_colorpicker_slider_image_resize_cb(void *data, Evas *e, 
Evas_Object *obj, void *event_info)
+{
+   Evas_Coord w, h;
+   
+   if (!obj)
+      return;
+   
+   evas_object_geometry_get(obj, NULL, NULL, &w, &h);
+   evas_object_image_fill_set(obj, 0, 0, w, h);
+}
+
 /**************************
  *
  * Colorpicker's smart object
@@ -865,6 +968,7 @@
 static void _etk_colorpicker_update(Etk_Colorpicker *cp, Etk_Bool sp_image, 
Etk_Bool sp_cursor, Etk_Bool vp_image, Etk_Bool vp_cursor)
 {
    int r, g, b;
+   float h, s, v;
    
    if (!cp)
       return;
@@ -875,18 +979,26 @@
    cp->vp_cursor_needs_update |= vp_cursor;
    cp->sliders_need_update = ETK_TRUE;
    
-   /* Updates the color */
+   /* Updates the color and the sliders */
    _etk_colorpicker_color_calc(cp->mode, cp->sp_xpos, cp->sp_ypos, cp->vp_pos, 
&r, &g, &b);
    if (cp->current_color.r != r || cp->current_color.g != g || 
cp->current_color.b != b)
    {
+      _etk_colorpicker_rgb_to_hsv(r, g, b, &h, &s, &v);
+      
+      etk_range_value_set(ETK_RANGE(cp->sliders[ETK_COLORPICKER_H]), h);
+      etk_range_value_set(ETK_RANGE(cp->sliders[ETK_COLORPICKER_S]), s);
+      etk_range_value_set(ETK_RANGE(cp->sliders[ETK_COLORPICKER_V]), v);
+      etk_range_value_set(ETK_RANGE(cp->sliders[ETK_COLORPICKER_R]), r);
+      etk_range_value_set(ETK_RANGE(cp->sliders[ETK_COLORPICKER_G]), g);
+      etk_range_value_set(ETK_RANGE(cp->sliders[ETK_COLORPICKER_B]), b);
+      
       cp->current_color.r = r;
       cp->current_color.g = g;
       cp->current_color.b = b;
+      
       etk_signal_emit(_etk_colorpicker_signals[ETK_CP_COLOR_CHANGED_SIGNAL], 
ETK_OBJECT(cp), NULL);
    }
    
-   /* TODO: update slider value!! */
-   
    etk_widget_redraw_queue(ETK_WIDGET(cp));
 }
 
@@ -998,7 +1110,7 @@
    r = cp->current_color.r;
    g = cp->current_color.g;
    b = cp->current_color.b;
-   evas_color_rgb_to_hsv(r, g, b, &h, &s, &v);
+   _etk_colorpicker_rgb_to_hsv(r, g, b, &h, &s, &v);
    
    for (i = 0; i < 6; i++)
    {
@@ -1009,13 +1121,13 @@
             switch (i)
             {
                case ETK_COLORPICKER_H:
-                  evas_color_hsv_to_rgb(360.0 * ((float)j / cp->sliders_res), 
s, v, &r2, &g2, &b2);
+                  _etk_colorpicker_hsv_to_rgb(360.0 * ((float)j / 
cp->sliders_res), s, v, &r2, &g2, &b2);
                   break;
                case ETK_COLORPICKER_S:
-                  evas_color_hsv_to_rgb(h, (float)j / cp->sliders_res, v, &r2, 
&g2, &b2);
+                  _etk_colorpicker_hsv_to_rgb(h, (float)j / cp->sliders_res, 
v, &r2, &g2, &b2);
                   break;
                case ETK_COLORPICKER_V:
-                  evas_color_hsv_to_rgb(h, s, (float)j / cp->sliders_res, &r2, 
&g2, &b2);
+                  _etk_colorpicker_hsv_to_rgb(h, s, (float)j / 
cp->sliders_res, &r2, &g2, &b2);
                   break;
                case ETK_COLORPICKER_R:
                   r2 = (255 * j) / cp->sliders_res;
@@ -1055,7 +1167,7 @@
    switch (cp->mode)
    {
       case ETK_COLORPICKER_H:
-         evas_color_hsv_to_rgb(360.0 * (1.0 - ((float)i / cp->vp_res)), 1.0, 
1.0, r, g, b);
+         _etk_colorpicker_hsv_to_rgb(360.0 * (1.0 - ((float)i / cp->vp_res)), 
1.0, 1.0, r, g, b);
          break;
       case ETK_COLORPICKER_S:
          *r = 255 - ((i * 255) / cp->vp_res);
@@ -1093,13 +1205,13 @@
    switch (mode)
    {
       case ETK_COLORPICKER_H:
-         evas_color_hsv_to_rgb(vp_pos * 360.0, sp_ypos, sp_xpos, r, g, b);
+         _etk_colorpicker_hsv_to_rgb(vp_pos * 360.0, sp_ypos, sp_xpos, r, g, 
b);
          break;
       case ETK_COLORPICKER_S:
-         evas_color_hsv_to_rgb(sp_ypos * 360.0, vp_pos, sp_xpos, r, g, b);
+         _etk_colorpicker_hsv_to_rgb(sp_ypos * 360.0, vp_pos, sp_xpos, r, g, 
b);
          break;
       case ETK_COLORPICKER_V:
-         evas_color_hsv_to_rgb(sp_ypos * 360.0, sp_xpos, vp_pos, r, g, b);
+         _etk_colorpicker_hsv_to_rgb(sp_ypos * 360.0, sp_xpos, vp_pos, r, g, 
b);
          break;
       case ETK_COLORPICKER_R:
          *r = 255 * vp_pos;
@@ -1119,6 +1231,78 @@
       default:
          break;
    }
+}
+
+/* Converts a hsv color to rgb. (r, g, b) must not be NULL! */
+static void _etk_colorpicker_hsv_to_rgb(float h, float s, float v, int *r, int 
*g, int *b)
+{
+   int i;
+   float f;
+
+   v *= 255;
+   if (s == 0)
+   {
+      *r = v;  *g = v;  *b = v;
+      return;
+   }
+
+   h /= 60;
+   i = h;
+   f = h - i;
+
+   s *= v;
+   f *= s;
+   s = v - s;
+   switch (i)
+   {
+      case 1:
+         *r = v - f;  *g = v;  *b = s;
+         return;
+      case 2:
+         *r = s;  *g = v;  *b = s + f;
+         return;
+      case 3:
+         *r = s;  *g = v - f;  *b = v;
+         return;
+      case 4:
+         *r = s + f;  *g = s;  *b = v;
+         return;
+      case 5:
+         *r = v;  *g = s;  *b = v - f;
+         return;
+      default:
+         *r = v;  *g = s + f;  *b = s;
+   }
+}
+
+/* Converts a rgb color to hsv. (h, s, v) must not be NULL! */
+static void _etk_colorpicker_rgb_to_hsv(int r, int g, int b, float *h, float 
*s, float *v)
+{
+   float  min, max, del;
+
+   min = ETK_MIN(r,g);  min = ETK_MIN(min,b);
+   max = ETK_MAX(r,g);  max = ETK_MAX(max,b);
+   del = max - min;
+
+   *v = (max / 255);
+   if ((max == 0) || (del == 0))
+   {
+      *s = 0; *h = 0;
+      return; 
+   }
+
+   *s = (del / max);
+
+   if (r == max)
+      *h = ((g - b) / del);
+   else if (g == max)
+      *h = 2 + ((b - r) / del);
+   else if (b == max)
+      *h = 4 + ((r - g) / del);
+
+   *h *= 60;
+   if (*h < 0)
+      *h += 360;
 }
 
 /** @} */




-------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to