Added wxRegion version of wxWindowDC::SetClippingRegion
authorJulian Smart <julian@anthemion.co.uk>
Wed, 2 Dec 1998 20:02:01 +0000 (20:02 +0000)
committerJulian Smart <julian@anthemion.co.uk>
Wed, 2 Dec 1998 20:02:01 +0000 (20:02 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1098 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

12 files changed:
docs/latex/wx/dc.tex
docs/msw/install.txt
include/wx/motif/dcclient.h
include/wx/msw/dc.h
include/wx/msw/region.h
include/wx/stubs/dcclient.h
samples/splitter/makefile.g95
src/motif/dcclient.cpp
src/motif/region.cpp
src/msw/dc.cpp
src/msw/region.cpp
src/stubs/dcclient.cpp

index 333d6355b7d6635e5a4d35002cd7a6e7a39964c1..e2fb6a9f9a05929584111a3b969707127ca5b763 100644 (file)
@@ -533,11 +533,15 @@ whether text will be drawn with a background colour or not.
 
 \func{void}{SetClippingRegion}{\param{long}{ x}, \param{long}{ y}, \param{long}{ width}, \param{long}{ height}}
 
-Sets the clipping region for the DC. The clipping region is a rectangular area
-to which drawing is restricted.  Possible uses for the clipping region are for clipping text
+\func{void}{SetClippingRegion}{\param{const wxRegion\&}{ region}}
+
+Sets the clipping region for the DC. The clipping region is an area
+to which drawing is restricted. Possible uses for the clipping region are for clipping text
 or for speeding up window redraws when only a known area of the screen is damaged.
 
-See also \helpref{wxDC::DestroyClippingRegion}{wxdcdestroyclippingregion}.
+\wxheading{See also}
+
+\helpref{wxDC::DestroyClippingRegion}{wxdcdestroyclippingregion}, \helpref{wxRegion}{wxregion}
 
 \membersection{wxDC::SetPalette}\label{wxdcsetpalette}
 
index d3a735555ca1ef08f5268a8803940aa8466623d9..a53f6f88804bbb667175cc83ef3f2b0fc27fbb3a 100644 (file)
@@ -79,6 +79,8 @@ Here are the steps required:
   extra files to use the wxWindows makefiles. You can find these
   files in ports/mingw32 on the ftp site or CD-ROM, as extra.zip.
   These should be extracted to the Mingw32 directory.
+  IMPORTANT: also see mingw32.txt in this directory (docs/msw)
+  about a fix that has to be applied to a Mingw32 header file.
 
 - Modify the file wx/src/cygnus.bat (or mingw32.bat or mingegcs.bat)
   to set up appropriate variables, if necessary mounting drives.
index 9b75bf2aada2f8ca527bf9104dbbce9855e7e3cd..3caa023ff3e196921e40e9f94d1650f9da2ef0af 100644 (file)
@@ -89,6 +89,7 @@ class WXDLLEXPORT wxWindowDC: public wxDC
     virtual void SetPalette( const wxPalette& palette );
     
     virtual void SetClippingRegion( long x, long y, long width, long height );
+    virtual void SetClippingRegion( const wxRegion& region );
     virtual void DestroyClippingRegion(void);
     
     virtual void DrawSpline( wxList *points );
index 983845e5a80372f9ee9cee5d97bc83e3d29804bd..05e696b5909b53de856f4fa1492ea97a0d1ff876 100644 (file)
@@ -158,6 +158,7 @@ public:
   {
     SetClippingRegion(rect.x, rect.y, rect.width, rect.height);
   }
+  virtual void SetClippingRegion(const wxRegion& region);
 
   virtual void SetPalette(const wxPalette& palette);
 #if WXWIN_COMPATIBILITY
index 3955305427493a124628d489a7c418e8f346b162..4be8411eb56ae1cac1a3060e4f04b1f5c04b23c7 100644 (file)
@@ -101,6 +101,9 @@ public:
        bool Combine(long x, long y, long width, long height, wxRegionOp op);
        bool Combine(const wxRegion& region, wxRegionOp op);
        bool Combine(const wxRect& rect, wxRegionOp op);
+
+    // Get internal region handle
+    WXHRGN GetHRGN() const;
 };
 
 class WXDLLEXPORT wxRegionIterator : public wxObject {
index 99845221b6225cd406937004f3f7a55dae1f412a..7b37f6022ba30662cbe4bc623154b3457fc145d5 100644 (file)
@@ -85,6 +85,7 @@ class WXDLLEXPORT wxWindowDC: public wxDC
     virtual void SetPalette( const wxPalette& palette );
     
     virtual void SetClippingRegion( long x, long y, long width, long height );
+    virtual void SetClippingRegion( const wxRegion& region ) ;
     virtual void DestroyClippingRegion(void);
     
     virtual void DrawSpline( wxList *points );
index 2ae60d6fc21ccc305cafd403fb3cd818451aded4..597f7d9a403d59087a83e4fe83fa7922fca838fa 100644 (file)
@@ -15,7 +15,7 @@ WXDIR = ../..
 # this central makefile.
 include $(WXDIR)/src/makeg95.env
 
-OBJECTS = $(OBJDIR)/test.$(OBJSUFF)
+OBJECTS = $(OBJDIR)/test.$(OBJSUFF) $(OBJDIR)/test_resources.$(OBJSUFF)
 
 all:    $(OBJDIR) test$(GUISUFFIX)$(EXESUFF)
 
@@ -24,14 +24,16 @@ wx:
 $(OBJDIR):
        mkdir $(OBJDIR)
 
-test$(GUISUFFIX)$(EXESUFF):    $(OBJDIR)/test.$(OBJSUFF) test.res $(WXLIB)
-       $(CC) $(LDFLAGS) -o test$(GUISUFFIX)$(EXESUFF) $(OBJDIR)/test.$(OBJSUFF) $(XVIEW_LINK) $(LDLIBS)
-       $(RSRC) test.$(RESSUFF) test.exe
+test$(GUISUFFIX)$(EXESUFF):    $(OBJECTS) $(WXLIB)
+       $(CC) $(LDFLAGS) -o test$(GUISUFFIX)$(EXESUFF) $(OBJECTS) $(LDLIBS)
 
 $(OBJDIR)/test.$(OBJSUFF):     test.$(SRCSUFF)
        $(CC) -c $(CPPFLAGS) -o $@ test.$(SRCSUFF)
 
-test.res:  test.rc
+$(OBJDIR)/test_resources.o:  test.rc
+       $(RESCOMP) -i test.rc -o $(OBJDIR)/test_resources.o $(RESFLAGS)
 
 clean:
        rm -f $(OBJECTS) test$(GUISUFFIX).exe core *.rsc *.res
+
+
index cb48e8250e38495f97d8f64b85ea3a799eda7f1d..a91a4e7d5721ee9f511621251091751907783ad1 100644 (file)
@@ -2045,6 +2045,34 @@ void wxWindowDC::SetClippingRegion( long x, long y, long width, long height )
   }
 };
 
