Enlightenment CVS committal

Author  : dj2
Project : e17
Module  : libs/ewl

Dir     : e17/libs/ewl/src/lib


Modified Files:
        ewl_spectrum.c 


Log Message:
- spectrum patch from Peter Wehrfritz. Thanks.
- fixes lots of resizing, value changed, initial placement issues with the
  cross hairs

===================================================================
RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_spectrum.c,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -3 -r1.21 -r1.22
--- ewl_spectrum.c      9 Apr 2006 15:59:33 -0000       1.21
+++ ewl_spectrum.c      10 Apr 2006 16:01:06 -0000      1.22
@@ -13,20 +13,30 @@
 static void ewl_spectrum_hsv_from_rgb(Ewl_Spectrum *sp);
 static void ewl_spectrum_rgb_from_hsv(Ewl_Spectrum *sp);
 static void ewl_spectrum_draw(Ewl_Spectrum *sp);
-static void ewl_spectrum_mouse_process(Ewl_Spectrum *sp, unsigned int x, 
-                                                       unsigned int y);
-
+static void ewl_spectrum_cross_hairs_draw(Ewl_Spectrum *sp);
+static void ewl_spectrum_mouse_process(Ewl_Spectrum *sp, int x, int y);
 static void ewl_spectrum_hsv_to_rgb(double h, double s, double v,
-                                               int *r, int *g, int *b);
+                                       int *r, int *g, int *b);
+static void ewl_spectrum_rgb_to_hsv(int r, int g, int b,
+                                       double *h, double *s, double *v);
 static void ewl_spectrum_color_coord_map(Ewl_Spectrum *sp, int x, int y, 
                                        int w, int h, unsigned int *r, 
                                        unsigned int *g, unsigned int *b);
+static void ewl_spectrum_color_coord_xy_get(Ewl_Spectrum *sp, int *x, int *y, 
+                                       int w, int h, unsigned int r, 
+                                       unsigned int g, unsigned int b);
 static void ewl_spectrum_color_coord_map_vertical(Ewl_Spectrum *sp, int y, 
                                int img_h, unsigned int *r, 
                                unsigned int *g, unsigned int *b);
 static void ewl_spectrum_color_coord_map_square(Ewl_Spectrum *sp, int x, 
                                int y, int img_w, int img_h, unsigned int *r, 
                                unsigned int *g, unsigned int *b);
+static void ewl_spectrum_color_coord_vertical_y_get(Ewl_Spectrum *sp, 
+                               int *y, int img_h,
+                               unsigned int r, unsigned int g, unsigned int b);
+static void ewl_spectrum_color_coord_square_xy_get(Ewl_Spectrum *sp,
+                               int *x, int *y, int img_w, int img_h,
+                               unsigned int r, unsigned int g, unsigned int b);
 
 /**
  * @return Returns a new Ewl_Spectrum widget or NULL on failure
@@ -56,7 +66,7 @@
 
 /**
  * @param sp: The Ewl_Spectrum to init
- * @return Returns TRUEE on success or FALSE on failure
+ * @return Returns TRUE on success or FALSE on failure
  * @brief Initializes an Ewl_Specturm widget to default values
  */
 int
@@ -309,6 +319,7 @@
                                        CURRENT_W(sp), CURRENT_H(sp));
 
        ewl_spectrum_draw(sp);
+       ewl_spectrum_cross_hairs_draw(sp);
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
@@ -370,50 +381,31 @@
 }
 
 static void
