[gtk+] gdk: calculate pixel color shift and precision lazily



commit 70d689cddda0dc616af97e8ed047d0c0acf7c7a6
Author: Paolo Borelli <pborelli gnome org>
Date:   Sat Feb 27 11:43:18 2016 +0100

    gdk: calculate pixel color shift and precision lazily
    
    This gets rid of the decompose_mask utility entirely and simplifies
    backend code.

 gdk/broadway/gdkvisual-broadway.c |   18 -------
 gdk/gdkvisual.c                   |   92 ++++++++++++++++--------------------
 gdk/gdkvisualprivate.h            |   12 -----
 gdk/quartz/gdkvisual-quartz.c     |   10 ----
 gdk/win32/gdkvisual-win32.c       |   48 ++++++++-----------
 gdk/x11/gdkvisual-x11.c           |   26 +----------
 gdk/x11/gdkwindow-x11.c           |   13 ++++--
 7 files changed, 73 insertions(+), 146 deletions(-)
---
diff --git a/gdk/broadway/gdkvisual-broadway.c b/gdk/broadway/gdkvisual-broadway.c
index 6ea2fab..9550682 100644
--- a/gdk/broadway/gdkvisual-broadway.c
+++ b/gdk/broadway/gdkvisual-broadway.c
@@ -84,15 +84,6 @@ _gdk_broadway_screen_init_visuals (GdkScreen *screen)
   visuals[0]->blue_mask = 0xff;
   visuals[0]->colormap_size = 256;
   visuals[0]->bits_per_rgb = 8;
-  gdk_visual_decompose_mask (visuals[0]->red_mask,
-                            &visuals[0]->red_shift,
-                            &visuals[0]->red_prec);
-  gdk_visual_decompose_mask (visuals[0]->green_mask,
-                            &visuals[0]->green_shift,
-                            &visuals[0]->green_prec);
-  gdk_visual_decompose_mask (visuals[0]->blue_mask,
-                            &visuals[0]->blue_shift,
-                            &visuals[0]->blue_prec);
 
   visuals[1] = g_object_new (GDK_TYPE_BROADWAY_VISUAL, NULL);
   visuals[1]->screen = screen;
@@ -104,15 +95,6 @@ _gdk_broadway_screen_init_visuals (GdkScreen *screen)
   visuals[1]->blue_mask = 0xff;
   visuals[1]->colormap_size = 256;
   visuals[1]->bits_per_rgb = 8;
-  gdk_visual_decompose_mask (visuals[1]->red_mask,
-                            &visuals[1]->red_shift,
-                            &visuals[1]->red_prec);
-  gdk_visual_decompose_mask (visuals[1]->green_mask,
-                            &visuals[1]->green_shift,
-                            &visuals[1]->green_prec);
-  gdk_visual_decompose_mask (visuals[1]->blue_mask,
-                            &visuals[1]->blue_shift,
-                            &visuals[1]->blue_prec);
 
   broadway_screen->system_visual = visuals[1];
   broadway_screen->rgba_visual = visuals[0];
diff --git a/gdk/gdkvisual.c b/gdk/gdkvisual.c
index 3539e40..d580c6b 100644
--- a/gdk/gdkvisual.c
+++ b/gdk/gdkvisual.c
@@ -351,6 +351,44 @@ gdk_visual_get_bits_per_rgb (GdkVisual *visual)
   return visual->bits_per_rgb;
 }
 