+void wxWindowDC::SetClippingRegion( const wxRegion& region )
+{
+  wxRect box = region.GetBox();
+
+  wxDC::SetClippingRegion( box.x, box.y, box.width, box.height );
+
+  if (m_userRegion)
+    XDestroyRegion ((Region) m_userRegion);
+  m_userRegion = (WXRegion) XCreateRegion ();
+
+  XUnionRegion((Region) m_userRegion, (Region) region.GetXRegion(), (Region) m_userRegion);
+
+  SetDCClipping ();
+
+  // Needs to work differently for Pixmap: without this,
+  // there's a nasty (Display*) m_display bug. 8/12/94
+  if (m_window && m_window->GetBackingPixmap())
+  {
+    XRectangle rects[1];
+    rects[0].x = XLOG2DEV_2(box.x);
+    rects[0].y = YLOG2DEV_2(box.y);
+    rects[0].width = XLOG2DEVREL(box.width);
+    rects[0].height = YLOG2DEVREL(box.height);
+    XSetClipRectangles((Display*) m_display, (GC) m_gcBacking, 0, 0, rects, 1, Unsorted);
+  }
+};
+
+
 void wxWindowDC::DestroyClippingRegion(void)
 {
   wxDC::DestroyClippingRegion();
index 914921145034bc6caf9ddcf6596670a5429c3001..7121fe63a32fb3ec5c0b7f5ce40b4740154d0e6c 100644 (file)
@@ -206,9 +206,7 @@ bool wxRegion::Combine(const wxRegion& region, wxRegionOp op)
             break ;
     }
 
