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

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