【摘录】BREW的功能函数库

 http://blog.csdn.net/NetMicrobe/archive/2006/09/23/1269326.aspx

最近在移植一个J2ME的游戏到BREW平台,和java比较BREW相对接近底层,没有Java那么周到,一些功能还是得自己动手开始写。

我有封装一个能够支持方便一直的库的想法,不过没有太多时间,现在还在被那个烂程序折磨,程序写成那样折磨自己也就罢了,还拿出来害人,真可恶!二来,能够对现有的一些比较好的库的研究后,写出来的会更实用更健壮些。

现在先做些基础工作吧。如果有人已经开始这么做了,不建议我很菜的话,我很乐意加入呢。

声明:下面的代码仅供学习研究,作者不为使用者造成的任何后果负责。

/*******************************************************************************************************************************************
* FUNCTION      : 
* DESCRIPTION   : File I/O
* RETURN        : 
*******************************************************************************************************************************************/
boolean CApp::dataSave( void* pData, int nsz, char* pszFile )
{
 IFileMgr* pFMgr = NULL;
 IFile*  pFile = NULL;
 boolean  bResult = FALSE;

 // File Mgr create
 if(ISHELL_CreateInstance( m_pIShell, AEECLSID_FILEMGR, (void**)&pFMgr ) == SUCCESS )
 {
  // if szFile exist
  if(IFILEMGR_Test(pFMgr,pszFile) == SUCCESS)
  {
   // DELETE
   if(IFILEMGR_Remove(pFMgr,pszFile) == EFAILED)
   {
    IFILEMGR_Release(pFMgr);
    return FALSE;
   }
  }

  //////////////////////////////////
  // check EFS space
  // TODO...
  //////////////////////////////////

  // CREATE
  pFile = IFILEMGR_OpenFile(pFMgr,pszFile,_OFM_CREATE);

  if(pFile != NULL)
  {
   // WRITE
   if(IFILE_Write(pFile, pData, nsz))
   {
    bResult = TRUE;
   }
   IFILE_Release(pFile);
  }
  IFILEMGR_Release(pFMgr);
 }

 return bResult;
}

/*******************************************************************************************************************************************
* FUNCTION      : 
* DESCRIPTION   : 
* RETURN        : 
*******************************************************************************************************************************************/
boolean CApp::dataLoad( void* pData, int nsz, char* pszFile )
{
 IFileMgr* pFMgr = NULL;
 IFile*   pFile = NULL;
 boolean   bResult = FALSE;

 // File Mgr create.
 if(ISHELL_CreateInstance( m_pIShell, AEECLSID_FILEMGR, (void**)&pFMgr ) == SUCCESS)
 {
  // if szFile exist
  if(IFILEMGR_Test(pFMgr, pszFile) == SUCCESS)
  {
   // OPEN
   pFile = IFILEMGR_OpenFile(pFMgr, pszFile, _OFM_READ);
   if(pFile != NULL)
   {
    // READ
    if(IFILE_Read(pFile, pData, nsz))
    {
     bResult = TRUE;
    }
    IFILE_Release(pFile);
   }
  }
  IFILEMGR_Release(pFMgr);
 }

 return bResult;
}

/*******************************************************************************************************************************************
* FUNCTION      : 
* DESCRIPTION   : 
* RETURN        : 
*******************************************************************************************************************************************/
int CApp::dataLoad( char* pszFile, uint8** ppData )
{
 int ret = 0;
 IFileMgr* pFMgr = NULL;
 IFile*   pFile = NULL;

 // File Mgr create.
 if(ISHELL_CreateInstance( m_pIShell, AEECLSID_FILEMGR, (void**)&pFMgr ) == SUCCESS)
 {
  // if szFile exist
  if(IFILEMGR_Test(pFMgr, pszFile) == SUCCESS)
  {
   // OPEN
   pFile = IFILEMGR_OpenFile(pFMgr, pszFile, _OFM_READ);
   if(pFile != NULL)
   {
    // GET FILE INFO
    AEEFileInfo fi;
    if( IFILE_GetInfo( pFile, &fi ) == SUCCESS && fi.dwSize > 0 )
    {
     // create buffer
     *ppData = (uint8*)MALLOC( fi.dwSize );
     // READ
     ret = IFILE_Read( pFile, *ppData, fi.dwSize );
    }
    
    IFILE_Release(pFile);
   }
  }
  IFILEMGR_Release(pFMgr);
 }

 return ret;
}

