issue #396 win32 modifyed.

This commit is contained in:
yangws 2011-03-28 10:44:14 +08:00
parent 2015e468ca
commit 4b86cec4be
6 changed files with 103 additions and 152 deletions

View File

@ -433,7 +433,7 @@ namespace cocos2d{
{
int nextFontPositionX = 0;
int nextFontPositionY = 0;
ccxInt16 prev = -1;
unsigned short prev = -1;
int kerningAmount = 0;
CCSize tmpSize = CCSizeZero;
@ -452,7 +452,7 @@ namespace cocos2d{
for (int i = 0; i < len - 1; ++i)
{
ccxInt16 c = m_sString[i];
unsigned short c = m_sString[i];
if (c == '\n')
{
quantityOfLines++;
@ -464,7 +464,7 @@ namespace cocos2d{
for(int i=0; i<len; i++)
{
ccxInt16 c = m_sString[i];
unsigned short c = m_sString[i];
CCAssert( c < kCCBMFontMaxChars, "BitmapFontAtlas: character outside bounds");
if (c == '\n')

View File

@ -29,16 +29,6 @@ THE SOFTWARE.
NS_CC_BEGIN;
// [u]int[8|16|32|64]
// char
typedef unsigned char ccxByte;
typedef signed short ccxInt16;
typedef unsigned short ccxUInt16;
// int
// unsigned
typedef long long ccxInt64;
typedef unsigned long long ccxUInt64;
/// The max length of CCLog message.
static const int kMaxLogLen = 255;
@ -47,66 +37,6 @@ static const int kMaxLogLen = 255;
*/
void CC_DLL CCLog(const char * pszFormat, ...);
struct ccxNullDeleter { template< class TPTR > void operator()(TPTR ) {} };
struct ccxNewDeleter { template< class TPTR > void operator()(TPTR p) { delete p; } };
struct ccxNewArrayDeleter { template< class TPTR > void operator()(TPTR p) { delete[] p; } };
/**
@brief A simple scoped pointer.
*/
template < class T, class D = ccxNewDeleter >
class CC_DLL ccxScopedPtr // noncopyable
: private D
{
public:
explicit ccxScopedPtr(T * p = 0): m_ptr(p) {}
~ccxScopedPtr() { if (m_ptr) (*static_cast<D*>(this))(m_ptr); }
void reset(T * p = 0) { ccxScopedPtr< T >(p).swap(*this); }
T * get() const { return m_ptr; }
void swap(ccxScopedPtr & b) { T * tmp = b.m_ptr; b.m_ptr = m_ptr; m_ptr = tmp; }
T & operator*() const { return * m_ptr; }
T * operator->() const { return m_ptr; }
operator bool () const { return m_ptr != 0; }
private:
ccxScopedPtr(const ccxScopedPtr&);
ccxScopedPtr & operator=(const ccxScopedPtr&);
void operator==(const ccxScopedPtr& ) const;
void operator!=(const ccxScopedPtr& ) const;
T * m_ptr;
};
/**
@brief A simple scoped point for array.
*/
template< class T, class D = ccxNewArrayDeleter >
class CC_DLL ccxScopedArray // noncopyable
: private D
{
public:
explicit ccxScopedArray( T * p = 0 ) : m_ptr( p ) {}
~ccxScopedArray() { if (m_ptr) (*static_cast<D*>(this))(m_ptr); }
void reset(T * p = 0) { ccxScopedArray<T>(p).swap(*this); }
T * get() const { return m_ptr; }
void swap(ccxScopedArray & b) { T * tmp = b.m_ptr; b.m_ptr = m_ptr; m_ptr = tmp; }
T & operator[](int i) const { CC_ASSERT(m_ptr && i >= 0); return m_ptr[i]; }
operator bool () const { return m_ptr != 0; }
private:
ccxScopedArray(ccxScopedArray const &);
ccxScopedArray & operator=(ccxScopedArray const &);
void operator==( ccxScopedArray const& ) const;
void operator!=( ccxScopedArray const& ) const;
T * m_ptr;
};
NS_CC_END;
#endif // __CC_COMMON_H__

View File

@ -34,10 +34,10 @@ THE SOFTWARE.
#undef QGLOBAL_H
#define CC_RGB_PREMULTIPLY_APLHA(vr, vg, vb, va) \
(unsigned)(((unsigned)((ccxByte)(vr) * ((ccxByte)(va) + 1)) >> 8) | \
((unsigned)((ccxByte)(vg) * ((ccxByte)(va) + 1) >> 8) << 8) | \
((unsigned)((ccxByte)(vb) * ((ccxByte)(va) + 1) >> 8) << 16) | \
((unsigned)(ccxByte)(va) << 24))
(unsigned)(((unsigned)((unsigned char)(vr) * ((unsigned char)(va) + 1)) >> 8) | \
((unsigned)((unsigned char)(vg) * ((unsigned char)(va) + 1) >> 8) << 8) | \
((unsigned)((unsigned char)(vb) * ((unsigned char)(va) + 1) >> 8) << 16) | \
((unsigned)(unsigned char)(va) << 24))
typedef struct
{
@ -73,12 +73,18 @@ CCImage::CCImage()
: m_nWidth(0)
, m_nHeight(0)
, m_nBitsPerComponent(0)
, m_pData(0)
, m_bHasAlpha(false)
, m_bPreMulti(false)
{
}
CCImage::~CCImage()
{
CC_SAFE_DELETE_ARRAY(m_pData);
}
bool CCImage::initWithImageFile(const char * strPath, EImageFormat eImgFmt/* = eFmtPng*/)
{
bool bRet = false;
@ -167,73 +173,79 @@ bool CCImage::_initWithJpgData(void * data, int nSize)
struct jpeg_decompress_struct cinfo;
struct jpeg_error_mgr jerr;
/* libjpeg data structure for storing one row, that is, scanline of an image */
JSAMPROW row_pointer[1];
JSAMPROW row_pointer[1] = {0};
unsigned long location = 0;
unsigned int i = 0;
/* here we set up the standard libjpeg error handler */
cinfo.err = jpeg_std_error( &jerr );
/* setup decompression process and source, then read JPEG header */
jpeg_create_decompress( &cinfo );
/* this makes the library read from infile */
jpeg_mem_src( &cinfo, (unsigned char *) data, nSize );
/* reading the image header which contains image information */
jpeg_read_header( &cinfo, true );
// we only support RGB or grayscale
if (cinfo.jpeg_color_space != JCS_RGB)
bool bRet = false;
do
{
if (cinfo.jpeg_color_space == JCS_GRAYSCALE || cinfo.jpeg_color_space == JCS_YCbCr)
/* here we set up the standard libjpeg error handler */
cinfo.err = jpeg_std_error( &jerr );
/* setup decompression process and source, then read JPEG header */
jpeg_create_decompress( &cinfo );
/* this makes the library read from infile */
jpeg_mem_src( &cinfo, (unsigned char *) data, nSize );
/* reading the image header which contains image information */
jpeg_read_header( &cinfo, true );
// we only support RGB or grayscale
if (cinfo.jpeg_color_space != JCS_RGB)
{
cinfo.out_color_space = JCS_RGB;
if (cinfo.jpeg_color_space == JCS_GRAYSCALE || cinfo.jpeg_color_space == JCS_YCbCr)
{
cinfo.out_color_space = JCS_RGB;
}
}
else
{
break;
}
}
else
{
return false;
}
/* Start decompression jpeg here */
jpeg_start_decompress( &cinfo );
/* Start decompression jpeg here */
jpeg_start_decompress( &cinfo );
/* init image info */
m_nWidth = cinfo.image_width;
m_nHeight = cinfo.image_height;
m_bHasAlpha = false;
m_bPreMulti = false;
m_nBitsPerComponent = 8;
m_pData.reset(new ccxByte[cinfo.output_width*cinfo.output_height*cinfo.output_components]);
ccxByte * pData = m_pData.get();
/* init image info */
m_nWidth = cinfo.image_width;
m_nHeight = cinfo.image_height;
m_bHasAlpha = false;
m_bPreMulti = false;
m_nBitsPerComponent = 8;
row_pointer[0] = new unsigned char[cinfo.output_width*cinfo.output_components];
CC_BREAK_IF(! row_pointer[0]);
/* now actually read the jpeg into the raw buffer */
row_pointer[0] = new unsigned char[cinfo.output_width*cinfo.output_components];
m_pData = new unsigned char[cinfo.output_width*cinfo.output_height*cinfo.output_components];
CC_BREAK_IF(! m_pData);
/* read one scan line at a time */
while( cinfo.output_scanline < cinfo.image_height )
{
jpeg_read_scanlines( &cinfo, row_pointer, 1 );
for( i=0; i<cinfo.image_width*cinfo.num_components;i++)
pData[location++] = row_pointer[0][i];
}
/* now actually read the jpeg into the raw buffer */
/* read one scan line at a time */
while( cinfo.output_scanline < cinfo.image_height )
{
jpeg_read_scanlines( &cinfo, row_pointer, 1 );
for( i=0; i<cinfo.image_width*cinfo.num_components;i++)
m_pData[location++] = row_pointer[0][i];
}
/* wrap up decompression, destroy objects, free pointers and close open files */
jpeg_finish_decompress( &cinfo );
jpeg_destroy_decompress( &cinfo );
delete row_pointer[0];
jpeg_finish_decompress( &cinfo );
jpeg_destroy_decompress( &cinfo );
/* wrap up decompression, destroy objects, free pointers and close open files */
bRet = true;
} while (0);
return true;
CC_SAFE_DELETE_ARRAY(row_pointer[0]);
return bRet;
}
bool CCImage::_initWithPngData(void * pData, int nDatalen)
{
bool bRet = false;
png_byte header[8] = {0};
png_structp png_ptr = 0;
png_structp png_ptr = 0;
png_infop info_ptr = 0;
unsigned char * pImateData = 0;
do
{
@ -283,14 +295,16 @@ bool CCImage::_initWithPngData(void * pData, int nDatalen)
{
bytesPerComponent = 4;
}
m_pData.reset(new ccxByte[nHeight * nWidth * bytesPerComponent]);
pImateData = new unsigned char[nHeight * nWidth * bytesPerComponent];
CC_BREAK_IF(! pImateData);
png_bytep * rowPointers = png_get_rows(png_ptr, info_ptr);
// copy data to image info
int bytesPerRow = nWidth * bytesPerComponent;
if(m_bHasAlpha)
{
unsigned int *tmp = (unsigned int *)m_pData.get();
unsigned int *tmp = (unsigned int *)pImateData;
for(unsigned int i = 0; i < nHeight; i++)
{
for(int j = 0; j < bytesPerRow; j += 4)
@ -304,16 +318,20 @@ bool CCImage::_initWithPngData(void * pData, int nDatalen)
{
for (unsigned int j = 0; j < nHeight; ++j)
{
memcpy(m_pData.get() + j * bytesPerRow, rowPointers[j], bytesPerRow);
memcpy(pImateData + j * bytesPerRow, rowPointers[j], bytesPerRow);
}
}
m_nHeight = (ccxInt16)nHeight;
m_nWidth = (ccxInt16)nWidth;
m_nBitsPerComponent = nBitsPerComponent;
m_nBitsPerComponent = nBitsPerComponent;
m_nHeight = (short)nHeight;
m_nWidth = (short)nWidth;
m_pData = pImateData;
pImateData = 0;
bRet = true;
} while (0);
CC_SAFE_DELETE_ARRAY(pImateData);
if (png_ptr)
{
png_destroy_read_struct(&png_ptr, (info_ptr) ? &info_ptr : 0, 0);

View File

@ -33,6 +33,7 @@ class CC_DLL CCImage
{
public:
CCImage();
~CCImage();
typedef enum
{
@ -88,7 +89,7 @@ public:
const char * pFontName = 0,
int nSize = 0);
ccxByte * getData() { return m_pData.get(); }
unsigned char * getData() { return m_pData; }
int getDataLen() { return m_nWidth * m_nHeight; }
int getColorSpace() { return 1; }
@ -102,8 +103,8 @@ public:
*/
bool saveToFile(const char * pszFilePath) { return false; }
CC_SYNTHESIZE_READONLY(ccxInt16, m_nWidth, Width);
CC_SYNTHESIZE_READONLY(ccxInt16, m_nHeight, Height);
CC_SYNTHESIZE_READONLY(short, m_nWidth, Width);
CC_SYNTHESIZE_READONLY(short, m_nHeight, Height);
CC_SYNTHESIZE_READONLY(int, m_nBitsPerComponent, BitsPerComponent);
public:
@ -117,7 +118,7 @@ protected:
bool _initWithJpgData(void * pData, int nDatalen);
bool _initWithPngData(void * pData, int nDatalen);
ccxScopedArray<ccxByte> m_pData;
unsigned char * m_pData;
bool m_bHasAlpha;
bool m_bPreMulti;

View File

@ -273,6 +273,7 @@ bool CCImage::initWithString(
int nSize/* = 0*/)
{
bool bRet = false;
unsigned char * pImageData = 0;
do
{
CC_BREAK_IF(! pText);
@ -289,8 +290,8 @@ bool CCImage::initWithString(
SIZE size = {nWidth, nHeight};
CC_BREAK_IF(! dc.drawText(pText, size, eAlignMask));
m_pData.reset(new ccxByte[size.cx * size.cy * 4]);
CC_BREAK_IF(! m_pData.get());
pImageData = new unsigned char[size.cx * size.cy * 4];
CC_BREAK_IF(! pImageData);
struct
{
@ -301,23 +302,24 @@ bool CCImage::initWithString(
CC_BREAK_IF(! GetDIBits(dc.getDC(), dc.getBitmap(), 0, 0,
NULL, (LPBITMAPINFO)&bi, DIB_RGB_COLORS));
m_nWidth = (ccxInt16)size.cx;
m_nHeight = (ccxInt16)size.cy;
m_nWidth = (short)size.cx;
m_nHeight = (short)size.cy;
m_bHasAlpha = true;
m_bPreMulti = false;
m_pData = pImageData;
pImageData = 0;
m_nBitsPerComponent = 8;
// copy pixed data
bi.bmiHeader.biHeight = (bi.bmiHeader.biHeight > 0)
? - bi.bmiHeader.biHeight : bi.bmiHeader.biHeight;
GetDIBits(dc.getDC(), dc.getBitmap(), 0, m_nHeight, m_pData.get(),
GetDIBits(dc.getDC(), dc.getBitmap(), 0, m_nHeight, m_pData,
(LPBITMAPINFO)&bi, DIB_RGB_COLORS);
// change pixel's alpha value to 255, when it's RGB != 0
COLORREF * pPixel = NULL;
for (int y = 0; y < m_nHeight; ++y)
{
pPixel = (COLORREF *)m_pData.get() + y * m_nWidth;
pPixel = (COLORREF *)m_pData + y * m_nWidth;
for (int x = 0; x < m_nWidth; ++x)
{
COLORREF& clr = *pPixel;

View File

@ -432,21 +432,21 @@ bool CCTexture2D::initPremultipliedATextureWithImage(CCImage *image, unsigned in
// info = kCGImageAlphaOnly;
// context = CGBitmapContextCreate(data, POTWide, POTHigh, 8, POTWide, NULL, info);
tempData = (ccxByte*)(image->getData());
tempData = (unsigned char*)(image->getData());
CCAssert(tempData != NULL, "NULL image data.");
if(image->getWidth() == POTWide && image->getHeight() == POTHigh)
{
data = new ccxByte[POTHigh * POTWide * 4];
data = new unsigned char[POTHigh * POTWide * 4];
memcpy(data, tempData, POTHigh * POTWide * 4);
}
else
{
data = new ccxByte[POTHigh * POTWide * 4];
data = new unsigned char[POTHigh * POTWide * 4];
memset(data, 0, POTHigh * POTWide * 4);
ccxByte* pPixelData = (ccxByte*) tempData;
ccxByte* pTargetData = (ccxByte*) data;
unsigned char* pPixelData = (unsigned char*) tempData;
unsigned char* pTargetData = (unsigned char*) data;
for(int y=0; y<image->getHeight(); ++y)
{
@ -456,20 +456,20 @@ bool CCTexture2D::initPremultipliedATextureWithImage(CCImage *image, unsigned in
break;
case kCCTexture2DPixelFormat_RGB888:
tempData = (ccxByte*)(image->getData());
tempData = (unsigned char*)(image->getData());
CCAssert(tempData != NULL, "NULL image data.");
if(image->getWidth() == POTWide && image->getHeight() == POTHigh)
{
data = new ccxByte[POTHigh * POTWide * 3];
data = new unsigned char[POTHigh * POTWide * 3];
memcpy(data, tempData, POTHigh * POTWide * 3);
}
else
{
data = new ccxByte[POTHigh * POTWide * 3];
data = new unsigned char[POTHigh * POTWide * 3];
memset(data, 0, POTHigh * POTWide * 3);
ccxByte* pPixelData = (ccxByte*) tempData;
ccxByte* pTargetData = (ccxByte*) data;
unsigned char* pPixelData = (unsigned char*) tempData;
unsigned char* pTargetData = (unsigned char*) data;
for(int y=0; y<image->getHeight(); ++y)
{