]> Pileus Git - ~andy/gtk/blobdiff - gdk/win32/gdkvisual-win32.c
README.win32 Add HAVE_WINTAB. Undefine it if bulding without the Wintab
[~andy/gtk] / gdk / win32 / gdkvisual-win32.c
index 70f513c4e0519e2b90f2cd6cad692659bd158331..f274117954de4ba5d344210251478cdb44bb0f07 100644 (file)
 #include <gdk/gdk.h>
 #include "gdkx.h"
 
-static void  gdk_visual_add            (GdkVisual *visual);
 static void  gdk_visual_decompose_mask (gulong     mask,
                                        gint      *shift,
                                        gint      *prec);
-static guint gdk_visual_hash           (Visual    *key);
-static gint  gdk_visual_compare        (Visual    *a,
-                                       Visual    *b);
-
 
 static GdkVisualPrivate *system_visual;
-static GdkVisualPrivate *visuals;
-static gint nvisuals;
 
-static gint available_depths[7];
-static gint navailable_depths;
+static gint available_depths[1];
 
-static GdkVisualType available_types[6];
-static gint navailable_types;
+static GdkVisualType available_types[1];
 
 #ifdef G_ENABLE_DEBUG
 
@@ -62,8 +53,6 @@ static const gchar* visual_names[] =
 
 #endif /* G_ENABLE_DEBUG */
 
