Blame gdk/directfb/gdkcolor-directfb.c

Packit Service fb6fa5
/* GDK - The GIMP Drawing Kit
Packit Service fb6fa5
 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This library is free software; you can redistribute it and/or
Packit Service fb6fa5
 * modify it under the terms of the GNU Lesser General Public
Packit Service fb6fa5
 * License as published by the Free Software Foundation; either
Packit Service fb6fa5
 * version 2 of the License, or (at your option) any later version.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This library is distributed in the hope that it will be useful,
Packit Service fb6fa5
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service fb6fa5
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service fb6fa5
 * Lesser General Public License for more details.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * You should have received a copy of the GNU Lesser General Public
Packit Service fb6fa5
 * License along with this library; if not, write to the
Packit Service fb6fa5
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Packit Service fb6fa5
 * Boston, MA 02111-1307, USA.
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
/*
Packit Service fb6fa5
 * Modified by the GTK+ Team and others 1997-2000.  See the AUTHORS
Packit Service fb6fa5
 * file for a list of people on the GTK+ Team.
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
/*
Packit Service fb6fa5
 * GTK+ DirectFB backend
Packit Service fb6fa5
 * Copyright (C) 2001-2002  convergence integrated media GmbH
Packit Service fb6fa5
 * Copyright (C) 2002       convergence GmbH
Packit Service fb6fa5
 * Written by Denis Oliver Kropp <dok@convergence.de> and
Packit Service fb6fa5
 *            Sven Neumann <sven@convergence.de>
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
#include "config.h"
Packit Service fb6fa5
#include "gdk.h"
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
#include <stdio.h>
Packit Service fb6fa5
#include <stdlib.h>
Packit Service fb6fa5
#include <string.h>
Packit Service fb6fa5
Packit Service fb6fa5
#include "gdkcolor.h"
Packit Service fb6fa5
#include "gdkinternals.h"
Packit Service fb6fa5
#include "gdkdirectfb.h"
Packit Service fb6fa5
#include "gdkprivate-directfb.h"
Packit Service fb6fa5
#include "gdkalias.h"
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
typedef struct {
Packit Service fb6fa5
  GdkColorInfo     *info;
Packit Service fb6fa5
  IDirectFBPalette *palette;
Packit Service fb6fa5
} GdkColormapPrivateDirectFB;
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
static void  gdk_colormap_finalize (GObject *object);
Packit Service fb6fa5
Packit Service fb6fa5
static gint  gdk_colormap_alloc_pseudocolors (GdkColormap *colormap,
Packit Service fb6fa5
                                              GdkColor    *colors,
Packit Service fb6fa5
                                              gint         ncolors,
Packit Service fb6fa5
                                              gboolean     writeable,
Packit Service fb6fa5
                                              gboolean     best_match,
Packit Service fb6fa5
                                              gboolean    *success);
Packit Service fb6fa5
static void  gdk_directfb_allocate_color_key (GdkColormap *colormap);
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
G_DEFINE_TYPE (GdkColormap, gdk_colormap, G_TYPE_OBJECT)
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gdk_colormap_init (GdkColormap *colormap)
Packit Service fb6fa5
{
Packit Service fb6fa5
  colormap->size           = 0;
Packit Service fb6fa5
  colormap->colors         = NULL;
Packit Service fb6fa5
  colormap->windowing_data = NULL;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gdk_colormap_class_init (GdkColormapClass *klass)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GObjectClass *object_class = G_OBJECT_CLASS (klass);
Packit Service fb6fa5
Packit Service fb6fa5
  object_class->finalize = gdk_colormap_finalize;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gdk_colormap_finalize (GObject *object)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkColormap                *colormap = GDK_COLORMAP (object);
Packit Service fb6fa5
  GdkColormapPrivateDirectFB *private  = colormap->windowing_data;
Packit Service fb6fa5
Packit Service fb6fa5
  g_free (colormap->colors);
Packit Service fb6fa5
Packit Service fb6fa5
  if (private)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      g_free (private->info);
Packit Service fb6fa5
Packit Service fb6fa5
      if (private->palette)
Packit Service fb6fa5
        private->palette->Release (private->palette);
Packit Service fb6fa5
Packit Service fb6fa5
      g_free (private);
Packit Service fb6fa5
      colormap->windowing_data = NULL;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  G_OBJECT_CLASS (gdk_colormap_parent_class)->finalize (object);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
GdkColormap*
Packit Service fb6fa5
gdk_colormap_new (GdkVisual *visual,
Packit Service fb6fa5
                  gboolean   private_cmap)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkColormap *colormap;
Packit Service fb6fa5
  gint         i;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_val_if_fail (visual != NULL, NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  colormap = g_object_new (gdk_colormap_get_type (), NULL);
Packit Service fb6fa5
  colormap->visual = visual;
Packit Service fb6fa5
  colormap->size   = visual->colormap_size;
Packit Service fb6fa5
Packit Service fb6fa5
  switch (visual->type)
Packit Service fb6fa5
    {
Packit Service fb6fa5
    case GDK_VISUAL_PSEUDO_COLOR:
Packit Service fb6fa5
      {
Packit Service fb6fa5
        IDirectFB                  *dfb = _gdk_display->directfb;
Packit Service fb6fa5
        IDirectFBPalette           *palette;
Packit Service fb6fa5
        GdkColormapPrivateDirectFB *private;
Packit Service fb6fa5
        DFBPaletteDescription       dsc;
Packit Service fb6fa5
Packit Service fb6fa5
        dsc.flags = DPDESC_SIZE;
Packit Service fb6fa5
        dsc.size  = colormap->size;
Packit Service fb6fa5
        if (!dfb->CreatePalette (dfb, &dsc, &palette))
Packit Service fb6fa5
          return NULL;
Packit Service fb6fa5
Packit Service fb6fa5
        colormap->colors = g_new0 (GdkColor, colormap->size);
Packit Service fb6fa5
Packit Service fb6fa5
        private = g_new0 (GdkColormapPrivateDirectFB, 1);
Packit Service fb6fa5
        private->info = g_new0 (GdkColorInfo, colormap->size);
Packit Service fb6fa5
Packit Service fb6fa5
	if (visual == gdk_visual_get_system ())
Packit Service fb6fa5
	  {
Packit Service fb6fa5
            /* save the first (transparent) palette entry */
