It's possible now to save to a PNG. OK, I still

have performance problems, but it's a start.
  Updated install.txt.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@662 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling 1998-09-03 21:46:47 +00:00
parent 24d20a8f73
commit cf7a7e133b
17 changed files with 487 additions and 63 deletions

View File

@ -4,11 +4,20 @@
If you compile wxWindows on Unix for the first time and don't like
to read install instructions just do (in the base dir):
./configure --with-gtk --with-shared --without-threads
./configure --without-threads
make
and drink 10 coffees.
and drink 10 coffees. Then you may log in as root and type
make install
You can leave out the --without-threads option if you have a NEW
Linux distribution based on glibc (e.g. RedHat 5.1) or any other
Unix that comes with Posix threads or SGI threads.
Now create your super-application myfoo.app and compile anywhere with
gcc -o -c myfoo.cpp -I/usr/local/include -L/usr/local/lib -lwx_gtk
* General
-----------------------
@ -141,8 +150,10 @@ not been defined. And Make in some circumstances as well...
* General options
-------------------
Obviously, you have to choose a toolkit. You must do this by
running configure with either of
Normally, you won't have to choose a toolkit, because when
you download wxGTK, it will default to --with-gtk etc. But
if you use all of our CVS repository you have to choose a
toolkit. You must do this by running configure with either of:
--with-gtk Use the GIMP ToolKit (GTK)
@ -155,7 +166,7 @@ The following options handle the kind of library you want to build.
--without-threads Compile without thread support.
--with-shared Create shared libraries.
--without-shared Do not create shared libraries.
--without-optimise Do not optimise the code.
@ -191,25 +202,21 @@ implemented.
-------------
The following must be done in the base directory (e.g. ~/wxGTK
or ~/wxWin)
First you have to create all makefiles in all subdirectories:
make Makefiles
or ~/wxWin or whatever)
Dependencies are generated automatically using
make depend
(For some reason, this doesn't seem to work completely.)
(For some reason, this doesn't seem to work.)
Now the makefiles are created you can compile everything is as simple
as typing:
make
make yourself some coffee, as it will try to compile
ALL the files in this distribution.
make yourself some coffee, as it will try to compile ALL the
files in this distribution.
if you want to be more selective:
@ -219,6 +226,13 @@ if you want to be more selective:
make other will build the other samples
make user will build the files in the directory other
Then you may install the library and it's header files under
/usr/local/include/wx and /usr/local/lib respectively. You
have to log in as root (i.e. run "su" and enter the root
password) and type
make install
Depending on the configuration of some files, the libraries
and binaries will be placed in different directories.
The "global" binaries and libraries will be placed in:
@ -242,8 +256,10 @@ will do the work for you.
* Creating a new Project
--------------------------
I propose to put all contributed programs in the directory
"~/wxWin/user", with a directory of its own.
There are two ways to create your own project. The first creates
a project within the source code directories of wxWindows: In this
case I propose to put all contributed programs in the directory
"/user", with a directory of its own.
This directory then should include the following files:
@ -258,6 +274,13 @@ Makefile.in (This is the base application-Makefile template, from
put ALL your source code along with all the other stuff you need for
your application in this directory (subdirectories are welcome).
The other way uses the installed libraries and header files in
/usr/local/include/wx and /usr/local/lib. In this case, just
compile your program like this:
gcc -o -c myfoo.cpp -I/usr/local/include -L/usr/local/lib -lwx_gtk
** Something about Makefiles
------------------------------

View File

@ -131,7 +131,7 @@ class wxBitmap: public wxObject
GdkPixmap *GetPixmap() const;
GdkBitmap *GetBitmap() const;
void DestroyImage();
void RecreateImage();
void Render();

View File

@ -66,7 +66,7 @@ class wxDC: public wxObject
void BeginDrawing(void) {};
void EndDrawing(void) {};
virtual bool Ok(void) const { return m_ok; };
virtual bool Ok(void) const;
virtual void FloodFill( long x1, long y1, wxColour *col, int style=wxFLOOD_SURFACE ) = 0;
virtual bool GetPixel( long x1, long y1, wxColour *col ) const = 0;

View File

@ -131,7 +131,7 @@ class wxBitmap: public wxObject
GdkPixmap *GetPixmap() const;
GdkBitmap *GetBitmap() const;
void DestroyImage();
void RecreateImage();
void Render();

View File

@ -66,7 +66,7 @@ class wxDC: public wxObject
void BeginDrawing(void) {};
void EndDrawing(void) {};
virtual bool Ok(void) const { return m_ok; };
virtual bool Ok(void) const;
virtual void FloodFill( long x1, long y1, wxColour *col, int style=wxFLOOD_SURFACE ) = 0;
virtual bool GetPixel( long x1, long y1, wxColour *col ) const = 0;

View File

@ -52,6 +52,7 @@ bool MyApp::OnInit(void)
wxMenu *help_menu = new wxMenu;
file_menu->Append(PNGDEMO_LOAD_FILE, "&Load file", "Load file");
file_menu->Append(PNGDEMO_SAVE_FILE, "&Save file", "Save file");
file_menu->Append(PNGDEMO_QUIT, "E&xit", "Quit program");
help_menu->Append(PNGDEMO_ABOUT, "&About", "About PNG demo");
@ -80,6 +81,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(PNGDEMO_QUIT, MyFrame::OnQuit)
EVT_MENU(PNGDEMO_ABOUT, MyFrame::OnAbout)
EVT_MENU(PNGDEMO_LOAD_FILE, MyFrame::OnLoadFile)
EVT_MENU(PNGDEMO_SAVE_FILE, MyFrame::OnSaveFile)
END_EVENT_TABLE()
// Define my frame constructor
@ -100,6 +102,33 @@ void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
"About PNG Demo", wxOK);
}
void MyFrame::OnSaveFile(wxCommandEvent& WXUNUSED(event))
{
char *f = wxFileSelector( "Save Image", (const char *)NULL, (const char *)NULL,
"png", "PNG files (*.png)|*.png" );
if (!f) return;
wxBitmap *backstore = new wxBitmap( 150, 150 );
wxMemoryDC memDC;
memDC.SelectObject( *backstore );
memDC.Clear();
memDC.SetBrush( *wxBLACK_BRUSH );
memDC.SetPen( *wxWHITE_PEN );
memDC.DrawRectangle( 0, 0, 150, 150 );
memDC.SetPen( *wxBLACK_PEN );
memDC.DrawLine( 0, 0, 0, 10 );
memDC.SetTextForeground( *wxWHITE );
memDC.DrawText( "This is a memory dc.", 10, 10 );
memDC.SelectObject( wxNullBitmap );
backstore->SaveFile( f, wxBITMAP_TYPE_PNG, (wxPalette*)NULL );
delete backstore;
}
void MyFrame::OnLoadFile(wxCommandEvent& WXUNUSED(event))
{
// Show file selector.

View File

@ -35,6 +35,7 @@ class MyFrame: public wxFrame
bool OnClose(void);
void OnActivate(bool) {}
void OnLoadFile(wxCommandEvent& event);
void OnSaveFile(wxCommandEvent& event);
void OnQuit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event);
DECLARE_EVENT_TABLE()
@ -54,4 +55,5 @@ DECLARE_EVENT_TABLE()
#define PNGDEMO_QUIT 100
#define PNGDEMO_ABOUT 101
#define PNGDEMO_LOAD_FILE 102
#define PNGDEMO_SAVE_FILE 103

View File

@ -17,7 +17,12 @@
#include "gdk/gdkprivate.h"
#ifdef USE_GDK_IMLIB
#include "../gdk_imlib/gdk_imlib.h"
#include "gdk/gdkx.h" // GDK_DISPLAY
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#endif
//-----------------------------------------------------------------------------
@ -223,7 +228,8 @@ bool wxBitmap::operator != ( const wxBitmap& bmp )
bool wxBitmap::Ok(void) const
{
return m_refData != NULL;
wxASSERT_MSG( m_refData != NULL, "invalid bitmap" );
return (m_refData != NULL);
}
int wxBitmap::GetHeight(void) const
@ -247,18 +253,27 @@ int wxBitmap::GetDepth(void) const
void wxBitmap::SetHeight( int height )
{
if (!Ok()) return;
wxFAIL_MSG( "wxBitmap::SetHeight not implemented" );
M_BMPDATA->m_height = height;
}
void wxBitmap::SetWidth( int width )
{
if (!Ok()) return;
wxFAIL_MSG( "wxBitmap::SetWidth not implemented" );
M_BMPDATA->m_width = width;
}
void wxBitmap::SetDepth( int depth )
{
if (!Ok()) return;
wxFAIL_MSG( "wxBitmap::SetDepth not implemented" );
M_BMPDATA->m_bpp = depth;
}
@ -274,6 +289,7 @@ void wxBitmap::SetMask( wxMask *mask )
if (!Ok()) return;
if (M_BMPDATA->m_mask) delete M_BMPDATA->m_mask;
M_BMPDATA->m_mask = mask;
}
@ -298,6 +314,10 @@ void wxBitmap::Resize( int height, int width )
Render();
#else
wxFAIL_MSG( "wxBitmap::Resize not implemented without GdkImlib" );
#endif
}
@ -312,6 +332,10 @@ bool wxBitmap::SaveFile( const wxString &name, int WXUNUSED(type),
return gdk_imlib_save_image( M_BMPDATA->m_image, WXSTRINGCAST name, (GdkImlibSaveInfo *) NULL );
#else
wxFAIL_MSG( "wxBitmap::SaveFile not implemented without GdkImlib" );
#endif
return FALSE;
@ -338,6 +362,11 @@ bool wxBitmap::LoadFile( const wxString &name, int WXUNUSED(type) )
M_BMPDATA->m_bpp = 24; // ?
return TRUE;
#else
wxFAIL_MSG( "wxBitmap::LoadFile not implemented without GdkImlib" );
#endif
return FALSE;
@ -352,6 +381,9 @@ wxPalette *wxBitmap::GetPalette(void) const
GdkPixmap *wxBitmap::GetPixmap(void) const
{
if (!Ok()) return (GdkPixmap *) NULL;
// if (!M_BMPDATA->m_image) RecreateImage();
return M_BMPDATA->m_pixmap;
}
@ -375,6 +407,53 @@ void wxBitmap::DestroyImage(void)
void wxBitmap::RecreateImage(void)
{
if (!Ok()) return;
#ifdef USE_GDK_IMLIB
DestroyImage();
wxCHECK_RET( M_BMPDATA->m_pixmap != NULL, "invalid bitmap" );
long size = (long)(M_BMPDATA->m_width)*(long)(M_BMPDATA->m_height)*(long)3;
unsigned char *data = new unsigned char[size];
for (long i = 0; i < size; i++) data[i] = 100;
GdkImage *image = gdk_image_get( M_BMPDATA->m_pixmap, 0, 0, M_BMPDATA->m_width, M_BMPDATA->m_height );
long pos = 0;
for (int j = 0; j < M_BMPDATA->m_height; j++)
{
for (int i = 0; i < M_BMPDATA->m_width; i++)
{
XColor xcol;
xcol.pixel = gdk_image_get_pixel( image, i, j );
Colormap cm = ((GdkColormapPrivate*)gdk_imlib_get_colormap())->xcolormap;
XQueryColor( gdk_display, cm, &xcol );
data[pos] = xcol.red;
data[pos+1] = xcol.green;
data[pos+2] = xcol.blue;
pos += 3;
}
}
wxCHECK_RET( M_BMPDATA->m_pixmap != NULL, "invalid bitmap" );
M_BMPDATA->m_image = gdk_imlib_create_image_from_data(
data, (unsigned char*)NULL, M_BMPDATA->m_width, M_BMPDATA->m_height );
delete[] data;
gdk_image_destroy( image );
Render();
#else
wxFAIL_MSG( "wxBitmap::RecreateImage not implemented without GdkImlib" );
#endif
}
void wxBitmap::Render(void)
@ -383,10 +462,26 @@ void wxBitmap::Render(void)
#ifdef USE_GDK_IMLIB
if (!M_BMPDATA->m_image) RecreateImage();
if (M_BMPDATA->m_pixmap)
{
gdk_imlib_free_pixmap( M_BMPDATA->m_pixmap );
M_BMPDATA->m_pixmap = (GdkPixmap*) NULL;
}
if (M_BMPDATA->m_mask)
{
delete M_BMPDATA->m_mask;
M_BMPDATA->m_mask = (wxMask*) NULL;
}
gdk_imlib_render( M_BMPDATA->m_image, M_BMPDATA->m_image->rgb_width, M_BMPDATA->m_image->rgb_height );
M_BMPDATA->m_width = M_BMPDATA->m_image->rgb_width;
M_BMPDATA->m_height = M_BMPDATA->m_image->rgb_height;
M_BMPDATA->m_pixmap = gdk_imlib_move_image( M_BMPDATA->m_image );
wxCHECK_RET( M_BMPDATA->m_pixmap != NULL, "pixmap rendering failed" )
GdkBitmap *mask = gdk_imlib_move_mask( M_BMPDATA->m_image );
if (mask)
{
@ -394,6 +489,10 @@ void wxBitmap::Render(void)
M_BMPDATA->m_mask->m_bitmap = mask;
}
#else
wxFAIL_MSG( "wxBitmap::Render not implemented without GdkImlib" );
#endif
}