-static GHashTable *visual_hash = NULL;
-
 void
 gdk_visual_init (void)
 {
@@ -94,242 +83,156 @@ gdk_visual_init (void)
 
   int rastercaps, numcolors, sizepalette, colorres, bitspixel;
   Visual *default_xvisual;
-  GdkVisualPrivate temp_visual;
-  int nxvisuals;
-  int i, j;
 
-  nxvisuals = 1;
-  visuals = g_new (GdkVisualPrivate, nxvisuals);
+  system_visual = g_new (GdkVisualPrivate, 1);
+
+  bitspixel = GetDeviceCaps (gdk_DC, BITSPIXEL);
+  rastercaps = GetDeviceCaps (gdk_DC, RASTERCAPS);
+  default_xvisual = g_new (Visual, 1);
+  system_visual->xvisual = default_xvisual;
+  system_visual->xvisual->visualid = 0;
+  system_visual->xvisual->bitspixel = bitspixel;
 
-  nvisuals = 0;
-  for (i = 0; i < nxvisuals; i++)
+  if (rastercaps & RC_PALETTE)
+    {
+      system_visual->visual.type = GDK_VISUAL_PSEUDO_COLOR;
+      numcolors = GetDeviceCaps (gdk_DC, NUMCOLORS);
+      sizepalette = GetDeviceCaps (gdk_DC, SIZEPALETTE);
+      colorres = GetDeviceCaps (gdk_DC, COLORRES);
+      system_visual->xvisual->map_entries = sizepalette;
+    }
+  else if (bitspixel == 1)
+    {
+      system_visual->visual.type = GDK_VISUAL_STATIC_GRAY;
+      system_visual->xvisual->map_entries = 2;
+    }
+  else if (bitspixel == 4)
+    {
+      system_visual->visual.type = GDK_VISUAL_STATIC_COLOR;
+      system_visual->xvisual->map_entries = 16;
+    }
+  else if (bitspixel == 8)
+    {
+      system_visual->visual.type = GDK_VISUAL_STATIC_COLOR;
+      system_visual->xvisual->map_entries = 256;
+    }
+  else if (bitspixel == 16)
     {
-      if (1)
+      system_visual->visual.type = GDK_VISUAL_TRUE_COLOR;
+#if 1
+      /* This code by Mike Enright,
+       * see http://www.users.cts.com/sd/m/menright/display.html
+       */
+      memset (&bmi, 0, sizeof (bmi));
+      bmi.bi.biSize = sizeof (bmi.bi);
+
+      hbm = CreateCompatibleBitmap (gdk_DC, 1, 1);
+      GetDIBits (gdk_DC, hbm, 0, 1, NULL,
+                (BITMAPINFO *) &bmi, DIB_RGB_COLORS);
+      GetDIBits (gdk_DC, hbm, 0, 1, NULL,
+                (BITMAPINFO *) &bmi, DIB_RGB_COLORS);
+      DeleteObject (hbm);
+
+      if (bmi.bi.biCompression != BI_BITFIELDS)
        {
-         bitspixel = GetDeviceCaps (gdk_DC, BITSPIXEL);
-         rastercaps = GetDeviceCaps (gdk_DC, RASTERCAPS);
-         default_xvisual = g_new (Visual, 1);
-         visuals[nvisuals].xvisual = default_xvisual;
-         visuals[nvisuals].xvisual->visualid = nvisuals;
-         visuals[nvisuals].xvisual->bitspixel = bitspixel;
-
-         if (rastercaps & RC_PALETTE)
+         /* Either BI_RGB or BI_RLE_something
+          * .... or perhaps (!!) something else.
+          * Theoretically biCompression might be
+          * mmioFourCC('c','v','i','d') but I doubt it.
+          */
+         if (bmi.bi.biCompression == BI_RGB)
            {
-             visuals[nvisuals].visual.type = GDK_VISUAL_PSEUDO_COLOR;
-             numcolors = GetDeviceCaps (gdk_DC, NUMCOLORS);
-             sizepalette = GetDeviceCaps (gdk_DC, SIZEPALETTE);
-             colorres = GetDeviceCaps (gdk_DC, COLORRES);
-             visuals[nvisuals].xvisual->map_entries = sizepalette;
+             /* It's 555 */
+             bitspixel = 15;
+             system_visual->visual.red_mask   = 0x00007C00;
+             system_visual->visual.green_mask = 0x000003E0;
+             system_visual->visual.blue_mask  = 0x0000001F;
            }
-         else if (bitspixel == 1)
-           {
-             visuals[nvisuals].visual.type = GDK_VISUAL_STATIC_GRAY;
-             visuals[nvisuals].xvisual->map_entries = 2;
-           }
-         else if (bitspixel == 4)
+         else
            {
-             visuals[nvisuals].visual.type = GDK_VISUAL_STATIC_COLOR;
-             visuals[nvisuals].xvisual->map_entries = 16;
+             g_assert_not_reached ();
            }
-         else if (bitspixel == 8)
+       }
+      else
+       {
+         DWORD allmasks =
+           bmi.u.fields[0] | bmi.u.fields[1] | bmi.u.fields[2];
+         int k = 0;
+         while (allmasks)
            {
-             visuals[nvisuals].visual.type = GDK_VISUAL_STATIC_COLOR;
-             visuals[nvisuals].xvisual->map_entries = 256;
+             if (allmasks&1)
+               k++;
+             allmasks/=2;
            }
-         else if (bitspixel == 16)
-           {
-             visuals[nvisuals].visual.type = GDK_VISUAL_TRUE_COLOR;
-#if 1
-             /* This code by Mike Enright,
-              * see http://www.users.cts.com/sd/m/menright/display.html
-              */
-             memset (&bmi, 0, sizeof (bmi));
-             bmi.bi.biSize = sizeof (bmi.bi);
-  
-             hbm = CreateCompatibleBitmap (gdk_DC, 1, 1);
-             GetDIBits (gdk_DC, hbm, 0, 1, NULL,
-                        (BITMAPINFO *) &bmi, DIB_RGB_COLORS);
-             GetDIBits (gdk_DC, hbm, 0, 1, NULL,
-                        (BITMAPINFO *) &bmi, DIB_RGB_COLORS);
-             DeleteObject (hbm);
-
-             if (bmi.bi.biCompression != BI_BITFIELDS)
-               {
-                 /* Either BI_RGB or BI_RLE_something
-                  * .... or perhaps (!!) something else.
-                  * Theoretically biCompression might be
-                  * mmioFourCC('c','v','i','d') but I doubt it.
-                  */
-                 if (bmi.bi.biCompression == BI_RGB)
-                   {
-                     /* It's 555 */
-                     bitspixel = 15;
-                     visuals[nvisuals].visual.red_mask   = 0x00007C00;
-                     visuals[nvisuals].visual.green_mask = 0x000003E0;
-                     visuals[nvisuals].visual.blue_mask  = 0x0000001F;
-                   }
-                 else
-                   {
-                     g_assert_not_reached ();
-                   }
-               }
-             else
-               {
-                 DWORD allmasks =
-                   bmi.u.fields[0] | bmi.u.fields[1] | bmi.u.fields[2];
-                 int k = 0;
-                 while (allmasks)
-                   {
-                     if (allmasks&1)
-                       k++;
-                     allmasks/=2;
-                   }
-                 bitspixel = k;
-                 visuals[nvisuals].visual.red_mask = bmi.u.fields[0];
-                 visuals[nvisuals].visual.green_mask = bmi.u.fields[1];
-                 visuals[nvisuals].visual.blue_mask  = bmi.u.fields[2];
-               }
+         bitspixel = k;
+         system_visual->visual.red_mask = bmi.u.fields[0];
+         system_visual->visual.green_mask = bmi.u.fields[1];
+         system_visual->visual.blue_mask  = bmi.u.fields[2];
+       }
 #else
-             /* Old, incorrect (but still working) code. */
+      /* Old, incorrect (but still working) code. */
 #if 0
-             visuals[nvisuals].visual.red_mask   = 0x0000F800;
-             visuals[nvisuals].visual.green_mask = 0x000007E0;
-             visuals[nvisuals].visual.blue_mask  = 0x0000001F;
+      system_visual->visual.red_mask   = 0x0000F800;
+      system_visual->visual.green_mask = 0x000007E0;
+      system_visual->visual.blue_mask  = 0x0000001F;
 #else
-             visuals[nvisuals].visual.red_mask   = 0x00007C00;
-             visuals[nvisuals].visual.green_mask = 0x000003E0;
-             visuals[nvisuals].visual.blue_mask  = 0x0000001F;
+      system_visual->visual.red_mask   = 0x00007C00;
+      system_visual->visual.green_mask = 0x000003E0;
+      system_visual->visual.blue_mask  = 0x0000001F;
 #endif
 #endif
-           }
-         else if (bitspixel == 24 || bitspixel == 32)
-           {
-             visuals[nvisuals].visual.type = GDK_VISUAL_TRUE_COLOR;
-             visuals[nvisuals].visual.red_mask   = 0x00FF0000;
-             visuals[nvisuals].visual.green_mask = 0x0000FF00;
-             visuals[nvisuals].visual.blue_mask  = 0x000000FF;
-           }
-         else
-           g_error ("gdk_visual_init: unsupported BITSPIXEL: %d\n", bitspixel);
-
-         visuals[nvisuals].visual.depth = bitspixel;
-         visuals[nvisuals].visual.byte_order = GDK_LSB_FIRST;
-         visuals[nvisuals].visual.bits_per_rgb = 42; /* Not used? */
-
-         if ((visuals[nvisuals].visual.type == GDK_VISUAL_TRUE_COLOR) ||
-             (visuals[nvisuals].visual.type == GDK_VISUAL_DIRECT_COLOR))
-           {
-             gdk_visual_decompose_mask (visuals[nvisuals].visual.red_mask,
-                                        &visuals[nvisuals].visual.red_shift,
-                                        &visuals[nvisuals].visual.red_prec);
-
-             gdk_visual_decompose_mask (visuals[nvisuals].visual.green_mask,
-                                        &visuals[nvisuals].visual.green_shift,
-                                        &visuals[nvisuals].visual.green_prec);
-
-             gdk_visual_decompose_mask (visuals[nvisuals].visual.blue_mask,
-                                        &visuals[nvisuals].visual.blue_shift,
-                                        &visuals[nvisuals].visual.blue_prec);
-             visuals[nvisuals].xvisual->map_entries =
-               1 << (MAX (visuals[nvisuals].visual.red_prec,
-                          MAX (visuals[nvisuals].visual.green_prec,
-                               visuals[nvisuals].visual.blue_prec)));
-           }
-         else
-           {
-             visuals[nvisuals].visual.red_mask = 0;
-             visuals[nvisuals].visual.red_shift = 0;
-             visuals[nvisuals].visual.red_prec = 0;
-
-             visuals[nvisuals].visual.green_mask = 0;
-             visuals[nvisuals].visual.green_shift = 0;
-             visuals[nvisuals].visual.green_prec = 0;
-
-             visuals[nvisuals].visual.blue_mask = 0;
-             visuals[nvisuals].visual.blue_shift = 0;
-             visuals[nvisuals].visual.blue_prec = 0;
-           }
-         visuals[nvisuals].visual.colormap_size = visuals[nvisuals].xvisual->map_entries;
-
-         nvisuals += 1;
-       }
     }
