From 265a3864bbbc7ac8af309c80321efbba8c0ca6e9 Mon Sep 17 00:00:00 2001
From: Julian Smart <julian@anthemion.co.uk>
Date: Thu, 3 Mar 2005 06:56:15 +0000
Subject: [PATCH] Added wxBUFFER_VIRTUAL_AREA, wxBUFFER_CLIENT_AREA to buffered
 DC

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@32572 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 docs/changes.txt           |  9 ++++--
 docs/latex/wx/bufferdc.tex | 20 +++++++++---
 include/wx/dcbuffer.h      | 64 +++++++++++++++++++++++++++++---------
 3 files changed, 72 insertions(+), 21 deletions(-)

diff --git a/docs/changes.txt b/docs/changes.txt
index 261d4441ea..17d1350f08 100644
--- a/docs/changes.txt
+++ b/docs/changes.txt
@@ -7,11 +7,16 @@ wxWidgets 2.5 Change Log - For more verbose changes, see the manual
 
 All:
 
+- wxURI::GetUser and wxURI::HasUser have been renamed to wxURI::GetUserInfo and wxURI::HasUserInfo respectively so that wxURI::GetUser returns the old username that were in the HTTP specification along with wxURI::GetPassword (Note that if you used wxURI::GetUser from 2.5.3 you should rename all instances of it to wxURI::GetUserInfo).
+- Added 
+
+All (GUI):
+
 - Added GetIcon, GetBitmap to wxImageList. wxGenericImageList's original
   GetBitmap is renamed GetBitmapPtr.
 - Added XPM data constructor to wxImage.
-- wxURI::GetUser and wxURI::HasUser have been renamed to wxURI::GetUserInfo and wxURI::HasUserInfo respectively so that wxURI::GetUser returns the old username that were in the HTTP specification along with wxURI::GetPassword (Note that if you used wxURI::GetUser from 2.5.3 you should rename all instances of it to wxURI::GetUserInfo).
-
+- Added style parameter to wxBufferedDC to allow buffering just
+  the client, or the whole virtual area.
 
 wxPalmOS:
 
diff --git a/docs/latex/wx/bufferdc.tex b/docs/latex/wx/bufferdc.tex
index 3a3af78022..0e903887ec 100644
--- a/docs/latex/wx/bufferdc.tex
+++ b/docs/latex/wx/bufferdc.tex
@@ -42,9 +42,9 @@ your \texttt{OnPaint()} handler, you should look at
 
 \func{}{wxBufferedDC}{\void}
 
-\func{}{wxBufferedDC}{\param{wxDC *}{dc}, \param{const wxSize\& }{area}}
+\func{}{wxBufferedDC}{\param{wxDC *}{dc}, \param{const wxSize\& }{area}, \param{int }{style = wxBUFFER\_CLIENT\_AREA}}
 
-\func{}{wxBufferedDC}{\param{wxDC *}{dc}, \param{const wxBitmap\& }{buffer}}
+\func{}{wxBufferedDC}{\param{wxDC *}{dc}, \param{const wxBitmap\& }{buffer}, \param{int }{style = wxBUFFER\_CLIENT\_AREA}}
 
 If you use the first, default, constructor, you must call one of the 
 \helpref{Init}{wxbuffereddcinit} methods later in order to use the object.
@@ -66,12 +66,16 @@ the most efficient solution as the bitmap doesn't have to be recreated each
 time but it also requires more memory as the bitmap is never freed. The bitmap
 should have appropriate size, anything drawn outside of its bounds is clipped.}
 
+\docparam{style}{wxBUFFER\_CLIENT\_AREA to indicate that just the client area of
+the window is buffered, or wxBUFFER\_VIRTUAL\_AREA to indicate that the buffer bitmap
+covers the virtual area (in which case PrepareDC is automatically called for the actual window
+device context).}
 
 \membersection{wxBufferedDC::Init}\label{wxbuffereddcinit}
 