Packit Service fb6fa5
            private->info[0].ref_count++;
Packit Service fb6fa5
          }
Packit Service fb6fa5
Packit Service fb6fa5
        private->palette = palette;
Packit Service fb6fa5
Packit Service fb6fa5
        colormap->windowing_data = private;
Packit Service fb6fa5
Packit Service fb6fa5
        gdk_directfb_allocate_color_key (colormap);
Packit Service fb6fa5
      }
Packit Service fb6fa5
      break;
Packit Service fb6fa5
Packit Service fb6fa5
    case GDK_VISUAL_STATIC_COLOR:
Packit Service fb6fa5
      colormap->colors = g_new0 (GdkColor, colormap->size);
Packit Service fb6fa5
      for (i = 0; i < colormap->size; i++)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          GdkColor *color = colormap->colors + i;
Packit Service fb6fa5
Packit Service fb6fa5
          color->pixel = i;
Packit Service fb6fa5
          color->red   = (i & 0xE0) <<  8 | (i & 0xE0);
Packit Service fb6fa5
          color->green = (i & 0x1C) << 11 | (i & 0x1C) << 3;
Packit Service fb6fa5
          color->blue  = (i & 0x03) << 14 | (i & 0x03) << 6;
Packit Service fb6fa5
        }
Packit Service fb6fa5
      break;