-
-  for (i = 0; i < nvisuals; i++)
+  else if (bitspixel == 24 || bitspixel == 32)
     {
-      for (j = i+1; j < nvisuals; j++)
-       {
-         if (visuals[j].visual.depth >= visuals[i].visual.depth)
-           {
-             if ((visuals[j].visual.depth == 8) && (visuals[i].visual.depth == 8))
-               {
-                 if (visuals[j].visual.type == GDK_VISUAL_PSEUDO_COLOR)
-                   {
-                     temp_visual = visuals[j];
-                     visuals[j] = visuals[i];
-                     visuals[i] = temp_visual;
-                   }
-                 else if ((visuals[i].visual.type != GDK_VISUAL_PSEUDO_COLOR) &&
-                          visuals[j].visual.type > visuals[i].visual.type)
-                   {
-                     temp_visual = visuals[j];
-                     visuals[j] = visuals[i];
-                     visuals[i] = temp_visual;
-                   }
-               }
-             else if ((visuals[j].visual.depth > visuals[i].visual.depth) ||
-                      ((visuals[j].visual.depth == visuals[i].visual.depth) &&
-                       (visuals[j].visual.type > visuals[i].visual.type)))
-               {
-                 temp_visual = visuals[j];
-                 visuals[j] = visuals[i];
-                 visuals[i] = temp_visual;
-               }
-           }
-       }
+      system_visual->visual.type = GDK_VISUAL_TRUE_COLOR;
+      system_visual->visual.red_mask   = 0x00FF0000;
+      system_visual->visual.green_mask = 0x0000FF00;
+      system_visual->visual.blue_mask  = 0x000000FF;
     }
