win32: move gdkvisual code in gdkscreen
Except for the init function, all the visual related code is made of gdkscreen vfuncs, so let's move it to gdkscreen-win32. This way we avoid keeping other static variables and instead store the info inside the screen struct.
This commit is contained in:
		| @ -318,7 +318,6 @@ w32_introspection_files =		\ | ||||
| 	win32/gdkscreen-win32.c		\ | ||||
| 	win32/gdkselection-win32.c	\ | ||||
| 	win32/gdktestutils-win32.c	\ | ||||
| 	win32/gdkvisual-win32.c		\ | ||||
| 	win32/gdkwin32.h		\ | ||||
| 	win32/gdkwin32cursor.h		\ | ||||
| 	win32/gdkwin32display.h		\ | ||||
|  | ||||
| @ -52,7 +52,6 @@ libgdk_win32_la_SOURCES = \ | ||||
| 	gdkscreen-win32.c \ | ||||
| 	gdkselection-win32.c \ | ||||
| 	gdktestutils-win32.c \ | ||||
| 	gdkvisual-win32.c \ | ||||
| 	gdkwin32cursor.h \ | ||||
| 	gdkwin32display.h \ | ||||
| 	gdkwin32displaymanager.h \ | ||||
|  | ||||
| @ -267,7 +267,6 @@ _gdk_win32_display_open (const gchar *display_name) | ||||
|   win32_display->screen = g_object_new (GDK_TYPE_WIN32_SCREEN, NULL); | ||||
|  | ||||
|   _gdk_monitor_init (GDK_WIN32_SCREEN (win32_display->screen)); | ||||
|   _gdk_visual_init (win32_display->screen); | ||||
|   _gdk_screen_init_root_window (GDK_WIN32_SCREEN (win32_display->screen)); | ||||
|   _gdk_events_init (); | ||||
|   _gdk_input_init (_gdk_display); | ||||
|  | ||||
| @ -508,20 +508,7 @@ void _gdk_win32_window_change_property (GdkWindow    *window, | ||||
| void _gdk_win32_window_delete_property (GdkWindow *window, GdkAtom    property); | ||||
|  | ||||
| /* Stray GdkWin32Screen members */ | ||||
| GdkVisual *_gdk_win32_screen_get_system_visual (GdkScreen *screen); | ||||
| GdkVisual *_gdk_win32_screen_get_rgba_visual (GdkScreen *screen); | ||||
| gboolean _gdk_win32_screen_get_setting (GdkScreen   *screen, const gchar *name, GValue *value); | ||||
| gint _gdk_win32_screen_visual_get_best_depth (GdkScreen *screen); | ||||
| GdkVisualType _gdk_win32_screen_visual_get_best_type (GdkScreen *screen); | ||||
| GdkVisual *_gdk_win32_screen_visual_get_best (GdkScreen *screen); | ||||
| GdkVisual *_gdk_win32_screen_visual_get_best_with_depth (GdkScreen *screen, gint depth); | ||||
| GdkVisual *_gdk_win32_screen_visual_get_best_with_type (GdkScreen *screen, GdkVisualType visual_type); | ||||
| GdkVisual *_gdk_win32_screen_visual_get_best_with_both (GdkScreen *screen, gint depth, GdkVisualType visual_type); | ||||
| void _gdk_win32_screen_query_depths  (GdkScreen *screen, gint **depths, gint  *count); | ||||
| void _gdk_win32_screen_query_visual_types (GdkScreen      *screen, | ||||
| 				           GdkVisualType **visual_types, | ||||
| 				           gint           *count); | ||||
| GList *_gdk_win32_screen_list_visuals (GdkScreen *screen); | ||||
|  | ||||
| /* Distributed display manager implementation */ | ||||
| GdkDisplay *_gdk_win32_display_open (const gchar *display_name); | ||||
| @ -540,7 +527,6 @@ void _gdk_win32_windowing_init (void); | ||||
| void _gdk_screen_init_root_window (GdkWin32Screen *screen_win32); | ||||
| void _gdk_screen_init_root_window_size (GdkWin32Screen *screen); | ||||
| void _gdk_monitor_init(GdkWin32Screen *screen); | ||||
| void _gdk_visual_init (GdkScreen *screen); | ||||
| void _gdk_dnd_init    (void); | ||||
| void _gdk_events_init (void); | ||||
| void _gdk_input_wintab_init_check (GdkDeviceManager *device_manager); | ||||
|  | ||||
| @ -39,6 +39,11 @@ struct _GdkWin32Screen | ||||
|   gint num_monitors; | ||||
|   GdkWin32Monitor *monitors; | ||||
|  | ||||
|   GdkVisual *system_visual; | ||||
|   GdkVisual *rgba_visual; | ||||
|   gint available_visual_depths[1]; | ||||
|   GdkVisualType available_visual_types[1]; | ||||
|  | ||||
|   GdkWindow *root_window; | ||||
|  | ||||
|   gint always_composited : 1; | ||||
| @ -51,6 +56,206 @@ struct _GdkWin32ScreenClass | ||||
|  | ||||
| G_DEFINE_TYPE (GdkWin32Screen, gdk_win32_screen, GDK_TYPE_SCREEN) | ||||
|  | ||||
| static gint | ||||
| get_color_precision (gulong mask) | ||||
| { | ||||
|   gint p = 0; | ||||
|  | ||||
|   while (mask & 0x1) | ||||
|     { | ||||
|       p++; | ||||
|       mask >>= 1; | ||||
|     } | ||||
|  | ||||
|   return p; | ||||
| } | ||||
|  | ||||
| static GdkVisual * | ||||
| init_visual (GdkScreen *screen, | ||||
|              gboolean is_rgba) | ||||
| { | ||||
|   GdkVisual *visual; | ||||
|   struct | ||||
|   { | ||||
|     BITMAPINFOHEADER bi; | ||||
|     union | ||||
|     { | ||||
|       RGBQUAD colors[256]; | ||||
|       DWORD fields[256]; | ||||
|     } u; | ||||
|   } bmi; | ||||
|   HBITMAP hbm; | ||||
|  | ||||
|   const gint rastercaps = GetDeviceCaps (_gdk_display_hdc, RASTERCAPS); | ||||
|   const int numcolors = GetDeviceCaps (_gdk_display_hdc, NUMCOLORS); | ||||
|   gint bitspixel = GetDeviceCaps (_gdk_display_hdc, BITSPIXEL); | ||||
|   gint map_entries = 0; | ||||
|  | ||||
|   visual = g_object_new (GDK_TYPE_VISUAL, NULL); | ||||
|   visual->screen = screen; | ||||
|  | ||||
|   if (rastercaps & RC_PALETTE) | ||||
|     { | ||||
|       const int sizepalette = GetDeviceCaps (_gdk_display_hdc, SIZEPALETTE); | ||||
|       gchar *max_colors = getenv ("GDK_WIN32_MAX_COLORS"); | ||||
|       visual->type = GDK_VISUAL_PSEUDO_COLOR; | ||||
|  | ||||
|       g_assert (sizepalette == 256); | ||||
|  | ||||
|       if (max_colors != NULL) | ||||
|         _gdk_max_colors = atoi (max_colors); | ||||
|  | ||||
|       map_entries = _gdk_max_colors; | ||||
|  | ||||
|       if (map_entries >= 16 && map_entries < sizepalette) | ||||
|         { | ||||
|           if (map_entries < 32) | ||||
|             { | ||||
|               map_entries = 16; | ||||
|               visual->type = GDK_VISUAL_STATIC_COLOR; | ||||
|               bitspixel = 4; | ||||
|             } | ||||
|           else if (map_entries < 64) | ||||
|             { | ||||
|               map_entries = 32; | ||||
|               bitspixel = 5; | ||||
|             } | ||||
|           else if (map_entries < 128) | ||||
|             { | ||||
|               map_entries = 64; | ||||
|               bitspixel = 6; | ||||
|             } | ||||
|           else if (map_entries < 256) | ||||
|             { | ||||
|               map_entries = 128; | ||||
|               bitspixel = 7; | ||||
|             } | ||||
|           else | ||||
|             g_assert_not_reached (); | ||||
|         } | ||||
|       else | ||||
|         map_entries = sizepalette; | ||||
|     } | ||||
|   else if (bitspixel == 1 && numcolors == 16) | ||||
|     { | ||||
|       bitspixel = 4; | ||||
|       visual->type = GDK_VISUAL_STATIC_COLOR; | ||||
|       map_entries = 16; | ||||
|     } | ||||
|   else if (bitspixel == 1) | ||||
|     { | ||||
|       visual->type = GDK_VISUAL_STATIC_GRAY; | ||||
|       map_entries = 2; | ||||
|     } | ||||
|   else if (bitspixel == 4) | ||||
|     { | ||||
|       visual->type = GDK_VISUAL_STATIC_COLOR; | ||||
|       map_entries = 16; | ||||
|     } | ||||
|   else if (bitspixel == 8) | ||||
|     { | ||||
|       visual->type = GDK_VISUAL_STATIC_COLOR; | ||||
|       map_entries = 256; | ||||
|     } | ||||
|   else if (bitspixel == 16) | ||||
|     { | ||||
|       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_display_hdc, 1, 1); | ||||
|       GetDIBits (_gdk_display_hdc, hbm, 0, 1, NULL, | ||||
|                  (BITMAPINFO *) &bmi, DIB_RGB_COLORS); | ||||
|       GetDIBits (_gdk_display_hdc, 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; | ||||
|               visual->red_mask   = 0x00007C00; | ||||
|               visual->green_mask = 0x000003E0; | ||||
|               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; | ||||
|           visual->red_mask = bmi.u.fields[0]; | ||||
|           visual->green_mask = bmi.u.fields[1]; | ||||
|           visual->blue_mask  = bmi.u.fields[2]; | ||||
|         } | ||||
| #else | ||||
|       /* Old, incorrect (but still working) code. */ | ||||
| #if 0 | ||||
|       visual->red_mask   = 0x0000F800; | ||||
|       visual->green_mask = 0x000007E0; | ||||
|       visual->blue_mask  = 0x0000001F; | ||||
| #else | ||||
|       visual->red_mask   = 0x00007C00; | ||||
|       visual->green_mask = 0x000003E0; | ||||
|       visual->blue_mask  = 0x0000001F; | ||||
| #endif | ||||
| #endif | ||||
|     } | ||||
|   else if (bitspixel == 24 || bitspixel == 32) | ||||
|     { | ||||
|       if (!is_rgba) | ||||
|         bitspixel = 24; | ||||
|       visual->type = GDK_VISUAL_TRUE_COLOR; | ||||
|       visual->red_mask   = 0x00FF0000; | ||||
|       visual->green_mask = 0x0000FF00; | ||||
|       visual->blue_mask  = 0x000000FF; | ||||
|     } | ||||
|   else | ||||
|     g_error ("_gdk_visual_init: unsupported BITSPIXEL: %d\n", bitspixel); | ||||
|  | ||||
|   visual->depth = bitspixel; | ||||
|   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)) | ||||
|     { | ||||
|       visual->red_mask = 0; | ||||
|       visual->green_mask = 0; | ||||
|       visual->blue_mask = 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; | ||||
|  | ||||
|   return visual; | ||||
| } | ||||
|  | ||||
| static void | ||||
| gdk_win32_screen_init (GdkWin32Screen *win32_screen) | ||||
| { | ||||
| @ -78,6 +283,12 @@ gdk_win32_screen_init (GdkWin32Screen *win32_screen) | ||||
|   if (logpixelsx > 0) | ||||
|     _gdk_screen_set_resolution (screen, logpixelsx); | ||||
|  | ||||
|   win32_screen->system_visual = init_visual (screen, FALSE); | ||||
|   win32_screen->rgba_visual = init_visual (screen, TRUE); | ||||
|  | ||||
|   win32_screen->available_visual_depths[0] = win32_screen->rgba_visual->depth; | ||||
|   win32_screen->available_visual_types[0] = win32_screen->rgba_visual->type; | ||||
|  | ||||
|   /* On Windows 8 and later, DWM (composition) is always enabled */ | ||||
|   win32_screen->always_composited = g_win32_check_windows_version (6, 2, 0, G_WIN32_OS_ANY); | ||||
| } | ||||
| @ -400,6 +611,109 @@ gdk_win32_screen_is_composited (GdkScreen *screen) | ||||
|     } | ||||
| } | ||||
|  | ||||
| static gint | ||||
| gdk_win32_screen_visual_get_best_depth (GdkScreen *screen) | ||||
| { | ||||
|   return GDK_WIN32_SCREEN (screen)->available_visual_depths[0]; | ||||
| } | ||||
|  | ||||
| static GdkVisualType | ||||
| gdk_win32_screen_visual_get_best_type (GdkScreen *screen) | ||||
| { | ||||
|   return GDK_WIN32_SCREEN (screen)->available_visual_types[0]; | ||||
| } | ||||
|  | ||||
| static GdkVisual * | ||||
| gdk_win32_screen_get_system_visual (GdkScreen *screen) | ||||
| { | ||||
|   return GDK_WIN32_SCREEN (screen)->system_visual; | ||||
| } | ||||
|  | ||||
| static GdkVisual * | ||||
| gdk_win32_screen_get_rgba_visual (GdkScreen *screen) | ||||
| { | ||||
|   return GDK_WIN32_SCREEN (screen)->rgba_visual; | ||||
| } | ||||
|  | ||||
| static GdkVisual* | ||||
| gdk_win32_screen_visual_get_best (GdkScreen *screen) | ||||
| { | ||||
|   return GDK_WIN32_SCREEN (screen)->rgba_visual; | ||||
| } | ||||
|  | ||||
| static GdkVisual * | ||||
| gdk_win32_screen_visual_get_best_with_depth (GdkScreen *screen, | ||||
|                                              gint       depth) | ||||
| { | ||||
|   GdkWin32Screen *win32_screen = GDK_WIN32_SCREEN (screen); | ||||
|  | ||||
|   if (depth == win32_screen->rgba_visual->depth) | ||||
|     return win32_screen->rgba_visual; | ||||
|   else if (depth == win32_screen->system_visual->depth) | ||||
|     return win32_screen->system_visual; | ||||
|  | ||||
|   return NULL; | ||||
| } | ||||
|  | ||||
| static GdkVisual * | ||||
| gdk_win32_screen_visual_get_best_with_type (GdkScreen     *screen, | ||||
|                                             GdkVisualType  visual_type) | ||||
| { | ||||
|   GdkWin32Screen *win32_screen = GDK_WIN32_SCREEN (screen); | ||||
|  | ||||
|   if (visual_type == win32_screen->rgba_visual->type) | ||||
|     return win32_screen->rgba_visual; | ||||
|   else if (visual_type == win32_screen->system_visual->type) | ||||
|     return win32_screen->system_visual; | ||||
|  | ||||
|   return NULL; | ||||
| } | ||||
|  | ||||
| static GdkVisual * | ||||
| gdk_win32_screen_visual_get_best_with_both (GdkScreen     *screen, | ||||
|                                             gint           depth, | ||||
|                                             GdkVisualType  visual_type) | ||||
| { | ||||
|   GdkWin32Screen *win32_screen = GDK_WIN32_SCREEN (screen); | ||||
|  | ||||
|   if ((depth == win32_screen->rgba_visual->depth) && (visual_type == win32_screen->rgba_visual->type)) | ||||
|     return win32_screen->rgba_visual; | ||||
|   else if ((depth == win32_screen->system_visual->depth) && (visual_type == win32_screen->system_visual->type)) | ||||
|     return win32_screen->system_visual; | ||||
|  | ||||
|   return NULL; | ||||
| } | ||||
|  | ||||
| static void | ||||
| gdk_win32_screen_query_depths (GdkScreen  *screen, | ||||
|                                gint      **depths, | ||||
|                                gint       *count) | ||||
| { | ||||
|   *count = 1; | ||||
|   *depths = GDK_WIN32_SCREEN (screen)->available_visual_depths; | ||||
| } | ||||
|  | ||||
| static void | ||||
| gdk_win32_screen_query_visual_types (GdkScreen      *screen, | ||||
|                                      GdkVisualType **visual_types, | ||||
|                                      gint           *count) | ||||
| { | ||||
|   *count = 1; | ||||
|   *visual_types = GDK_WIN32_SCREEN (screen)->available_visual_types; | ||||
| } | ||||
|  | ||||
| static GList * | ||||
| gdk_win32_screen_list_visuals (GdkScreen *screen) | ||||
| { | ||||
|   GdkWin32Screen *win32_screen = GDK_WIN32_SCREEN (screen); | ||||
|   GList *result = NULL; | ||||
|  | ||||
|   result = g_list_append (result, win32_screen->rgba_visual); | ||||
|   result = g_list_append (result, win32_screen->system_visual); | ||||
|  | ||||
|   return result; | ||||
| } | ||||
|  | ||||
| static void | ||||
| gdk_win32_screen_finalize (GObject *object) | ||||
| { | ||||
| @ -435,20 +749,20 @@ gdk_win32_screen_class_init (GdkWin32ScreenClass *klass) | ||||
|   screen_class->get_monitor_plug_name = gdk_win32_screen_get_monitor_plug_name; | ||||
|   screen_class->get_monitor_geometry = gdk_win32_screen_get_monitor_geometry; | ||||
|   screen_class->get_monitor_workarea = gdk_win32_screen_get_monitor_geometry; | ||||
|   screen_class->get_system_visual = _gdk_win32_screen_get_system_visual; | ||||
|   screen_class->get_rgba_visual = _gdk_win32_screen_get_rgba_visual; | ||||
|   screen_class->is_composited = gdk_win32_screen_is_composited; | ||||
|   screen_class->make_display_name = gdk_win32_screen_make_display_name; | ||||
|   screen_class->get_active_window = gdk_win32_screen_get_active_window; | ||||
|   screen_class->get_window_stack = gdk_win32_screen_get_window_stack; | ||||
|   screen_class->get_setting = _gdk_win32_screen_get_setting; | ||||
|   screen_class->visual_get_best_depth = _gdk_win32_screen_visual_get_best_depth; | ||||
|   screen_class->visual_get_best_type = _gdk_win32_screen_visual_get_best_type; | ||||
|   screen_class->visual_get_best = _gdk_win32_screen_visual_get_best; | ||||
|   screen_class->visual_get_best_with_depth = _gdk_win32_screen_visual_get_best_with_depth; | ||||
|   screen_class->visual_get_best_with_type = _gdk_win32_screen_visual_get_best_with_type; | ||||
|   screen_class->visual_get_best_with_both = _gdk_win32_screen_visual_get_best_with_both; | ||||
|   screen_class->query_depths = _gdk_win32_screen_query_depths; | ||||
|   screen_class->query_visual_types = _gdk_win32_screen_query_visual_types; | ||||
|   screen_class->list_visuals = _gdk_win32_screen_list_visuals; | ||||
|   screen_class->get_system_visual = gdk_win32_screen_get_system_visual; | ||||
|   screen_class->get_rgba_visual = gdk_win32_screen_get_rgba_visual; | ||||
|   screen_class->visual_get_best_depth = gdk_win32_screen_visual_get_best_depth; | ||||
|   screen_class->visual_get_best_type = gdk_win32_screen_visual_get_best_type; | ||||
|   screen_class->visual_get_best = gdk_win32_screen_visual_get_best; | ||||
|   screen_class->visual_get_best_with_depth = gdk_win32_screen_visual_get_best_with_depth; | ||||
|   screen_class->visual_get_best_with_type = gdk_win32_screen_visual_get_best_with_type; | ||||
|   screen_class->visual_get_best_with_both = gdk_win32_screen_visual_get_best_with_both; | ||||
|   screen_class->query_depths = gdk_win32_screen_query_depths; | ||||
|   screen_class->query_visual_types = gdk_win32_screen_query_visual_types; | ||||
|   screen_class->list_visuals = gdk_win32_screen_list_visuals; | ||||
| } | ||||
|  | ||||
| @ -1,345 +0,0 @@ | ||||
| /* GDK - The GIMP Drawing Kit | ||||
|  * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald | ||||
|  * Copyright (C) 1998-2002 Tor Lillqvist | ||||
|  * | ||||
|  * This library is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU Lesser General Public | ||||
|  * License as published by the Free Software Foundation; either | ||||
|  * version 2 of the License, or (at your option) any later version. | ||||
|  * | ||||
|  * This library is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  * Lesser General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Lesser General Public | ||||
|  * License along with this library. If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|  * Modified by the GTK+ Team and others 1997-2000.  See the AUTHORS | ||||
|  * file for a list of people on the GTK+ Team.  See the ChangeLog | ||||
|  * files for a list of changes.  These files are distributed with | ||||
|  * GTK+ at ftp://ftp.gtk.org/pub/gtk/. | ||||
|  */ | ||||
|  | ||||
| #include "config.h" | ||||
| #include <stdlib.h> | ||||
|  | ||||
| #include "gdkvisual.h" | ||||
| #include "gdkscreen.h" /* gdk_screen_get_default() */ | ||||
| #include "gdkprivate-win32.h" | ||||
| #include "gdkvisualprivate.h" | ||||
|  | ||||
| static GdkVisual *system_visual = NULL; | ||||
| static GdkVisual *rgba_visual = NULL; | ||||
|  | ||||
| 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) | ||||
| { | ||||
|   GdkVisual *visual; | ||||
|   struct | ||||
|   { | ||||
|     BITMAPINFOHEADER bi; | ||||
|     union | ||||
|     { | ||||
|       RGBQUAD colors[256]; | ||||
|       DWORD fields[256]; | ||||
|     } u; | ||||
|   } bmi; | ||||
|   HBITMAP hbm; | ||||
|  | ||||
|   const gint rastercaps = GetDeviceCaps (_gdk_display_hdc, RASTERCAPS); | ||||
|   const int numcolors = GetDeviceCaps (_gdk_display_hdc, NUMCOLORS); | ||||
|   gint bitspixel = GetDeviceCaps (_gdk_display_hdc, BITSPIXEL); | ||||
|   gint map_entries = 0; | ||||
|  | ||||
|   visual = g_object_new (GDK_TYPE_VISUAL, NULL); | ||||
|   visual->screen = screen; | ||||
|  | ||||
|   if (rastercaps & RC_PALETTE) | ||||
|     { | ||||
|       const int sizepalette = GetDeviceCaps (_gdk_display_hdc, SIZEPALETTE); | ||||
|       gchar *max_colors = getenv ("GDK_WIN32_MAX_COLORS"); | ||||
|       visual->type = GDK_VISUAL_PSEUDO_COLOR; | ||||
|  | ||||
|       g_assert (sizepalette == 256); | ||||
|  | ||||
|       if (max_colors != NULL) | ||||
| 	_gdk_max_colors = atoi (max_colors); | ||||
|  | ||||
|       map_entries = _gdk_max_colors; | ||||
|  | ||||
|       if (map_entries >= 16 && map_entries < sizepalette) | ||||
| 	{ | ||||
| 	  if (map_entries < 32) | ||||
| 	    { | ||||
| 	      map_entries = 16; | ||||
| 	      visual->type = GDK_VISUAL_STATIC_COLOR; | ||||
| 	      bitspixel = 4; | ||||
| 	    } | ||||
| 	  else if (map_entries < 64) | ||||
| 	    { | ||||
| 	      map_entries = 32; | ||||
| 	      bitspixel = 5; | ||||
| 	    } | ||||
| 	  else if (map_entries < 128) | ||||
| 	    { | ||||
| 	      map_entries = 64; | ||||
| 	      bitspixel = 6; | ||||
| 	    } | ||||
| 	  else if (map_entries < 256) | ||||
| 	    { | ||||
| 	      map_entries = 128; | ||||
| 	      bitspixel = 7; | ||||
| 	    } | ||||
| 	  else | ||||
| 	    g_assert_not_reached (); | ||||
| 	} | ||||
|       else | ||||
| 	map_entries = sizepalette; | ||||
|     } | ||||
|   else if (bitspixel == 1 && numcolors == 16) | ||||
|     { | ||||
|       bitspixel = 4; | ||||
|       visual->type = GDK_VISUAL_STATIC_COLOR; | ||||
|       map_entries = 16; | ||||
|     } | ||||
|   else if (bitspixel == 1) | ||||
|     { | ||||
|       visual->type = GDK_VISUAL_STATIC_GRAY; | ||||
|       map_entries = 2; | ||||
|     } | ||||
|   else if (bitspixel == 4) | ||||
|     { | ||||
|       visual->type = GDK_VISUAL_STATIC_COLOR; | ||||
|       map_entries = 16; | ||||
|     } | ||||
|   else if (bitspixel == 8) | ||||
|     { | ||||
|       visual->type = GDK_VISUAL_STATIC_COLOR; | ||||
|       map_entries = 256; | ||||
|     } | ||||
|   else if (bitspixel == 16) | ||||
|     { | ||||
|       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_display_hdc, 1, 1); | ||||
|       GetDIBits (_gdk_display_hdc, hbm, 0, 1, NULL, | ||||
| 		 (BITMAPINFO *) &bmi, DIB_RGB_COLORS); | ||||
|       GetDIBits (_gdk_display_hdc, 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; | ||||
| 	      visual->red_mask   = 0x00007C00; | ||||
| 	      visual->green_mask = 0x000003E0; | ||||
| 	      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; | ||||
| 	  visual->red_mask = bmi.u.fields[0]; | ||||
| 	  visual->green_mask = bmi.u.fields[1]; | ||||
| 	  visual->blue_mask  = bmi.u.fields[2]; | ||||
| 	} | ||||
| #else | ||||
|       /* Old, incorrect (but still working) code. */ | ||||
| #if 0 | ||||
|       visual->red_mask   = 0x0000F800; | ||||
|       visual->green_mask = 0x000007E0; | ||||
|       visual->blue_mask  = 0x0000001F; | ||||
| #else | ||||
|       visual->red_mask   = 0x00007C00; | ||||
|       visual->green_mask = 0x000003E0; | ||||
|       visual->blue_mask  = 0x0000001F; | ||||
| #endif | ||||
| #endif | ||||
|     } | ||||
|   else if (bitspixel == 24 || bitspixel == 32) | ||||
|     { | ||||
|       if (!is_rgba) | ||||
|         bitspixel = 24; | ||||
|       visual->type = GDK_VISUAL_TRUE_COLOR; | ||||
|       visual->red_mask   = 0x00FF0000; | ||||
|       visual->green_mask = 0x0000FF00; | ||||
|       visual->blue_mask  = 0x000000FF; | ||||
|     } | ||||
|   else | ||||
|     g_error ("_gdk_visual_init: unsupported BITSPIXEL: %d\n", bitspixel); | ||||
|  | ||||
|   visual->depth = bitspixel; | ||||
|   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)) | ||||
|     { | ||||
|       visual->red_mask = 0; | ||||
|       visual->green_mask = 0; | ||||
|       visual->blue_mask = 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; | ||||
|   available_types[0] = visual->type; | ||||
|  | ||||
|   if (is_rgba) | ||||
|     rgba_visual = visual; | ||||
|   else | ||||
|     system_visual = visual; | ||||
| } | ||||
|  | ||||
| void | ||||
| _gdk_visual_init (GdkScreen *screen) | ||||
| { | ||||
|   _gdk_visual_init_internal (screen, FALSE); | ||||
|   _gdk_visual_init_internal (screen, TRUE); | ||||
| } | ||||
|  | ||||
| gint | ||||
| _gdk_win32_screen_visual_get_best_depth (GdkScreen *screen) | ||||
| { | ||||
|   return available_depths[0]; | ||||
| } | ||||
|  | ||||
| GdkVisualType | ||||
| _gdk_win32_screen_visual_get_best_type (GdkScreen *screen) | ||||
| { | ||||
|   return available_types[0]; | ||||
| } | ||||
|  | ||||
| GdkVisual* | ||||
| _gdk_win32_screen_get_system_visual (GdkScreen *screen) | ||||
| { | ||||
|   return system_visual; | ||||
| } | ||||
|  | ||||
| GdkVisual * | ||||
| _gdk_win32_screen_get_rgba_visual (GdkScreen *screen) | ||||
| { | ||||
|   return rgba_visual; | ||||
| } | ||||
|  | ||||
| GdkVisual* | ||||
| _gdk_win32_screen_visual_get_best (GdkScreen *screen) | ||||
| { | ||||
|   return ((GdkVisual*) rgba_visual); | ||||
| } | ||||
|  | ||||
| GdkVisual* | ||||
| _gdk_win32_screen_visual_get_best_with_depth (GdkScreen *screen, gint depth) | ||||
| { | ||||
|   if (depth == rgba_visual->depth) | ||||
|     return (GdkVisual*) rgba_visual; | ||||
|   else if (depth == system_visual->depth) | ||||
|     return (GdkVisual*) system_visual; | ||||
|   else | ||||
|     return NULL; | ||||
| } | ||||
|  | ||||
| GdkVisual* | ||||
| _gdk_win32_screen_visual_get_best_with_type (GdkScreen *screen, GdkVisualType visual_type) | ||||
| { | ||||
|   if (visual_type == rgba_visual->type) | ||||
|     return rgba_visual; | ||||
|   else if (visual_type == system_visual->type) | ||||
|     return system_visual; | ||||
|   else | ||||
|     return NULL; | ||||
| } | ||||
|  | ||||
| GdkVisual* | ||||
| _gdk_win32_screen_visual_get_best_with_both (GdkScreen    *screen, | ||||
| 					     gint          depth, | ||||
| 					     GdkVisualType visual_type) | ||||
| { | ||||
|   if ((depth == rgba_visual->depth) && (visual_type == rgba_visual->type)) | ||||
|     return rgba_visual; | ||||
|   else if ((depth == system_visual->depth) && (visual_type == system_visual->type)) | ||||
|     return system_visual; | ||||
|   else | ||||
|     return NULL; | ||||
| } | ||||
|  | ||||
| void | ||||
| _gdk_win32_screen_query_depths  (GdkScreen *screen, | ||||
| 				 gint **depths, | ||||
| 				 gint  *count) | ||||
| { | ||||
|   *count = 1; | ||||
|   *depths = available_depths; | ||||
| } | ||||
|  | ||||
| void | ||||
| _gdk_win32_screen_query_visual_types (GdkScreen      *screen, | ||||
| 				      GdkVisualType **visual_types, | ||||
| 				      gint           *count) | ||||
| { | ||||
|   *count = 1; | ||||
|   *visual_types = available_types; | ||||
| } | ||||
|  | ||||
| GList* | ||||
| _gdk_win32_screen_list_visuals (GdkScreen *screen) | ||||
| { | ||||
|   GList *result = NULL; | ||||
|  | ||||
|   result = g_list_append (result, (gpointer) rgba_visual); | ||||
|   result = g_list_append (result, (gpointer) system_visual); | ||||
|  | ||||
|   return result; | ||||
| } | ||||
| @ -48,7 +48,6 @@ gdk_win32_OBJECTS = \ | ||||
| 	gdkscreen-win32.obj \ | ||||
| 	gdkselection-win32.obj \ | ||||
| 	gdktestutils-win32.obj \ | ||||
| 	gdkvisual-win32.obj \ | ||||
| 	gdkwin32id.obj \ | ||||
| 	gdkwindow-win32.obj | ||||
|  | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 Paolo Borelli
					Paolo Borelli