00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "scaled_bitmap.hpp"
00026
00027
00028 ScaledBitmap::ScaledBitmap( intf_thread_t *pIntf, const GenericBitmap &rBitmap,
00029 int width, int height ):
00030 GenericBitmap( pIntf ), m_width( width ), m_height( height )
00031 {
00032
00033
00034
00035 m_pData = new uint8_t[m_height * m_width * 4];
00036
00037 int srcWidth = rBitmap.getWidth();
00038 int srcHeight = rBitmap.getHeight();
00039 uint32_t *pSrcData = (uint32_t*)rBitmap.getData();
00040 uint32_t *pDestData = (uint32_t*)m_pData;
00041
00042
00043 if( width > srcWidth )
00044 {
00045
00046 int incX1 = 2 * (srcWidth-1);
00047 int incX2 = incX1 - 2 * (width-1);
00048 int dX = incX1 - (width-1);
00049
00050 for( int y = 0; y < height; y++ )
00051 {
00052 uint32_t yOffset = ((y * srcHeight) / height) * srcWidth;
00053 pSrcData = ((uint32_t*)rBitmap.getData()) + yOffset;
00054
00055 for( int x = 0; x < width; x++ )
00056 {
00057 *(pDestData++) = *pSrcData;
00058
00059 if( dX <= 0 )
00060 {
00061 dX += incX1;
00062 }
00063 else
00064 {
00065 dX += incX2;
00066 pSrcData++;
00067 }
00068 }
00069 }
00070 }
00071
00072 else
00073 {
00074
00075 int incX1 = 2 * (width-1);
00076 int incX2 = incX1 - 2 * (srcWidth-1);
00077 int dX = incX1 - (srcWidth-1);
00078
00079 for( int y = 0; y < height; y++ )
00080 {
00081 uint32_t yOffset = ((y * srcHeight) / height) * srcWidth;
00082 pSrcData = ((uint32_t*)rBitmap.getData()) + yOffset;
00083
00084 for( int x = 0; x < width; x++ )
00085 {
00086 *(pDestData++) = *(pSrcData++);
00087
00088 while( dX <= 0 )
00089 {
00090 dX += incX1;
00091 pSrcData++;
00092 }
00093 dX += incX2;
00094 }
00095 }
00096
00097 }
00098 }
00099
00100
00101 ScaledBitmap::~ScaledBitmap()
00102 {
00103 if( m_pData )
00104 {
00105 delete[] m_pData;
00106 }
00107 }
00108