From 8e1a0be21745d261faf72b5779a11b07c5861009 Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Sat, 6 May 2000 17:30:50 +0000 Subject: [PATCH] Added and documented wxImage::Mirror() and wxImage::Rotate90(). git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_2_BRANCH@7362 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/latex/wx/image.tex | 14 +++++++ include/wx/image.h | 11 +++-- src/common/image.cpp | 91 +++++++++++++++++++++++++++++++++++++++-- 3 files changed, 109 insertions(+), 7 deletions(-) diff --git a/docs/latex/wx/image.tex b/docs/latex/wx/image.tex index e5296ea8eb..e8d5db60bd 100644 --- a/docs/latex/wx/image.tex +++ b/docs/latex/wx/image.tex @@ -491,6 +491,13 @@ mimetype to the named file} \end{twocollist}} } +\membersection{wxImage::Mirror}\label{wximagemirror} + +\constfunc{wxImage}{Mirror}{\param{bool}{ horizontally = TRUE}} + +Returns a mirrored copy of the image. The parameter {\it horizontally} +indicates the orientation. + \membersection{wxImage::Replace}\label{wximagereplace} \func{void}{Replace}{\param{unsigned char}{ r1}, \param{unsigned char}{ g1}, \param{unsigned char}{ b1}, @@ -523,6 +530,13 @@ rotated image background. Else, black (rgb 0, 0, 0) will be used. Returns the rotated image, leaving this image intact. +\membersection{wxImage::Rotate90}\label{wximagerotate90} + +\constfunc{wxImage}{Rotate90}{\param{bool}{ clockwise = TRUE}} + +Returns a copy of the image rotated 90 degrees in the direction +indicated by {\it clockwise}. + \membersection{wxImage::Scale}\label{wximagescale} \constfunc{wxImage}{Scale}{\param{int}{ width}, \param{int}{ height}} diff --git a/include/wx/image.h b/include/wx/image.h index 05523dd6f0..5978327a5b 100644 --- a/include/wx/image.h +++ b/include/wx/image.h @@ -122,7 +122,10 @@ public: // Rotates the image about the given point, 'angle' radians. // Returns the rotated image, leaving this image intact. wxImage Rotate(double angle, const wxPoint & centre_of_rotation, - bool interpolating = TRUE, wxPoint * offset_after_rotation = (wxPoint*) NULL) const ; + bool interpolating = TRUE, wxPoint * offset_after_rotation = (wxPoint*) NULL) const; + + wxImage Rotate90( bool clockwise = TRUE ) const; + wxImage Mirror( bool horizontally = TRUE ) const; // replace one colour with another void Replace( unsigned char r1, unsigned char g1, unsigned char b1, @@ -130,9 +133,9 @@ public: // these routines are slow but safe void SetRGB( int x, int y, unsigned char r, unsigned char g, unsigned char b ); - unsigned char GetRed( int x, int y ); - unsigned char GetGreen( int x, int y ); - unsigned char GetBlue( int x, int y ); + unsigned char GetRed( int x, int y ) const; + unsigned char GetGreen( int x, int y ) const; + unsigned char GetBlue( int x, int y ) const; static bool CanRead( const wxString& name ); virtual bool LoadFile( const wxString& name, long type = wxBITMAP_TYPE_ANY ); diff --git a/src/common/image.cpp b/src/common/image.cpp index 2632b75583..2de40f9b39 100644 --- a/src/common/image.cpp +++ b/src/common/image.cpp @@ -217,6 +217,91 @@ wxImage wxImage::Scale( int width, int height ) const return image; } +wxImage wxImage::Rotate90( bool clockwise ) const +{ + wxImage image; + + wxCHECK_MSG( Ok(), image, wxT("invalid image") ); + + image.Create( M_IMGDATA->m_height, M_IMGDATA->m_width ); + + char unsigned *data = image.GetData(); + + wxCHECK_MSG( data, image, wxT("unable to create image") ); + + if (M_IMGDATA->m_hasMask) + image.SetMaskColour( M_IMGDATA->m_maskRed, M_IMGDATA->m_maskGreen, M_IMGDATA->m_maskBlue ); + + long height = M_IMGDATA->m_height; + long width = M_IMGDATA->m_width; + + char unsigned *source_data = M_IMGDATA->m_data; + char unsigned *target_data; + + for (long j = 0; j < height; j++) + { + for (long i = 0; i < width; i++) + { + if (clockwise) + target_data = data + (((i+1)*height) - j - 1)*3; + else + target_data = data + ((height*(width-1)) + j - (i*height))*3; + memcpy( target_data, source_data, 3 ); + source_data += 3; + } + } + + return image; +} + +wxImage wxImage::Mirror( bool horizontally ) const +{ + wxImage image; + + wxCHECK_MSG( Ok(), image, wxT("invalid image") ); + + image.Create( M_IMGDATA->m_width, M_IMGDATA->m_height ); + + char unsigned *data = image.GetData(); + + wxCHECK_MSG( data, image, wxT("unable to create image") ); + + if (M_IMGDATA->m_hasMask) + image.SetMaskColour( M_IMGDATA->m_maskRed, M_IMGDATA->m_maskGreen, M_IMGDATA->m_maskBlue ); + + long height = M_IMGDATA->m_height; + long width = M_IMGDATA->m_width; + + char unsigned *source_data = M_IMGDATA->m_data; + char unsigned *target_data; + + if (horizontally) + { + for (long j = 0; j < height; j++) + { + data += width*3; + target_data = data-3; + for (long i = 0; i < width; i++) + { + memcpy( target_data, source_data, 3 ); + source_data += 3; + target_data -= 3; + } + } + } + else + { + for (long i = 0; i < height; i++) + { + target_data = data + 3*width*(height-1-i); + memcpy( target_data, source_data, 3*width ); + source_data += 3*width; + } + } + + return image; +} + wxImage wxImage::GetSubImage( const wxRect &rect ) const { wxImage image; @@ -293,7 +378,7 @@ void wxImage::SetRGB( int x, int y, unsigned char r, unsigned char g, unsigned c M_IMGDATA->m_data[ pos+2 ] = b; } -unsigned char wxImage::GetRed( int x, int y ) +unsigned char wxImage::GetRed( int x, int y ) const { wxCHECK_MSG( Ok(), 0, wxT("invalid image") ); @@ -307,7 +392,7 @@ unsigned char wxImage::GetRed( int x, int y ) return M_IMGDATA->m_data[pos]; } -unsigned char wxImage::GetGreen( int x, int y ) +unsigned char wxImage::GetGreen( int x, int y ) const { wxCHECK_MSG( Ok(), 0, wxT("invalid image") ); @@ -321,7 +406,7 @@ unsigned char wxImage::GetGreen( int x, int y ) return M_IMGDATA->m_data[pos+1]; } -unsigned char wxImage::GetBlue( int x, int y ) +unsigned char wxImage::GetBlue( int x, int y ) const { wxCHECK_MSG( Ok(), 0, wxT("invalid image") );