+  else
+    g_error ("gdk_visual_init: unsupported BITSPIXEL: %d\n", bitspixel);
 
-  for (i = 0; i < nvisuals; i++)
-    if (default_xvisual->visualid == visuals[i].xvisual->visualid)
-      {
-       system_visual = &visuals[i];
-       break;
-      }
+  system_visual->visual.depth = bitspixel;
+  system_visual->visual.byte_order = GDK_LSB_FIRST;
+  system_visual->visual.bits_per_rgb = 42; /* Not used? */
 
-  navailable_depths = 0;
-  for (i = 0; i < npossible_depths; i++)
+  if ((system_visual->visual.type == GDK_VISUAL_TRUE_COLOR) ||
+      (system_visual->visual.type == GDK_VISUAL_DIRECT_COLOR))
     {
-      for (j = 0; j < nvisuals; j++)
-       {
-         if (visuals[j].visual.depth == possible_depths[i])
-           {
-             available_depths[navailable_depths++] = visuals[j].visual.depth;
-             break;
-           }
-       }
+      gdk_visual_decompose_mask (system_visual->visual.red_mask,
+                                &system_visual->visual.red_shift,
+                                &system_visual->visual.red_prec);
+
+      gdk_visual_decompose_mask (system_visual->visual.green_mask,
+                                &system_visual->visual.green_shift,
+                                &system_visual->visual.green_prec);
+
+      gdk_visual_decompose_mask (system_visual->visual.blue_mask,
+                                &system_visual->visual.blue_shift,
+                                &system_visual->visual.blue_prec);
+      system_visual->xvisual->map_entries =
+       1 << (MAX (system_visual->visual.red_prec,
+                  MAX (system_visual->visual.green_prec,
+                       system_visual->visual.blue_prec)));
     }
+  else
+    {
+      system_visual->visual.red_mask = 0;
+      system_visual->visual.red_shift = 0;
+      system_visual->visual.red_prec = 0;
 
-  if (navailable_depths == 0)
-    g_error ("unable to find a usable depth");
+      system_visual->visual.green_mask = 0;
+      system_visual->visual.green_shift = 0;
+      system_visual->visual.green_prec = 0;
 
-  navailable_types = 0;
-  for (i = 0; i < npossible_types; i++)
-    {
-      for (j = 0; j < nvisuals; j++)
-       {
-         if (visuals[j].visual.type == possible_types[i])
-           {
-             available_types[navailable_types++] = visuals[j].visual.type;
-             break;
-           }
-       }
+      system_visual->visual.blue_mask = 0;
+      system_visual->visual.blue_shift = 0;
+      system_visual->visual.blue_prec = 0;
     }
+  system_visual->visual.colormap_size = system_visual->xvisual->map_entries;
 
-  for (i = 0; i < nvisuals; i++)
-    gdk_visual_add ((GdkVisual*) &visuals[i]);
-
-  if (npossible_types == 0)
-    g_error ("unable to find a usable visual type");
+  available_depths[0] = system_visual->visual.depth;
+  available_types[0] = system_visual->visual.type;
 }
 
 GdkVisual*