/*******************************************************************************************************************************************
* FUNCTION      : 
* DESCRIPTION   : 
* RETURN        : 
*******************************************************************************************************************************************/
boolean CApp::fileExists( char* pszFile )
{
 boolean ret = FALSE;
 IFileMgr* pFMgr = NULL;
 IFile*   pFile = NULL;

 // File Mgr create.
 if(ISHELL_CreateInstance( m_pIShell, AEECLSID_FILEMGR, (void**)&pFMgr ) == SUCCESS)
 {
  // if szFile exist
  if(IFILEMGR_Test(pFMgr, pszFile) == SUCCESS)
  {
   ret = TRUE;
  }
  IFILEMGR_Release(pFMgr);
 }

 return ret;
}

/*******************************************************************************************************************************************
* FUNCTION      : 
* DESCRIPTION   : 
* RETURN        : 
*******************************************************************************************************************************************/
boolean CApp::dataReplace( int nStart, int nsz, void* pData, char* pszFile )
{
 IFileMgr* pFMgr = NULL;
 IFile*   pFile = NULL;
 boolean   bResult = FALSE;

 // File Mgr create.
 if(ISHELL_CreateInstance(m_pIShell,AEECLSID_FILEMGR,(void**)&pFMgr) == SUCCESS)
 {
  //////////////////////////////////
  // check EFS space
  // TODO...
  //////////////////////////////////

  // if szFile exist
  if(IFILEMGR_Test(pFMgr,pszFile) == SUCCESS)
  {
   // OPEN
   pFile = IFILEMGR_OpenFile(pFMgr,pszFile,_OFM_READWRITE);
  }
  else
  {
   // CREATE
   pFile = IFILEMGR_OpenFile( pFMgr, pszFile, _OFM_CREATE );
  }
   
  if(pFile != NULL)
  {
   // MODIFY
   if( IFILE_Seek( pFile, _SEEK_START, nStart ) == SUCCESS )
   {
    if ( IFILE_Write( pFile, pData, nsz ) > 0 )
    {
     bResult = TRUE;
    }
   }
   IFILE_Release(pFile);
  }
  
  IFILEMGR_Release(pFMgr);
 }

 return bResult;
}

/*******************************************************************************************************************************************
* FUNCTION      : 
* DESCRIPTION   : String
* RETURN        : 
*******************************************************************************************************************************************/
AECHAR* CApp::SubString( AECHAR* psz, int bi, int ei )
{
 AECHAR* ret = NULL;

 int len = ei - bi;
 if ( ( len > 0 ) && ( bi <= WSTRLEN(psz) ) )
 {
  ret = new AECHAR[len];
  MEMCPY( (void*)ret, (void*)(psz + bi), len * sizeof(AECHAR) );
 }

 return ret;
}

/*******************************************************************************************************************************************
* FUNCTION      : 
* DESCRIPTION   : 
* RETURN        : 
*******************************************************************************************************************************************/
AECHAR* CApp::SubString( AECHAR* psz, int bi )
{
 return SubString( psz, bi, WSTRLEN(psz) );
}
/*******************************************************************************************************************************************
* FUNCTION      : 
* DESCRIPTION   : 
* RETURN        : -1,if not found target
*******************************************************************************************************************************************/
int CApp::IndexOf( AECHAR* source, AECHAR* target )
{
 int sourceCount=WSTRLEN(source);
 int targetCount=WSTRLEN(target);
 if (sourceCount<=0) {
  return -1;
 }
 if (targetCount == 0) {
  return -1;
 }

 AECHAR first  = target[0];
 int i = 0;
 int max = (sourceCount - targetCount);

startSearchForFirstChar:
 while (true) {
  /* Look for first character. */
  while (i <= max && source[i] != first) {
   i++;
  }
  if (i > max) {
   return -1;
  }

  /* Found first character, now look at the rest of v2 */
  int j = i + 1;
  int end = j + targetCount - 1;
  int k = 1;
  while (j < end) {
   if (source[j++] != target[k++]) {
    i++;
    /* Look for str's first char again. */
    goto startSearchForFirstChar;
   }
  }
  return i ; /* Found whole string. */
 }
}