-ewl_spectrum_mouse_process(Ewl_Spectrum *sp, unsigned int x, unsigned int y)
+ewl_spectrum_mouse_process(Ewl_Spectrum *sp, int x, int y)
 {
        Evas_Coord img_w, img_h;
        unsigned int r, g, b;
-       unsigned int mx, my;
 
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR("sp", sp);
        DCHECK_TYPE("sp", sp, EWL_SPECTRUM_TYPE);
+       
+       x -= CURRENT_X(sp->canvas);
+       y -= CURRENT_Y(sp->canvas);
+
+       if (x < 0)
+               x = 0;
+       if (y < 0)
+               y = 0;
+       if (x > CURRENT_W(sp->canvas))
+               x = CURRENT_W(sp->canvas);
+       if (y > CURRENT_H(sp->canvas))
+               y = CURRENT_H(sp->canvas);
 
-       if (x > (CURRENT_X(sp->canvas) + CURRENT_W(sp->canvas)))
-               x = CURRENT_X(sp->canvas) + CURRENT_W(sp->canvas);
-       if (y > (CURRENT_Y(sp->canvas) + CURRENT_H(sp->canvas)))
-               y = CURRENT_Y(sp->canvas) + CURRENT_H(sp->canvas);
-
-       mx = x - CURRENT_X(sp->canvas);
-       my = y - CURRENT_Y(sp->canvas);
        evas_object_image_size_get(EWL_IMAGE(sp->canvas)->image, &img_w, 
&img_h);
-       ewl_spectrum_color_coord_map(sp, mx, my, img_w, img_h, &r, &g, &b);
+       ewl_spectrum_color_coord_map(sp, x, y, img_w, img_h, &r, &g, &b);
        ewl_spectrum_rgb_set(sp, r, g, b);
 
-       /* place the horizontal cross hair */
-       y -= CURRENT_H(sp->cross_hairs.horizontal) / 2;
-       ewl_object_position_request(EWL_OBJECT(sp->cross_hairs.horizontal), 
-                                                       CURRENT_X(sp), y);
-       ewl_object_w_request(EWL_OBJECT(sp->cross_hairs.horizontal), 
-                                                       CURRENT_W(sp));
-
-       if (!VISIBLE(sp->cross_hairs.horizontal))
-               ewl_widget_show(sp->cross_hairs.horizontal);
-
-       /* place the vertical cross hair if needed */
-       if (sp->type == EWL_SPECTRUM_TYPE_SQUARE)
-       {
-               x -= CURRENT_W(sp->cross_hairs.vertical) / 2;
-               
ewl_object_position_request(EWL_OBJECT(sp->cross_hairs.vertical), 
-                                                       x, CURRENT_Y(sp));
-               ewl_object_h_request(EWL_OBJECT(sp->cross_hairs.vertical), 
-                                                       CURRENT_H(sp));
-
-               if (!VISIBLE(sp->cross_hairs.vertical))
-                       ewl_widget_show(sp->cross_hairs.vertical);
-       }
-
        ewl_callback_call(EWL_WIDGET(sp), EWL_CALLBACK_VALUE_CHANGED);
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
@@ -422,38 +414,16 @@
 static void
 ewl_spectrum_hsv_from_rgb(Ewl_Spectrum *sp)
 {
-       unsigned int min, max;
-
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR("sp", sp);
        DCHECK_TYPE("sp", sp, EWL_SPECTRUM_TYPE);
 
-       min = MIN(sp->rgb.r, MIN(sp->rgb.g, sp->rgb.b));
-       max = MAX(sp->rgb.r, MAX(sp->rgb.g, sp->rgb.b));
-
-       sp->hsv.v = max / 255.0;
-       sp->hsv.s = (max != 0) ? ((max - min) / (float)max) : 0.0;
-
-       if (sp->hsv.s == 0.0) 
-               sp->hsv.h = 0;
-       else
-       {
-               unsigned int delta;
-
-               delta = max - min;
-               if ((unsigned int)sp->rgb.r == max)
-                       sp->hsv.h = (sp->rgb.g - sp->rgb.b) / (float)delta;
-               else if ((unsigned int)sp->rgb.g == max)
-                       sp->hsv.h = 2.0 + ((sp->rgb.b - sp->rgb.r) / 
(float)delta);
-               else if ((unsigned int)sp->rgb.b == max)
-                       sp->hsv.h = 4.0 + ((sp->rgb.r - sp->rgb.g) / 
(float)delta);
-
-               sp->hsv.h *= 60.0;
-               if (sp->hsv.h < 0.0) sp->hsv.h += 360.0;
-       }
+       ewl_spectrum_rgb_to_hsv(sp->rgb.r, sp->rgb.g, sp->rgb.b,
+                       &(sp->hsv.h), &(sp->hsv.s), &(sp->hsv.v));
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
+
 static void
 ewl_spectrum_rgb_from_hsv(Ewl_Spectrum *sp)
 {
@@ -469,7 +439,7 @@
 
 static void
 ewl_spectrum_hsv_to_rgb(double h, double s, double v,
-                               int *r, int *g, int *b)
+                       int *r, int *g, int *b)
 {
        unsigned int r_tmp = 0, g_tmp = 0, b_tmp = 0;
 
@@ -551,6 +521,45 @@
 }
 
 static void
+ewl_spectrum_rgb_to_hsv(int r, int g, int b,
+                       double *h, double *s, double *v)
+{
+       unsigned int min, max;
+       double tmp_h, tmp_s, tmp_v;
+
+       DENTER_FUNCTION(DLEVEL_STABLE);
+
+       min = MIN(r, MIN(g, b));
+       max = MAX(r, MAX(g, b));
+
+       tmp_v = max / 255.0;
+       tmp_s = (max != 0) ? ((max - min) / (float)max) : 0.0;
+       tmp_h = 0.0;
+
+       if (tmp_s != 0.0)
+       {
+               unsigned int delta;
+
+               delta = max - min;
+               if ((unsigned int)r == max)
+                       tmp_h = (g - b) / (float)delta;
+               else if ((unsigned int)g == max)
+                       tmp_h = 2.0 + ((b - r) / (float)delta);
+               else if ((unsigned int)b == max)
+                       tmp_h = 4.0 + ((r - g) / (float)delta);
+
+               tmp_h *= 60.0;
+               if (tmp_h < 0.0) tmp_h += 360.0;
+       }
+       
+       if (h) *h = tmp_h;
+       if (s) *s = tmp_s;
+       if (v) *v = tmp_v;
+
+       DLEAVE_FUNCTION(DLEVEL_STABLE);
+}
+
+static void
 ewl_spectrum_draw(Ewl_Spectrum *sp)
 {
        Evas_Object *img;
@@ -590,6 +599,47 @@
 }
 
 static void
+ewl_spectrum_cross_hairs_draw(Ewl_Spectrum *sp)
+{
+       int x, y;
+       Evas_Coord img_w, img_h;
+       DENTER_FUNCTION(DLEVEL_STABLE);
+       DCHECK_PARAM_PTR("sp", sp);
+       DCHECK_TYPE("sp", sp, EWL_SPECTRUM_TYPE);
+       
+       /* get the coords */
+       evas_object_image_size_get(EWL_IMAGE(sp->canvas)->image, &img_w, 
&img_h);
+       ewl_spectrum_color_coord_xy_get(sp, &x, &y, img_w, img_h, 
+                                       sp->rgb.r, sp->rgb.g, sp->rgb.b);
+       x += CURRENT_X(sp->canvas);
+       y += CURRENT_Y(sp->canvas);
+       /* place the horizontal cross hair */
+       y -= CURRENT_H(sp->cross_hairs.horizontal) / 2;
+       ewl_object_position_request(EWL_OBJECT(sp->cross_hairs.horizontal), 
+                                                       CURRENT_X(sp), y);
+       ewl_object_w_request(EWL_OBJECT(sp->cross_hairs.horizontal), 
+                                                       CURRENT_W(sp));
+
+       if (!VISIBLE(sp->cross_hairs.horizontal))
+               ewl_widget_show(sp->cross_hairs.horizontal);
+
+       /* place the vertical cross hair if needed */
+       if (sp->type == EWL_SPECTRUM_TYPE_SQUARE)
+       {
+               x -= CURRENT_W(sp->cross_hairs.vertical) / 2;
+               
ewl_object_position_request(EWL_OBJECT(sp->cross_hairs.vertical), 
+                                                       x, CURRENT_Y(sp));
+               ewl_object_h_request(EWL_OBJECT(sp->cross_hairs.vertical), 
+                                                       CURRENT_H(sp));
+
+               if (!VISIBLE(sp->cross_hairs.vertical))
+                       ewl_widget_show(sp->cross_hairs.vertical);
+       }
+       
+       DLEAVE_FUNCTION(DLEVEL_STABLE);
+}
+
+static void
 ewl_spectrum_color_coord_map(Ewl_Spectrum *sp, int x, int y, int img_w, int 
img_h,
                                unsigned int *r, unsigned int *g, unsigned int 
*b)
 {
@@ -605,6 +655,25 @@
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
 
+static void ewl_spectrum_color_coord_xy_get(Ewl_Spectrum *sp, int *x, int *y, 
+                                       int w, int h, unsigned int r,
+                                       unsigned int g, unsigned int b)
+{
+       DENTER_FUNCTION(DLEVEL_STABLE);
+       DCHECK_PARAM_PTR("sp", sp);
+
+       if (sp->type == EWL_SPECTRUM_TYPE_VERTICAL) {
+               ewl_spectrum_color_coord_vertical_y_get(sp, y, h, r, g, b);
+               if (x) *x = 0;
+       }
+       else
+               ewl_spectrum_color_coord_square_xy_get(sp, x, y, w, 
+                                                       h, r, g, b);
+
+       DLEAVE_FUNCTION(DLEVEL_STABLE);
+}                                      
+
+
 static void
 ewl_spectrum_color_coord_map_vertical(Ewl_Spectrum *sp, int y, int img_h,
                                        unsigned int *r, unsigned int *g, 
unsigned int *b)
@@ -625,14 +694,14 @@
        switch (sp->mode)
        {
                case EWL_COLOR_MODE_RGB_RED:
-                       r_tmp = sp->rgb.r - ((sp->rgb.r * y) / img_h);
+                       r_tmp = 255 - ((255 * y) / img_h);
                        break;
 
                case EWL_COLOR_MODE_RGB_GREEN:
-                       g_tmp = sp->rgb.g - ((sp->rgb.g * y) / img_h);
+                       g_tmp = 255 - ((255 * y) / img_h);
                        break;
                case EWL_COLOR_MODE_RGB_BLUE:
-                       b_tmp = sp->rgb.b - ((sp->rgb.b * y) / img_h);
+                       b_tmp = 255 - ((255 * y) / img_h);
                        break;
 
                case EWL_COLOR_MODE_HSV_HUE:
@@ -720,6 +789,113 @@
        if (r) *r = r_tmp;
        if (g) *g = g_tmp;
        if (b) *b = b_tmp;
+
+       DLEAVE_FUNCTION(DLEVEL_STABLE);
+}
+
+static void
+ewl_spectrum_color_coord_vertical_y_get(Ewl_Spectrum *sp, int *y, int img_h,
+                                       unsigned int r, unsigned int g, 
unsigned int b)
+{
+       int tmp_y;
+       double h, s, v;
+
+       DENTER_FUNCTION(DLEVEL_STABLE);
+       DCHECK_PARAM_PTR("sp", sp);
+
+       tmp_y = 0;
+       switch (sp->mode)
+       {
+               case EWL_COLOR_MODE_RGB_RED:
+                       tmp_y = ((255 - r) * img_h) / 255;
+                       break;
+
+               case EWL_COLOR_MODE_RGB_GREEN:
+                       tmp_y = ((255 - g) * img_h) / 255;
+                       break;
+               case EWL_COLOR_MODE_RGB_BLUE:
+                       tmp_y = ((255 - b) * img_h) / 255;
+                       break;
+
+               case EWL_COLOR_MODE_HSV_HUE:
+                       ewl_spectrum_rgb_to_hsv(r, b, g, &h, &s, &v);
+                       tmp_y = (int) (((360.0 - h) * img_h) / 360.0);
+                       break;
+
+               case EWL_COLOR_MODE_HSV_SATURATION:
+                       ewl_spectrum_rgb_to_hsv(r, b, g, &h, &s, &v);
+                       tmp_y = (int) ((1.0 - s) * img_h);
+                       break;
+
+               case EWL_COLOR_MODE_HSV_VALUE:
+                       ewl_spectrum_rgb_to_hsv(r, b, g, &h, &s, &v);
+                       tmp_y = (int) ((1.0 - v) * img_h);
+                       break;
+
+               default:
+                       break;
+       }
+
+       if (y) *y = tmp_y;
+
+       DLEAVE_FUNCTION(DLEVEL_STABLE);
+}
+
+
+static void
+ewl_spectrum_color_coord_square_xy_get(Ewl_Spectrum *sp, int *x, int *y, int 
img_w, int img_h,
+                                       unsigned int r, unsigned int g, 
unsigned int b)
+{
+       int tmp_x, tmp_y;
+       double h, s, v;
+
+       DENTER_FUNCTION(DLEVEL_STABLE);
+       DCHECK_PARAM_PTR("sp", sp);
+
+       tmp_x = 0;
+       tmp_y = 0;
+       
+       switch (sp->mode)
+       {
+               case EWL_COLOR_MODE_RGB_RED:
+                       tmp_x = (int) ((1.0 - b / 255.0) * img_w);
+                       tmp_y = (int) ((1.0 - g / 255.0) * img_h);
+                       break;
+
+               case EWL_COLOR_MODE_RGB_GREEN:
+                       tmp_x = (int) ((1.0 - b / 255.0) * img_w);
+                       tmp_y = (int) ((1.0 - r / 255.0) * img_h);
+                       break;
+
+               case EWL_COLOR_MODE_RGB_BLUE:
+                       tmp_x = (int) ((1.0 - g / 255.0) * img_w);
+                       tmp_y = (int) ((1.0 - r / 255.0) * img_h);
+                       break;
+
+               case EWL_COLOR_MODE_HSV_HUE:
+                       ewl_spectrum_rgb_to_hsv(r, b, g, &h, &s, &v);
+                       tmp_x = (int) ((1.0 - v) * img_w);
+                       tmp_y = (int) ((1.0 - s) * img_h);
+                       break;
+
+               case EWL_COLOR_MODE_HSV_SATURATION:
+                       ewl_spectrum_rgb_to_hsv(r, b, g, &h, &s, &v);
+                       tmp_x = (int) ((1.0 - (h / 360.0)) * img_w);
+                       tmp_y = (int) ((1.0 - v) * img_h);
+                       break;
+
+               case EWL_COLOR_MODE_HSV_VALUE:
+                       ewl_spectrum_rgb_to_hsv(r, b, g, &h, &s, &v);
+                       tmp_x = (int) ((1.0 - (h / 360.0)) * img_w);
+                       tmp_y = (int) ((1.0 - s) * img_h);
+                       break;
+
+               default:
+                       break;
+       }
+
+       if (x) *x = tmp_x;
+       if (y) *y = tmp_y;
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }




-------------------------------------------------------
This SF.Net email is sponsored by xPML, a groundbreaking scripting language
that extends applications into web and mobile media. Attend the live webcast
and join the prime developer group breaking into this new coding territory!
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to