Packit Service fb6fa5
Packit Service fb6fa5
    default:
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  return colormap;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
GdkScreen*
Packit Service fb6fa5
gdk_colormap_get_screen (GdkColormap *cmap)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return _gdk_screen;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
GdkColormap*
Packit Service fb6fa5
gdk_screen_get_system_colormap (GdkScreen *screen)
Packit Service fb6fa5
{
Packit Service fb6fa5
  static GdkColormap *colormap = NULL;
Packit Service fb6fa5
Packit Service fb6fa5
  if (!colormap)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GdkVisual *visual = gdk_visual_get_system ();
Packit Service fb6fa5
Packit Service fb6fa5
      /* special case PSEUDO_COLOR to use the system palette */
Packit Service fb6fa5
      if (visual->type == GDK_VISUAL_PSEUDO_COLOR)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          GdkColormapPrivateDirectFB *private;
Packit Service fb6fa5
          IDirectFBSurface           *surface;
Packit Service fb6fa5
Packit Service fb6fa5
          colormap = g_object_new (gdk_colormap_get_type (), NULL);
Packit Service fb6fa5
Packit Service fb6fa5
          colormap->visual = visual;
Packit Service fb6fa5
          colormap->size   = visual->colormap_size;
Packit Service fb6fa5
          colormap->colors = g_new0 (GdkColor, colormap->size);
Packit Service fb6fa5
Packit Service fb6fa5
          private = g_new0 (GdkColormapPrivateDirectFB, 1);
Packit Service fb6fa5
          private->info = g_new0 (GdkColorInfo, colormap->size);
Packit Service fb6fa5
Packit Service fb6fa5
          surface = GDK_WINDOW_IMPL_DIRECTFB (
Packit Service fb6fa5
                        GDK_WINDOW_OBJECT (_gdk_parent_root)->impl)->drawable.surface;
Packit Service fb6fa5
          surface->GetPalette (surface, &private->palette);
Packit Service fb6fa5
Packit Service fb6fa5
          colormap->windowing_data = private;
Packit Service fb6fa5
Packit Service fb6fa5
          /* save the first (transparent) palette entry */
Packit Service fb6fa5
          private->info[0].ref_count++;
Packit Service fb6fa5
Packit Service fb6fa5
          gdk_directfb_allocate_color_key (colormap);
Packit Service fb6fa5
        }
Packit Service fb6fa5
      else