/*******************************************************************************************************************************************
* FUNCTION      : 
* DESCRIPTION   : 
* RETURN        : 
*******************************************************************************************************************************************/
int CApp::IndexOf( AECHAR* source, AECHAR target )
{
 int sourceCount=WSTRLEN(source);
 int i;
 for ( i=0; i<sourceCount; i++ )
 {
  if ( source[i] == target )
  {
   return i;
  }
 }
 return -1;
}

/*******************************************************************************************************************************************
* FUNCTION      : 
* DESCRIPTION   : 
* RETURN        : 
*******************************************************************************************************************************************/
AECHAR* CApp::Trim( AECHAR* psz )
{
 int count = WSTRLEN(psz);
 int len = count;
 int st = 0;

 while ((st < len) && (psz[st] <= ' ')) {
     st++;
 }
 while ((st < len) && (psz[len - 1] <= ' ')) {
     len--;
 }

 AECHAR* ret = NULL;
 if ( (st > 0) || (len < count) )
 {
  ret = SubString( psz, st, len );
  delete[] psz;
  psz = NULL;
 }
 else
 {
  ret = psz;
 }
 return ret;
}

/*******************************************************************************************************************************************
* FUNCTION      : 
* DESCRIPTION   : 
* RETURN        : 
*******************************************************************************************************************************************/
int CApp::ParseInt( AECHAR* psz )
{
 char numBuf[12];
 WSTRTOSTR( psz, (char*)numBuf, 12 );

 int len = STRLEN( numBuf );
 for ( int i=0; i<len; i++ )
 {
  if ( ( numBuf[i] < '0' ) || ( numBuf[i] > '9' ) )
  {
   return 0;
  }
 }
 return ATOI( (char*)numBuf );
}

/*******************************************************************************************************************************************
* FUNCTION      : 
* DESCRIPTION   : 
* RETURN        : 
*******************************************************************************************************************************************/
void CApp::AppendWChar( AECHAR* psz, AECHAR c )
{
 int len = WSTRLEN( psz );
 psz[len] = c;
 psz[len+1] = '\0';
}

/*******************************************************************************************************************************************
* FUNCTION      : 
* DESCRIPTION   : 
* RETURN        : 
*******************************************************************************************************************************************/
uint32 CApp::loadStringFromResource( AECHAR** ppsz, uint16 nResID )
{
 uint32 size = 0;

 if(*ppsz == NULL)
 {
  ISHELL_GetResSize( m_pIShell, CULD_BS_RES_FILE, nResID, RESTYPE_STRING, &size );
  *ppsz = (AECHAR*)MALLOC(size * sizeof(AECHAR));
  if(*ppsz != NULL)
  {
   ISHELL_LoadResString(m_pIShell,CULD_BS_RES_FILE,nResID,*ppsz,size * sizeof(AECHAR));
  }
 }

 return size;
}
/*******************************************************************************************************************************************
* FUNCTION      : 
* DESCRIPTION   : STREAM
* RETURN        : 
*******************************************************************************************************************************************/
AECHAR* CApp::ReadUTF( uint8** pdis )
{
 int utflen = ((*pdis)[0] << 8) | (*pdis)[1];
 (*pdis) += 2;

    AECHAR* str = new AECHAR[utflen]; 
 str[0] = '\0';
    uint8* bytearr = new uint8[utflen];
    uint32 c, char2, char3;
 int count = 0;

 MEMMOVE( bytearr, (*pdis), utflen );
 (*pdis) += utflen;

 while (count < utflen) 
 {
      c = bytearr[count];
  switch (c >> 4) 
  {
   case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
    /* 0xxxxxxx*/
    count++;
    //str.append((char)c);
    CApp::AppendWChar( str, (AECHAR)c );
    break;
   case 12: case 13:
    /* 110x xxxx   10xx xxxx*/
    count += 2;
    if (count > utflen)
     goto READ_UTF_END;
    char2 = bytearr[count-1];
    if ((char2 & 0xC0) != 0x80)
     goto READ_UTF_END; 
    //str.append((char)(((c & 0x1F) << 6) | (char2 & 0x3F)));
    CApp::AppendWChar( str, (AECHAR)(((c & 0x1F) << 6) | (char2 & 0x3F)) );
    break;
   case 14:
    /* 1110 xxxx  10xx xxxx  10xx xxxx */
    count += 3;
    if (count > utflen)
     goto READ_UTF_END;
    char2 = bytearr[count-2];
    char3 = bytearr[count-1];
    if (((char2 & 0xC0) != 0x80) || ((char3 & 0xC0) != 0x80))
     goto READ_UTF_END;   
    //str.append((char)(((c & 0x0F) << 12) | ((char2 & 0x3F) << 6) | ((char3 & 0x3F) << 0)));
    CApp::AppendWChar( str, (AECHAR)(((c & 0x0F) << 12) | ((char2 & 0x3F) << 6)  | ((char3 & 0x3F) << 0)) );
    break;
   default:
    /* 10xx xxxx,  1111 xxxx */
    goto READ_UTF_END;   
  }
 }

READ_UTF_END:
    // The number of chars produced may be less than utflen
 AECHAR* ret = NULL;
 int strLen = WSTRLEN( str );
 if ( strLen <= 0 )
 {
  ret = NULL;
 }
 else
 {
  ret = new AECHAR[strLen];
  WSTRCPY( ret, str );
 }
 if ( str )
 {
  delete[] str;
  str = NULL;
 }
 if ( bytearr )
 {
  delete[] bytearr;
  bytearr = NULL;
 }
 return ret;
}