-\func{void}{Init}{\param{wxDC *}{dc}, \param{const wxSize\& }{area}}
+\func{void}{Init}{\param{wxDC *}{dc}, \param{const wxSize\& }{area}, \param{int }{style = wxBUFFER\_CLIENT\_AREA}}
 
-\func{void}{Init}{\param{wxDC *}{dc}, \param{const wxBitmap\& }{buffer}}
+\func{void}{Init}{\param{wxDC *}{dc}, \param{const wxBitmap\& }{buffer}, \param{int }{style = wxBUFFER\_CLIENT\_AREA}}
 
 These functions initialize the object created using the default constructor.
 Please see \helpref{constructors documentation}{wxbuffereddcctor} for details.
@@ -113,12 +117,18 @@ already does this internally for the real underlying wxPaintDC.
 
 \membersection{wxBufferedPaintDC::wxBufferedPaintDC}\label{wxbufferedpaintdcctor}
 
-\func{}{wxBufferedPaintDC}{\param{wxWindow *}{window}, \param{const wxBitmap\& }{buffer = wxNullBitmap}}
+\func{}{wxBufferedPaintDC}{\param{wxWindow *}{window}, \param{const wxBitmap\& }{buffer}, \param{int }{style = wxBUFFER\_CLIENT\_AREA}}
+
+\func{}{wxBufferedPaintDC}{\param{wxWindow *}{window}, \param{int }{style = wxBUFFER\_CLIENT\_AREA}}
 
 As with \helpref{wxBufferedDC}{wxbuffereddcctor}, you may either provide the
 bitmap to be used for buffering or let this object create one internally (in
 the latter case, the size of the client part of the window is used).
 
+Pass wxBUFFER\_CLIENT\_AREA for the {\it style} parameter to indicate that just the client area of
+the window is buffered, or wxBUFFER\_VIRTUAL\_AREA to indicate that the buffer bitmap
+covers the virtual area (in which case PrepareDC is automatically called for the actual window
+device context).
 
 \membersection{wxBufferedPaintDC::\destruct{wxBufferedPaintDC}}\label{wxbufferedpaintdcdtor}
 
diff --git a/include/wx/dcbuffer.h b/include/wx/dcbuffer.h
index 6cd63b8d60..e7ccff4f55 100644
--- a/include/wx/dcbuffer.h
+++ b/include/wx/dcbuffer.h
@@ -20,18 +20,27 @@
 // Double buffering helper.
 // ----------------------------------------------------------------------------
 
