Example #1
0
void _gdk_visual_init (void)
{
  long format = gi_screen_format();
  gint map_entries = 0;

  //system_visual = g_object_new (GDK_TYPE_GIX_VISUAL, NULL);
  system_visual = g_object_new (GDK_TYPE_VISUAL, NULL);
  g_assert(system_visual != NULL);
  system_visual->screen = gdk_screen_get_default();
  g_assert(system_visual->screen != NULL);

  switch (format)
  {
  case GI_RENDER_r5g6b5:
	  system_visual->red_mask   = 0x00007C00;
      system_visual->green_mask = 0x000003E0;
      system_visual->blue_mask  = 0x0000001F;
	  system_visual->type = GDK_VISUAL_TRUE_COLOR;
	  break;

  case GI_RENDER_r8g8b8:
  case GI_RENDER_x8r8g8b8:
	  system_visual->type = GDK_VISUAL_TRUE_COLOR;
      system_visual->red_mask   = 0x00FF0000;
      system_visual->green_mask = 0x0000FF00;
      system_visual->blue_mask  = 0x000000FF;
	  break;
  default:
	  break;
  
  }

	gdk_visual_decompose_mask (system_visual->red_mask,
			 &system_visual->red_shift,
			 &system_visual->red_prec);

	gdk_visual_decompose_mask (system_visual->green_mask,
			 &system_visual->green_shift,
			 &system_visual->green_prec);

	gdk_visual_decompose_mask (system_visual->blue_mask,
		 &system_visual->blue_shift,
		 &system_visual->blue_prec);
	map_entries = 1 << (MAX (system_visual->red_prec,
		   MAX (system_visual->green_prec,
			system_visual->blue_prec)));
	system_visual->colormap_size = map_entries;

	system_visual->depth = GI_RENDER_FORMAT_BPP(format);
	system_visual->byte_order = GDK_LSB_FIRST;
	system_visual->bits_per_rgb = 42; /* Not used? */

	available_depths[0] = system_visual->depth;
	available_types[0] = system_visual->type;
}
void
_gdk_visual_init (GdkScreen *screen)
{
  static const gint possible_depths[8] = { 32, 30, 24, 16, 15, 8, 4, 1 };
  static const GdkVisualType possible_types[6] =
    {
      GDK_VISUAL_DIRECT_COLOR,
      GDK_VISUAL_TRUE_COLOR,
      GDK_VISUAL_PSEUDO_COLOR,
      GDK_VISUAL_STATIC_COLOR,
      GDK_VISUAL_GRAYSCALE,
      GDK_VISUAL_STATIC_GRAY
    };

  GdkScreenX11 *screen_x11;
  XVisualInfo *visual_list;
  XVisualInfo visual_template;
  GdkVisualPrivate *temp_visual;
  Visual *default_xvisual;
  GdkVisualPrivate **visuals;
  int nxvisuals;
  int nvisuals;
  int i, j;
  
  g_return_if_fail (GDK_IS_SCREEN (screen));
  screen_x11 = GDK_SCREEN_X11 (screen);

  nxvisuals = 0;
  visual_template.screen = screen_x11->screen_num;
  visual_list = XGetVisualInfo (screen_x11->xdisplay, VisualScreenMask, &visual_template, &nxvisuals);
  
  visuals = g_new (GdkVisualPrivate *, nxvisuals);
  for (i = 0; i < nxvisuals; i++)
    visuals[i] = g_object_new (GDK_TYPE_VISUAL, NULL);

  default_xvisual = DefaultVisual (screen_x11->xdisplay, screen_x11->screen_num);

  nvisuals = 0;
  for (i = 0; i < nxvisuals; i++)
    {
      visuals[nvisuals]->screen = screen;
      
      if (visual_list[i].depth >= 1)
	{
#ifdef __cplusplus
	  switch (visual_list[i].c_class)
#else /* __cplusplus */
	  switch (visual_list[i].class)
#endif /* __cplusplus */
	    {
	    case StaticGray:
	      visuals[nvisuals]->visual.type = GDK_VISUAL_STATIC_GRAY;
	      break;
	    case GrayScale:
	      visuals[nvisuals]->visual.type = GDK_VISUAL_GRAYSCALE;
	      break;
	    case StaticColor:
	      visuals[nvisuals]->visual.type = GDK_VISUAL_STATIC_COLOR;
	      break;
	    case PseudoColor:
	      visuals[nvisuals]->visual.type = GDK_VISUAL_PSEUDO_COLOR;
	      break;
	    case TrueColor:
	      visuals[nvisuals]->visual.type = GDK_VISUAL_TRUE_COLOR;
	      break;
	    case DirectColor:
	      visuals[nvisuals]->visual.type = GDK_VISUAL_DIRECT_COLOR;
	      break;
	    }

	  visuals[nvisuals]->visual.depth = visual_list[i].depth;
	  visuals[nvisuals]->visual.byte_order =
	    (ImageByteOrder(screen_x11->xdisplay) == LSBFirst) ?
	    GDK_LSB_FIRST : GDK_MSB_FIRST;
	  visuals[nvisuals]->visual.red_mask = visual_list[i].red_mask;
	  visuals[nvisuals]->visual.green_mask = visual_list[i].green_mask;
	  visuals[nvisuals]->visual.blue_mask = visual_list[i].blue_mask;
	  visuals[nvisuals]->visual.colormap_size = visual_list[i].colormap_size;
	  visuals[nvisuals]->visual.bits_per_rgb = visual_list[i].bits_per_rgb;
	  visuals[nvisuals]->xvisual = visual_list[i].visual;

	  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);
	    }
	  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;
	    }
	  
	  nvisuals += 1;
	}
    }

  if (visual_list)
    XFree (visual_list);

  for (i = 0; i < nvisuals; i++)
    {
      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;
		}
	    }
	}
    }

  for (i = 0; i < nvisuals; i++)
    {
      if (default_xvisual->visualid == visuals[i]->xvisual->visualid)
	screen_x11->system_visual = visuals[i];

      /* For now, we only support 8888 ARGB for the "rgba visual".
       * Additional formats (like ABGR) could be added later if they
       * turn up.
       */
      if (visuals[i]->visual.depth == 32 &&
	  (visuals[i]->visual.red_mask   == 0xff0000 &&
	   visuals[i]->visual.green_mask == 0x00ff00 &&
	   visuals[i]->visual.blue_mask  == 0x0000ff))
	{
	  screen_x11->rgba_visual = GDK_VISUAL (visuals[i]);
	}
    }