/*******************************************************************************************************************************************
* FUNCTION      : 
* DESCRIPTION   : 
* RETURN        : 
*******************************************************************************************************************************************/
int CApp::WriteUTF( uint8** pdos, AECHAR* psz )
{
 int i;
 int strlen = WSTRLEN(psz);
 int utflen = 0;
 int c, count = 0;
 
 for ( i = 0; i < strlen; i++) 
 {
     c = psz[i];
     if ((c >= 0x0001) && (c <= 0x007F)) 
  {
   utflen++;
     } 
  else if (c > 0x07FF) 
  {
   utflen += 3;
     } 
  else 
  {
   utflen += 2;
     }
 }

 if (utflen > 65535)
     return 0;

 (*pdos)[0] = (uint8)(((uint32)utflen) >> 8);
 (*pdos)[1] = (uint8)utflen;
 (*pdos) += 2;
 for ( i = 0; i < strlen; i++) 
 {
     c = psz[i];
     if ((c >= 0x0001) && (c <= 0x007F)) 
  {
   (*pdos)[0] = (byte) c;
   (*pdos) += 1;
     } 
  else if (c > 0x07FF) 
  {
   (*pdos)[0] = (uint8) (0xE0 | ((c >> 12) & 0x0F));
   (*pdos)[1] = (uint8) (0x80 | ((c >>  6) & 0x3F));
   (*pdos)[2] = (uint8) (0x80 | ((c >>  0) & 0x3F));
   (*pdos) += 3;
     } 
  else 
  {
   (*pdos)[0] = (uint8) (0xC0 | ((c >>  6) & 0x1F));
   (*pdos)[1] = (uint8) (0x80 | ((c >>  0) & 0x3F));
   (*pdos) += 2;
     }
 }
 return utflen + 2;
}

 /*******************************************************************************************************************************************
* FUNCTION      : 
* DESCRIPTION   : 
* RETURN        : 
*******************************************************************************************************************************************/
int CApp::ReadInt( uint8** pdis )
{
 int ret = ((*pdis)[0] << 24) | ((*pdis)[1] << 16) | ((*pdis)[2] << 8) | (*pdis)[3];
 (*pdis) += 4;
 return ret;
}

/*******************************************************************************************************************************************
* FUNCTION      : 
* DESCRIPTION   : 
* RETURN        : 
*******************************************************************************************************************************************/
void CApp::WriteInt( uint8** pdos, int n )
{
 (*pdos)[0] = (uint8)(((uint32)n) >> 24);
 (*pdos)[1] = (uint8)(((uint32)n) >> 16);
 (*pdos)[2] = (uint8)(((uint32)n) >> 8);
 (*pdos)[3] = (uint8)n;
 (*pdos) += 4;
}

/*******************************************************************************************************************************************
* FUNCTION      : 
* DESCRIPTION   : 
* RETURN        : 
*******************************************************************************************************************************************/
short CApp::ReadShort( uint8** pdis )
{
 short ret = ((*pdis)[0] << 8) | (*pdis)[1];
 (*pdis) += 2;
 return ret;
}

