From 9ce8d6a2b0fec3ce3f6e838445fdea3445d2ce8d Mon Sep 17 00:00:00 2001 From: Mattia Barbon Date: Mon, 7 Apr 2003 17:15:11 +0000 Subject: [PATCH] Moved m_visual* wxApp[X11] members used by wxBitmap and wxColour into a new wxXVisualInfo structure, and moved code to initialize it to a new src/x11/utilsx.cpp file (utility functions shared by wxMotif and wxX11). Added (currently unused) code in wxMotif to retrieve wxXVisualInfo; it will be used when wxMotif is switched to bitmap.cpp from wxX11. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@20056 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- distrib/msw/tmake/filelist.txt | 1 + include/wx/motif/app.h | 9 +- include/wx/x11/app.h | 30 +++--- include/wx/x11/privx.h | 30 +++++- src/motif/app.cpp | 27 ++++++ src/motif/files.lst | 4 +- src/x11/app.cpp | 124 +------------------------ src/x11/bitmap.cpp | 46 ++++++---- src/x11/colour.cpp | 8 +- src/x11/files.lst | 2 + src/x11/utilsx.cpp | 161 +++++++++++++++++++++++++++++++++ 11 files changed, 276 insertions(+), 166 deletions(-) create mode 100644 src/x11/utilsx.cpp diff --git a/distrib/msw/tmake/filelist.txt b/distrib/msw/tmake/filelist.txt index 49ee59985b..83e254f63f 100644 --- a/distrib/msw/tmake/filelist.txt +++ b/distrib/msw/tmake/filelist.txt @@ -700,6 +700,7 @@ reparent.cpp X11 settings.cpp X11 toplevel.cpp X11 utils.cpp X11 +utilsx.cpp X11 Motif window.cpp X11 accel.cpp OS2 diff --git a/include/wx/motif/app.h b/include/wx/motif/app.h index b8e43947c4..a0d914b1df 100644 --- a/include/wx/motif/app.h +++ b/include/wx/motif/app.h @@ -32,6 +32,8 @@ class WXDLLEXPORT wxApp; class WXDLLEXPORT wxKeyEvent; class WXDLLEXPORT wxLog; class WXDLLEXPORT wxEventLoop; +class WXDLLEXPORT wxXVisualInfo; +class wxXVisualInfoMap; // ---------------------------------------------------------------------------- // the wxApp class for Motif - see wxAppBase for more details @@ -90,7 +92,9 @@ public: // This handler is called when a property change event occurs virtual void HandlePropertyChange(WXEvent *event); - + + wxXVisualInfo* GetVisualInfo(WXDisplay* display); + private: static long sm_lastMessageTime; int m_nCmdShow; @@ -103,7 +107,8 @@ private: WXColormap m_mainColormap; WXDisplay* m_initialDisplay; long m_maxRequestSize; - + wxXVisualInfoMap* m_visualInfoMap; + DECLARE_EVENT_TABLE() }; diff --git a/include/wx/x11/app.h b/include/wx/x11/app.h index 3621558b9f..f61e293a66 100644 --- a/include/wx/x11/app.h +++ b/include/wx/x11/app.h @@ -33,6 +33,7 @@ class WXDLLEXPORT wxApp; class WXDLLEXPORT wxKeyEvent; class WXDLLEXPORT wxLog; class WXDLLEXPORT wxEventLoop; +class WXDLLEXPORT wxXVisualInfo; // ---------------------------------------------------------------------------- // the wxApp class for wxX11 - see wxAppBase for more details @@ -107,7 +108,14 @@ public: // environment variable PangoContext* GetPangoContext(); #endif - + + wxXVisualInfo* GetVisualInfo(WXDisplay* display) + { + // this should be implemented correctly for wxBitmap to work + // with multiple display + return m_visualInfo; + } + // We need this before creating the app static WXDisplay* GetDisplay() { return ms_display; } static WXDisplay* ms_display; @@ -117,24 +125,8 @@ public: bool m_showIconic; wxSize m_initialSize; -#if !wxUSE_NANOX - // Someone find a better place for these - int m_visualType; // TrueColor, DirectColor etc. - int m_visualDepth; - int m_visualColormapSize; - void *m_visualColormap; - int m_visualScreen; - unsigned long m_visualRedMask; - unsigned long m_visualGreenMask; - unsigned long m_visualBlueMask; - int m_visualRedShift; - int m_visualGreenShift; - int m_visualBlueShift; - int m_visualRedPrec; - int m_visualGreenPrec; - int m_visualBluePrec; - - unsigned char *m_colorCube; +#if !wxUSE_NANOX + wxXVisualInfo* m_visualInfo; #endif protected: diff --git a/include/wx/x11/privx.h b/include/wx/x11/privx.h index 7a3473593a..30862c0b35 100644 --- a/include/wx/x11/privx.h +++ b/include/wx/x11/privx.h @@ -135,5 +135,31 @@ bool wxWindowIsVisible(Window win); #define XFontStructGetAscent(f) f->ascent #endif -#endif -// _WX_PRIVX_H_ +class WXDLLEXPORT wxXVisualInfo +{ +public: + wxXVisualInfo(); + ~wxXVisualInfo(); + void Init( Display* dpy, XVisualInfo* visualInfo ); + + int m_visualType; // TrueColor, DirectColor etc. + int m_visualDepth; + int m_visualColormapSize; + void *m_visualColormap; + int m_visualScreen; + unsigned long m_visualRedMask; + unsigned long m_visualGreenMask; + unsigned long m_visualBlueMask; + int m_visualRedShift; + int m_visualGreenShift; + int m_visualBlueShift; + int m_visualRedPrec; + int m_visualGreenPrec; + int m_visualBluePrec; + + unsigned char *m_colorCube; +}; + +bool wxFillXVisualInfo( wxXVisualInfo* vi, Display* dpy ); + +#endif // _WX_PRIVX_H_ diff --git a/src/motif/app.cpp b/src/motif/app.cpp index 1d226a24a9..63cfd7ab1c 100644 --- a/src/motif/app.cpp +++ b/src/motif/app.cpp @@ -37,6 +37,7 @@ #include "wx/intl.h" #include "wx/evtloop.h" #include "wx/hash.h" +#include "wx/hashmap.h" #if wxUSE_THREADS #include "wx/thread.h" @@ -58,6 +59,8 @@ #include +WX_DECLARE_VOIDPTR_HASH_MAP( wxXVisualInfo*, wxXVisualInfoMap ); + extern wxList wxPendingDelete; extern bool wxAddIdleCallback(); @@ -243,11 +246,21 @@ wxApp::wxApp() m_topLevelWidget = (WXWidget) NULL; m_maxRequestSize = 0; m_initialDisplay = (WXDisplay*) 0; + m_visualInfoMap = new wxXVisualInfoMap; } wxApp::~wxApp() { delete m_eventLoop; + + for( wxXVisualInfoMap::iterator it = m_visualInfoMap->begin(), + end = m_visualInfoMap->end(); + it != end; ++it ) + { + delete it->second; + } + + delete m_visualInfoMap; } bool wxApp::Initialized() @@ -493,6 +506,20 @@ WXColormap wxApp::GetMainColormap(WXDisplay* display) return (WXColormap) c; } +wxXVisualInfo* wxApp::GetVisualInfo( WXDisplay* display ) +{ + wxXVisualInfoMap::iterator it = m_visualInfoMap->find( display ); + + if( it != m_visualInfoMap->end() ) return it->second; + + wxXVisualInfo* vi = new wxXVisualInfo; + wxFillXVisualInfo( vi, (Display*)display ); + + (*m_visualInfoMap)[display] = vi; + + return vi; +} + void wxExit() { int retValue = 0; diff --git a/src/motif/files.lst b/src/motif/files.lst index f16c5df062..10a3a6674d 100644 --- a/src/motif/files.lst +++ b/src/motif/files.lst @@ -233,6 +233,7 @@ ALL_SOURCES = \ motif/window.cpp \ x11/brush.cpp \ x11/pen.cpp \ + x11/utilsx.cpp \ unix/dialup.cpp \ unix/dir.cpp \ unix/fontenum.cpp \ @@ -862,7 +863,8 @@ GUIOBJS = \ utils.o \ window.o \ brush.o \ - pen.o + pen.o \ + utilsx.o UNIXOBJS = \ dialup.o \ diff --git a/src/x11/app.cpp b/src/x11/app.cpp index 743577430e..bd29c3eac5 100644 --- a/src/x11/app.cpp +++ b/src/x11/app.cpp @@ -32,8 +32,6 @@ #include "wx/univ/theme.h" #include "wx/univ/renderer.h" -#define ABS(a) (((a) < 0) ? -(a) : (a)) - #if wxUSE_THREADS #include "wx/thread.h" #endif @@ -380,19 +378,14 @@ wxApp::wxApp() m_initialSize = wxDefaultSize; #if !wxUSE_NANOX - m_visualColormap = NULL; - m_colorCube = NULL; + m_visualInfo = NULL; #endif } wxApp::~wxApp() { #if !wxUSE_NANOX - if (m_colorCube) - free( m_colorCube ); - - if (m_visualColormap) - delete [] (XColor*)m_visualColormap; + delete m_visualInfo; #endif } @@ -964,24 +957,6 @@ void wxApp::DeletePendingObjects() } } -static void wxCalcPrecAndShift( unsigned long mask, int *shift, int *prec ) -{ - *shift = 0; - *prec = 0; - - while (!(mask & 0x1)) - { - (*shift)++; - mask >>= 1; - } - - while (mask & 0x1) - { - (*prec)++; - mask >>= 1; - } -} - // Create display, and other initialization bool wxApp::OnInitGui() { @@ -998,99 +973,8 @@ bool wxApp::OnInitGui() m_maxRequestSize = XMaxRequestSize( (Display*) wxApp::GetDisplay() ); #if !wxUSE_NANOX - // Get info about the current visual. It is enough - // to do this once here unless we support different - // visuals, displays and screens. Given that wxX11 - // mostly for embedded things, that is no real - // limitation. - Display *xdisplay = (Display*) wxApp::GetDisplay(); - int xscreen = DefaultScreen(xdisplay); - Visual* xvisual = DefaultVisual(xdisplay,xscreen); - int xdepth = DefaultDepth(xdisplay, xscreen); - - XVisualInfo vinfo_template; - vinfo_template.visual = xvisual; - vinfo_template.visualid = XVisualIDFromVisual( xvisual ); - vinfo_template.depth = xdepth; - - int nitem = 0; - XVisualInfo *vi = XGetVisualInfo( xdisplay, VisualIDMask|VisualDepthMask, &vinfo_template, &nitem ); - wxASSERT_MSG( vi, wxT("No visual info") ); - - m_visualType = vi->visual->c_class; - m_visualScreen = vi->screen; - - m_visualRedMask = vi->red_mask; - m_visualGreenMask = vi->green_mask; - m_visualBlueMask = vi->blue_mask; - - if (m_visualType != GrayScale && m_visualType != PseudoColor) - { - wxCalcPrecAndShift( m_visualRedMask, &m_visualRedShift, &m_visualRedPrec ); - wxCalcPrecAndShift( m_visualGreenMask, &m_visualGreenShift, &m_visualGreenPrec ); - wxCalcPrecAndShift( m_visualBlueMask, &m_visualBlueShift, &m_visualBluePrec ); - } - - m_visualDepth = xdepth; - if (xdepth == 16) - xdepth = m_visualRedPrec + m_visualGreenPrec + m_visualBluePrec; - - m_visualColormapSize = vi->colormap_size; - - XFree( vi ); - - if (m_visualDepth > 8) - return TRUE; - - m_visualColormap = new XColor[m_visualColormapSize]; - XColor* colors = (XColor*) m_visualColormap; - - for (int i = 0; i < m_visualColormapSize; i++) - colors[i].pixel = i; - - XQueryColors( xdisplay, DefaultColormap(xdisplay,xscreen), colors, m_visualColormapSize ); - - m_colorCube = (unsigned char*)malloc(32 * 32 * 32); - - for (int r = 0; r < 32; r++) - { - for (int g = 0; g < 32; g++) - { - for (int b = 0; b < 32; b++) - { - int rr = (r << 3) | (r >> 2); - int gg = (g << 3) | (g >> 2); - int bb = (b << 3) | (b >> 2); - - int index = -1; - - if (colors) - { - int max = 3 * 65536; - - for (int i = 0; i < m_visualColormapSize; i++) - { - int rdiff = ((rr << 8) - colors[i].red); - int gdiff = ((gg << 8) - colors[i].green); - int bdiff = ((bb << 8) - colors[i].blue); - int sum = ABS (rdiff) + ABS (gdiff) + ABS (bdiff); - if (sum < max) - { - index = i; max = sum; - } - } - } - else - { - // assume 8-bit true or static colors. this really exists - index = (r >> (5 - m_visualRedPrec)) << m_visualRedShift; - index |= (g >> (5 - m_visualGreenPrec)) << m_visualGreenShift; - index |= (b >> (5 - m_visualBluePrec)) << m_visualBlueShift; - } - m_colorCube[ (r*1024) + (g*32) + b ] = index; - } - } - } + m_visualInfo = new wxXVisualInfo; + wxFillXVisualInfo( m_visualInfo, (Display*) wxApp::GetDisplay() ); #endif return TRUE; diff --git a/src/x11/bitmap.cpp b/src/x11/bitmap.cpp index 398e85126f..b8c6b31ec7 100644 --- a/src/x11/bitmap.cpp +++ b/src/x11/bitmap.cpp @@ -114,7 +114,7 @@ bool wxMask::Create( const wxBitmap& bitmap, unsigned char green = colour.Green(); unsigned char blue = colour.Blue(); - int bpp = wxTheApp->m_visualDepth; + int bpp = wxTheApp->GetVisualInfo(m_display)->m_visualDepth; if (bpp == 15) { @@ -506,7 +506,7 @@ bool wxBitmap::CreateFromImage( const wxImage& image, int depth ) Window xroot = RootWindow( xdisplay, xscreen ); Visual* xvisual = DefaultVisual( xdisplay, xscreen ); - int bpp = wxTheApp->m_visualDepth; + int bpp = wxTheApp->GetVisualInfo(M_BMPDATA->m_display)->m_visualDepth; int width = image.GetWidth(); int height = image.GetHeight(); @@ -563,14 +563,19 @@ bool wxBitmap::CreateFromImage( const wxImage& image, int depth ) enum byte_order { RGB, RBG, BRG, BGR, GRB, GBR }; byte_order b_o = RGB; + wxXVisualInfo* vi = wxTheApp->GetVisualInfo(M_BMPDATA->m_display); + unsigned long greenMask = vi->m_visualGreenMask, + redMask = vi->m_visualRedMask, + blueMask = vi->m_visualBlueMask; + if (bpp > 8) { - if ((wxTheApp->m_visualRedMask > wxTheApp->m_visualGreenMask) && (wxTheApp->m_visualGreenMask > wxTheApp->m_visualBlueMask)) b_o = RGB; - else if ((wxTheApp->m_visualRedMask > wxTheApp->m_visualBlueMask) && (wxTheApp->m_visualBlueMask > wxTheApp->m_visualGreenMask)) b_o = RBG; - else if ((wxTheApp->m_visualBlueMask > wxTheApp->m_visualRedMask) && (wxTheApp->m_visualRedMask > wxTheApp->m_visualGreenMask)) b_o = BRG; - else if ((wxTheApp->m_visualBlueMask > wxTheApp->m_visualGreenMask) && (wxTheApp->m_visualGreenMask > wxTheApp->m_visualRedMask)) b_o = BGR; - else if ((wxTheApp->m_visualGreenMask > wxTheApp->m_visualRedMask) && (wxTheApp->m_visualRedMask > wxTheApp->m_visualBlueMask)) b_o = GRB; - else if ((wxTheApp->m_visualGreenMask > wxTheApp->m_visualBlueMask) && (wxTheApp->m_visualBlueMask > wxTheApp->m_visualRedMask)) b_o = GBR; + if ((redMask > greenMask) && (greenMask > blueMask)) b_o = RGB; + else if ((redMask > blueMask) && (blueMask > greenMask)) b_o = RBG; + else if ((blueMask > redMask) && (redMask > greenMask)) b_o = BRG; + else if ((blueMask > greenMask) && (greenMask > redMask))b_o = BGR; + else if ((greenMask > redMask) && (redMask > blueMask)) b_o = GRB; + else if ((greenMask > blueMask) && (blueMask > redMask)) b_o = GBR; } int r_mask = image.GetMaskRed(); @@ -580,7 +585,8 @@ bool wxBitmap::CreateFromImage( const wxImage& image, int depth ) unsigned char* data = image.GetData(); wxASSERT_MSG( data, "No image data" ); - unsigned char *colorCube = wxTheApp->m_colorCube; + unsigned char *colorCube = + wxTheApp->GetVisualInfo(M_BMPDATA->m_display)->m_colorCube; bool hasMask = image.HasMask(); @@ -719,7 +725,7 @@ wxImage wxBitmap::ConvertToImage() const return image; #else // !wxUSE_NANOX - int bpp = wxTheApp->m_visualDepth; + int bpp = wxTheApp->GetVisualInfo(M_BMPDATA->m_display)->m_visualDepth; XImage *x_image = NULL; if (GetPixmap()) { @@ -772,14 +778,17 @@ wxImage wxBitmap::ConvertToImage() const if (GetPixmap()) { - red_shift_right = wxTheApp->m_visualRedShift; - red_shift_left = 8-wxTheApp->m_visualRedPrec; - green_shift_right = wxTheApp->m_visualGreenShift; - green_shift_left = 8-wxTheApp->m_visualGreenPrec; - blue_shift_right = wxTheApp->m_visualBlueShift; - blue_shift_left = 8-wxTheApp->m_visualBluePrec; + wxXVisualInfo* vi = wxTheApp->GetVisualInfo(M_BMPDATA->m_display); + + red_shift_right = vi->m_visualRedShift; + red_shift_left = 8 - vi->m_visualRedPrec; + green_shift_right = vi->m_visualGreenShift; + green_shift_left = 8 - vi->m_visualGreenPrec; + blue_shift_right = vi->m_visualBlueShift; + blue_shift_left = 8 - vi->m_visualBluePrec; - use_shift = (wxTheApp->m_visualType == GrayScale) || (wxTheApp->m_visualType != PseudoColor); + use_shift = (vi->m_visualType == GrayScale) || + (vi->m_visualType != PseudoColor); } if (GetBitmap()) @@ -787,7 +796,8 @@ wxImage wxBitmap::ConvertToImage() const bpp = 1; } - XColor *colors = (XColor*) wxTheApp->m_visualColormap; + XColor *colors = (XColor*)wxTheApp-> + GetVisualInfo(M_BMPDATA->m_display)->m_visualColormap; int width = GetWidth(); int height = GetHeight(); diff --git a/src/x11/colour.cpp b/src/x11/colour.cpp index fa4909495c..7431369b7f 100644 --- a/src/x11/colour.cpp +++ b/src/x11/colour.cpp @@ -93,8 +93,8 @@ void wxColourRefData::FreeColour() if (!m_colormap) return; #if !wxUSE_NANOX - if ((wxTheApp->m_visualType == GrayScale) || - (wxTheApp->m_visualType == PseudoColor)) + if ((wxTheApp->m_visualInfo->m_visualType == GrayScale) || + (wxTheApp->m_visualInfo->m_visualType == PseudoColor)) { int idx = m_color.pixel; colMapAllocCounter[ idx ] = colMapAllocCounter[ idx ] - 1; @@ -116,8 +116,8 @@ void wxColourRefData::AllocColour( WXColormap cmap ) FreeColour(); #if !wxUSE_NANOX - if ((wxTheApp->m_visualType == GrayScale) || - (wxTheApp->m_visualType == PseudoColor)) + if ((wxTheApp->m_visualInfo->m_visualType == GrayScale) || + (wxTheApp->m_visualInfo->m_visualType == PseudoColor)) { m_hasPixel = XAllocColor( wxGlobalDisplay(), (Colormap) cmap, &m_color ); int idx = m_color.pixel; diff --git a/src/x11/files.lst b/src/x11/files.lst index beb49099b6..e5c5cc3eab 100644 --- a/src/x11/files.lst +++ b/src/x11/files.lst @@ -31,6 +31,7 @@ ALL_SOURCES = \ x11/settings.cpp \ x11/toplevel.cpp \ x11/utils.cpp \ + x11/utilsx.cpp \ x11/window.cpp \ generic/accel.cpp \ generic/busyinfo.cpp \ @@ -640,6 +641,7 @@ GUI_LOWLEVEL_OBJS = \ settings.o \ toplevel.o \ utils.o \ + utilsx.o \ window.o COMMONOBJS = \ diff --git a/src/x11/utilsx.cpp b/src/x11/utilsx.cpp new file mode 100644 index 0000000000..1e9acde567 --- /dev/null +++ b/src/x11/utilsx.cpp @@ -0,0 +1,161 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/x11/utilsx.cpp +// Purpose: Private functions common to X11 and Motif ports +// Author: Mattia Barbon +// Modified by: +// Created: 05/04/03 +// RCS-ID: $Id$ +// Copyright: (c) Mattia Barbon +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#include "wx/x11/privx.h" + +// ---------------------------------------------------------------------------- +// wxXVisualInfo +// ---------------------------------------------------------------------------- + +#if !wxUSE_NANOX + +bool wxFillXVisualInfo( wxXVisualInfo* vi, Display* dpy ) +{ + int xscreen = DefaultScreen( dpy ); + Visual* vis = DefaultVisual( dpy, xscreen ); + int bpp = DefaultDepth( dpy, xscreen ); + + XVisualInfo vinfo_template; + XVisualInfo *vinfo; + + vinfo_template.visual = vis; + vinfo_template.visualid = XVisualIDFromVisual( vis ); + vinfo_template.depth = bpp; + int nitem = 0; + + vinfo = XGetVisualInfo( dpy, VisualIDMask|VisualDepthMask, + &vinfo_template, &nitem ); + + wxCHECK_MSG( vinfo, false, wxT("no visual") ); + + vi->Init( dpy, vinfo ); + + XFree(vinfo); + + return true; +} + +inline int ABS(int x) { return x < 0 ? -x : x; } + +static void wxCalcPrecAndShift( unsigned long mask, int *shift, int *prec ) +{ + *shift = 0; + *prec = 0; + + while (!(mask & 0x1)) + { + (*shift)++; + mask >>= 1; + } + + while (mask & 0x1) + { + (*prec)++; + mask >>= 1; + } +} + +wxXVisualInfo::wxXVisualInfo() +{ + m_visualColormap = NULL; + m_colorCube = NULL; +} + +wxXVisualInfo::~wxXVisualInfo() +{ + if (m_colorCube) + free( m_colorCube ); + + if (m_visualColormap) + delete [] (XColor*)m_visualColormap; +} + +void wxXVisualInfo::Init( Display* dpy, XVisualInfo* vi ) +{ + m_visualType = vi->visual->c_class; + m_visualScreen = vi->screen; + + m_visualRedMask = vi->red_mask; + m_visualGreenMask = vi->green_mask; + m_visualBlueMask = vi->blue_mask; + + if (m_visualType != GrayScale && m_visualType != PseudoColor) + { + wxCalcPrecAndShift( m_visualRedMask, &m_visualRedShift, + &m_visualRedPrec ); + wxCalcPrecAndShift( m_visualGreenMask, &m_visualGreenShift, + &m_visualGreenPrec ); + wxCalcPrecAndShift( m_visualBlueMask, &m_visualBlueShift, + &m_visualBluePrec ); + } + + m_visualDepth = vi->depth; + if (vi->depth == 16) + vi->depth = m_visualRedPrec + m_visualGreenPrec + m_visualBluePrec; + + m_visualColormapSize = vi->colormap_size; + + if (m_visualDepth > 8) + return; + + m_visualColormap = new XColor[m_visualColormapSize]; + XColor* colors = (XColor*) m_visualColormap; + + for (int i = 0; i < m_visualColormapSize; i++) + colors[i].pixel = i; + + XQueryColors( dpy, DefaultColormap(dpy, vi->screen), + colors, m_visualColormapSize ); + + m_colorCube = (unsigned char*)malloc(32 * 32 * 32); + + for (int r = 0; r < 32; r++) + { + for (int g = 0; g < 32; g++) + { + for (int b = 0; b < 32; b++) + { + int rr = (r << 3) | (r >> 2); + int gg = (g << 3) | (g >> 2); + int bb = (b << 3) | (b >> 2); + + int index = -1; + + if (colors) + { + int max = 3 * 65536; + + for (int i = 0; i < m_visualColormapSize; i++) + { + int rdiff = ((rr << 8) - colors[i].red); + int gdiff = ((gg << 8) - colors[i].green); + int bdiff = ((bb << 8) - colors[i].blue); + int sum = ABS (rdiff) + ABS (gdiff) + ABS (bdiff); + if (sum < max) + { + index = i; max = sum; + } + } + } + else + { + // assume 8-bit true or static colors. this really exists + index = (r >> (5 - m_visualRedPrec)) << m_visualRedShift; + index |= (g >> (5 - m_visualGreenPrec)) << m_visualGreenShift; + index |= (b >> (5 - m_visualBluePrec)) << m_visualBlueShift; + } + m_colorCube[ (r*1024) + (g*32) + b ] = index; + } + } + } +} + +#endif // !wxUSE_NANOX -- 2.47.2