+// Assumes the buffer bitmap covers the entire scrolled window,
+// and prepares the window DC accordingly
+#define wxBUFFER_VIRTUAL_AREA       0x01
+
+// Assumes the buffer bitmap only covers the client area;
+// does not prepare the window DC
+#define wxBUFFER_CLIENT_AREA        0x02
+
 class wxBufferedDC : public wxMemoryDC
 {
 public:
     // Default ctor, must subsequently call Init for two stage construction.
-    wxBufferedDC() : m_dc( 0 )
+    wxBufferedDC() : m_dc( 0 ), m_style(0)
     {
     }
 
     // Construct a wxBufferedDC using a user supplied buffer.
-    wxBufferedDC(wxDC *dc, const wxBitmap &buffer)
+    wxBufferedDC(wxDC *dc, const wxBitmap &buffer, int style = wxBUFFER_CLIENT_AREA)
         : m_dc( dc ),
-          m_buffer( buffer )
+          m_buffer( buffer ),
+          m_style(style)
     {
         UseBuffer();
     }
@@ -39,9 +48,11 @@ public:
     // Construct a wxBufferedDC with an internal buffer of 'area'
     // (where area is usually something like the size of the window
     // being buffered)
-    wxBufferedDC(wxDC *dc, const wxSize &area)
+    wxBufferedDC(wxDC *dc, const wxSize &area, int style = wxBUFFER_CLIENT_AREA)
         : m_dc( dc ),
-          m_buffer( area.GetWidth(), area.GetHeight() )
+          m_buffer( area.GetWidth(), area.GetHeight() ),
+          m_style(style)
+
     {
         UseBuffer();
     }
@@ -56,18 +67,19 @@ public:
 
     // These reimplement the actions of the ctors for two stage creation, but
     // are not used by the ctors themselves to save a few cpu cycles.
-    void Init(wxDC *dc, const wxBitmap &buffer)
+    void Init(wxDC *dc, const wxBitmap &buffer, int style = wxBUFFER_CLIENT_AREA)
     {
         wxASSERT_MSG( m_dc == 0 && m_buffer == wxNullBitmap,
                       _T("wxBufferedDC already initialised") );
         m_dc = dc;
         m_buffer = buffer;
+        m_style = style;
         UseBuffer();
     }
 
-    void Init(wxDC *dc, const wxSize &area)
+    void Init(wxDC *dc, const wxSize &area, int style = wxBUFFER_CLIENT_AREA)
     {
-        Init(dc, wxBitmap(area.GetWidth(), area.GetHeight()));
+        Init(dc, wxBitmap(area.GetWidth(), area.GetHeight()), style);
     }
 
     // Blits the buffer to the dc, and detaches the dc from the buffer (so it
@@ -81,8 +93,10 @@ public:
         wxASSERT_MSG( m_dc != 0,
                       _T("No underlying DC associated with wxBufferedDC (anymore)") );
 
-        wxCoord x, y;
-        GetDeviceOrigin(& x, & y);
+        wxCoord x=0, y=0;
+
+        if (m_style & wxBUFFER_CLIENT_AREA)
+            GetDeviceOrigin(& x, & y);
 
         m_dc->Blit( 0, 0,
                     m_buffer.GetWidth(), m_buffer.GetHeight(), this,
@@ -90,6 +104,10 @@ public:
         m_dc = NULL;
     }
 
+    // Set and get the style
+    void SetStyle(int style) { m_style = style; }
+    int GetStyle() const { return m_style; }
+
 private:
     // check that the bitmap is valid and use it
     void UseBuffer()
@@ -109,6 +127,9 @@ private:
     // the buffer (selected in this DC)
     wxBitmap m_buffer;
 
+    // the buffering style
+    int m_style;
+
     DECLARE_NO_COPY_CLASS(wxBufferedDC)
 };
 
@@ -122,14 +143,29 @@ private:
 class wxBufferedPaintDC : public wxBufferedDC
 {
 public:
-    // If no bitmap is supplied by the user, a temporary one wil; be created.
-    wxBufferedPaintDC(wxWindow *window, const wxBitmap& buffer = wxNullBitmap)
+    // If no bitmap is supplied by the user, a temporary one will be created.
+    wxBufferedPaintDC(wxWindow *window, const wxBitmap& buffer, int style = wxBUFFER_CLIENT_AREA)
         : m_paintdc(window)
     {
+        // If we're buffering the virtual window, scale the paint DC as well
+        if (style & wxBUFFER_VIRTUAL_AREA)
+            window->PrepareDC( m_paintdc );
+
         if( buffer != wxNullBitmap )
-            Init(&m_paintdc, buffer);
+            Init(&m_paintdc, buffer, style);
         else
-            Init(&m_paintdc, window->GetClientSize());
+            Init(&m_paintdc, window->GetClientSize(), style);
+    }
+
+    // If no bitmap is supplied by the user, a temporary one will be created.
+    wxBufferedPaintDC(wxWindow *window, int style = wxBUFFER_CLIENT_AREA)
+        : m_paintdc(window)
+    {
+        // If we're using the virtual window, scale the paint DC as well
+        if (style & wxBUFFER_VIRTUAL_AREA)
+            window->PrepareDC( m_paintdc );
+
+        Init(&m_paintdc, window->GetClientSize(), style);
     }
 
     // default copy ctor ok.
-- 
2.45.2