+static void
+gdk_visual_get_pixel_details (GdkVisual *visual,
+                              gulong     pixel_mask,
+                              guint32   *mask,
+                              gint      *shift,
+                              gint      *precision)
+{
+  gulong m = 0;
+  gint s = 0;
+  gint p = 0;
+
+  if (pixel_mask != 0)
+    {
+      m = pixel_mask;
+      while (!(m & 0x1))
+        {
+          s++;
+          m >>= 1;
+        }
+
+      m = pixel_mask;
+      while (m & 0x1)
+        {
+          p++;
+          m >>= 1;
+        }
+    }
+
+  if (mask)
+    *mask = pixel_mask;
+
+  if (shift)
+    *shift = s;
+
+  if (precision)
+    *precision = p;
+}
+
 /**
  * gdk_visual_get_red_pixel_details:
  * @visual: A #GdkVisual
@@ -374,14 +412,7 @@ gdk_visual_get_red_pixel_details (GdkVisual *visual,
 {
   g_return_if_fail (GDK_IS_VISUAL (visual));
 
-  if (mask)
-    *mask = visual->red_mask;
-
-  if (shift)
-    *shift = visual->red_shift;
-
-  if (precision)
-    *precision = visual->red_prec;
+  gdk_visual_get_pixel_details (visual, visual->red_mask, mask, shift, precision);
 }
 
 /**
@@ -407,14 +438,7 @@ gdk_visual_get_green_pixel_details (GdkVisual *visual,
 {
   g_return_if_fail (GDK_IS_VISUAL (visual));
 
-  if (mask)
-    *mask = visual->green_mask;
-
-  if (shift)
-    *shift = visual->green_shift;
-
-  if (precision)
-    *precision = visual->green_prec;
+  gdk_visual_get_pixel_details (visual, visual->green_mask, mask, shift, precision);
 }
 
 /**
@@ -440,14 +464,7 @@ gdk_visual_get_blue_pixel_details (GdkVisual *visual,
 {
   g_return_if_fail (GDK_IS_VISUAL (visual));
 
-  if (mask)
-    *mask = visual->blue_mask;
-
-  if (shift)
-    *shift = visual->blue_shift;
-
-  if (precision)
-    *precision = visual->blue_prec;
+  gdk_visual_get_pixel_details (visual, visual->blue_mask, mask, shift, precision);
 }
 
 /**
@@ -467,30 +484,3 @@ gdk_visual_get_screen (GdkVisual *visual)
 
   return visual->screen;
 }
-
-void
-gdk_visual_decompose_mask (gulong  mask,
-                           gint   *shift,
-                           gint   *prec)
-{
-  *shift = 0;
-  *prec = 0;
-
-  if (mask == 0)
-    {
-      g_warning ("Mask is 0 in visual. Server bug ?");
-      return;
-    }
-
-  while (!(mask & 0x1))
-    {
-      (*shift)++;
-      mask >>= 1;
-    }
-
-  while (mask & 0x1)
-    {
-      (*prec)++;
-      mask >>= 1;
-    }
-}
diff --git a/gdk/gdkvisualprivate.h b/gdk/gdkvisualprivate.h
index 3375f23..597221e 100644
--- a/gdk/gdkvisualprivate.h
+++ b/gdk/gdkvisualprivate.h
@@ -40,16 +40,8 @@ struct _GdkVisual
   gint bits_per_rgb;
 
   guint32 red_mask;
-  gint red_shift;
-  gint red_prec;
-
   guint32 green_mask;
-  gint green_shift;
-  gint green_prec;
-
   guint32 blue_mask;
-  gint blue_shift;
-  gint blue_prec;
 
   GdkScreen *screen;
 };
@@ -59,10 +51,6 @@ struct _GdkVisualClass
   GObjectClass parent_class;
 };
 
-void        gdk_visual_decompose_mask       (gulong  mask,
-                                             gint   *shift,
-                                             gint   *prec);
-
 G_END_DECLS
 
 #endif
diff --git a/gdk/quartz/gdkvisual-quartz.c b/gdk/quartz/gdkvisual-quartz.c
index 9f52e6e..ea7d2c8 100644
--- a/gdk/quartz/gdkvisual-quartz.c
+++ b/gdk/quartz/gdkvisual-quartz.c
@@ -55,16 +55,6 @@ create_standard_visual (GdkScreen *screen,
   visual->red_mask = 0xff0000;
   visual->green_mask = 0xff00;
   visual->blue_mask = 0xff;
-  
-  gdk_visual_decompose_mask (visual->red_mask,
-                            &visual->red_shift,
-                            &visual->red_prec);
-  gdk_visual_decompose_mask (visual->green_mask,
-                            &visual->green_shift,
-                            &visual->green_prec);
-  gdk_visual_decompose_mask (visual->blue_mask,
-                            &visual->blue_shift,
-                            &visual->blue_prec);
 
   return visual;
 }
diff --git a/gdk/win32/gdkvisual-win32.c b/gdk/win32/gdkvisual-win32.c
index fd2a7f9..c14be04 100644
--- a/gdk/win32/gdkvisual-win32.c
+++ b/gdk/win32/gdkvisual-win32.c
@@ -38,6 +38,20 @@ static gint available_depths[1];
 
 static GdkVisualType available_types[1];
 
+static gint
+get_color_precision (gulong mask)
+{
+  gint p = 0;
+
+  while (mask & 0x1)
+    {
+      p++;
+      mask >>= 1;
+    }
+
+  return p;
+}
+
 static void
 _gdk_visual_init_internal (GdkScreen *screen, gboolean is_rgba)
 {
@@ -206,38 +220,18 @@ _gdk_visual_init_internal (GdkScreen *screen, gboolean is_rgba)
   visual->byte_order = GDK_LSB_FIRST;
   visual->bits_per_rgb = 42; /* Not used? */
 
-  if ((visual->type == GDK_VISUAL_TRUE_COLOR) ||
-      (visual->type == GDK_VISUAL_DIRECT_COLOR))
-    {
-      gdk_visual_decompose_mask (visual->red_mask,
-                                &visual->red_shift,
-                                &visual->red_prec);
-
-      gdk_visual_decompose_mask (visual->green_mask,
-                                &visual->green_shift,
-                                &visual->green_prec);
-
-      gdk_visual_decompose_mask (visual->blue_mask,
-                                &visual->blue_shift,
-                                &visual->blue_prec);
-      map_entries = 1 << (MAX (visual->red_prec,
-                              MAX (visual->green_prec,
-                                   visual->blue_prec)));
-    }
-  else
+  if ((visual->type != GDK_VISUAL_TRUE_COLOR) &&
+      (visual->type != GDK_VISUAL_DIRECT_COLOR))
     {
       visual->red_mask = 0;
-      visual->red_shift = 0;
-      visual->red_prec = 0;
-
       visual->green_mask = 0;
-      visual->green_shift = 0;
-      visual->green_prec = 0;
-
       visual->blue_mask = 0;
-      visual->blue_shift = 0;
-      visual->blue_prec = 0;
     }
