OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libjava/] [gnu/] [gcj/] [xlib/] [natColormap.cc] - Rev 756

Compare with Previous | Blame | View Log

/* Copyright (C) 2000  Free Software Foundation
 
   This file is part of libgcj.
 
This software is copyrighted work licensed under the terms of the
Libgcj License.  Please consult the file "LIBGCJ_LICENSE" for
details.  */
 
// Needed to avoid linking in libstdc++
#ifndef __STL_USE_EXCEPTIONS
#   include <java/lang/OutOfMemoryError.h>
#   define __THROW_BAD_ALLOC throw new java::lang::OutOfMemoryError()
#endif
 
#include <vector>
 
#include <X11/Xlib.h>
 
#include <gcj/cni.h>
#include <java/lang/RuntimeException.h>
#include <gnu/gcj/xlib/Display.h>
#include <gnu/gcj/xlib/Screen.h>
#include <gnu/gcj/xlib/Colormap.h>
#include <gnu/gcj/xlib/XColor.h>
#include <gnu/gcj/RawData.h>
 
jlong gnu::gcj::xlib::Colormap::allocateColorPixel(XColor* color)
{
  ::Display* dpy = (::Display*) (screen->getDisplay()->display);
  ::XColor* col = (::XColor*) (color->structure);
  Status result = XAllocColor(dpy, xid, col);
  if (result == 0)
    throw new ::java::lang::RuntimeException(
      JvNewStringLatin1("Unable to allocate color pixel."));
 
  return col->pixel;
}
 
typedef JArray<gnu::gcj::xlib::XColor*>* xcolorarray;
 
xcolorarray gnu::gcj::xlib::Colormap::getSharedColors()
{
  ::Display* dpy = (::Display*) (screen->getDisplay()->display);
  unsigned int nCells = CellsOfScreen(ScreenOfDisplay(dpy, screen->screenNumber));
 
  typedef ::XColor xcolor;
  std::vector<xcolor> colors(nCells);
  for (unsigned int i=0; i<nCells; i++)
    colors[i].pixel = i;
  ::XColor* cols = colors.get_allocator().address(colors.front());
  XQueryColors(dpy, xid, cols,
	       nCells);
 
  int nShared = 0;
  for (unsigned int i=0; i<nCells; i++)
    {
      ::XColor color = colors[i];
 
      if (!XAllocColor(dpy, xid, &color))
	continue;
 
      /* FIXME: In some cases this algorithm may identify a free
	 color cell as a shared one. */
      if (color.pixel != i)
	{
	  // Oops, the color wasn't shared. Free it.
	  XFreeColors(dpy, xid, &(color.pixel), 1, 0);
	  colors[i].flags = FLAG_NOT_SHARED;
	  continue;
	}
 
      // FIXME: Shared or free?
 
      nShared++;
      colors[i].flags = FLAG_SHARED;
    }
 
  JArray<XColor*>* shared = newXColorArray(nShared);
  int si=0;
  for (unsigned int i=0; i<nCells; i++)
    {
      if (colors[i].flags != FLAG_SHARED)
	continue;
 
      XColor* col = elements(shared)[si++];
      gnu::gcj::RawData* colorData = col->structure;
      ::XColor* colStruct = reinterpret_cast<xcolor*>(colorData);
      *colStruct = colors[i];
    }
 
  return shared;
}
 
xcolorarray gnu::gcj::xlib::Colormap::getXColors()
{
  ::Display* dpy = (::Display*) (screen->getDisplay()->display);
  unsigned int nCells =
    CellsOfScreen(ScreenOfDisplay(dpy, screen->screenNumber));
 
  typedef ::XColor xcolor;
  std::vector<xcolor> colors(nCells);
 
  JArray<XColor*>* colArray = newXColorArray(nCells);
 
  for (unsigned int i=0; i<nCells; i++)
    colors[i].pixel = i;
 
  XQueryColors(dpy, xid, &(colors.front()), nCells);
 
  /* TODO: The current problem with this code is that it relies on
     (color.pixel == i) as an indicator that the color is
     shared. However, (color.pixel == i), may also occur simply
     because color cell i simply was the next free in the list of
     unallocated color cells.  IDEA: run through the list both
     backwards and forwards, and only pick out the colorcells that
     have been identified as shared during both passes.  Reversing the
     traversal direction might prevent i from corresponding to the
     next free colorcell, atleast in one of the passes. */
  for (unsigned int i=0; i<nCells; i++)
    {
      ::XColor color = colors[i];
 
      char flag = FLAG_NOT_SHARED;
      if (XAllocColor(dpy, xid, &color))
	{
	  if (color.pixel == i)
	    {
	      flag = FLAG_SHARED;
	    }
	  else
	    {
	      // Oops, the color wasn't shared. Free it.
	      XFreeColors(dpy, xid, &(color.pixel), 1, 0);
	    }
	}
 
      // Copy color data into object in array
      XColor* col = elements(colArray)[i];
      gnu::gcj::RawData* colorData = col->structure;
      ::XColor* colStruct = reinterpret_cast<xcolor*>(colorData);
      *colStruct = colors[i];
      colStruct->flags = flag;
    }
 
  return colArray;
}
 
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.