/*******************************************************************************************************************************************
* FUNCTION      : 
* DESCRIPTION   : 
* RETURN        : 
*******************************************************************************************************************************************/
void CApp::WriteShort ( uint8** pdos, short n )
{
 (*pdos)[0] = (uint8)(((uint16)n) >> 8);
 (*pdos)[1] = (uint8)n;
 (*pdos) += 2;
}

/*******************************************************************************************************************************************
* FUNCTION      : 
* DESCRIPTION   : 
* RETURN        : 
*******************************************************************************************************************************************/
byte CApp::ReadByte( uint8** pdis )
{
 byte ret = (*pdis)[0];
 (*pdis) += 1;
 return ret;
}

/*******************************************************************************************************************************************
* FUNCTION      : 
* DESCRIPTION   : 
* RETURN        : 
*******************************************************************************************************************************************/
void CApp::WriteByte( uint8** pdos, byte n )
{
 (*pdos)[0] = (uint8)n;
 (*pdos) += 1;
}

/*******************************************************************************************************************************************
* FUNCTION      : 
* DESCRIPTION   : 
* RETURN        : 
*******************************************************************************************************************************************/
void CApp::Read( uint8** pdis, uint8* pDst, int ofs, int len )
{
 MEMMOVE( pDst+ofs, *pdis, len );
 (*pdis) += len;
}

/*******************************************************************************************************************************************
* FUNCTION      : 
* DESCRIPTION   : 
* RETURN        : 
*******************************************************************************************************************************************/
void CApp::Write( uint8** pdos, uint8* pSrc, int ofs, int len )
{
 MEMMOVE( *pdos, pSrc+ofs, len );
 (*pdos) += len;
}

/*******************************************************************************************************************************************
* FUNCTION      : 
* DESCRIPTION   : Random
* RETURN        : 
*******************************************************************************************************************************************/
int CApp::GetRand2( int max )
{
 int r;
 GETRAND( (byte*)&r, 4 );
 r &= 0x7fffffff;
 r %= max;

 return r;
}

/*******************************************************************************************************************************************
* FUNCTION      : 
* DESCRIPTION   : 
* RETURN        : 
*******************************************************************************************************************************************/
int CApp::GetRandInt()
{
 int r;
 GETRAND( (byte*)&r, 4 );
 return r;
}

/*******************************************************************************************************************************************
* FUNCTION      : 
* DESCRIPTION   : 
* RETURN        : 
*******************************************************************************************************************************************/
int CApp::GetRand2( int min, int max )
{
 if( min < max ) {
  int r;
  GETRAND( (byte*)&r, 4 );
  r &= 0x7fffffff;
        return ( r % ( max - min ) + min  );
    } else {
        return min;
    }
}

/*******************************************************************************************************************************************
* FUNCTION      : 
* DESCRIPTION   : IMAGE
* RETURN        : 
*******************************************************************************************************************************************/
IBitmap* CApp::getBitmap( IImage* pIImg )
{
 IBitmap* ret = NULL;
 IBitmap* pDes = NULL;
 AEEImageInfo imginfo;
 
 if ( pIImg )
 {
  // GET Display Destination
  pDes = IDISPLAY_GetDestination( m_pIDisplay );
  if ( pDes )
  {
   IIMAGE_GetInfo( pIImg, &imginfo );
   if( IBITMAP_CreateCompatibleBitmap( pDes, &ret, imginfo.cx, imginfo.cy ) == SUCCESS )
   {
    // SET Display Destination
    IDISPLAY_SetDestination( m_pIDisplay, ret );

    // DRAW At ret Bitmap
    IIMAGE_Draw( pIImg, 0, 0 );

    // RESTORE Display Destination
    IDISPLAY_SetDestination( m_pIDisplay, pDes );
   }
   
   IBITMAP_Release( pDes );
  }
 }

 return ret;
}

