Updated bitmap blitting code as per 2_4


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@24211 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling
2003-10-17 14:28:52 +00:00
parent a2e268df19
commit 551b5391ae
4 changed files with 66 additions and 30 deletions

View File

@@ -414,10 +414,18 @@ wxBitmap wxBitmap::Rescale( int clipx, int clipy, int clipwidth, int clipheight,
for (int h = 0; h < height; h++) for (int h = 0; h < height; h++)
{ {
char outbyte = 0; char outbyte = 0;
int old_x = -1;
guint32 old_pixval;
for (int w=0; w<width; w++) for (int w=0; w<width; w++)
{ {
guint32 pixval = gdk_image_get_pixel( img, tablex[w], tabley[h] ); guint32 pixval;
int x = tablex[w];
if (x == old_x)
pixval = old_pixval;
else
pixval = gdk_image_get_pixel( img, x, tabley[h] );
if (bpp==1) if (bpp==1)
{ {
if (!pixval) if (!pixval)

View File

@@ -191,7 +191,7 @@ static void wxInitGCPool()
// If we cannot malloc, then fail with error // If we cannot malloc, then fail with error
// when debug is enabled. If debug is not enabled, // when debug is enabled. If debug is not enabled,
// the problem will eventually get caught // the problem will eventually get caught
// in wxGetPoolGC. // in wxGetPoolGC.
wxFAIL_MSG( wxT("Cannot allocate GC pool") ); wxFAIL_MSG( wxT("Cannot allocate GC pool") );
return; return;
} }
@@ -237,13 +237,13 @@ static GdkGC* wxGetPoolGC( GdkWindow *window, wxPoolGCType type )
// We did not find an available GC. // We did not find an available GC.
// We need to grow the GC pool. // We need to grow the GC pool.
pptr = (wxGC *)realloc(wxGCPool, pptr = (wxGC *)realloc(wxGCPool,
(wxGCPoolSize + GC_POOL_ALLOC_SIZE)*sizeof(wxGC)); (wxGCPoolSize + GC_POOL_ALLOC_SIZE)*sizeof(wxGC));
if (pptr != NULL) if (pptr != NULL)
{ {
// Initialize newly allocated pool. // Initialize newly allocated pool.
wxGCPool = pptr; wxGCPool = pptr;
memset(&wxGCPool[wxGCPoolSize], 0, memset(&wxGCPool[wxGCPoolSize], 0,
GC_POOL_ALLOC_SIZE*sizeof(wxGC)); GC_POOL_ALLOC_SIZE*sizeof(wxGC));
// Initialize entry we will return. // Initialize entry we will return.
wxGCPool[wxGCPoolSize].m_gc = gdk_gc_new( window ); wxGCPool[wxGCPoolSize].m_gc = gdk_gc_new( window );
@@ -1270,11 +1270,14 @@ bool wxWindowDC::DoBlit( wxCoord xdest, wxCoord ydest,
wxCoord bm_width = memDC->m_selected.GetWidth(); wxCoord bm_width = memDC->m_selected.GetWidth();
wxCoord bm_height = memDC->m_selected.GetHeight(); wxCoord bm_height = memDC->m_selected.GetHeight();
// get clip coords // Get clip coords for the bitmap. If we don't
wxRegion tmp( xx,yy,ww,hh ); // use wxBitmap::Rescale(), which can clip the
tmp.Intersect( m_currentClippingRegion ); // bitmap, these are the same as the original
wxCoord cx,cy,cw,ch; // coordinates
tmp.GetBox(cx,cy,cw,ch); wxCoord cx = xx;
wxCoord cy = yy;
wxCoord cw = ww;
wxCoord ch = hh;
// interpret userscale of src too // interpret userscale of src too
double xsc,ysc; double xsc,ysc;
@@ -1285,16 +1288,23 @@ bool wxWindowDC::DoBlit( wxCoord xdest, wxCoord ydest,
wxCoord bm_ww = XLOG2DEVREL( bm_width ); wxCoord bm_ww = XLOG2DEVREL( bm_width );
wxCoord bm_hh = YLOG2DEVREL( bm_height ); wxCoord bm_hh = YLOG2DEVREL( bm_height );
// scale bitmap if required // Scale bitmap if required
wxBitmap use_bitmap; wxBitmap use_bitmap;
if ((bm_width != bm_ww) || (bm_height != bm_hh)) if ((bm_width != bm_ww) || (bm_height != bm_hh))
{ {
use_bitmap = memDC->m_selected.Rescale(cx-xx,cy-yy,cw,ch,bm_ww,bm_hh); // This indicates that the blitting code below will get
// a clipped bitmap and therefore needs to move the origin
// accordingly
wxRegion tmp( xx,yy,ww,hh );
tmp.Intersect( m_currentClippingRegion );
tmp.GetBox(cx,cy,cw,ch);
// Scale and clipped bitmap
use_bitmap = memDC->m_selected.Rescale(cx-xx,cy-yy,cw,ch,bm_ww,bm_hh);
} }
else else
{ {
// FIXME: use cx,cy,cw,ch here, too? // Don't scale bitmap
use_bitmap = memDC->m_selected; use_bitmap = memDC->m_selected;
} }
@@ -1463,7 +1473,7 @@ void wxWindowDC::DoDrawText( const wxString &text, wxCoord x, wxCoord y )
int w,h; int w,h;
if (abs(m_scaleY - 1.0) < 0.00001) if (fabs(m_scaleY - 1.0) < 0.00001)
{ {
// If there is a user or actually any scale applied to // If there is a user or actually any scale applied to
// the device context, scale the font. // the device context, scale the font.

View File

@@ -414,10 +414,18 @@ wxBitmap wxBitmap::Rescale( int clipx, int clipy, int clipwidth, int clipheight,
for (int h = 0; h < height; h++) for (int h = 0; h < height; h++)
{ {
char outbyte = 0; char outbyte = 0;
int old_x = -1;
guint32 old_pixval;
for (int w=0; w<width; w++) for (int w=0; w<width; w++)
{ {
guint32 pixval = gdk_image_get_pixel( img, tablex[w], tabley[h] ); guint32 pixval;
int x = tablex[w];
if (x == old_x)
pixval = old_pixval;
else
pixval = gdk_image_get_pixel( img, x, tabley[h] );
if (bpp==1) if (bpp==1)
{ {
if (!pixval) if (!pixval)

View File

@@ -191,7 +191,7 @@ static void wxInitGCPool()
// If we cannot malloc, then fail with error // If we cannot malloc, then fail with error
// when debug is enabled. If debug is not enabled, // when debug is enabled. If debug is not enabled,
// the problem will eventually get caught // the problem will eventually get caught
// in wxGetPoolGC. // in wxGetPoolGC.
wxFAIL_MSG( wxT("Cannot allocate GC pool") ); wxFAIL_MSG( wxT("Cannot allocate GC pool") );
return; return;
} }
@@ -237,13 +237,13 @@ static GdkGC* wxGetPoolGC( GdkWindow *window, wxPoolGCType type )
// We did not find an available GC. // We did not find an available GC.
// We need to grow the GC pool. // We need to grow the GC pool.
pptr = (wxGC *)realloc(wxGCPool, pptr = (wxGC *)realloc(wxGCPool,
(wxGCPoolSize + GC_POOL_ALLOC_SIZE)*sizeof(wxGC)); (wxGCPoolSize + GC_POOL_ALLOC_SIZE)*sizeof(wxGC));
if (pptr != NULL) if (pptr != NULL)
{ {
// Initialize newly allocated pool. // Initialize newly allocated pool.
wxGCPool = pptr; wxGCPool = pptr;
memset(&wxGCPool[wxGCPoolSize], 0, memset(&wxGCPool[wxGCPoolSize], 0,
GC_POOL_ALLOC_SIZE*sizeof(wxGC)); GC_POOL_ALLOC_SIZE*sizeof(wxGC));
// Initialize entry we will return. // Initialize entry we will return.
wxGCPool[wxGCPoolSize].m_gc = gdk_gc_new( window ); wxGCPool[wxGCPoolSize].m_gc = gdk_gc_new( window );
@@ -1270,11 +1270,14 @@ bool wxWindowDC::DoBlit( wxCoord xdest, wxCoord ydest,
wxCoord bm_width = memDC->m_selected.GetWidth(); wxCoord bm_width = memDC->m_selected.GetWidth();
wxCoord bm_height = memDC->m_selected.GetHeight(); wxCoord bm_height = memDC->m_selected.GetHeight();
// get clip coords // Get clip coords for the bitmap. If we don't
wxRegion tmp( xx,yy,ww,hh ); // use wxBitmap::Rescale(), which can clip the
tmp.Intersect( m_currentClippingRegion ); // bitmap, these are the same as the original
wxCoord cx,cy,cw,ch; // coordinates
tmp.GetBox(cx,cy,cw,ch); wxCoord cx = xx;
wxCoord cy = yy;
wxCoord cw = ww;
wxCoord ch = hh;
// interpret userscale of src too // interpret userscale of src too
double xsc,ysc; double xsc,ysc;
@@ -1285,16 +1288,23 @@ bool wxWindowDC::DoBlit( wxCoord xdest, wxCoord ydest,
wxCoord bm_ww = XLOG2DEVREL( bm_width ); wxCoord bm_ww = XLOG2DEVREL( bm_width );
wxCoord bm_hh = YLOG2DEVREL( bm_height ); wxCoord bm_hh = YLOG2DEVREL( bm_height );
// scale bitmap if required // Scale bitmap if required
wxBitmap use_bitmap; wxBitmap use_bitmap;
if ((bm_width != bm_ww) || (bm_height != bm_hh)) if ((bm_width != bm_ww) || (bm_height != bm_hh))
{ {
use_bitmap = memDC->m_selected.Rescale(cx-xx,cy-yy,cw,ch,bm_ww,bm_hh); // This indicates that the blitting code below will get
// a clipped bitmap and therefore needs to move the origin
// accordingly
wxRegion tmp( xx,yy,ww,hh );
tmp.Intersect( m_currentClippingRegion );
tmp.GetBox(cx,cy,cw,ch);
// Scale and clipped bitmap
use_bitmap = memDC->m_selected.Rescale(cx-xx,cy-yy,cw,ch,bm_ww,bm_hh);
} }
else else
{ {
// FIXME: use cx,cy,cw,ch here, too? // Don't scale bitmap
use_bitmap = memDC->m_selected; use_bitmap = memDC->m_selected;
} }
@@ -1463,7 +1473,7 @@ void wxWindowDC::DoDrawText( const wxString &text, wxCoord x, wxCoord y )
int w,h; int w,h;
if (abs(m_scaleY - 1.0) < 0.00001) if (fabs(m_scaleY - 1.0) < 0.00001)
{ {
// If there is a user or actually any scale applied to // If there is a user or actually any scale applied to
// the device context, scale the font. // the device context, scale the font.