mirror of https://github.com/axmolengine/axmol.git
[uphone] use a shared TWindow to draw bitmaps and texts, this optimization promotes the performance on uphone about 5%~6%
This commit is contained in:
parent
eac572b2c9
commit
56f8bf3c40
|
@ -29,78 +29,120 @@ THE SOFTWARE.
|
||||||
|
|
||||||
namespace cocos2d {
|
namespace cocos2d {
|
||||||
|
|
||||||
|
static TWindow * s_pMemWnd = NULL;
|
||||||
|
|
||||||
CCXBitmapDC::CCXBitmapDC(int width, int height)
|
CCXBitmapDC::CCXBitmapDC(int width, int height)
|
||||||
|
: m_pBitmap(NULL)
|
||||||
{
|
{
|
||||||
m_pBitmap->Create(width, height, 32);
|
m_pBitmap = TBitmap::Create(width, height, 32);
|
||||||
m_pWindow = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CCXBitmapDC::CCXBitmapDC(const char *text, CGSize dimensions, UITextAlignment alignment, const char *fontName, float fontSize)
|
CCXBitmapDC::CCXBitmapDC(const char *text, CGSize dimensions, UITextAlignment alignment, const char *fontName, float fontSize)
|
||||||
|
: m_pBitmap(NULL)
|
||||||
{
|
{
|
||||||
// create font
|
TUChar *pText = NULL;
|
||||||
TFont font;
|
do
|
||||||
font.Create(0, (Int32)fontSize);
|
{
|
||||||
|
// create font
|
||||||
|
TFont font;
|
||||||
|
CCX_BREAK_IF(! font.Create(0, (Int32)fontSize));
|
||||||
|
|
||||||
// text
|
// text
|
||||||
Int32 len = strlen(text) + 1;
|
Int32 len = strlen(text) + 1;
|
||||||
TUChar *pText = new TUChar[len];
|
CCX_BREAK_IF(! (pText = new TUChar[len]));
|
||||||
TUString::StrGBToUnicode(pText, (Char*)text);
|
TUString::StrGBToUnicode(pText, (Char*)text);
|
||||||
|
|
||||||
// calculate text size
|
// calculate text size
|
||||||
if (CGSize::CGSizeEqualToSize(dimensions, CGSizeZero))
|
if (CGSize::CGSizeEqualToSize(dimensions, CGSizeZero))
|
||||||
{
|
{
|
||||||
m_tSize.width = font.CharsWidth(pText,len);
|
m_tSize.width = font.CharsWidth(pText,len);
|
||||||
m_tSize.height = font.LineHeight();
|
m_tSize.height = font.LineHeight();
|
||||||
}else
|
}else
|
||||||
{
|
{
|
||||||
m_tSize = dimensions;
|
m_tSize = dimensions;
|
||||||
}
|
}
|
||||||
|
|
||||||
Int16 width = (Int16)m_tSize.width;
|
Int16 width = (Int16)m_tSize.width;
|
||||||
Int16 height = (Int16)m_tSize.height;
|
Int16 height = (Int16)m_tSize.height;
|
||||||
|
|
||||||
// create memory window
|
// create bitmap
|
||||||
m_pWindow = new TWindow(CCXApplication::sharedApplication());
|
CCX_BREAK_IF(! (m_pBitmap = TBitmap::Create(width, height, 32)));
|
||||||
m_pWindow->CreateMemWindow(width, height,screenTransparentFormat);
|
|
||||||
|
|
||||||
// create DC
|
// create memory window
|
||||||
TDC dc(m_pWindow);
|
if (s_pMemWnd)
|
||||||
// set DC styles
|
{
|
||||||
UInt32 styles = GUI_API_STYLE_SPECIFY_FORE_COLOR | GUI_API_STYLE_ROP_MODE_TRANSPARENT |
|
TRectangle rcMemWnd(0, 0, 0, 0);
|
||||||
GUI_API_STYLE_SPECIFY_BACK_COLOR | GUI_API_STYLE_ALIGNMENT_MIDDLE | GUI_API_STYLE_SPECIFY_FONT;
|
s_pMemWnd->GetClientBounds(&rcMemWnd);
|
||||||
|
if (rcMemWnd.Width() < width || rcMemWnd.Height() < height)
|
||||||
|
{
|
||||||
|
s_pMemWnd->CloseWindow();
|
||||||
|
s_pMemWnd = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
switch (alignment)
|
do
|
||||||
{
|
{
|
||||||
case UITextAlignmentLeft:
|
// if memery window is already break
|
||||||
styles |= GUI_API_STYLE_ALIGNMENT_LEFT;
|
CCX_BREAK_IF(s_pMemWnd);
|
||||||
break;
|
|
||||||
case UITextAlignmentCenter:
|
|
||||||
styles |= GUI_API_STYLE_ALIGNMENT_CENTER;
|
|
||||||
break;
|
|
||||||
case UITextAlignmentRight:
|
|
||||||
styles |= GUI_API_STYLE_ALIGNMENT_RIGHT;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
styles |= GUI_API_STYLE_ALIGNMENT_CENTER;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
TRectangle rect;
|
|
||||||
m_pWindow->GetWindowFrameRect(&rect);
|
|
||||||
|
|
||||||
m_pBitmap = m_pWindow->GetMemWindowTBitmapPtr();
|
CCX_BREAK_IF(! (s_pMemWnd = new TWindow(CCXApplication::sharedApplication())));
|
||||||
m_pBitmap->Fill32(RGBA(0, 0, 0, 0));
|
|
||||||
|
|
||||||
dc.DrawTextInRectangleEx(pText, 0, RGBA(255,255,255,255), RGBA(0,0,0,255), font, &rect, styles);
|
Coord nCurrentWidth = CCXApplication::GetCurrentApplication()->GetScreenWidth();
|
||||||
|
Coord nCurrentHeight = CCXApplication::GetCurrentApplication()->GetScreenHeight();
|
||||||
|
|
||||||
delete [] pText;
|
Coord nMemWndW = (width >= nCurrentWidth) ? width : nCurrentWidth;
|
||||||
|
Coord nMemWndH = (height >= nCurrentHeight) ? height : nCurrentHeight;
|
||||||
|
CCX_BREAK_IF(s_pMemWnd->CreateMemWindow(nMemWndW, nMemWndH,screenTransparentFormat));
|
||||||
|
delete s_pMemWnd;
|
||||||
|
s_pMemWnd = NULL;
|
||||||
|
} while (0);
|
||||||
|
|
||||||
|
CCX_BREAK_IF(! s_pMemWnd);
|
||||||
|
|
||||||
|
// create DC
|
||||||
|
TDC dc(s_pMemWnd);
|
||||||
|
// set DC styles
|
||||||
|
UInt32 styles = GUI_API_STYLE_SPECIFY_FORE_COLOR | GUI_API_STYLE_ROP_MODE_TRANSPARENT |
|
||||||
|
GUI_API_STYLE_SPECIFY_BACK_COLOR | GUI_API_STYLE_ALIGNMENT_MIDDLE | GUI_API_STYLE_SPECIFY_FONT;
|
||||||
|
|
||||||
|
switch (alignment)
|
||||||
|
{
|
||||||
|
case UITextAlignmentLeft:
|
||||||
|
styles |= GUI_API_STYLE_ALIGNMENT_LEFT;
|
||||||
|
break;
|
||||||
|
case UITextAlignmentCenter:
|
||||||
|
styles |= GUI_API_STYLE_ALIGNMENT_CENTER;
|
||||||
|
break;
|
||||||
|
case UITextAlignmentRight:
|
||||||
|
styles |= GUI_API_STYLE_ALIGNMENT_RIGHT;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
styles |= GUI_API_STYLE_ALIGNMENT_CENTER;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
s_pMemWnd->GetMemWindowTBitmapPtr()->Fill32(RGBA(0, 0, 0, 0), 0, 0, width, height);
|
||||||
|
|
||||||
|
TRectangle rect(0, 0, width, height);
|
||||||
|
dc.DrawTextInRectangleEx(pText, 0, RGBA(255,255,255,255), RGBA(0,0,0,255), font, &rect, styles);
|
||||||
|
|
||||||
|
dc.ReadBitmap(m_pBitmap, 0, 0);
|
||||||
|
|
||||||
|
} while (0);
|
||||||
|
if (pText)
|
||||||
|
{
|
||||||
|
delete[] pText;
|
||||||
|
pText = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CCXBitmapDC::~CCXBitmapDC(void)
|
CCXBitmapDC::~CCXBitmapDC(void)
|
||||||
{
|
{
|
||||||
if (m_pWindow)
|
if (m_pBitmap)
|
||||||
{
|
{
|
||||||
m_pWindow->CloseWindowNow();
|
m_pBitmap->Destroy();
|
||||||
m_pWindow = NULL;
|
m_pBitmap = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void *CCXBitmapDC::getBuffer()
|
void *CCXBitmapDC::getBuffer()
|
||||||
|
|
|
@ -47,7 +47,6 @@ namespace cocos2d{
|
||||||
protected:
|
protected:
|
||||||
TBitmap *m_pBitmap;
|
TBitmap *m_pBitmap;
|
||||||
CGSize m_tSize;
|
CGSize m_tSize;
|
||||||
TWindow *m_pWindow;
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -83,6 +83,12 @@ UIImage::UIImage(void)
|
||||||
|
|
||||||
UIImage::UIImage(CCXBitmapDC * pBmpDC)
|
UIImage::UIImage(CCXBitmapDC * pBmpDC)
|
||||||
{
|
{
|
||||||
|
m_imageInfo.hasAlpha = false;
|
||||||
|
m_imageInfo.isPremultipliedAlpha = false;
|
||||||
|
m_imageInfo.height = 0;
|
||||||
|
m_imageInfo.width = 0;
|
||||||
|
m_imageInfo.data = NULL;
|
||||||
|
m_imageInfo.bitsPerComponent = 0;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
CCX_BREAK_IF(! pBmpDC);
|
CCX_BREAK_IF(! pBmpDC);
|
||||||
|
|
Loading…
Reference in New Issue