View File

@ -83,6 +83,12 @@ wxDC::~wxDC(void)
{
}
bool wxDC::Ok(void) const
{
wxASSERT_MSG( !ok, "invalid display context" );
return m_ok;
}
void wxDC::DrawArc( long WXUNUSED(x1), long WXUNUSED(y1), long WXUNUSED(x2), long WXUNUSED(y2),
double WXUNUSED(xc), double WXUNUSED(yc) )
{

View File

@ -124,10 +124,12 @@ wxPaintDC::~wxPaintDC(void)
void wxPaintDC::FloodFill( long WXUNUSED(x1), long WXUNUSED(y1),
wxColour *WXUNUSED(col), int WXUNUSED(style) )
{
wxFAIL_MSG( "wxPaintDC::FloodFill not implemented" );
}
bool wxPaintDC::GetPixel( long WXUNUSED(x1), long WXUNUSED(y1), wxColour *WXUNUSED(col) ) const
{
wxFAIL_MSG( "wxPaintDC::GetPixel not implemented" );
return FALSE;
}
@ -135,6 +137,8 @@ void wxPaintDC::DrawLine( long x1, long y1, long x2, long y2 )
{
if (!Ok()) return;
if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
if (m_pen.GetStyle() != wxTRANSPARENT)
{
gdk_draw_line( m_window, m_penGC,
@ -146,6 +150,8 @@ void wxPaintDC::CrossHair( long x, long y )
{
if (!Ok()) return;
if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
if (m_pen.GetStyle() != wxTRANSPARENT)
{
int w = 0;
@ -164,6 +170,8 @@ void wxPaintDC::DrawArc( long x1, long y1, long x2, long y2, double xc, double y
{
if (!Ok()) return;
if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
long xx1 = XLOG2DEV(x1);
long yy1 = YLOG2DEV(y1);
long xx2 = XLOG2DEV(x2);
@ -212,6 +220,8 @@ void wxPaintDC::DrawEllipticArc( long x, long y, long width, long height, double
{
if (!Ok()) return;
if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
long xx = XLOG2DEV(x);
long yy = YLOG2DEV(y);
long ww = m_signX * XLOG2DEVREL(width);
@ -234,6 +244,8 @@ void wxPaintDC::DrawPoint( long x, long y )
{
if (!Ok()) return;
if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
if (m_pen.GetStyle() != wxTRANSPARENT)
gdk_draw_point( m_window, m_penGC, XLOG2DEV(x), YLOG2DEV(y) );
}
@ -242,6 +254,8 @@ void wxPaintDC::DrawLines( int n, wxPoint points[], long xoffset, long yoffset )
{
if (!Ok()) return;
if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
if (m_pen.GetStyle() == wxTRANSPARENT) return;
for (int i = 0; i < n-1; i++)
@ -258,6 +272,8 @@ void wxPaintDC::DrawLines( wxList *points, long xoffset, long yoffset )
{
if (!Ok()) return;
if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
if (m_pen.GetStyle() == wxTRANSPARENT) return;
wxNode *node = points->First();
@ -274,10 +290,12 @@ void wxPaintDC::DrawLines( wxList *points, long xoffset, long yoffset )
}
}
void wxPaintDC::DrawPolygon( int n, wxPoint points[],
long xoffset, long yoffset, int WXUNUSED(fillStyle) )
{
if (!Ok()) return;
void wxPaintDC::DrawPolygon( int n, wxPoint points[], long xoffset, long yoffset, int WXUNUSED(fillStyle) )
{
if (!Ok()) return;
if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
if (!n) return; // Nothing to draw
GdkPoint *gdkpoints = new GdkPoint[n+1];
int i;
@ -299,12 +317,13 @@ void wxPaintDC::DrawPolygon( int n, wxPoint points[],
delete[] gdkpoints;
}
void wxPaintDC::DrawPolygon( wxList *lines, long xoffset,
long yoffset, int WXUNUSED(fillStyle))
{
void wxPaintDC::DrawPolygon( wxList *lines, long xoffset, long yoffset, int WXUNUSED(fillStyle))
{
if (!Ok()) return;
if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
int n = lines->Number();
if (!Ok()) return;
GdkPoint *gdkpoints = new GdkPoint[n];
wxNode *node = lines->First();
int cnt=0;
@ -336,6 +355,8 @@ void wxPaintDC::DrawRectangle( long x, long y, long width, long height )
{
if (!Ok()) return;
if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
long xx = XLOG2DEV(x);
long yy = YLOG2DEV(y);
long ww = m_signX * XLOG2DEVREL(width);
@ -359,6 +380,8 @@ void wxPaintDC::DrawRoundedRectangle( long x, long y, long width, long height, d
{
if (!Ok()) return;
if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
if (radius < 0.0) radius = - radius * ((width < height) ? width : height);
long xx = XLOG2DEV(x);
@ -424,6 +447,8 @@ void wxPaintDC::DrawEllipse( long x, long y, long width, long height )
{
if (!Ok()) return;
if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
long xx = XLOG2DEV(x);
long yy = YLOG2DEV(y);
long ww = m_signX * XLOG2DEVREL(width);
@ -451,6 +476,8 @@ void wxPaintDC::DrawIcon( const wxIcon &icon, long x, long y, bool useMask )
if (!icon.Ok()) return;
if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
int xx = XLOG2DEV(x);
int yy = YLOG2DEV(y);
@ -478,21 +505,22 @@ bool wxPaintDC::Blit( long xdest, long ydest, long width, long height,
{
if (!Ok()) return FALSE;
if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
// CMB 20/5/98: add blitting of bitmaps
if (source->IsKindOf(CLASSINFO(wxMemoryDC)))
{
wxMemoryDC* srcDC = (wxMemoryDC*)source;
GdkBitmap* bmap = srcDC->m_selected.GetBitmap();
GdkBitmap* bmap = srcDC->m_selected.GetBitmap();
if (bmap)
{
gdk_draw_bitmap (
m_window,
m_textGC,
bmap,
source->DeviceToLogicalX(xsrc), source->DeviceToLogicalY(ysrc),
XLOG2DEV(xdest), YLOG2DEV(ydest),
source->DeviceToLogicalXRel(width), source->DeviceToLogicalYRel(height)
);
gdk_draw_bitmap( m_window, m_textGC, bmap,
source->DeviceToLogicalX(xsrc),
source->DeviceToLogicalY(ysrc),
XLOG2DEV(xdest),
YLOG2DEV(ydest),
source->DeviceToLogicalXRel(width),
source->DeviceToLogicalYRel(height) );
return TRUE;
}
}
@ -519,6 +547,8 @@ void wxPaintDC::DrawText( const wxString &text, long x, long y, bool WXUNUSED(us
{
if (!Ok()) return;
if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
GdkFont *font = m_font.GetInternalFont( m_scaleY );
x = XLOG2DEV(x);
@ -588,7 +618,7 @@ void wxPaintDC::Clear(void)
{
if (!Ok()) return;
// DestroyClippingRegion();
if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
if (m_isDrawable)
{

View File

@ -14,6 +14,10 @@
#include "wx/dcmemory.h"
#ifdef USE_GDK_IMLIB
#include "../gdk_imlib/gdk_imlib.h"
#endif
//-----------------------------------------------------------------------------
// wxMemoryDC
//-----------------------------------------------------------------------------
@ -23,13 +27,23 @@ IMPLEMENT_DYNAMIC_CLASS(wxMemoryDC,wxPaintDC)
wxMemoryDC::wxMemoryDC(void)
{
m_ok = FALSE;
#ifdef USE_GDK_IMLIB
m_cmap = gdk_imlib_get_colormap();
#else
m_cmap = gdk_colormap_get_system();
#endif
}
wxMemoryDC::wxMemoryDC( wxDC *WXUNUSED(dc) )
{
m_ok = FALSE;
#ifdef USE_GDK_IMLIB
m_cmap = gdk_imlib_get_colormap();
#else
m_cmap = gdk_colormap_get_system();
#endif
}
wxMemoryDC::~wxMemoryDC(void)

View File

@ -150,7 +150,7 @@ bool wxMenuBar::Enabled( int id ) const
}
//-----------------------------------------------------------------------------
// wxMenu
// "activate"
//-----------------------------------------------------------------------------
static void gtk_menu_clicked_callback( GtkWidget *widget, wxMenu *menu )
@ -161,7 +161,7 @@ static void gtk_menu_clicked_callback( GtkWidget *widget, wxMenu *menu )
if (!menu->IsEnabled(id)) return;
wxCommandEvent event( wxEVENT_TYPE_MENU_COMMAND, id );
wxCommandEvent event( wxEVT_COMMAND_MENU_SELECTED, id );
event.SetEventObject( menu );
event.SetInt(id );
@ -177,6 +177,38 @@ static void gtk_menu_clicked_callback( GtkWidget *widget, wxMenu *menu )
if (win) win->GetEventHandler()->ProcessEvent( event );
}
//-----------------------------------------------------------------------------
// "select"
//-----------------------------------------------------------------------------
static void gtk_menu_hilight_callback( GtkWidget *widget, wxMenu *menu )
{
int id = menu->FindMenuIdByMenuItem(widget);
wxASSERT( id != -1 ); // should find it!
if (!menu->IsEnabled(id)) return;
wxCommandEvent event( wxEVT_MENU_HIGHLIGHT, id );
event.SetEventObject( menu );
event.SetInt(id );
if (menu->m_callback)
{
(void) (*(menu->m_callback)) (*menu, event);
return;
}
if (menu->GetEventHandler()->ProcessEvent(event)) return;
wxWindow *win = menu->GetInvokingWindow();
if (win) win->GetEventHandler()->ProcessEvent( event );
}
//-----------------------------------------------------------------------------
// wxMenu
//-----------------------------------------------------------------------------
IMPLEMENT_DYNAMIC_CLASS(wxMenuItem,wxObject)
wxMenuItem::wxMenuItem()
@ -283,6 +315,10 @@ void wxMenu::Append( int id, const wxString &item, const wxString &helpStr, bool
GTK_SIGNAL_FUNC(gtk_menu_clicked_callback),
(gpointer*)this );
gtk_signal_connect( GTK_OBJECT(menuItem), "select",
GTK_SIGNAL_FUNC(gtk_menu_hilight_callback),
(gpointer*)this );
gtk_menu_append( GTK_MENU(m_menu), menuItem );
gtk_widget_show( menuItem );
m_items.Append( mitem );

View File

@ -17,7 +17,12 @@
#include "gdk/gdkprivate.h"
#ifdef USE_GDK_IMLIB
#include "../gdk_imlib/gdk_imlib.h"
#include "gdk/gdkx.h" // GDK_DISPLAY
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#endif
//-----------------------------------------------------------------------------
@ -223,7 +228,8 @@ bool wxBitmap::operator != ( const wxBitmap& bmp )
bool wxBitmap::Ok(void) const
{
return m_refData != NULL;
wxASSERT_MSG( m_refData != NULL, "invalid bitmap" );
return (m_refData != NULL);
}
int wxBitmap::GetHeight(void) const
@ -247,18 +253,27 @@ int wxBitmap::GetDepth(void) const
void wxBitmap::SetHeight( int height )
{
if (!Ok()) return;
wxFAIL_MSG( "wxBitmap::SetHeight not implemented" );
M_BMPDATA->m_height = height;
}
void wxBitmap::SetWidth( int width )
{
if (!Ok()) return;
wxFAIL_MSG( "wxBitmap::SetWidth not implemented" );
M_BMPDATA->m_width = width;
}
void wxBitmap::SetDepth( int depth )
{
if (!Ok()) return;
wxFAIL_MSG( "wxBitmap::SetDepth not implemented" );
M_BMPDATA->m_bpp = depth;
}
@ -274,6 +289,7 @@ void wxBitmap::SetMask( wxMask *mask )
if (!Ok()) return;
if (M_BMPDATA->m_mask) delete M_BMPDATA->m_mask;
M_BMPDATA->m_mask = mask;
}
@ -298,6 +314,10 @@ void wxBitmap::Resize( int height, int width )
Render();
#else
wxFAIL_MSG( "wxBitmap::Resize not implemented without GdkImlib" );
#endif
}
@ -312,6 +332,10 @@ bool wxBitmap::SaveFile( const wxString &name, int WXUNUSED(type),
return gdk_imlib_save_image( M_BMPDATA->m_image, WXSTRINGCAST name, (GdkImlibSaveInfo *) NULL );
#else
wxFAIL_MSG( "wxBitmap::SaveFile not implemented without GdkImlib" );
#endif
return FALSE;
@ -338,6 +362,11 @@ bool wxBitmap::LoadFile( const wxString &name, int WXUNUSED(type) )
M_BMPDATA->m_bpp = 24; // ?
return TRUE;
#else
wxFAIL_MSG( "wxBitmap::LoadFile not implemented without GdkImlib" );
#endif
return FALSE;
@ -352,6 +381,9 @@ wxPalette *wxBitmap::GetPalette(void) const
GdkPixmap *wxBitmap::GetPixmap(void) const
{
if (!Ok()) return (GdkPixmap *) NULL;
// if (!M_BMPDATA->m_image) RecreateImage();
return M_BMPDATA->m_pixmap;
}
@ -375,6 +407,53 @@ void wxBitmap::DestroyImage(void)
void wxBitmap::RecreateImage(void)
{
if (!Ok()) return;
#ifdef USE_GDK_IMLIB
DestroyImage();
wxCHECK_RET( M_BMPDATA->m_pixmap != NULL, "invalid bitmap" );
long size = (long)(M_BMPDATA->m_width)*(long)(M_BMPDATA->m_height)*(long)3;
unsigned char *data = new unsigned char[size];
for (long i = 0; i < size; i++) data[i] = 100;
GdkImage *image = gdk_image_get( M_BMPDATA->m_pixmap, 0, 0, M_BMPDATA->m_width, M_BMPDATA->m_height );
long pos = 0;
for (int j = 0; j < M_BMPDATA->m_height; j++)
{
for (int i = 0; i < M_BMPDATA->m_width; i++)
{
XColor xcol;
xcol.pixel = gdk_image_get_pixel( image, i, j );
Colormap cm = ((GdkColormapPrivate*)gdk_imlib_get_colormap())->xcolormap;
XQueryColor( gdk_display, cm, &xcol );
data[pos] = xcol.red;
data[pos+1] = xcol.green;
data[pos+2] = xcol.blue;
pos += 3;
}
}
wxCHECK_RET( M_BMPDATA->m_pixmap != NULL, "invalid bitmap" );
M_BMPDATA->m_image = gdk_imlib_create_image_from_data(
data, (unsigned char*)NULL, M_BMPDATA->m_width, M_BMPDATA->m_height );
delete[] data;
gdk_image_destroy( image );
Render();
#else
wxFAIL_MSG( "wxBitmap::RecreateImage not implemented without GdkImlib" );
#endif
}
void wxBitmap::Render(void)
@ -383,10 +462,26 @@ void wxBitmap::Render(void)
#ifdef USE_GDK_IMLIB
if (!M_BMPDATA->m_image) RecreateImage();
if (M_BMPDATA->m_pixmap)
{
gdk_imlib_free_pixmap( M_BMPDATA->m_pixmap );
M_BMPDATA->m_pixmap = (GdkPixmap*) NULL;
}
if (M_BMPDATA->m_mask)
{
delete M_BMPDATA->m_mask;
M_BMPDATA->m_mask = (wxMask*) NULL;
}
gdk_imlib_render( M_BMPDATA->m_image, M_BMPDATA->m_image->rgb_width, M_BMPDATA->m_image->rgb_height );
M_BMPDATA->m_width = M_BMPDATA->m_image->rgb_width;
M_BMPDATA->m_height = M_BMPDATA->m_image->rgb_height;
M_BMPDATA->m_pixmap = gdk_imlib_move_image( M_BMPDATA->m_image );
wxCHECK_RET( M_BMPDATA->m_pixmap != NULL, "pixmap rendering failed" )
GdkBitmap *mask = gdk_imlib_move_mask( M_BMPDATA->m_image );
if (mask)
{
@ -394,6 +489,10 @@ void wxBitmap::Render(void)
M_BMPDATA->m_mask->m_bitmap = mask;
}
#else
wxFAIL_MSG( "wxBitmap::Render not implemented without GdkImlib" );
#endif
}

View File

@ -83,6 +83,12 @@ wxDC::~wxDC(void)
{
}
bool wxDC::Ok(void) const
{
wxASSERT_MSG( !ok, "invalid display context" );
return m_ok;
}
void wxDC::DrawArc( long WXUNUSED(x1), long WXUNUSED(y1), long WXUNUSED(x2), long WXUNUSED(y2),
double WXUNUSED(xc), double WXUNUSED(yc) )
{

View File

@ -124,10 +124,12 @@ wxPaintDC::~wxPaintDC(void)
void wxPaintDC::FloodFill( long WXUNUSED(x1), long WXUNUSED(y1),
wxColour *WXUNUSED(col), int WXUNUSED(style) )
{
wxFAIL_MSG( "wxPaintDC::FloodFill not implemented" );
}
bool wxPaintDC::GetPixel( long WXUNUSED(x1), long WXUNUSED(y1), wxColour *WXUNUSED(col) ) const
{
wxFAIL_MSG( "wxPaintDC::GetPixel not implemented" );
return FALSE;
}
@ -135,6 +137,8 @@ void wxPaintDC::DrawLine( long x1, long y1, long x2, long y2 )
{
if (!Ok()) return;
if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
if (m_pen.GetStyle() != wxTRANSPARENT)
{
gdk_draw_line( m_window, m_penGC,
@ -146,6 +150,8 @@ void wxPaintDC::CrossHair( long x, long y )
{
if (!Ok()) return;
if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
if (m_pen.GetStyle() != wxTRANSPARENT)
{
int w = 0;
@ -164,6 +170,8 @@ void wxPaintDC::DrawArc( long x1, long y1, long x2, long y2, double xc, double y
{
if (!Ok()) return;
if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
long xx1 = XLOG2DEV(x1);
long yy1 = YLOG2DEV(y1);
long xx2 = XLOG2DEV(x2);
@ -212,6 +220,8 @@ void wxPaintDC::DrawEllipticArc( long x, long y, long width, long height, double
{
if (!Ok()) return;
if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
long xx = XLOG2DEV(x);
long yy = YLOG2DEV(y);
long ww = m_signX * XLOG2DEVREL(width);
@ -234,6 +244,8 @@ void wxPaintDC::DrawPoint( long x, long y )
{
if (!Ok()) return;
if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
if (m_pen.GetStyle() != wxTRANSPARENT)
gdk_draw_point( m_window, m_penGC, XLOG2DEV(x), YLOG2DEV(y) );
}
@ -242,6 +254,8 @@ void wxPaintDC::DrawLines( int n, wxPoint points[], long xoffset, long yoffset )
{
if (!Ok()) return;
if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
if (m_pen.GetStyle() == wxTRANSPARENT) return;
for (int i = 0; i < n-1; i++)
@ -258,6 +272,8 @@ void wxPaintDC::DrawLines( wxList *points, long xoffset, long yoffset )
{
if (!Ok()) return;
if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
if (m_pen.GetStyle() == wxTRANSPARENT) return;
wxNode *node = points->First();
@ -274,10 +290,12 @@ void wxPaintDC::DrawLines( wxList *points, long xoffset, long yoffset )
}
}
void wxPaintDC::DrawPolygon( int n, wxPoint points[],
long xoffset, long yoffset, int WXUNUSED(fillStyle) )
{
if (!Ok()) return;
void wxPaintDC::DrawPolygon( int n, wxPoint points[], long xoffset, long yoffset, int WXUNUSED(fillStyle) )
{
if (!Ok()) return;
if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
if (!n) return; // Nothing to draw
GdkPoint *gdkpoints = new GdkPoint[n+1];
int i;
@ -299,12 +317,13 @@ void wxPaintDC::DrawPolygon( int n, wxPoint points[],
delete[] gdkpoints;
}
void wxPaintDC::DrawPolygon( wxList *lines, long xoffset,
long yoffset, int WXUNUSED(fillStyle))
{
void wxPaintDC::DrawPolygon( wxList *lines, long xoffset, long yoffset, int WXUNUSED(fillStyle))
{
if (!Ok()) return;
if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
int n = lines->Number();
if (!Ok()) return;
GdkPoint *gdkpoints = new GdkPoint[n];
wxNode *node = lines->First();
int cnt=0;
@ -336,6 +355,8 @@ void wxPaintDC::DrawRectangle( long x, long y, long width, long height )
{
if (!Ok()) return;
if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
long xx = XLOG2DEV(x);
long yy = YLOG2DEV(y);
long ww = m_signX * XLOG2DEVREL(width);
@ -359,6 +380,8 @@ void wxPaintDC::DrawRoundedRectangle( long x, long y, long width, long height, d
{
if (!Ok()) return;
if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
if (radius < 0.0) radius = - radius * ((width < height) ? width : height);
long xx = XLOG2DEV(x);
@ -424,6 +447,8 @@ void wxPaintDC::DrawEllipse( long x, long y, long width, long height )
{
if (!Ok()) return;
if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
long xx = XLOG2DEV(x);
long yy = YLOG2DEV(y);
long ww = m_signX * XLOG2DEVREL(width);
@ -451,6 +476,8 @@ void wxPaintDC::DrawIcon( const wxIcon &icon, long x, long y, bool useMask )
if (!icon.Ok()) return;
if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
int xx = XLOG2DEV(x);
int yy = YLOG2DEV(y);
@ -478,21 +505,22 @@ bool wxPaintDC::Blit( long xdest, long ydest, long width, long height,
{
if (!Ok()) return FALSE;
if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
// CMB 20/5/98: add blitting of bitmaps
if (source->IsKindOf(CLASSINFO(wxMemoryDC)))
{
wxMemoryDC* srcDC = (wxMemoryDC*)source;
GdkBitmap* bmap = srcDC->m_selected.GetBitmap();
GdkBitmap* bmap = srcDC->m_selected.GetBitmap();
if (bmap)
{
gdk_draw_bitmap (
m_window,
m_textGC,
bmap,
source->DeviceToLogicalX(xsrc), source->DeviceToLogicalY(ysrc),
XLOG2DEV(xdest), YLOG2DEV(ydest),
source->DeviceToLogicalXRel(width), source->DeviceToLogicalYRel(height)
);
gdk_draw_bitmap( m_window, m_textGC, bmap,
source->DeviceToLogicalX(xsrc),
source->DeviceToLogicalY(ysrc),
XLOG2DEV(xdest),
YLOG2DEV(ydest),
source->DeviceToLogicalXRel(width),
source->DeviceToLogicalYRel(height) );
return TRUE;
}
}
@ -519,6 +547,8 @@ void wxPaintDC::DrawText( const wxString &text, long x, long y, bool WXUNUSED(us
{
if (!Ok()) return;
if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
GdkFont *font = m_font.GetInternalFont( m_scaleY );
x = XLOG2DEV(x);
@ -588,7 +618,7 @@ void wxPaintDC::Clear(void)
{
if (!Ok()) return;
// DestroyClippingRegion();
if (!m_isDrawable) ((wxMemoryDC*)this)->m_selected.DestroyImage();
if (m_isDrawable)
{

View File

@ -14,6 +14,10 @@
#include "wx/dcmemory.h"
#ifdef USE_GDK_IMLIB
#include "../gdk_imlib/gdk_imlib.h"
#endif
//-----------------------------------------------------------------------------
// wxMemoryDC
//-----------------------------------------------------------------------------
@ -23,13 +27,23 @@ IMPLEMENT_DYNAMIC_CLASS(wxMemoryDC,wxPaintDC)
wxMemoryDC::wxMemoryDC(void)
{
m_ok = FALSE;
#ifdef USE_GDK_IMLIB
m_cmap = gdk_imlib_get_colormap();
#else
m_cmap = gdk_colormap_get_system();
#endif
}
wxMemoryDC::wxMemoryDC( wxDC *WXUNUSED(dc) )
{
m_ok = FALSE;
#ifdef USE_GDK_IMLIB
m_cmap = gdk_imlib_get_colormap();
#else
m_cmap = gdk_colormap_get_system();
#endif
}
wxMemoryDC::~wxMemoryDC(void)

View File

@ -150,7 +150,7 @@ bool wxMenuBar::Enabled( int id ) const
}
//-----------------------------------------------------------------------------
// wxMenu
// "activate"
//-----------------------------------------------------------------------------
static void gtk_menu_clicked_callback( GtkWidget *widget, wxMenu *menu )
@ -161,7 +161,7 @@ static void gtk_menu_clicked_callback( GtkWidget *widget, wxMenu *menu )
if (!menu->IsEnabled(id)) return;
wxCommandEvent event( wxEVENT_TYPE_MENU_COMMAND, id );
wxCommandEvent event( wxEVT_COMMAND_MENU_SELECTED, id );
event.SetEventObject( menu );
event.SetInt(id );
@ -177,6 +177,38 @@ static void gtk_menu_clicked_callback( GtkWidget *widget, wxMenu *menu )
if (win) win->GetEventHandler()->ProcessEvent( event );
}
//-----------------------------------------------------------------------------
// "select"
//-----------------------------------------------------------------------------
static void gtk_menu_hilight_callback( GtkWidget *widget, wxMenu *menu )
{
int id = menu->FindMenuIdByMenuItem(widget);
wxASSERT( id != -1 ); // should find it!
if (!menu->IsEnabled(id)) return;
wxCommandEvent event( wxEVT_MENU_HIGHLIGHT, id );
event.SetEventObject( menu );
event.SetInt(id );
if (menu->m_callback)
{
(void) (*(menu->m_callback)) (*menu, event);
return;
}
if (menu->GetEventHandler()->ProcessEvent(event)) return;
wxWindow *win = menu->GetInvokingWindow();
if (win) win->GetEventHandler()->ProcessEvent( event );
}
//-----------------------------------------------------------------------------
// wxMenu
//-----------------------------------------------------------------------------
IMPLEMENT_DYNAMIC_CLASS(wxMenuItem,wxObject)
wxMenuItem::wxMenuItem()
@ -283,6 +315,10 @@ void wxMenu::Append( int id, const wxString &item, const wxString &helpStr, bool
GTK_SIGNAL_FUNC(gtk_menu_clicked_callback),
(gpointer*)this );
gtk_signal_connect( GTK_OBJECT(menuItem), "select",
GTK_SIGNAL_FUNC(gtk_menu_hilight_callback),
(gpointer*)this );
gtk_menu_append( GTK_MENU(m_menu), menuItem );
gtk_widget_show( menuItem );
m_items.Append( mitem );