/*******************************************************************************************************************************************
* FUNCTION      : 
* DESCRIPTION   : 
* RETURN        : 
*******************************************************************************************************************************************/
IBitmap* CApp::getBitmap( IImage* pIImg, RGBVAL transCol )
{
 IBitmap* ret = NULL;
 IBitmap* pDes = NULL;
 AEEImageInfo imginfo;
 
 if ( pIImg )
 {
  // GET Display Destination
  pDes = IDISPLAY_GetDestination( m_pIDisplay );
  if ( pDes )
  {
   IIMAGE_GetInfo( pIImg, &imginfo );
   if( IBITMAP_CreateCompatibleBitmap( pDes, &ret, imginfo.cx, imginfo.cy ) == SUCCESS )
   {
    // SET Display Destination
    IDISPLAY_SetDestination( m_pIDisplay, ret );
    
    // FILL ret with transparent color
    AEERect rect;
    SETAEERECT( &rect, 0, 0, imginfo.cx, imginfo.cy );
    IDISPLAY_FillRect( m_pIDisplay, &rect, transCol );

    // DRAW At ret Bitmap
    IIMAGE_Draw( pIImg, 0, 0 );

    // SET ret transparent color
    IBITMAP_SetTransparencyColor( ret, IBITMAP_RGBToNative( ret, transCol ) );

    // RESTORE Display Destination
    IDISPLAY_SetDestination( m_pIDisplay, pDes );
   }
   
   IBITMAP_Release( pDes );
  }
 }

 return ret;
}

/*******************************************************************************************************************************************
* FUNCTION      : 
* DESCRIPTION   : 
* RETURN        : 
*******************************************************************************************************************************************/
IBitmap* CApp::createPNGBitmap( uint8* data, int dataSz )
{
 IBitmap* ret = NULL;
 IMemAStream* p_memStream = NULL;
 IImage* pIImg = NULL;
 
 if ( data != NULL && dataSz > 0 )
 {
  if ( ISHELL_CreateInstance( m_pIShell, AEECLSID_MEMASTREAM, (void**)&p_memStream ) == SUCCESS )
  {
   // IMemAStream Instance CREATED
   byte* p_memData = (uint8*)MALLOC(dataSz);
   if( p_memData )
   {
    MEMMOVE( p_memData, data, dataSz );
    IMEMASTREAM_Set( p_memStream, p_memData, dataSz, 0, FALSE );

    ret = createPNGBitmap( p_memStream );
   }

   // RLEASE IMemAStream
   if( p_memStream )
    IMEMASTREAM_Release( p_memStream );
  }
 }

 return ret;
}

/*******************************************************************************************************************************************
* FUNCTION      : 
* DESCRIPTION   : 
* RETURN        : 
*******************************************************************************************************************************************/
IBitmap* CApp::createPNGBitmap( IMemAStream* pMemStream )
{
 IBitmap* ret = NULL;
 IImage* pIImg = NULL;
 
 if ( ISHELL_CreateInstance( m_pIShell, AEECLSID_PNG, (void**)&pIImg ) == SUCCESS )
 {
  // IImage-PNG CREATED.
  // SET MEM_STREAM
  IIMAGE_SetStream( pIImg, (IAStream*)pMemStream );

  // CREATE ret
  ret = getBitmap( pIImg );

  // RELEASE IImage_PNG
  IIMAGE_Release( pIImg );
  //p_memStream = NULL;
 }

 return ret;
}

/*******************************************************************************************************************************************
* FUNCTION      : 
* DESCRIPTION   : 
* RETURN        : 
*******************************************************************************************************************************************/
IBitmap* CApp::createPNGBitmap( IMemAStream* pMemStream, RGBVAL transCol )
{
 IBitmap* ret = NULL;
 IImage* pIImg = NULL;
 
 if ( ISHELL_CreateInstance( m_pIShell, AEECLSID_PNG, (void**)&pIImg ) == SUCCESS )
 {
  // IImage-PNG CREATED.
  // SET MEM_STREAM
  IIMAGE_SetStream( pIImg, (IAStream*)pMemStream );

  // CREATE ret
  ret = getBitmap( pIImg, transCol );

  // RELEASE IImage_PNG
  IIMAGE_Release( pIImg );
  //p_memStream = NULL;
 }

 return ret;
}

/*******************************************************************************************************************************************
* FUNCTION      : 
* DESCRIPTION   : 
* RETURN        : 
*******************************************************************************************************************************************/
int CApp::GetImageW( IBitmap* pbmp )
{
 if ( pbmp == NULL ) return 0;

 AEEBitmapInfo bi;
 IBITMAP_GetInfo( pbmp, &bi, sizeof(bi) );
 return bi.cx;
}

/*******************************************************************************************************************************************
* FUNCTION      : 
* DESCRIPTION   : 
* RETURN        : 
*******************************************************************************************************************************************/
int CApp::GetImageH( IBitmap* pbmp )
{
 if ( pbmp == NULL ) return 0;

 AEEBitmapInfo bi;
 IBITMAP_GetInfo( pbmp, &bi, sizeof(bi) );
 return bi.cy;
}

