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,20 +29,27 @@ THE SOFTWARE.
|
|||
|
||||
namespace cocos2d {
|
||||
|
||||
static TWindow * s_pMemWnd = NULL;
|
||||
|
||||
CCXBitmapDC::CCXBitmapDC(int width, int height)
|
||||
: m_pBitmap(NULL)
|
||||
{
|
||||
m_pBitmap->Create(width, height, 32);
|
||||
m_pWindow = NULL;
|
||||
m_pBitmap = TBitmap::Create(width, height, 32);
|
||||
}
|
||||
|
||||
CCXBitmapDC::CCXBitmapDC(const char *text, CGSize dimensions, UITextAlignment alignment, const char *fontName, float fontSize)
|
||||
: m_pBitmap(NULL)
|
||||
{
|
||||
TUChar *pText = NULL;
|
||||
do
|
||||
{
|
||||
// create font
|
||||
TFont font;
|
||||
font.Create(0, (Int32)fontSize);
|
||||
CCX_BREAK_IF(! font.Create(0, (Int32)fontSize));
|
||||
|
||||
// text
|
||||
Int32 len = strlen(text) + 1;
|
||||
TUChar *pText = new TUChar[len];
|
||||
CCX_BREAK_IF(! (pText = new TUChar[len]));
|
||||
TUString::StrGBToUnicode(pText, (Char*)text);
|
||||
|
||||
// calculate text size
|
||||
|
@ -58,12 +65,42 @@ namespace cocos2d {
|
|||
Int16 width = (Int16)m_tSize.width;
|
||||
Int16 height = (Int16)m_tSize.height;
|
||||
|
||||
// create bitmap
|
||||
CCX_BREAK_IF(! (m_pBitmap = TBitmap::Create(width, height, 32)));
|
||||
|
||||
// create memory window
|
||||
m_pWindow = new TWindow(CCXApplication::sharedApplication());
|
||||
m_pWindow->CreateMemWindow(width, height,screenTransparentFormat);
|
||||
if (s_pMemWnd)
|
||||
{
|
||||
TRectangle rcMemWnd(0, 0, 0, 0);
|
||||
s_pMemWnd->GetClientBounds(&rcMemWnd);
|
||||
if (rcMemWnd.Width() < width || rcMemWnd.Height() < height)
|
||||
{
|
||||
s_pMemWnd->CloseWindow();
|
||||
s_pMemWnd = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
// if memery window is already break
|
||||
CCX_BREAK_IF(s_pMemWnd);
|
||||
|
||||
CCX_BREAK_IF(! (s_pMemWnd = new TWindow(CCXApplication::sharedApplication())));
|
||||
|
||||
Coord nCurrentWidth = CCXApplication::GetCurrentApplication()->GetScreenWidth();
|
||||
Coord nCurrentHeight = CCXApplication::GetCurrentApplication()->GetScreenHeight();
|
||||
|
||||
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(m_pWindow);
|
||||
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;
|
||||
|
@ -83,23 +120,28 @@ namespace cocos2d {
|
|||
styles |= GUI_API_STYLE_ALIGNMENT_CENTER;
|
||||
break;
|
||||
}
|
||||
TRectangle rect;
|
||||
m_pWindow->GetWindowFrameRect(&rect);
|
||||
|
||||
m_pBitmap = m_pWindow->GetMemWindowTBitmapPtr();
|
||||
m_pBitmap->Fill32(RGBA(0, 0, 0, 0));
|
||||
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);
|
||||
|
||||
delete [] pText;
|
||||
dc.ReadBitmap(m_pBitmap, 0, 0);
|
||||
|
||||
} while (0);
|
||||
if (pText)
|
||||
{
|
||||
delete[] pText;
|
||||
pText = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
CCXBitmapDC::~CCXBitmapDC(void)
|
||||
{
|
||||
if (m_pWindow)
|
||||
if (m_pBitmap)
|
||||
{
|
||||
m_pWindow->CloseWindowNow();
|
||||
m_pWindow = NULL;
|
||||
m_pBitmap->Destroy();
|
||||
m_pBitmap = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -47,7 +47,6 @@ namespace cocos2d{
|
|||
protected:
|
||||
TBitmap *m_pBitmap;
|
||||
CGSize m_tSize;
|
||||
TWindow *m_pWindow;
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -83,6 +83,12 @@ UIImage::UIImage(void)
|
|||
|
||||
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
|
||||
{
|
||||
CCX_BREAK_IF(! pBmpDC);
|
||||
|
|
Loading…
Reference in New Issue