#ifdef G_ENABLE_DEBUG 
  if (_gdk_debug_flags & GDK_DEBUG_MISC)
    for (i = 0; i < nvisuals; i++)
      g_message ("visual: %s: %d",
		 visual_names[visuals[i]->visual.type],
		 visuals[i]->visual.depth);
#endif /* G_ENABLE_DEBUG */

  screen_x11->navailable_depths = 0;
  for (i = 0; i < G_N_ELEMENTS (possible_depths); i++)
    {
      for (j = 0; j < nvisuals; j++)
	{
	  if (visuals[j]->visual.depth == possible_depths[i])
	    {
	      screen_x11->available_depths[screen_x11->navailable_depths++] = visuals[j]->visual.depth;
	      break;
	    }
	}
    }

  if (screen_x11->navailable_depths == 0)
    g_error ("unable to find a usable depth");

  screen_x11->navailable_types = 0;
  for (i = 0; i < G_N_ELEMENTS (possible_types); i++)
    {
      for (j = 0; j < nvisuals; j++)
	{
	  if (visuals[j]->visual.type == possible_types[i])
	    {
	      screen_x11->available_types[screen_x11->navailable_types++] = visuals[j]->visual.type;
	      break;
	    }
	}
    }

  for (i = 0; i < nvisuals; i++)
    gdk_visual_add ((GdkVisual*) visuals[i]);

  if (screen_x11->navailable_types == 0)
    g_error ("unable to find a usable visual type");

  screen_x11->visuals = visuals;
  screen_x11->nvisuals = nvisuals;
}
Example #3
0
void gdk_visual_init(void)
{
   struct {
      BITMAPINFOHEADER bi;
      union {
         RGBQUAD colors[256];
         DWORD fields[256];
      } u;
   } bmi;
   HBITMAP hbm;

   int rastercaps, numcolors, sizepalette, bitspixel;

   system_visual = g_new(GdkVisualPrivate, 1);

   bitspixel = GetDeviceCaps(gdk_DC, BITSPIXEL);
   rastercaps = GetDeviceCaps(gdk_DC, RASTERCAPS);
   system_visual->xvisual = g_new(Visual, 1);
   system_visual->xvisual->visualid = 0;
   system_visual->xvisual->bitspixel = bitspixel;

   // temporary solves a strange bug in root in 16 bit mode:
   // axis labels background is not the same color than the 
   // pad background...
   if (bitspixel == 16) bitspixel = 24; 

   if (rastercaps & RC_PALETTE) {
      g_error
          ("Palettized display (%d-colour) mode not supported on Windows.",
           GetDeviceCaps(gdk_DC, SIZEPALETTE));
      system_visual->visual.type = GDK_VISUAL_PSEUDO_COLOR;
      numcolors = GetDeviceCaps(gdk_DC, NUMCOLORS);
      sizepalette = GetDeviceCaps(gdk_DC, SIZEPALETTE);
      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) {
      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) {
         /* 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;
            system_visual->visual.red_mask = 0x00007C00;
            system_visual->visual.green_mask = 0x000003E0;
            system_visual->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;
         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. */
#if 0
      system_visual->visual.red_mask = 0x0000F800;
      system_visual->visual.green_mask = 0x000007E0;
      system_visual->visual.blue_mask = 0x0000001F;
#else
      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) {
//      bitspixel = 24;
      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);

   system_visual->visual.depth = bitspixel;
   system_visual->visual.byte_order = GDK_LSB_FIRST;
   system_visual->visual.bits_per_rgb = 42;	/* Not used? */

   if ((system_visual->visual.type == GDK_VISUAL_TRUE_COLOR) ||
       (system_visual->visual.type == GDK_VISUAL_DIRECT_COLOR)) {
      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;

      system_visual->visual.green_mask = 0;
      system_visual->visual.green_shift = 0;
      system_visual->visual.green_prec = 0;

      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;

   available_depths[0] = system_visual->visual.depth;
   available_types[0] = system_visual->visual.type;
}