-    // TODO combine region
-
-       return FALSE;
+  return FALSE;
 }
 
 bool wxRegion::Combine(const wxRect& rect, wxRegionOp op)
index 5b4e8fddcda7ae1ee0d99d09bc154124c775c32c..9375860e758a995a9eb58f11f1b198e3ff4e723c 100644 (file)
@@ -181,6 +181,22 @@ void wxDC::SetClippingRegion(long cx, long cy, long cw, long ch)
   DoClipping((WXHDC) m_hDC);
 }
 
+void wxDC::SetClippingRegion(const wxRegion& region)
+{
+  if (!region.GetHRGN())
+    return;
+
+  wxRect box = region.GetBox();
+
+  m_clipping = TRUE;
+  m_clipX1 = box.x;
+  m_clipY1 = box.y;
+  m_clipX2 = box.x + box.width;
+  m_clipY2 = box.y + box.height;
+
+  ExtSelectClipRgn((HDC) m_hDC, (HRGN) region.GetHRGN(), RGN_AND);
+}
+
 void wxDC::DoClipping(WXHDC dc)
 {
   if (m_clipping && dc)
@@ -194,11 +210,14 @@ void wxDC::DestroyClippingRegion(void)
 {
   if (m_clipping && m_hDC)
   {
+    // TODO: this should restore the previous clipping region,
+    // so that OnPaint processing works correctly, and the update clipping region
+    // doesn't get destroyed after the first DestroyClippingRegion.
     HRGN rgn = CreateRectRgn(0, 0, 32000, 32000);
     SelectClipRgn((HDC) m_hDC, rgn);
     DeleteObject(rgn);
-   }
-   m_clipping = FALSE;
+  }
+  m_clipping = FALSE;
 }
 
 bool wxDC::CanDrawBitmap(void) const
index 5e7fae2b07a407faf42d305b044b63c6671dfa40..e26d294ce764c71ac6a777b887082697f71b3216 100644 (file)
@@ -288,6 +288,14 @@ wxRegionContain wxRegion::Contains(const wxRect& rect) const
     return Contains(x, y, w, h);
 }
 
+// Get internal region handle
+WXHRGN wxRegion::GetHRGN() const
+{
+    if (!m_refData)
+        return (WXHRGN) 0;
+    return (WXHRGN) M_REGION;
+}
+
 ///////////////////////////////////////////////////////////////////////////////
 //                                                                                                                                                      //
 //                                                        wxRegionIterator                                                              //
index 4ba48ce40bb15853a847542b2cc7c5741d86cdbd..b21b90399e65a39b2cd3dda2ac32656bb603dc39 100644 (file)
@@ -448,9 +448,20 @@ void wxWindowDC::SetPalette( const wxPalette& WXUNUSED(palette) )
 void wxWindowDC::SetClippingRegion( long x, long y, long width, long height )
 {
   wxDC::SetClippingRegion( x, y, width, height );
+
+  // TODO
   
 };
 
+void wxWindowDC::SetClippingRegion( const wxRegion& region )
+{
+  wxRect box = region.GetBox();
+
+  wxDC::SetClippingRegion( box.x, box.y, box.width, box.height );
+
+  // TODO
+}
+
 void wxWindowDC::DestroyClippingRegion(void)
 {
   wxDC::DestroyClippingRegion();