From 9390a202a8b9d67d393faf3e1323885e6a27c127 Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Fri, 22 Jan 1999 18:08:54 +0000 Subject: [PATCH] The Image sample now does anti-aliasing, oh well. Made internal use of OnIdle - er - internal. (I.e. it doesn't use EVT_IDLE anymore and thus cannot be overridden by users) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1450 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/gtk/frame.h | 3 +- include/wx/gtk/window.h | 29 +++++++++--------- include/wx/gtk1/frame.h | 3 +- include/wx/gtk1/window.h | 29 +++++++++--------- samples/image/image.cpp | 65 ++++++++++++++++++++++++++++++++++++---- src/gtk/app.cpp | 3 ++ src/gtk/frame.cpp | 3 +- src/gtk/window.cpp | 10 +++---- src/gtk1/app.cpp | 3 ++ src/gtk1/frame.cpp | 3 +- src/gtk1/window.cpp | 10 +++---- 11 files changed, 112 insertions(+), 49 deletions(-) diff --git a/include/wx/gtk/frame.h b/include/wx/gtk/frame.h index 4e02f06324..2265c07ffb 100644 --- a/include/wx/gtk/frame.h +++ b/include/wx/gtk/frame.h @@ -102,7 +102,6 @@ public: void OnActivate( wxActivateEvent &WXUNUSED(event) ) { } // called from docview.cpp void OnSize( wxSizeEvent &event ); void OnCloseWindow( wxCloseEvent& event ); - void OnIdle(wxIdleEvent& event ); // implementation @@ -111,6 +110,8 @@ public: void DoMenuUpdates(); void DoMenuUpdates(wxMenu* menu); + virtual void OnInternalIdle(); + wxMenuBar *m_frameMenuBar; wxStatusBar *m_frameStatusBar; wxToolBar *m_frameToolBar; diff --git a/include/wx/gtk/window.h b/include/wx/gtk/window.h index 2169590c56..f7ca89a62d 100644 --- a/include/wx/gtk/window.h +++ b/include/wx/gtk/window.h @@ -177,7 +177,6 @@ public: { wxPoint pt(ConvertDialogToPixels(wxPoint(sz.x, sz.y))); return wxSize(pt.x, pt.y); } void OnSize( wxSizeEvent &event ); - void OnIdle( wxIdleEvent& event ); virtual bool Show( bool show ); virtual void Enable( bool enable ); @@ -316,22 +315,24 @@ public: // implementation - void PreCreation( wxWindow *parent, wxWindowID id, const wxPoint &pos, - const wxSize &size, long style, const wxString &name ); - void PostCreation(); - virtual GtkWidget *GetConnectWidget(); - virtual bool IsOwnGtkWindow( GdkWindow *window ); - void ConnectWidget( GtkWidget *widget ); - - bool HasVMT(); + void PreCreation( wxWindow *parent, wxWindowID id, const wxPoint &pos, + const wxSize &size, long style, const wxString &name ); + void PostCreation(); + + virtual GtkWidget* GetConnectWidget(); + virtual bool IsOwnGtkWindow( GdkWindow *window ); + void ConnectWidget( GtkWidget *widget ); - virtual wxPoint GetClientAreaOrigin() const; - virtual void AdjustForParentClientOrigin( int& x, int& y, int sizeFlags ); + bool HasVMT(); - GtkStyle *GetWidgetStyle(); - void SetWidgetStyle(); - virtual void ApplyWidgetStyle(); + virtual wxPoint GetClientAreaOrigin() const; + virtual void AdjustForParentClientOrigin( int& x, int& y, int sizeFlags ); + GtkStyle *GetWidgetStyle(); + void SetWidgetStyle(); + virtual void ApplyWidgetStyle(); + + virtual void OnInternalIdle(); wxWindow *m_parent; wxList m_children; diff --git a/include/wx/gtk1/frame.h b/include/wx/gtk1/frame.h index 4e02f06324..2265c07ffb 100644 --- a/include/wx/gtk1/frame.h +++ b/include/wx/gtk1/frame.h @@ -102,7 +102,6 @@ public: void OnActivate( wxActivateEvent &WXUNUSED(event) ) { } // called from docview.cpp void OnSize( wxSizeEvent &event ); void OnCloseWindow( wxCloseEvent& event ); - void OnIdle(wxIdleEvent& event ); // implementation @@ -111,6 +110,8 @@ public: void DoMenuUpdates(); void DoMenuUpdates(wxMenu* menu); + virtual void OnInternalIdle(); + wxMenuBar *m_frameMenuBar; wxStatusBar *m_frameStatusBar; wxToolBar *m_frameToolBar; diff --git a/include/wx/gtk1/window.h b/include/wx/gtk1/window.h index 2169590c56..f7ca89a62d 100644 --- a/include/wx/gtk1/window.h +++ b/include/wx/gtk1/window.h @@ -177,7 +177,6 @@ public: { wxPoint pt(ConvertDialogToPixels(wxPoint(sz.x, sz.y))); return wxSize(pt.x, pt.y); } void OnSize( wxSizeEvent &event ); - void OnIdle( wxIdleEvent& event ); virtual bool Show( bool show ); virtual void Enable( bool enable ); @@ -316,22 +315,24 @@ public: // implementation - void PreCreation( wxWindow *parent, wxWindowID id, const wxPoint &pos, - const wxSize &size, long style, const wxString &name ); - void PostCreation(); - virtual GtkWidget *GetConnectWidget(); - virtual bool IsOwnGtkWindow( GdkWindow *window ); - void ConnectWidget( GtkWidget *widget ); - - bool HasVMT(); + void PreCreation( wxWindow *parent, wxWindowID id, const wxPoint &pos, + const wxSize &size, long style, const wxString &name ); + void PostCreation(); + + virtual GtkWidget* GetConnectWidget(); + virtual bool IsOwnGtkWindow( GdkWindow *window ); + void ConnectWidget( GtkWidget *widget ); - virtual wxPoint GetClientAreaOrigin() const; - virtual void AdjustForParentClientOrigin( int& x, int& y, int sizeFlags ); + bool HasVMT(); - GtkStyle *GetWidgetStyle(); - void SetWidgetStyle(); - virtual void ApplyWidgetStyle(); + virtual wxPoint GetClientAreaOrigin() const; + virtual void AdjustForParentClientOrigin( int& x, int& y, int sizeFlags ); + GtkStyle *GetWidgetStyle(); + void SetWidgetStyle(); + virtual void ApplyWidgetStyle(); + + virtual void OnInternalIdle(); wxWindow *m_parent; wxList m_children; diff --git a/samples/image/image.cpp b/samples/image/image.cpp index cdbac91bc3..56c4b6ddc7 100644 --- a/samples/image/image.cpp +++ b/samples/image/image.cpp @@ -34,9 +34,11 @@ public: MyCanvas( wxWindow *parent, wxWindowID, const wxPoint &pos, const wxSize &size ); ~MyCanvas(); void OnPaint( wxPaintEvent &event ); + void CreateAntiAliasedBitmap(); wxBitmap *my_horse; wxBitmap *my_square; + wxBitmap *my_anti; DECLARE_DYNAMIC_CLASS(MyCanvas) DECLARE_EVENT_TABLE() @@ -107,12 +109,15 @@ MyCanvas::MyCanvas( wxWindow *parent, const wxWindowID id, image.LoadFile( dir + wxString("test.png"), wxBITMAP_TYPE_PNG ); my_square = new wxBitmap( image.ConvertToBitmap() ); + + CreateAntiAliasedBitmap(); } MyCanvas::~MyCanvas() { delete my_horse; delete my_square; + delete my_anti; } void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) @@ -120,15 +125,65 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) wxPaintDC dc( this ); PrepareDC( dc ); - dc.DrawText( "Loaded image", 30, 100 ); - if (my_square->Ok()) dc.DrawBitmap( *my_square, 30, 120 ); + dc.DrawText( "Loaded image", 30, 10 ); + if (my_square->Ok()) dc.DrawBitmap( *my_square, 30, 30 ); - dc.DrawText( "Drawn directly", 150, 100 ); + dc.DrawText( "Drawn directly", 150, 10 ); dc.SetBrush( wxBrush( "orange", wxSOLID ) ); dc.SetPen( *wxWHITE_PEN ); - dc.DrawRectangle( 150, 120, 100, 100 ); + dc.DrawRectangle( 150, 30, 100, 100 ); + + if (my_horse->Ok()) dc.DrawBitmap( *my_horse, 30, 140 ); + + if (my_anti->Ok()) dc.DrawBitmap( *my_anti, 250, 140 ); +} - if (my_horse->Ok()) dc.DrawBitmap( *my_horse, 30, 240 ); +void MyCanvas::CreateAntiAliasedBitmap() +{ + wxBitmap bitmap( 300, 300 ); + wxMemoryDC dc; + dc.SelectObject( bitmap ); + + dc.SetPen( *wxTRANSPARENT_PEN ); + + dc.Clear(); + + dc.SetFont( wxFont( 24, wxDECORATIVE, wxDEFAULT, wxDEFAULT ) ); + dc.SetTextForeground( "RED" ); + dc.DrawText( "This is anti-aliased Text.", 20, 20 ); + dc.DrawText( "And a Rectangle.", 20, 60 ); + + dc.SetBrush( *wxRED_BRUSH ); + dc.DrawRoundedRectangle( 20, 100, 200, 180, 20 ); + + wxImage original( bitmap ); + wxImage anti( 150, 150 ); + + /* This is quite slow, but safe. Use wxImage::GetData() for speed instead. */ + + for (int y = 1; y < 149; y++) + for (int x = 1; x < 149; x++) + { + int red = original.GetRed( x*2, y*2 ) + + original.GetRed( x*2-1, y*2 ) + + original.GetRed( x*2, y*2+1 ) + + original.GetRed( x*2+1, y*2+1 ); + red = red/4; + + int green = original.GetGreen( x*2, y*2 ) + + original.GetGreen( x*2-1, y*2 ) + + original.GetGreen( x*2, y*2+1 ) + + original.GetGreen( x*2+1, y*2+1 ); + green = green/4; + + int blue = original.GetBlue( x*2, y*2 ) + + original.GetBlue( x*2-1, y*2 ) + + original.GetBlue( x*2, y*2+1 ) + + original.GetBlue( x*2+1, y*2+1 ); + blue = blue/4; + anti.SetRGB( x, y, red, green, blue ); + } + my_anti = new wxBitmap( anti.ConvertToBitmap() ); } // MyFrame diff --git a/src/gtk/app.cpp b/src/gtk/app.cpp index 7b938e7667..0df66f47b8 100644 --- a/src/gtk/app.cpp +++ b/src/gtk/app.cpp @@ -302,6 +302,9 @@ bool wxApp::SendIdleEvents( wxWindow* win ) wxIdleEvent event; event.SetEventObject(win); + + win->OnInternalIdle(); + win->ProcessEvent(event); if (event.MoreRequested()) diff --git a/src/gtk/frame.cpp b/src/gtk/frame.cpp index 934ea9d990..e47d0a2613 100644 --- a/src/gtk/frame.cpp +++ b/src/gtk/frame.cpp @@ -101,7 +101,6 @@ static gint gtk_frame_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventC BEGIN_EVENT_TABLE(wxFrame, wxWindow) EVT_SIZE(wxFrame::OnSize) EVT_CLOSE(wxFrame::OnCloseWindow) - EVT_IDLE(wxFrame::OnIdle) END_EVENT_TABLE() IMPLEMENT_DYNAMIC_CLASS(wxFrame,wxWindow) @@ -457,7 +456,7 @@ void wxFrame::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y), int width, int height m_resizing = FALSE; } -void wxFrame::OnIdle(wxIdleEvent& WXUNUSED(event) ) +void wxFrame::OnInternalIdle() { if (!m_sizeSet) GtkOnSize( m_x, m_y, m_width, m_height ); diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index 5a527820d6..936b4a76a2 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -1257,7 +1257,6 @@ BEGIN_EVENT_TABLE(wxWindow, wxEvtHandler) EVT_SIZE(wxWindow::OnSize) EVT_SYS_COLOUR_CHANGED(wxWindow::OnSysColourChanged) EVT_INIT_DIALOG(wxWindow::OnInitDialog) - EVT_IDLE(wxWindow::OnIdle) EVT_KEY_DOWN(wxWindow::OnKeyDown) END_EVENT_TABLE() @@ -1791,6 +1790,11 @@ void wxWindow::SetSize( int x, int y, int width, int height, int sizeFlags ) m_resizing = FALSE; } +void wxWindow::OnInternalIdle() +{ + UpdateWindowUI(); +} + void wxWindow::SetSize( int width, int height ) { SetSize( -1, -1, width, height, wxSIZE_USE_EXISTING ); @@ -3449,7 +3453,3 @@ void wxWindow::GetPositionConstraint(int *x, int *y) const GetPosition(x, y); } -void wxWindow::OnIdle(wxIdleEvent& WXUNUSED(event) ) -{ - UpdateWindowUI(); -} diff --git a/src/gtk1/app.cpp b/src/gtk1/app.cpp index 7b938e7667..0df66f47b8 100644 --- a/src/gtk1/app.cpp +++ b/src/gtk1/app.cpp @@ -302,6 +302,9 @@ bool wxApp::SendIdleEvents( wxWindow* win ) wxIdleEvent event; event.SetEventObject(win); + + win->OnInternalIdle(); + win->ProcessEvent(event); if (event.MoreRequested()) diff --git a/src/gtk1/frame.cpp b/src/gtk1/frame.cpp index 934ea9d990..e47d0a2613 100644 --- a/src/gtk1/frame.cpp +++ b/src/gtk1/frame.cpp @@ -101,7 +101,6 @@ static gint gtk_frame_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventC BEGIN_EVENT_TABLE(wxFrame, wxWindow) EVT_SIZE(wxFrame::OnSize) EVT_CLOSE(wxFrame::OnCloseWindow) - EVT_IDLE(wxFrame::OnIdle) END_EVENT_TABLE() IMPLEMENT_DYNAMIC_CLASS(wxFrame,wxWindow) @@ -457,7 +456,7 @@ void wxFrame::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y), int width, int height m_resizing = FALSE; } -void wxFrame::OnIdle(wxIdleEvent& WXUNUSED(event) ) +void wxFrame::OnInternalIdle() { if (!m_sizeSet) GtkOnSize( m_x, m_y, m_width, m_height ); diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index 5a527820d6..936b4a76a2 100644 --- a/src/gtk1/window.cpp +++ b/src/gtk1/window.cpp @@ -1257,7 +1257,6 @@ BEGIN_EVENT_TABLE(wxWindow, wxEvtHandler) EVT_SIZE(wxWindow::OnSize) EVT_SYS_COLOUR_CHANGED(wxWindow::OnSysColourChanged) EVT_INIT_DIALOG(wxWindow::OnInitDialog) - EVT_IDLE(wxWindow::OnIdle) EVT_KEY_DOWN(wxWindow::OnKeyDown) END_EVENT_TABLE() @@ -1791,6 +1790,11 @@ void wxWindow::SetSize( int x, int y, int width, int height, int sizeFlags ) m_resizing = FALSE; } +void wxWindow::OnInternalIdle() +{ + UpdateWindowUI(); +} + void wxWindow::SetSize( int width, int height ) { SetSize( -1, -1, width, height, wxSIZE_USE_EXISTING ); @@ -3449,7 +3453,3 @@ void wxWindow::GetPositionConstraint(int *x, int *y) const GetPosition(x, y); } -void wxWindow::OnIdle(wxIdleEvent& WXUNUSED(event) ) -{ - UpdateWindowUI(); -} -- 2.45.2