@@ -365,67 +268,43 @@ gdk_visual_get_system (void)
 GdkVisual*
 gdk_visual_get_best (void)
 {
-  return ((GdkVisual*) &(visuals[0]));
+  return ((GdkVisual*) system_visual);
 }
 
 GdkVisual*
 gdk_visual_get_best_with_depth (gint depth)
 {
-  GdkVisual *return_val;
-  int i;
-
-  return_val = NULL;
-  for (i = 0; i < nvisuals; i++)
-    if (depth == visuals[i].visual.depth)
-      {
-       return_val = (GdkVisual*) &(visuals[i]);
-       break;
-      }
-
-  return return_val;
+  if (depth == system_visual->visual.depth)
+    return (GdkVisual*) system_visual;
+  else
+    return NULL;
 }
 
 GdkVisual*
 gdk_visual_get_best_with_type (GdkVisualType visual_type)
 {
-  GdkVisual *return_val;
-  int i;
-
-  return_val = NULL;
-  for (i = 0; i < nvisuals; i++)
-    if (visual_type == visuals[i].visual.type)
-      {
-       return_val = (GdkVisual*) &(visuals[i]);
-       break;
-      }
-
-  return return_val;
+  if (visual_type == system_visual->visual.type)
+    return (GdkVisual*) system_visual;
+  else
+    return NULL;
 }
 
 GdkVisual*
 gdk_visual_get_best_with_both (gint          depth,
                               GdkVisualType visual_type)
 {
-  GdkVisual *return_val;
-  int i;
-
-  return_val = NULL;
-  for (i = 0; i < nvisuals; i++)
-    if ((depth == visuals[i].visual.depth) &&
-       (visual_type == visuals[i].visual.type))
-      {
-       return_val = (GdkVisual*) &(visuals[i]);
-       break;
-      }
-
-  return return_val;
+  if ((depth == system_visual->visual.depth) &&
+      (visual_type == system_visual->visual.type))
+    return (GdkVisual*) system_visual;
+  else
+    return NULL;
 }
 
 void
 gdk_query_depths  (gint **depths,
                   gint  *count)
 {
-  *count = navailable_depths;
+  *count = 1;
   *depths = available_depths;
 }
 
@@ -433,59 +312,32 @@ void
 gdk_query_visual_types (GdkVisualType **visual_types,
                        gint           *count)
 {
-  *count = navailable_types;
+  *count = 1;
   *visual_types = available_types;
 }
 
 GList*
 gdk_list_visuals (void)
 {
-  GList *list;
-  guint i;
-
-  list = NULL;
-  for (i = 0; i < nvisuals; ++i)
-    list = g_list_append (list, (gpointer) &visuals[i]);
-
-  return list;
+  return g_list_append (NULL, (gpointer) system_visual);
 }
 
 GdkVisual*
 gdk_visual_lookup (Visual *xvisual)
 {
-  GdkVisual *visual;
-
-  if (!visual_hash)
+  if (system_visual->xvisual == xvisual)
+    return (GdkVisual *) system_visual;
+  else
     return NULL;
-
-  visual = g_hash_table_lookup (visual_hash, xvisual);
-  return visual;
 }
 
 GdkVisual*
 gdkx_visual_get (VisualID xvisualid)
 {
-  int i;
-
-  for (i = 0; i < nvisuals; i++)
-    if (xvisualid == visuals[i].xvisual->visualid)
-      return (GdkVisual*) &visuals[i];
-
-  return NULL;
-}
-
-static void
-gdk_visual_add (GdkVisual *visual)
-{
-  GdkVisualPrivate *private;
-
-  if (!visual_hash)
-    visual_hash = g_hash_table_new ((GHashFunc) gdk_visual_hash,
-                                   (GCompareFunc) gdk_visual_compare);
-
-  private = (GdkVisualPrivate*) visual;
-
-  g_hash_table_insert (visual_hash, private->xvisual, visual);
+  if (xvisualid == system_visual->xvisual->visualid)
+    return (GdkVisual*) system_visual;
+  else
+    return NULL;
 }
 
 static void
@@ -508,19 +360,3 @@ gdk_visual_decompose_mask (gulong  mask,
       mask >>= 1;
     }
 }
-
-/* This hash stuff is pretty useless on Windows, as there is only
-   one visual... */
-
-static guint
-gdk_visual_hash (Visual *key)
-{
-  return key->visualid;
-}
-
-static gint
-gdk_visual_compare (Visual *a,
-                   Visual *b)
-{
-  return (a->visualid == b->visualid);
-}