]> git.saurik.com Git - wxWidgets.git/commitdiff
Added wxImage wxImage::GetSubImage(cont wxRect&) const
authorSylvain Bougnoux <bougnoux@imra-europe.com>
Wed, 18 Aug 1999 17:01:47 +0000 (17:01 +0000)
committerSylvain Bougnoux <bougnoux@imra-europe.com>
Wed, 18 Aug 1999 17:01:47 +0000 (17:01 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@3414 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/latex/wx/image.tex
include/wx/image.h
src/common/image.cpp

index c99c8a9ecd937ec4ae331c680ebeee1921c9aff3..a68a97cfea8688a2993dbbd8e6d585f87ba6c1a0 100644 (file)
@@ -478,6 +478,13 @@ Example:
 
 \helpref{Rescale}{wximagerescale}
 
+\membersection{wxImage::GetSubImage}\label{wximagegetsubimage}
+
+\constfunc{wxImage}{GetSubImage}{\param{const wxRect&}{rect}}
+
+Returns a sub image of the current one as long as the rect belongs entirely to 
+the image.
+
 \membersection{wxImage::SetData}\label{wximagesetdata}
 
 \func{void}{SetData}{\param{unsigned char*}{data}}
index 53618a1e19ce9eb80ee8fc509653caf03bed8026..4a42b42635586862131fcc5fb57b248e07afbc23 100644 (file)
@@ -170,6 +170,30 @@ public:
 #endif
 };
 
+//-----------------------------------------------------------------------------
+// wxPNMHandler
+//-----------------------------------------------------------------------------
+
+class WXDLLEXPORT wxPNMHandler : public wxImageHandler
+{
+  DECLARE_DYNAMIC_CLASS(wxPNMHandler)
+
+public:
+
+  inline wxPNMHandler()
+  {
+      m_name = "PNM file";
+      m_extension = "pnm";
+      m_type = wxBITMAP_TYPE_PNM;
+      m_mime = "image/pnm";
+  };
+
+#if wxUSE_STREAMS
+  virtual bool LoadFile( wxImage *image, wxInputStream& stream, bool verbose=TRUE );
+  virtual bool SaveFile( wxImage *image, wxOutputStream& stream, bool verbose=TRUE );
+#endif
+};
+
 //-----------------------------------------------------------------------------
 // wxImage
 //-----------------------------------------------------------------------------
@@ -200,6 +224,9 @@ public:
   void Create( int width, int height );
   void Destroy();
 
+  // return the new image with size width*height
+  wxImage GetSubImage( const wxRect& ) const;
+
   // return the new image with size width*height
   wxImage Scale( int width, int height ) const;
 
index a67a7445acc44d845f4fe876780ce24b2f9c70fa..2ee0a4c1bb891312f17c858c184987f7e5c5bf62 100644 (file)
@@ -189,6 +189,43 @@ wxImage wxImage::Scale( int width, int height ) const
     return image;
 }
 
+wxImage wxImage::GetSubImage( const wxRect &rect ) const
+{
+    wxImage image;
+
+    wxCHECK_MSG( Ok(), image, _T("invalid image") );
+
+    wxCHECK_MSG( (rect.GetLeft()>=0) && (rect.GetTop()>=0) && (rect.GetRight()<=GetWidth()) && (rect.GetBottom()<=GetHeight())
+                , image, _T("invalid subimage size") );
+
+    int subwidth=rect.GetWidth();
+    const int subheight=rect.GetHeight();
+
+    image.Create( subwidth, subheight );
+
+    char unsigned *subdata = image.GetData(), *data=GetData();
+
+    wxCHECK_MSG( subdata, image, _T("unable to create image") );
+
+    if (M_IMGDATA->m_hasMask)
+        image.SetMaskColour( M_IMGDATA->m_maskRed, M_IMGDATA->m_maskGreen, M_IMGDATA->m_maskBlue );
+
+    const int subleft=3*rect.GetLeft();
+    const int width=3*GetWidth();
+    subwidth*=3;
+    
+    data+=rect.GetTop()*width+subleft;
+
+    for (long j = 0; j < subheight; ++j)
+    {
+        memcpy( subdata, data, subwidth);
+        subdata+=subwidth;
+       data+=width;
+    }
+
+    return image;
+}
+
 void wxImage::SetRGB( int x, int y, unsigned char r, unsigned char g, unsigned char b )
 {
     wxCHECK_RET( Ok(), _T("invalid image") );
@@ -388,7 +425,6 @@ bool wxImage::SaveFile( const wxString& filename, const wxString& mimetype )
 }
 
 #if wxUSE_STREAMS
-//#include <stream.h>
 
 bool wxImage::LoadFile( wxInputStream& stream, long type )
 {
@@ -403,8 +439,8 @@ bool wxImage::LoadFile( wxInputStream& stream, long type )
       // here we can try to guess the handler according the extension,
       // but we lose the stream name !?
       // Probably we should write methods such as 
-      // bool wxImageHandler::IsAppropriate(wxString&)
-      // bool wxImageHandler::IsAppropriate(sxInputStream&&)
+      // bool wxImageHandler::CanRead(wxString&)
+      // bool wxImageHandler::CanRead(sxInputStream&&)
       // for png : see example.c
        wxList &list=GetHandlers();
        off_t pos=stream.TellI();
@@ -412,13 +448,14 @@ bool wxImage::LoadFile( wxInputStream& stream, long type )
         wxLogNull prevent_log;
 
        for ( wxList::Node *node = list.GetFirst(); node; node = node->GetNext() )
-       {
-           handler=(wxImageHandler*)node->GetData();
-           //cout << handler->GetExtension() << endl;
+       {  
+           handler=(wxImageHandler*)node->GetData();
            if (handler->LoadFile( this, stream, FALSE )) return TRUE;
+
            stream.SeekI(pos);
        }
 
+       wxLogWarning( _T("No handler found for this image.") );
        return FALSE;
     }