From 783da8450c15fec48691411d492ad2246cba15d7 Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Thu, 9 Oct 2003 20:01:49 +0000 Subject: [PATCH] Added wxBitmap::Rescale() from 2_4 git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@24144 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/gtk/bitmap.h | 2 + include/wx/gtk1/bitmap.h | 2 + src/gtk/bitmap.cpp | 161 +++++++++++++++++++++++++++++++++++++++ src/gtk1/bitmap.cpp | 161 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 326 insertions(+) diff --git a/include/wx/gtk/bitmap.h b/include/wx/gtk/bitmap.h index 5ba80bf85f..51cc2fed09 100644 --- a/include/wx/gtk/bitmap.h +++ b/include/wx/gtk/bitmap.h @@ -113,6 +113,8 @@ public: GdkPixmap *GetPixmap() const; GdkBitmap *GetBitmap() const; + // Basically, this corresponds to Win32 StretchBlt() + wxBitmap Rescale( int clipx, int clipy, int clipwidth, int clipheight, int width, int height ); protected: bool CreateFromXpm(const char **bits); bool CreateFromImage(const wxImage& image, int depth); diff --git a/include/wx/gtk1/bitmap.h b/include/wx/gtk1/bitmap.h index 5ba80bf85f..51cc2fed09 100644 --- a/include/wx/gtk1/bitmap.h +++ b/include/wx/gtk1/bitmap.h @@ -113,6 +113,8 @@ public: GdkPixmap *GetPixmap() const; GdkBitmap *GetBitmap() const; + // Basically, this corresponds to Win32 StretchBlt() + wxBitmap Rescale( int clipx, int clipy, int clipwidth, int clipheight, int width, int height ); protected: bool CreateFromXpm(const char **bits); bool CreateFromImage(const wxImage& image, int depth); diff --git a/src/gtk/bitmap.cpp b/src/gtk/bitmap.cpp index 05f616edce..d6ccd87c4c 100644 --- a/src/gtk/bitmap.cpp +++ b/src/gtk/bitmap.cpp @@ -39,6 +39,8 @@ #include #endif // GTK+ 2.0/1.2 +#include + extern void gdk_wx_draw_bitmap (GdkDrawable *drawable, GdkGC *gc, GdkDrawable *src, @@ -344,6 +346,165 @@ bool wxBitmap::CreateFromXpm( const char **bits ) return TRUE; } +wxBitmap wxBitmap::Rescale( int clipx, int clipy, int clipwidth, int clipheight, int newx, int newy ) +{ + wxCHECK_MSG( Ok(), wxNullBitmap, wxT("invalid bitmap") ); + + if (newy==M_BMPDATA->m_width && newy==M_BMPDATA->m_height) + return *this; + + GdkImage *img = (GdkImage*) NULL; + if (GetPixmap()) + img = gdk_image_get( GetPixmap(), 0, 0, GetWidth(), GetHeight() ); + else if (GetBitmap()) + img = gdk_image_get( GetBitmap(), 0, 0, GetWidth(), GetHeight() ); + else + wxFAIL_MSG( wxT("Ill-formed bitmap") ); + + wxCHECK_MSG( img, wxNullBitmap, wxT("couldn't create image") ); + + wxBitmap bmp; + int bpp = -1; + + int width = wxMax(newx, 1); + int height = wxMax(newy, 1); + width = wxMin(width, clipwidth); + height = wxMin(height, clipheight); + + GdkGC *gc = NULL; + GdkPixmap *dstpix = NULL; + if (GetPixmap()) + { + GdkVisual *visual = gdk_window_get_visual( GetPixmap() ); + if (visual == NULL) + visual = wxTheApp->GetGdkVisual(); + + bpp = visual->depth; + bmp = wxBitmap(width,height,bpp); + dstpix = bmp.GetPixmap(); + gc = gdk_gc_new( dstpix ); + } + + char *dst = NULL; + long dstbyteperline = 0; + + if (GetBitmap()) + { + bpp = 1; + dstbyteperline = width/8*M_BMPDATA->m_bpp; + if (width*M_BMPDATA->m_bpp % 8 != 0) + dstbyteperline++; + dst = (char*) malloc(dstbyteperline*height); + } + + // be careful to use the right scaling factor + float scx = (float)M_BMPDATA->m_width/(float)newx; + float scy = (float)M_BMPDATA->m_height/(float)newy; + // prepare accel-tables + int *tablex = (int *)calloc(width,sizeof(int)); + int *tabley = (int *)calloc(height,sizeof(int)); + + // accel table filled with clipped values + for (int x = 0; x < width; x++) + tablex[x] = (int) (scx * (x+clipx)); + for (int y = 0; y < height; y++) + tabley[y] = (int) (scy * (y+clipy)); + + // Main rescaling routine starts here + for (int h = 0; h < height; h++) + { + char outbyte = 0; + + for (int w=0; wGetBitmap(), 0, 0, GetWidth(), GetHeight() ); + + for (int h = 0; h < height; h++) + { + char outbyte = 0; + + for (int w=0; w #endif // GTK+ 2.0/1.2 +#include + extern void gdk_wx_draw_bitmap (GdkDrawable *drawable, GdkGC *gc, GdkDrawable *src, @@ -344,6 +346,165 @@ bool wxBitmap::CreateFromXpm( const char **bits ) return TRUE; } +wxBitmap wxBitmap::Rescale( int clipx, int clipy, int clipwidth, int clipheight, int newx, int newy ) +{ + wxCHECK_MSG( Ok(), wxNullBitmap, wxT("invalid bitmap") ); + + if (newy==M_BMPDATA->m_width && newy==M_BMPDATA->m_height) + return *this; + + GdkImage *img = (GdkImage*) NULL; + if (GetPixmap()) + img = gdk_image_get( GetPixmap(), 0, 0, GetWidth(), GetHeight() ); + else if (GetBitmap()) + img = gdk_image_get( GetBitmap(), 0, 0, GetWidth(), GetHeight() ); + else + wxFAIL_MSG( wxT("Ill-formed bitmap") ); + + wxCHECK_MSG( img, wxNullBitmap, wxT("couldn't create image") ); + + wxBitmap bmp; + int bpp = -1; + + int width = wxMax(newx, 1); + int height = wxMax(newy, 1); + width = wxMin(width, clipwidth); + height = wxMin(height, clipheight); + + GdkGC *gc = NULL; + GdkPixmap *dstpix = NULL; + if (GetPixmap()) + { + GdkVisual *visual = gdk_window_get_visual( GetPixmap() ); + if (visual == NULL) + visual = wxTheApp->GetGdkVisual(); + + bpp = visual->depth; + bmp = wxBitmap(width,height,bpp); + dstpix = bmp.GetPixmap(); + gc = gdk_gc_new( dstpix ); + } + + char *dst = NULL; + long dstbyteperline = 0; + + if (GetBitmap()) + { + bpp = 1; + dstbyteperline = width/8*M_BMPDATA->m_bpp; + if (width*M_BMPDATA->m_bpp % 8 != 0) + dstbyteperline++; + dst = (char*) malloc(dstbyteperline*height); + } + + // be careful to use the right scaling factor + float scx = (float)M_BMPDATA->m_width/(float)newx; + float scy = (float)M_BMPDATA->m_height/(float)newy; + // prepare accel-tables + int *tablex = (int *)calloc(width,sizeof(int)); + int *tabley = (int *)calloc(height,sizeof(int)); + + // accel table filled with clipped values + for (int x = 0; x < width; x++) + tablex[x] = (int) (scx * (x+clipx)); + for (int y = 0; y < height; y++) + tabley[y] = (int) (scy * (y+clipy)); + + // Main rescaling routine starts here + for (int h = 0; h < height; h++) + { + char outbyte = 0; + + for (int w=0; wGetBitmap(), 0, 0, GetWidth(), GetHeight() ); + + for (int h = 0; h < height; h++) + { + char outbyte = 0; + + for (int w=0; w