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
This commit is contained in:
Mattia Barbon 2003-04-07 17:15:11 +00:00
parent 13fc3db40e
commit 9ce8d6a2b0
11 changed files with 276 additions and 166 deletions

View File

@ -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

View File

@ -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()
};

View File

@ -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:

View File

@ -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_

View File

@ -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 <string.h>
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;

View File

@ -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 \

View File

@ -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;

View File

@ -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();

View File

@ -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;

View File

@ -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 = \

161
src/x11/utilsx.cpp Normal file
View File

@ -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