miniopenwavesurf.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:9k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #include "minisite.h"
  36. #include "hxvsurf.h"
  37. #include "ciddefs.h"
  38. #include "miniopenwavesurf.h"
  39. #include "miniopenwavesite.h"
  40. #include "opwindow.h"
  41. CMiniOpenwaveSurface::CMiniOpenwaveSurface(IUnknown* pContext, CMiniBaseSite* pSite)
  42.     :  CMiniBaseSurface(pContext, pSite)
  43. ,  m_nCompositionSize(0)
  44. ,  m_nCompositionPitch(0)
  45.     ,  m_pCompositionSurface(NULL)
  46.     ,  m_ulTotalFramesBlted(0)
  47. ,  m_cidIn(-1)
  48. ,  m_cidOut(-1)
  49. {
  50. }
  51. CMiniOpenwaveSurface::~CMiniOpenwaveSurface()
  52. {
  53. HX_FREE(m_pCompositionSurface);
  54. m_nCompositionSize  = 0;
  55.     m_nCompositionPitch = 0;
  56. memset(&m_surfaceSize, 0, sizeof( m_surfaceSize ) );
  57. }
  58. HX_RESULT CMiniOpenwaveSurface::_CreateDestBuffer( int cidIn,
  59.                                                   int nWidth,
  60.                                                   int nHeight,
  61.                                                   int& nCount)
  62. {
  63.     HX_RESULT res = HXR_OK;
  64. HX_ASSERT( m_pSite );
  65.     //For now, we only support RGB32
  66.     HX_ASSERT( cidIn == CID_I420 );
  67. m_cidIn = cidIn;
  68. m_cidOut = CID_RGB565;
  69. int sc, sw, sh;
  70. COpWindow *pOpWin = ((CHXOpenwaveSite*)m_pSite)->GetOpWindow();
  71. /// color info has to be converted to something both sides understand
  72. /// for now it is hard coded
  73. pOpWin->GetScreenInfo(sc, sw, sh);
  74. ((CHXOpenwaveSite*)m_pSite)->_SetScreenSize(sw, sh);
  75. /// if the site's default size is bigger than the image
  76. /// then make site fit the image instead of scaling the 
  77. /// image to fit the site
  78. if (nWidth < sw)
  79. {
  80. sw = nWidth;
  81. }
  82. if (nHeight < sh)
  83. {
  84. sh = nHeight;
  85. }
  86. HXxSize newScreenSize = {sw, sh};
  87. /// since we are sue sw <= nWidth and sh <= nHeight
  88. /// now let us do the scaling down to preserve the proportion of 
  89. /// original image, nWidth:nHeight
  90. float hr = (float)sh/(float)nHeight;
  91. float wr = (float)sw/(float)nWidth;
  92. if (hr < 1.0 && wr < 1.0)
  93. {
  94. if (hr < wr)
  95. {
  96. newScreenSize.cx = sh*nWidth/nHeight;
  97. newScreenSize.cy = sh;
  98. }
  99. else
  100. {
  101. newScreenSize.cx = sw;
  102. newScreenSize.cy = sw*nHeight/nWidth;
  103. }
  104. }
  105. /// color info has to be converted to something both sides understand
  106. /// for now it is hard coded
  107. pOpWin->SetImageInfo(m_cidOut, newScreenSize.cx, newScreenSize.cy);
  108. m_pSite->SetSize(newScreenSize);
  109. //Get the size of this site.
  110.     m_pSite->GetSize(m_surfaceSize);
  111.     //Malloc the room to hold the actual bits.
  112.     HXBitmapInfo bmiTemp;
  113.     m_pImageHelper->MakeBitmap( &bmiTemp,
  114.                                 sizeof(bmiTemp),
  115.                                 m_cidOut,
  116.                                 m_surfaceSize.cx,
  117.                                 m_surfaceSize.cy,
  118.                                 NULL,
  119.                                 0);
  120.     
  121.     m_nCompositionPitch = m_pImageHelper->GetBitmapPitch(&bmiTemp);
  122.     int imageSize = bmiTemp.bmiHeader.biSizeImage;
  123.     _ResizeVideoBuffer(imageSize);
  124.     HX_ASSERT( m_pImageHelper->GetBitmapColor(&bmiTemp) == m_cidOut );
  125.     return res;
  126. }
  127. HX_RESULT CMiniOpenwaveSurface::_ResizeVideoBuffer( INT32 nSize)
  128. {
  129.     HX_RESULT retVal=HXR_OK;
  130.     //XXXgfw. Trade off here. We can use lots of mem if we just return and
  131.     //the user has scaled the image up very much and then goes back down.
  132.     //If we don't just return we can do tons and tons of mallocs. Maybe we
  133.     //should add a timed callback to reclaim some of this mem after a few
  134.     //seconds.
  135.     if(nSize <= (INT32)m_nCompositionSize)
  136.         return retVal;
  137.     if(m_pCompositionSurface == NULL)
  138.     {
  139.         m_pCompositionSurface = (UCHAR*) malloc(nSize);
  140.     }
  141.     else
  142.     {
  143.         m_pCompositionSurface = (UCHAR*) realloc(m_pCompositionSurface, nSize);
  144.     }
  145.     if( m_pCompositionSurface )
  146.     {
  147.         m_nCompositionSize = nSize;
  148.     }
  149.     else
  150.     {
  151.         HX_ASSERT("We can't alloc the composition surface." == NULL );
  152.         m_nCompositionSize = 0;
  153.     }
  154.     return retVal;
  155. }
  156.          
  157. HX_RESULT CMiniOpenwaveSurface::_LockDestBuffer( UCHAR** ppDestPtr,
  158.                                                 LONG32* pnDestPitch,
  159.                                                 int& cid,
  160.                                                 REF(HXxSize) srcSize,
  161.                                                 int nIndex)
  162. {
  163.     HX_RESULT res = HXR_OK;
  164. *ppDestPtr = m_pCompositionSurface;
  165.     *pnDestPitch = m_nCompositionPitch;
  166.     cid = m_cidOut;
  167.     
  168.     return res;
  169. }
  170.          
  171. HX_RESULT CMiniOpenwaveSurface::_TransferToDestBuffer( UCHAR*   pSrcBuffer,
  172.                                                       HXBitmapInfoHeader* pBitmapInfo,
  173.                                                       HXxRect* prSrcRect,
  174.                                                       HXxRect* prDstRect,
  175.                                                       UCHAR*   pDstBuffer,
  176.                                                       LONG32   nDstPitch)
  177. {
  178.     HX_RESULT res = HXR_OK;
  179.     //XXXGfw when we really have a buffer to color convert to we
  180.     //can uncomment this....
  181. BOOL bTransfer = FALSE;
  182. UCHAR* pOutBuffer = pSrcBuffer;
  183. if ((prSrcRect != prDstRect) || (m_cidIn != m_cidOut))
  184. {
  185. bTransfer = TRUE;
  186. }
  187. // First do the transfer if it needed
  188. if (bTransfer)
  189. {
  190. res =  CMiniBaseSurface::_TransferToDestBuffer( pSrcBuffer,
  191.                                              pBitmapInfo,
  192.                                          prSrcRect,
  193.                                      prDstRect,
  194.                                  pDstBuffer,
  195.                              nDstPitch);
  196. if (SUCCEEDED(res))
  197. {
  198. pOutBuffer = pDstBuffer;
  199. }
  200. }
  201.     
  202. // Simply set the source buffer back to TLC's window object
  203. // and invalidate the window for drawing to happen 
  204. // in the next event loop
  205. COpWindow *pOpWin = ((CHXOpenwaveSite*)m_pSite)->GetOpWindow();
  206. pOpWin->SetImageSource(pOutBuffer);
  207. pOpWin->Invalidate();
  208.     return res;
  209. }
  210.          
  211. HX_RESULT CMiniOpenwaveSurface::_UnlockDestBuffer(UCHAR* pSurfPtr, int nIndex)
  212. {
  213.     //Nothing to do here for Openwave.....
  214.     return HXR_OK;
  215. }
  216.          
  217. HX_RESULT CMiniOpenwaveSurface::_RenderDestBuffer(HXxRect* prSrcRect,
  218.                                                   HXxRect* prDestRect,
  219.                                                   int nIndex)
  220. {
  221.     HX_RESULT res = HXR_OK;
  222. // Since we already invalidated the window in the _TransferToDstBuffer which
  223. // will render the frame, so nothing to do here but simply
  224.     // output a message here about how many frames we have seen...
  225.     m_ulTotalFramesBlted++;
  226. #ifdef _DEBUG
  227. fprintf(stderr, "CMiniOpenwaveSurface: m_ulTotalFramesBlted: m_ulTotalFramesBltedn");
  228. #endif
  229.     
  230.     return res;
  231. }
  232.          
  233. HX_RESULT CMiniOpenwaveSurface::_DestroyDestBuffer(int cid, int nCount)
  234. {
  235. HX_FREE(m_pCompositionSurface);
  236.     m_nCompositionSize  = 0;
  237.     m_nCompositionPitch = 0;
  238.     memset(&m_surfaceSize, 0, sizeof( m_surfaceSize ) );
  239.     
  240.     return HXR_OK;
  241. }
  242. HX_RESULT CMiniOpenwaveSurface::_init()
  243. {
  244.    return HXR_OK;
  245. }
  246. int CMiniOpenwaveSurface::GetDstCID(int nIndex)
  247. {
  248.     //right hard coded, but should use GetScreenInfo call to set
  249. // it correctly
  250.     return m_cidOut;
  251. }