+  else
+    map_entries = 1 << (MAX (get_color_precision (visual->red_mask),
+                             MAX (get_color_precision (visual->green_mask),
+                                  get_color_precision (visual->blue_mask))));
+
   visual->colormap_size = map_entries;
 
   available_depths[0] = visual->depth;
diff --git a/gdk/x11/gdkvisual-x11.c b/gdk/x11/gdkvisual-x11.c
index 0614fc0..e59ebf7 100644
--- a/gdk/x11/gdkvisual-x11.c
+++ b/gdk/x11/gdkvisual-x11.c
@@ -175,34 +175,12 @@ _gdk_x11_screen_init_visuals (GdkScreen *screen)
          visuals[nvisuals]->bits_per_rgb = visual_list[i].bits_per_rgb;
          GDK_X11_VISUAL (visuals[nvisuals])->xvisual = visual_list[i].visual;
 
-         if ((visuals[nvisuals]->type == GDK_VISUAL_TRUE_COLOR) ||
-             (visuals[nvisuals]->type == GDK_VISUAL_DIRECT_COLOR))
-           {
-             gdk_visual_decompose_mask (visuals[nvisuals]->red_mask,
-                                        &visuals[nvisuals]->red_shift,
-                                        &visuals[nvisuals]->red_prec);
-
-             gdk_visual_decompose_mask (visuals[nvisuals]->green_mask,
-                                        &visuals[nvisuals]->green_shift,
-                                        &visuals[nvisuals]->green_prec);
-
-             gdk_visual_decompose_mask (visuals[nvisuals]->blue_mask,
-                                        &visuals[nvisuals]->blue_shift,
-                                        &visuals[nvisuals]->blue_prec);
-           }
-         else
+         if ((visuals[nvisuals]->type != GDK_VISUAL_TRUE_COLOR) &&
+             (visuals[nvisuals]->type != GDK_VISUAL_DIRECT_COLOR))
            {
              visuals[nvisuals]->red_mask = 0;
-             visuals[nvisuals]->red_shift = 0;
-             visuals[nvisuals]->red_prec = 0;
-
              visuals[nvisuals]->green_mask = 0;
-             visuals[nvisuals]->green_shift = 0;
-             visuals[nvisuals]->green_prec = 0;
-
              visuals[nvisuals]->blue_mask = 0;
-             visuals[nvisuals]->blue_shift = 0;
-             visuals[nvisuals]->blue_prec = 0;
            }
 
          nvisuals += 1;
diff --git a/gdk/x11/gdkwindow-x11.c b/gdk/x11/gdkwindow-x11.c
index 8544de8..91a4e19 100644
--- a/gdk/x11/gdkwindow-x11.c
+++ b/gdk/x11/gdkwindow-x11.c
@@ -2920,6 +2920,7 @@ gdk_window_x11_set_back_color (GdkWindow *window,
           * it's likely alpha, so we set them to 1s.
           */
          guint padding, pixel;
+         gint red_prec, red_shift, green_prec, green_shift, blue_prec, blue_shift;
 
          /* Shifting by >= width-of-type isn't defined in C */
          if (visual->depth >= 32)
@@ -2928,10 +2929,14 @@ gdk_window_x11_set_back_color (GdkWindow *window,
            padding = ((~(guint32)0)) << visual->depth;
          
          pixel = ~ (visual->red_mask | visual->green_mask | visual->blue_mask | padding);
-         
-         pixel += (((int) (red   * ((1 << visual->red_prec  ) - 1))) << visual->red_shift  ) +
-                  (((int) (green * ((1 << visual->green_prec) - 1))) << visual->green_shift) +
-                  (((int) (blue  * ((1 << visual->blue_prec ) - 1))) << visual->blue_shift );
+
+          gdk_visual_get_red_pixel_details (visual, NULL, &red_shift, &red_prec);
+          gdk_visual_get_green_pixel_details (visual, NULL, &green_shift, &green_prec);
+          gdk_visual_get_blue_pixel_details (visual, NULL, &blue_shift, &blue_prec);
+
+          pixel += (((int) (red   * ((1 << red_prec  ) - 1))) << red_shift  ) +
+                   (((int) (green * ((1 << green_prec) - 1))) << green_shift) +
+                   (((int) (blue  * ((1 << blue_prec ) - 1))) << blue_shift );
 
           XSetWindowBackground (GDK_WINDOW_XDISPLAY (window),
                                 GDK_WINDOW_XID (window), pixel);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]