Packit Service fb6fa5
        {
Packit Service fb6fa5
          colormap = gdk_colormap_new (visual, FALSE);
Packit Service fb6fa5
        }
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  return colormap;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
gint
Packit Service fb6fa5
gdk_colormap_get_system_size (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkVisual *visual;
Packit Service fb6fa5
Packit Service fb6fa5
  visual = gdk_visual_get_system ();
Packit Service fb6fa5
Packit Service fb6fa5
  return visual->colormap_size;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gdk_colormap_change (GdkColormap *colormap,
Packit Service fb6fa5
                     gint         ncolors)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_message ("gdk_colormap_change() is deprecated and unimplemented");
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gdk_colors_alloc (GdkColormap   *colormap,
Packit Service fb6fa5
                  gboolean       contiguous,
Packit Service fb6fa5
                  gulong        *planes,
Packit Service fb6fa5
                  gint           nplanes,
Packit Service fb6fa5
                  gulong        *pixels,
Packit Service fb6fa5
                  gint           npixels)
Packit Service fb6fa5
{
Packit Service fb6fa5
  /* g_message ("gdk_colors_alloc() is deprecated and unimplemented"); */
Packit Service fb6fa5
Packit Service fb6fa5
  return TRUE;  /* return TRUE here to make GdkRGB happy */
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gdk_colors_free (GdkColormap *colormap,
Packit Service fb6fa5
                 gulong      *in_pixels,
Packit Service fb6fa5
                 gint         in_npixels,
Packit Service fb6fa5
                 gulong       planes)
Packit Service fb6fa5
{
Packit Service fb6fa5
  /* g_message ("gdk_colors_free() is deprecated and unimplemented"); */
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gdk_colormap_free_colors (GdkColormap    *colormap,
Packit Service fb6fa5
                          const GdkColor *colors,
Packit Service fb6fa5
                          gint            ncolors)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkColormapPrivateDirectFB *private;
Packit Service fb6fa5
  gint                        i;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_if_fail (GDK_IS_COLORMAP (colormap));
Packit Service fb6fa5
  g_return_if_fail (colors != NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  private = colormap->windowing_data;
Packit Service fb6fa5
  if (!private)
Packit Service fb6fa5
    return;
Packit Service fb6fa5
Packit Service fb6fa5
  for (i = 0; i < ncolors; i++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      gint  index = colors[i].pixel;
Packit Service fb6fa5
Packit Service fb6fa5
      if (index < 0 || index >= colormap->size)
Packit Service fb6fa5
        continue;
Packit Service fb6fa5
Packit Service fb6fa5
      if (private->info[index].ref_count)
Packit Service fb6fa5
        private->info[index].ref_count--;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
gint
Packit Service fb6fa5
gdk_colormap_alloc_colors (GdkColormap *colormap,
Packit Service fb6fa5
                           GdkColor    *colors,
Packit Service fb6fa5
                           gint         ncolors,
Packit Service fb6fa5
                           gboolean     writeable,
Packit Service fb6fa5
                           gboolean     best_match,
Packit Service fb6fa5
                           gboolean    *success)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkVisual *visual;
Packit Service fb6fa5
  gint       i;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_val_if_fail (GDK_IS_COLORMAP (colormap), 0);
Packit Service fb6fa5
  g_return_val_if_fail (colors != NULL, 0);
Packit Service fb6fa5
  g_return_val_if_fail (success != NULL, 0);
Packit Service fb6fa5
Packit Service fb6fa5
  switch (colormap->visual->type)
Packit Service fb6fa5
    {
Packit Service fb6fa5
    case GDK_VISUAL_TRUE_COLOR:
Packit Service fb6fa5
      visual = colormap->visual;
Packit Service fb6fa5
Packit Service fb6fa5
      for (i = 0; i < ncolors; i++)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          colors[i].pixel =
Packit Service fb6fa5
            (((colors[i].red
Packit Service fb6fa5
               >> (16 - visual->red_prec))   << visual->red_shift)   +
Packit Service fb6fa5
             ((colors[i].green
Packit Service fb6fa5
               >> (16 - visual->green_prec)) << visual->green_shift) +
Packit Service fb6fa5
             ((colors[i].blue
Packit Service fb6fa5
               >> (16 - visual->blue_prec))  << visual->blue_shift));
Packit Service fb6fa5
Packit Service fb6fa5
          success[i] = TRUE;
Packit Service fb6fa5
        }
Packit Service fb6fa5
      break;
Packit Service fb6fa5
Packit Service fb6fa5
    case GDK_VISUAL_PSEUDO_COLOR:
Packit Service fb6fa5
      return gdk_colormap_alloc_pseudocolors (colormap,
Packit Service fb6fa5
                                              colors, ncolors,
Packit Service fb6fa5
                                              writeable, best_match,
Packit Service fb6fa5
                                              success);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
Packit Service fb6fa5
    case GDK_VISUAL_STATIC_COLOR:
Packit Service fb6fa5
      for (i = 0; i < ncolors; i++)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          colors[i].pixel = (((colors[i].red   & 0xE000) >> 8)  |
Packit Service fb6fa5
                             ((colors[i].green & 0xE000) >> 11) |
Packit Service fb6fa5
                             ((colors[i].blue  & 0xC000) >> 14));
Packit Service fb6fa5
          success[i] = TRUE;
Packit Service fb6fa5
        }
Packit Service fb6fa5
      break;
Packit Service fb6fa5
Packit Service fb6fa5
    default:
Packit Service fb6fa5
      for (i = 0; i < ncolors; i++)
Packit Service fb6fa5
        success[i] = FALSE;
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  return 0;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gdk_color_change (GdkColormap *colormap,
Packit Service fb6fa5
                  GdkColor    *color)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkColormapPrivateDirectFB *private;
Packit Service fb6fa5
  IDirectFBPalette           *palette;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_val_if_fail (GDK_IS_COLORMAP (colormap), FALSE);
Packit Service fb6fa5
  g_return_val_if_fail (color != NULL, FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
  private = colormap->windowing_data;
Packit Service fb6fa5
  if (!private)
Packit Service fb6fa5
    return FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  palette = private->palette;
Packit Service fb6fa5
  if (!palette)
Packit Service fb6fa5
    return FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  if (color->pixel < 0 || color->pixel >= colormap->size)
Packit Service fb6fa5
    return FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  if (private->info[color->pixel].flags & GDK_COLOR_WRITEABLE)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      DFBColor  entry = { 0xFF,
Packit Service fb6fa5
                          color->red   >> 8,
Packit Service fb6fa5
                          color->green >> 8,
Packit Service fb6fa5
                          color->blue  >> 8 };
Packit Service fb6fa5
Packit Service fb6fa5
      if (palette->SetEntries (palette, &entry, 1, color->pixel) != DFB_OK)
Packit Service fb6fa5
        return FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
      colormap->colors[color->pixel] = *color;
Packit Service fb6fa5
      return TRUE;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  return FALSE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gdk_colormap_query_color (GdkColormap *colormap,
Packit Service fb6fa5
                          gulong       pixel,
Packit Service fb6fa5
                          GdkColor    *result)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkVisual *visual;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_if_fail (GDK_IS_COLORMAP (colormap));
Packit Service fb6fa5
Packit Service fb6fa5
  visual = gdk_colormap_get_visual (colormap);
Packit Service fb6fa5
Packit Service fb6fa5
  switch (visual->type)
Packit Service fb6fa5
    {
Packit Service fb6fa5
    case GDK_VISUAL_TRUE_COLOR:
Packit Service fb6fa5
      result->red = 65535. *
Packit Service fb6fa5
        (gdouble)((pixel & visual->red_mask) >> visual->red_shift) /
Packit Service fb6fa5
        ((1 << visual->red_prec) - 1);
Packit Service fb6fa5
Packit Service fb6fa5
      result->green = 65535. *
Packit Service fb6fa5
        (gdouble)((pixel & visual->green_mask) >> visual->green_shift) /
Packit Service fb6fa5
        ((1 << visual->green_prec) - 1);
Packit Service fb6fa5
Packit Service fb6fa5
      result->blue = 65535. *
Packit Service fb6fa5
        (gdouble)((pixel & visual->blue_mask) >> visual->blue_shift) /
Packit Service fb6fa5
        ((1 << visual->blue_prec) - 1);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
Packit Service fb6fa5
    case GDK_VISUAL_STATIC_COLOR:
Packit Service fb6fa5
    case GDK_VISUAL_PSEUDO_COLOR:
Packit Service fb6fa5
      if (pixel >= 0 && pixel < colormap->size)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          result->red   = colormap->colors[pixel].red;
Packit Service fb6fa5
          result->green = colormap->colors[pixel].green;
Packit Service fb6fa5
          result->blue  = colormap->colors[pixel].blue;
Packit Service fb6fa5
        }
Packit Service fb6fa5
      else
Packit Service fb6fa5
        g_warning ("gdk_colormap_query_color: pixel outside colormap");
Packit Service fb6fa5
      break;
Packit Service fb6fa5
Packit Service fb6fa5
    case GDK_VISUAL_DIRECT_COLOR:
Packit Service fb6fa5
    case GDK_VISUAL_GRAYSCALE:
Packit Service fb6fa5
    case GDK_VISUAL_STATIC_GRAY:
Packit Service fb6fa5
      /* unsupported */
Packit Service fb6fa5
      g_assert_not_reached ();
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
IDirectFBPalette *
Packit Service fb6fa5
gdk_directfb_colormap_get_palette (GdkColormap *colormap)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkColormapPrivateDirectFB *private;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_val_if_fail (GDK_IS_COLORMAP (colormap), NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  private = colormap->windowing_data;
Packit Service fb6fa5
Packit Service fb6fa5
  if (private && private->palette)
Packit Service fb6fa5
    return private->palette;
Packit Service fb6fa5
  else
Packit Service fb6fa5
    return NULL;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gint
Packit Service fb6fa5
gdk_colormap_alloc_pseudocolors (GdkColormap *colormap,
Packit Service fb6fa5
                                 GdkColor    *colors,
Packit Service fb6fa5
                                 gint         ncolors,
Packit Service fb6fa5
                                 gboolean     writeable,
Packit Service fb6fa5
                                 gboolean     best_match,
Packit Service fb6fa5
                                 gboolean    *success)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkColormapPrivateDirectFB *private = colormap->windowing_data;
Packit Service fb6fa5
  IDirectFBPalette           *palette;
Packit Service fb6fa5
  gint                        i, j;
Packit Service fb6fa5
  gint                        remaining = ncolors;
Packit Service fb6fa5
Packit Service fb6fa5
  palette = private->palette;
Packit Service fb6fa5
Packit Service fb6fa5
  for (i = 0; i < ncolors; i++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      guint     index;
Packit Service fb6fa5
      DFBColor  lookup = { 0xFF,
Packit Service fb6fa5
                           colors[i].red   >> 8,
Packit Service fb6fa5
                           colors[i].green >> 8,
Packit Service fb6fa5
                           colors[i].blue  >> 8 };
Packit Service fb6fa5
Packit Service fb6fa5
      success[i] = FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
      if (writeable)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          /* look for an empty slot and allocate a new color */
Packit Service fb6fa5
          for (j = 0; j < colormap->size; j++)
Packit Service fb6fa5
            if (private->info[j].ref_count == 0)
Packit Service fb6fa5
              {
Packit Service fb6fa5
                index = j;
Packit Service fb6fa5
Packit Service fb6fa5
                palette->SetEntries (palette, &lookup, 1, index);
Packit Service fb6fa5
Packit Service fb6fa5
                private->info[index].flags = GDK_COLOR_WRITEABLE;
Packit Service fb6fa5
Packit Service fb6fa5
                colors[i].pixel = index;
Packit Service fb6fa5
                colormap->colors[index] = colors[i];
Packit Service fb6fa5
Packit Service fb6fa5
                goto allocated;
Packit Service fb6fa5
              }
Packit Service fb6fa5
        }
Packit Service fb6fa5
      else
Packit Service fb6fa5
        {
Packit Service fb6fa5
          palette->FindBestMatch (palette,
Packit Service fb6fa5
                                  lookup.r, lookup.g, lookup.b, lookup.a,
Packit Service fb6fa5
                                  &index);
Packit Service fb6fa5
Packit Service fb6fa5
          if (index < 0 || index > colormap->size)
Packit Service fb6fa5
            continue;
Packit Service fb6fa5
Packit Service fb6fa5
          /* check if we have an exact (non-writeable) match */
Packit Service fb6fa5
          if (private->info[index].ref_count &&
Packit Service fb6fa5
              !(private->info[index].flags & GDK_COLOR_WRITEABLE))
Packit Service fb6fa5
            {
Packit Service fb6fa5
              DFBColor  entry;
Packit Service fb6fa5
Packit Service fb6fa5
              palette->GetEntries (palette, &entry, 1, index);
Packit Service fb6fa5
Packit Service fb6fa5
              if (entry.a == 0xFF &&
Packit Service fb6fa5
                  entry.r == lookup.r && entry.g == lookup.g && entry.b == lookup.b)
Packit Service fb6fa5
                {
Packit Service fb6fa5
                  colors[i].pixel = index;
Packit Service fb6fa5
Packit Service fb6fa5
                  goto allocated;
Packit Service fb6fa5
                }
Packit Service fb6fa5
            }
Packit Service fb6fa5
Packit Service fb6fa5
          /* look for an empty slot and allocate a new color */
Packit Service fb6fa5
          for (j = 0; j < colormap->size; j++)
Packit Service fb6fa5
            if (private->info[j].ref_count == 0)
Packit Service fb6fa5
              {
Packit Service fb6fa5
                index = j;
Packit Service fb6fa5
Packit Service fb6fa5
                palette->SetEntries (palette, &lookup, 1, index);
Packit Service fb6fa5
    		private->info[index].flags = 0;
Packit Service fb6fa5
Packit Service fb6fa5
                colors[i].pixel = index;
Packit Service fb6fa5
                colormap->colors[index] = colors[i];
Packit Service fb6fa5
Packit Service fb6fa5
                goto allocated;
Packit Service fb6fa5
              }
Packit Service fb6fa5
Packit Service fb6fa5
          /* if that failed, use the best match */
Packit Service fb6fa5
          if (best_match &&
Packit Service fb6fa5
              !(private->info[index].flags & GDK_COLOR_WRITEABLE))
Packit Service fb6fa5
            {
Packit Service fb6fa5
#if 0
Packit Service fb6fa5
               g_print ("best match for (%d %d %d)  ",
Packit Service fb6fa5
                       colormap->colors[index].red,
Packit Service fb6fa5
                       colormap->colors[index].green,
Packit Service fb6fa5
                       colormap->colors[index].blue);
Packit Service fb6fa5
#endif
Packit Service fb6fa5
Packit Service fb6fa5
              colors[i].pixel = index;
Packit Service fb6fa5
Packit Service fb6fa5
              goto allocated;
Packit Service fb6fa5
            }
Packit Service fb6fa5
        }
Packit Service fb6fa5
Packit Service fb6fa5
      /* if we got here, all attempts failed */
Packit Service fb6fa5
      continue;
Packit Service fb6fa5
Packit Service fb6fa5
    allocated:
Packit Service fb6fa5
      private->info[index].ref_count++;
Packit Service fb6fa5
Packit Service fb6fa5
#if 0
Packit Service fb6fa5
      g_print ("cmap %p: allocated (%d %d %d) %d [%d]\n", colormap,
Packit Service fb6fa5
                colors[i].red, colors[i].green, colors[i].blue, colors[i].pixel,
Packit Service fb6fa5
	        private->info[index].ref_count);
Packit Service fb6fa5
#endif
Packit Service fb6fa5
Packit Service fb6fa5
      success[i] = TRUE;
Packit Service fb6fa5
      remaining--;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  return remaining;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/* dirty hack for color_keying */
Packit Service fb6fa5
static void
Packit Service fb6fa5
gdk_directfb_allocate_color_key (GdkColormap *colormap)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkColormapPrivateDirectFB *private = colormap->windowing_data;
Packit Service fb6fa5
  IDirectFBPalette           *palette = private->palette;
Packit Service fb6fa5
Packit Service fb6fa5
  if (!gdk_directfb_enable_color_keying)
Packit Service fb6fa5
    return;
Packit Service fb6fa5
Packit Service fb6fa5
  palette->SetEntries (palette, &gdk_directfb_bg_color, 1, 255);
Packit Service fb6fa5
Packit Service fb6fa5
  colormap->colors[255].pixel = 255;
Packit Service fb6fa5
  colormap->colors[255].red   = ((gdk_directfb_bg_color_key.r << 8)
Packit Service fb6fa5
                                 | gdk_directfb_bg_color_key.r);
Packit Service fb6fa5
  colormap->colors[255].green = ((gdk_directfb_bg_color_key.g << 8)
Packit Service fb6fa5
                                 | gdk_directfb_bg_color_key.g);
Packit Service fb6fa5
  colormap->colors[255].blue  = ((gdk_directfb_bg_color_key.b << 8)
Packit Service fb6fa5
                                 | gdk_directfb_bg_color_key.b);
Packit Service fb6fa5
Packit Service fb6fa5
  private->info[255].ref_count++;
Packit Service fb6fa5
}
Packit Service fb6fa5
#define __GDK_COLOR_X11_C__
Packit Service fb6fa5
#include "gdkaliasdef.c"