|
Packit |
98cdb6 |
/* GDK - The GIMP Drawing Kit
|
|
Packit |
98cdb6 |
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
|
Packit |
98cdb6 |
*
|
|
Packit |
98cdb6 |
* This library is free software; you can redistribute it and/or
|
|
Packit |
98cdb6 |
* modify it under the terms of the GNU Lesser General Public
|
|
Packit |
98cdb6 |
* License as published by the Free Software Foundation; either
|
|
Packit |
98cdb6 |
* version 2 of the License, or (at your option) any later version.
|
|
Packit |
98cdb6 |
*
|
|
Packit |
98cdb6 |
* This library is distributed in the hope that it will be useful,
|
|
Packit |
98cdb6 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
98cdb6 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
98cdb6 |
* Lesser General Public License for more details.
|
|
Packit |
98cdb6 |
*
|
|
Packit |
98cdb6 |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit |
98cdb6 |
* License along with this library; if not, write to the
|
|
Packit |
98cdb6 |
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
Packit |
98cdb6 |
* Boston, MA 02111-1307, USA.
|
|
Packit |
98cdb6 |
*/
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
/*
|
|
Packit |
98cdb6 |
* Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
|
|
Packit |
98cdb6 |
* file for a list of people on the GTK+ Team.
|
|
Packit |
98cdb6 |
*/
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
/*
|
|
Packit |
98cdb6 |
* GTK+ DirectFB backend
|
|
Packit |
98cdb6 |
* Copyright (C) 2001-2002 convergence integrated media GmbH
|
|
Packit |
98cdb6 |
* Copyright (C) 2002-2004 convergence GmbH
|
|
Packit |
98cdb6 |
* Written by Denis Oliver Kropp <dok@convergence.de> and
|
|
Packit |
98cdb6 |
* Sven Neumann <sven@convergence.de>
|
|
Packit |
98cdb6 |
*/
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
#include "config.h"
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
#include "gdkdirectfb.h"
|
|
Packit |
98cdb6 |
#include "gdkprivate-directfb.h"
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
#include "gdkscreen.h"
|
|
Packit |
98cdb6 |
#include "gdkvisual.h"
|
|
Packit |
98cdb6 |
#include "gdkalias.h"
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
struct _GdkVisualClass
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
GObjectClass parent_class;
|
|
Packit |
98cdb6 |
};
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
static void gdk_visual_decompose_mask (gulong mask,
|
|
Packit |
98cdb6 |
gint *shift,
|
|
Packit |
98cdb6 |
gint *prec);
|
|
Packit |
98cdb6 |
static GdkVisualDirectFB * gdk_directfb_visual_create (DFBSurfacePixelFormat pixelformat);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
static DFBSurfacePixelFormat formats[] =
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
DSPF_ARGB,
|
|
Packit |
98cdb6 |
DSPF_LUT8,
|
|
Packit |
98cdb6 |
DSPF_RGB32,
|
|
Packit |
98cdb6 |
DSPF_RGB24,
|
|
Packit |
98cdb6 |
DSPF_RGB16,
|
|
Packit |
98cdb6 |
DSPF_ARGB1555,
|
|
Packit |
98cdb6 |
DSPF_RGB332
|
|
Packit |
98cdb6 |
};
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
GdkVisual * system_visual = NULL;
|
|
Packit |
98cdb6 |
static GdkVisualDirectFB * visuals[G_N_ELEMENTS (formats) + 1] = { NULL };
|
|
Packit |
98cdb6 |
static gint available_depths[G_N_ELEMENTS (formats) + 1] = {0};
|
|
Packit |
98cdb6 |
static GdkVisualType available_types[G_N_ELEMENTS (formats) + 1] = {0};
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
static void
|
|
Packit |
98cdb6 |
gdk_visual_finalize (GObject *object)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
g_error ("A GdkVisual object was finalized. This should not happen");
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
static void
|
|
Packit |
98cdb6 |
gdk_visual_class_init (GObjectClass *class)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
class->finalize = gdk_visual_finalize;
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
GType
|
|
Packit |
98cdb6 |
gdk_visual_get_type (void)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
static GType object_type = 0;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
if (!object_type)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
const GTypeInfo object_info =
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
sizeof (GdkVisualClass),
|
|
Packit |
98cdb6 |
(GBaseInitFunc) NULL,
|
|
Packit |
98cdb6 |
(GBaseFinalizeFunc) NULL,
|
|
Packit |
98cdb6 |
(GClassInitFunc) gdk_visual_class_init,
|
|
Packit |
98cdb6 |
NULL, /* class_finalize */
|
|
Packit |
98cdb6 |
NULL, /* class_data */
|
|
Packit |
98cdb6 |
sizeof (GdkVisualDirectFB),
|
|
Packit |
98cdb6 |
0, /* n_preallocs */
|
|
Packit |
98cdb6 |
(GInstanceInitFunc) NULL,
|
|
Packit |
98cdb6 |
};
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
object_type = g_type_register_static (G_TYPE_OBJECT,
|
|
Packit |
98cdb6 |
"GdkVisual",
|
|
Packit |
98cdb6 |
&object_info, 0);
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
return object_type;
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
void
|
|
Packit |
98cdb6 |
_gdk_visual_init (void)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
DFBDisplayLayerConfig dlc;
|
|
Packit |
98cdb6 |
DFBSurfaceDescription desc;
|
|
Packit |
98cdb6 |
IDirectFBSurface *dest;
|
|
Packit |
98cdb6 |
gint i, c;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
_gdk_display->layer->GetConfiguration (_gdk_display->layer, &dlc);
|
|
Packit |
98cdb6 |
g_assert (dlc.pixelformat != DSPF_UNKNOWN);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
dest = gdk_display_dfb_create_surface (_gdk_display, dlc.pixelformat, 8, 8);
|
|
Packit |
98cdb6 |
g_assert (dest != NULL);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
/* We could provide all visuals since DirectFB allows us to mix
|
|
Packit |
98cdb6 |
surface formats. Blitting with format conversion can however
|
|
Packit |
98cdb6 |
be incredibly slow, so we've choosen to register only those
|
|
Packit |
98cdb6 |
visuals that can be blitted to the display layer in hardware.
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
If you want to use a special pixelformat that is not registered
|
|
Packit |
98cdb6 |
here, you can create it using the DirectFB-specific function
|
|
Packit |
98cdb6 |
gdk_directfb_visual_by_format().
|
|
Packit |
98cdb6 |
Note:
|
|
Packit |
98cdb6 |
changed to do all formats but we should redo this code
|
|
Packit |
98cdb6 |
to ensure the base format ARGB LUT8 RGB etc then add ones supported
|
|
Packit |
98cdb6 |
by the hardware
|
|
Packit |
98cdb6 |
*/
|
|
Packit |
98cdb6 |
for (i = 0; i < G_N_ELEMENTS (formats); i++)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
IDirectFBSurface *src;
|
|
Packit |
98cdb6 |
DFBAccelerationMask acc;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
desc.flags = DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT;
|
|
Packit |
98cdb6 |
desc.width = 8;
|
|
Packit |
98cdb6 |
desc.height = 8;
|
|
Packit |
98cdb6 |
desc.pixelformat = formats[i];
|
|
Packit |
98cdb6 |
//call direct so fail silently is ok
|
|
Packit |
98cdb6 |
if (_gdk_display->directfb->CreateSurface (_gdk_display->directfb,
|
|
Packit |
98cdb6 |
&desc, &src) != DFB_OK)
|
|
Packit |
98cdb6 |
continue;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
visuals[i] = gdk_directfb_visual_create (formats[i]);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
dest->GetAccelerationMask (dest, src, &acc;;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
if (acc & DFXL_BLIT || formats[i] == dlc.pixelformat)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
system_visual = GDK_VISUAL (visuals[i]);
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
src->Release (src);
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
dest->Release (dest);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
//fallback to ARGB must be supported
|
|
Packit |
98cdb6 |
if (!system_visual)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
g_assert (visuals[DSPF_ARGB] != NULL);
|
|
Packit |
98cdb6 |
system_visual = GDK_VISUAL(visuals[DSPF_ARGB]);
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
g_assert (system_visual != NULL);
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
gint
|
|
Packit |
98cdb6 |
gdk_visual_get_best_depth (void)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
return system_visual->depth;
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
GdkVisualType
|
|
Packit |
98cdb6 |
gdk_visual_get_best_type (void)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
return system_visual->type;
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
GdkVisual *
|
|
Packit |
98cdb6 |
gdk_screen_get_system_visual (GdkScreen *screen)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
g_assert (system_visual);
|
|
Packit |
98cdb6 |
return system_visual;
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
GdkVisual *
|
|
Packit |
98cdb6 |
gdk_visual_get_best (void)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
return system_visual;
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
GdkVisual *
|
|
Packit |
98cdb6 |
gdk_visual_get_best_with_depth (gint depth)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
gint i;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
for (i = 0; visuals[i]; i++)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
if (visuals[i]) {
|
|
Packit |
98cdb6 |
GdkVisual *visual = GDK_VISUAL (visuals[i]);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
if (depth == visual->depth)
|
|
Packit |
98cdb6 |
return visual;
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
return NULL;
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
GdkVisual *
|
|
Packit |
98cdb6 |
gdk_visual_get_best_with_type (GdkVisualType visual_type)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
gint i;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
for (i = 0; visuals[i]; i++)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
if (visuals[i]) {
|
|
Packit |
98cdb6 |
GdkVisual *visual = GDK_VISUAL (visuals[i]);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
if (visual_type == visual->type)
|
|
Packit |
98cdb6 |
return visual;
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
return NULL;
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
GdkVisual*
|
|
Packit |
98cdb6 |
gdk_visual_get_best_with_both (gint depth,
|
|
Packit |
98cdb6 |
GdkVisualType visual_type)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
gint i;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
for (i = 0; visuals[i]; i++)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
if (visuals[i]) {
|
|
Packit |
98cdb6 |
GdkVisual *visual = GDK_VISUAL (visuals[i]);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
if (depth == visual->depth && visual_type == visual->type)
|
|
Packit |
98cdb6 |
return visual;
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
return system_visual;
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
void
|
|
Packit |
98cdb6 |
gdk_query_depths (gint **depths,
|
|
Packit |
98cdb6 |
gint *count)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
gint i;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
for (i = 0; available_depths[i]; i++)
|
|
Packit |
98cdb6 |
;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
*count = i;
|
|
Packit |
98cdb6 |
*depths = available_depths;
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
void
|
|
Packit |
98cdb6 |
gdk_query_visual_types (GdkVisualType **visual_types,
|
|
Packit |
98cdb6 |
gint *count)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
gint i;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
for (i = 0; available_types[i]; i++)
|
|
Packit |
98cdb6 |
;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
*count = i;
|
|
Packit |
98cdb6 |
*visual_types = available_types;
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
GList *
|
|
Packit |
98cdb6 |
gdk_screen_list_visuals (GdkScreen *screen)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
GList *list = NULL;
|
|
Packit |
98cdb6 |
gint i;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
for (i = 0; visuals[i]; i++)
|
|
Packit |
98cdb6 |
if (visuals[i]) {
|
|
Packit |
98cdb6 |
GdkVisual * vis = GDK_VISUAL (visuals[i]);
|
|
Packit |
98cdb6 |
list = g_list_append (list,vis);
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
return list;
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
/**
|
|
Packit |
98cdb6 |
* gdk_directfb_visual_by_format:
|
|
Packit |
98cdb6 |
* @pixel_format: the pixel_format of the requested visual
|
|
Packit |
98cdb6 |
*
|
|
Packit |
98cdb6 |
* This function is specific to the DirectFB backend. It allows
|
|
Packit |
98cdb6 |
* to specify a GdkVisual by @pixel_format.
|
|
Packit |
98cdb6 |
*
|
|
Packit |
98cdb6 |
* At startup, only those visuals that can be blitted
|
|
Packit |
98cdb6 |
* hardware-accelerated are registered. By using
|
|
Packit |
98cdb6 |
* gdk_directfb_visual_by_format() you can retrieve visuals that
|
|
Packit |
98cdb6 |
* don't match this criteria since this function will try to create
|
|
Packit |
98cdb6 |
* a new visual for the desired @pixel_format for you.
|
|
Packit |
98cdb6 |
*
|
|
Packit |
98cdb6 |
* Return value: a pointer to the GdkVisual or %NULL if the
|
|
Packit |
98cdb6 |
* pixel_format is unsupported.
|
|
Packit |
98cdb6 |
**/
|
|
Packit |
98cdb6 |
GdkVisual *
|
|
Packit |
98cdb6 |
gdk_directfb_visual_by_format (DFBSurfacePixelFormat pixel_format)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
gint i;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
/* first check if one the registered visuals matches */
|
|
Packit |
98cdb6 |
for (i = 0; visuals[i]; i++)
|
|
Packit |
98cdb6 |
if (visuals[i] && visuals[i]->format == pixel_format)
|
|
Packit |
98cdb6 |
return GDK_VISUAL (visuals[i]);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
/* none matched, try to create a new one for this pixel_format */
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
DFBSurfaceDescription desc;
|
|
Packit |
98cdb6 |
IDirectFBSurface *test;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
desc.flags = DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT;
|
|
Packit |
98cdb6 |
desc.width = 8;
|
|
Packit |
98cdb6 |
desc.height = 8;
|
|
Packit |
98cdb6 |
desc.pixelformat = pixel_format;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
if (_gdk_display->directfb->CreateSurface (_gdk_display->directfb,
|
|
Packit |
98cdb6 |
&desc, &test) != DFB_OK)
|
|
Packit |
98cdb6 |
return NULL;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
test->Release (test);
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
return GDK_VISUAL (gdk_directfb_visual_create (pixel_format));
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
GdkScreen *
|
|
Packit |
98cdb6 |
gdk_visual_get_screen (GdkVisual *visual)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
g_return_val_if_fail (GDK_IS_VISUAL (visual), NULL);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
return gdk_screen_get_default ();
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
static void
|
|
Packit |
98cdb6 |
gdk_visual_decompose_mask (gulong mask,
|
|
Packit |
98cdb6 |
gint *shift,
|
|
Packit |
98cdb6 |
gint *prec)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
*shift = 0;
|
|
Packit |
98cdb6 |
*prec = 0;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
while (!(mask & 0x1))
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
(*shift)++;
|
|
Packit |
98cdb6 |
mask >>= 1;
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
while (mask & 0x1)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
(*prec)++;
|
|
Packit |
98cdb6 |
mask >>= 1;
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
static GdkVisualDirectFB *
|
|
Packit |
98cdb6 |
gdk_directfb_visual_create (DFBSurfacePixelFormat pixelformat)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
GdkVisual *visual;
|
|
Packit |
98cdb6 |
gint i;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
for (i = 0; i < G_N_ELEMENTS (formats); i++)
|
|
Packit |
98cdb6 |
if (formats[i] == pixelformat)
|
|
Packit |
98cdb6 |
break;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
if (i == G_N_ELEMENTS (formats))
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
g_warning ("unsupported pixelformat");
|
|
Packit |
98cdb6 |
return NULL;
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
visual = g_object_new (GDK_TYPE_VISUAL, NULL);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
switch (pixelformat)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
case DSPF_LUT8:
|
|
Packit |
98cdb6 |
visual->type = GDK_VISUAL_PSEUDO_COLOR;
|
|
Packit |
98cdb6 |
visual->bits_per_rgb = 8;
|
|
Packit |
98cdb6 |
break;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
case DSPF_RGB332:
|
|
Packit |
98cdb6 |
visual->type = GDK_VISUAL_STATIC_COLOR;
|
|
Packit |
98cdb6 |
visual->bits_per_rgb = 3;
|
|
Packit |
98cdb6 |
break;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
case DSPF_ARGB1555:
|
|
Packit |
98cdb6 |
visual->type = GDK_VISUAL_TRUE_COLOR;
|
|
Packit |
98cdb6 |
visual->red_mask = 0x00007C00;
|
|
Packit |
98cdb6 |
visual->green_mask = 0x000003E0;
|
|
Packit |
98cdb6 |
visual->blue_mask = 0x0000001F;
|
|
Packit |
98cdb6 |
visual->bits_per_rgb = 5;
|
|
Packit |
98cdb6 |
break;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
case DSPF_RGB16:
|
|
Packit |
98cdb6 |
visual->type = GDK_VISUAL_TRUE_COLOR;
|
|
Packit |
98cdb6 |
visual->red_mask = 0x0000F800;
|
|
Packit |
98cdb6 |
visual->green_mask = 0x000007E0;
|
|
Packit |
98cdb6 |
visual->blue_mask = 0x0000001F;
|
|
Packit |
98cdb6 |
visual->bits_per_rgb = 6;
|
|
Packit |
98cdb6 |
break;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
case DSPF_RGB24:
|
|
Packit |
98cdb6 |
case DSPF_RGB32:
|
|
Packit |
98cdb6 |
case DSPF_ARGB:
|
|
Packit |
98cdb6 |
visual->type = GDK_VISUAL_TRUE_COLOR;
|
|
Packit |
98cdb6 |
visual->red_mask = 0x00FF0000;
|
|
Packit |
98cdb6 |
visual->green_mask = 0x0000FF00;
|
|
Packit |
98cdb6 |
visual->blue_mask = 0x000000FF;
|
|
Packit |
98cdb6 |
visual->bits_per_rgb = 8;
|
|
Packit |
98cdb6 |
break;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
default:
|
|
Packit |
98cdb6 |
g_assert_not_reached ();
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
#if G_BYTE_ORDER == G_BIG_ENDIAN
|
|
Packit |
98cdb6 |
visual->byte_order = GDK_MSB_FIRST;
|
|
Packit |
98cdb6 |
#else
|
|
Packit |
98cdb6 |
visual->byte_order = GDK_LSB_FIRST;
|
|
Packit |
98cdb6 |
#endif
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
visual->depth = DFB_BITS_PER_PIXEL (pixelformat);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
switch (visual->type)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
case GDK_VISUAL_TRUE_COLOR:
|
|
Packit |
98cdb6 |
gdk_visual_decompose_mask (visual->red_mask,
|
|
Packit |
98cdb6 |
&visual->red_shift, &visual->red_prec);
|
|
Packit |
98cdb6 |
gdk_visual_decompose_mask (visual->green_mask,
|
|
Packit |
98cdb6 |
&visual->green_shift, &visual->green_prec);
|
|
Packit |
98cdb6 |
gdk_visual_decompose_mask (visual->blue_mask,
|
|
Packit |
98cdb6 |
&visual->blue_shift, &visual->blue_prec);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
/* the number of possible levels per color component */
|
|
Packit |
98cdb6 |
visual->colormap_size = 1 << MAX (visual->red_prec,
|
|
Packit |
98cdb6 |
MAX (visual->green_prec,
|
|
Packit |
98cdb6 |
visual->blue_prec));
|
|
Packit |
98cdb6 |
break;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
case GDK_VISUAL_STATIC_COLOR:
|
|
Packit |
98cdb6 |
case GDK_VISUAL_PSEUDO_COLOR:
|
|
Packit |
98cdb6 |
visual->colormap_size = 1 << visual->depth;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
visual->red_mask = 0;
|
|
Packit |
98cdb6 |
visual->red_shift = 0;
|
|
Packit |
98cdb6 |
visual->red_prec = 0;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
visual->green_mask = 0;
|
|
Packit |
98cdb6 |
visual->green_shift = 0;
|
|
Packit |
98cdb6 |
visual->green_prec = 0;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
visual->blue_mask = 0;
|
|
Packit |
98cdb6 |
visual->blue_shift = 0;
|
|
Packit |
98cdb6 |
visual->blue_prec = 0;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
break;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
default:
|
|
Packit |
98cdb6 |
g_assert_not_reached ();
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
((GdkVisualDirectFB *)visual)->format = pixelformat;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
for (i = 0; available_depths[i]; i++)
|
|
Packit |
98cdb6 |
if (available_depths[i] == visual->depth)
|
|
Packit |
98cdb6 |
break;
|
|
Packit |
98cdb6 |
if (!available_depths[i])
|
|
Packit |
98cdb6 |
available_depths[i] = visual->depth;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
for (i = 0; available_types[i]; i++)
|
|
Packit |
98cdb6 |
if (available_types[i] == visual->type)
|
|
Packit |
98cdb6 |
break;
|
|
Packit |
98cdb6 |
if (!available_types[i])
|
|
Packit |
98cdb6 |
available_types[i] = visual->type;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
return (GdkVisualDirectFB *) visual;
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
#define __GDK_VISUAL_X11_C__
|
|
Packit |
98cdb6 |
#include "gdkaliasdef.c"
|