/*******************************************************************************************************************************************
* FUNCTION      : 
* DESCRIPTION   : 
* RETURN        : 
*******************************************************************************************************************************************/
void CApp::drawRegion( IBitmap* pSrc, int xSrc, int ySrc, int w, int h, int transform, int xDes, int yDes )
{
 if ( transform != TRANS_MIRROR )
 {
  // NO Transform
  IDISPLAY_BitBlt( m_pIDisplay, xDes, yDes, w, h, pSrc, xSrc, ySrc, AEE_RO_TRANSPARENT );
 }
 else
 {
  // MIRROR Transform
  ITRANSFORM_TransformBltSimple( pTransform, xDes, yDes, pSrc, xSrc, ySrc, w, h, TRANSFORM_FLIP_X | TRANSFORM_ROTATE_180, COMPOSITE_KEYCOLOR );
 }
}

/*******************************************************************************************************************************************
* FUNCTION      : 
* DESCRIPTION   : 
* RETURN        : 
*******************************************************************************************************************************************/
void CApp::setColor( int color )
{
 IGRAPHICS_SetColor( pGraphics, GET_R(color), GET_G(color), GET_B(color), 0 );
}

/*******************************************************************************************************************************************
* FUNCTION      : 
* DESCRIPTION   : 
* RETURN        : 
*******************************************************************************************************************************************/
RGBVAL CApp::getColor()
{
 uint8 r,g,b,alpha;
 IGRAPHICS_GetColor( pGraphics, &r, &g, &b, &alpha );
 return MAKE_RGB( r, g, b );
}

/*******************************************************************************************************************************************
* FUNCTION      : 
* DESCRIPTION   : 
* RETURN        : 
*******************************************************************************************************************************************/
void CApp::drawRect( int x, int y, int w, int h )
{
 AEERect rect;
 SETAEERECT( &rect, x, y, w, h );
 IDISPLAY_DrawRect( m_pIDisplay, &rect, getColor(), RGB_NONE, IDF_RECT_FRAME );
}

/*******************************************************************************************************************************************
* FUNCTION      : 
* DESCRIPTION   : 
* RETURN        : 
*******************************************************************************************************************************************/
void CApp::drawRect( int x, int y, int w, int h, RGBVAL color )
{
 AEERect rect;
 SETAEERECT( &rect, x, y, w, h );
 IDISPLAY_DrawRect( m_pIDisplay, &rect, color, RGB_NONE, IDF_RECT_FRAME );
}

/*******************************************************************************************************************************************
* FUNCTION      : 
* DESCRIPTION   : 
* RETURN        : 
*******************************************************************************************************************************************/
void CApp::fillRect( int x, int y, int w, int h )
{
 AEERect rect;
 SETAEERECT( &rect, x, y, w, h );
 IDISPLAY_FillRect( m_pIDisplay, &rect, getColor() );
}

/*******************************************************************************************************************************************
* FUNCTION      : 
* DESCRIPTION   : 
* RETURN        : 
*******************************************************************************************************************************************/
void CApp::fillRect( int x, int y, int w, int h, RGBVAL color )
{
 AEERect rect;
 SETAEERECT( &rect, x, y, w, h );
 IDISPLAY_FillRect( m_pIDisplay, &rect, color );
}

/*******************************************************************************************************************************************
* FUNCTION      : 
* DESCRIPTION   : 
* RETURN        : 
*******************************************************************************************************************************************/
void CApp::drawLine( int x1, int y1, int x2, int y2 )
{
 AEELine line;
 line.sx = x1; line.sy = y1;
 line.ex = x2; line.ey = y2;
 IGRAPHICS_DrawLine( pGraphics, &line );
}
/*******************************************************************************************************************************************
* FUNCTION      : 
* DESCRIPTION   : 
* RETURN        : 
*******************************************************************************************************************************************/
IBitmap* CApp::createImage( int w, int h )
{
 IBitmap* ret = NULL;
 IBitmap* dev = NULL;

 IDISPLAY_GetDeviceBitmap( m_pIDisplay, &dev );
 if ( dev )
 {
  IBITMAP_CreateCompatibleBitmap( dev, &ret, w, h );

  IBITMAP_Release( dev );
  dev = NULL;
 }
 
 return ret;
}

你可能感兴趣的:(brew)