munixsurf.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 "coloracc.h"
  38. #include "minisurf.h"
  39. #include "munixsurf.h"
  40. #include "minifmt.h"
  41. CMiniUnixSurface::CMiniUnixSurface(IUnknown* pContext, CMiniBaseSite* pSite)
  42.     :  CMiniBaseSurface(pContext, pSite)
  43.     , m_pDisplay(NULL)
  44.     , m_GC(0)
  45.     , m_nScreenNumber(0)
  46.     , m_pXImage(NULL)
  47.     , m_pVisual(NULL)
  48.     , m_unDepth(0)
  49.     , m_pScreen(NULL)
  50.     , m_nBitsPerPixel(0)
  51.     , m_nCompositionSize(0)
  52.     , m_pCompositionSurface(NULL)
  53. {
  54. }
  55. CMiniUnixSurface::~CMiniUnixSurface()
  56. {
  57.     if( m_GC )
  58.     {
  59.         XFreeGC( m_pDisplay, m_GC );
  60.         m_GC=0;
  61.     }
  62.     if( m_pXImage )
  63.     {
  64.         XFree(m_pXImage);
  65.         m_pXImage = NULL;
  66.     }
  67.     HX_FREE(m_pCompositionSurface);
  68.     m_nCompositionSize  = 0;
  69.     m_nCompositionPitch = 0;
  70.     memset(&m_surfaceSize, 0, sizeof( m_surfaceSize ) );
  71. }
  72. HX_RESULT CMiniUnixSurface::_CreateDestBuffer(int cidIn,
  73.                                               int nWidth,
  74.                                               int nHeight,
  75.                                               int& nCount)
  76. {
  77.     HX_ASSERT( m_pSite );
  78.     HX_ASSERT( m_pDisplay );
  79.     HX_ASSERT( m_pVisual );
  80.     HX_ASSERT( m_unDepth );
  81.     //For now, we just support RGB32
  82.     HX_ASSERT( cidIn == CID_I420 );
  83.     
  84.     if( m_pXImage )
  85.     {
  86.         XFree( m_pXImage );
  87.     }
  88.     //Get the size of this site.
  89.     m_pSite->GetSize(m_surfaceSize);
  90.     //Malloc the room to hold the actual bits.
  91.     HXBitmapInfo bmiTemp;
  92.     m_pImageHelper->MakeBitmap( &bmiTemp,
  93.                                 sizeof(bmiTemp),
  94.                                 CID_RGB32,
  95.                                 m_surfaceSize.cx,
  96.                                 m_surfaceSize.cy,
  97.                                 NULL,
  98.                                 0);
  99.     
  100.     m_nCompositionPitch = m_pImageHelper->GetBitmapPitch(&bmiTemp);
  101.     int imageSize = bmiTemp.bmiHeader.biSizeImage;
  102.     _ResizeVideoBuffer(imageSize);
  103.     HX_ASSERT( m_pImageHelper->GetBitmapColor(&bmiTemp) == CID_RGB32 );
  104.     //Create our RGB dest image here.
  105.     m_pXImage  = XCreateImage( m_pDisplay,
  106.                                m_pVisual,
  107.                                m_unDepth, //Remember, it better be 32bits in this example site.
  108.                                ZPixmap,
  109.                                0,
  110.                                (char*)m_pCompositionSurface,
  111.                                m_surfaceSize.cx,
  112.                                m_surfaceSize.cy,
  113.                                32,
  114.                                0);
  115.     
  116.     return HXR_OK;
  117. }
  118.          
  119. HX_RESULT CMiniUnixSurface::_LockDestBuffer(UCHAR** ppDestPtr,
  120.                                             LONG32* pnDestPitch,
  121.                                             int& cid,
  122.                                             REF(HXxSize) srcSize,
  123.                                             int nIndex)
  124. {
  125.     *ppDestPtr = m_pCompositionSurface;
  126.     *pnDestPitch = m_nCompositionPitch;
  127.     cid = CID_RGB32;
  128.     
  129.     return HXR_OK;
  130. }
  131.          
  132. HX_RESULT CMiniUnixSurface::_TransferToDestBuffer(UCHAR* pSrcBuffer,
  133.                                                   HXBitmapInfoHeader* pBitmapInfo,
  134.                                                   HXxRect* prSrcRect,
  135.                                                   HXxRect* prDstRect,
  136.                                                   UCHAR* pDstBuffer,
  137.                                                   LONG32 nDstPitch)
  138. {
  139.     HX_RESULT res = HXR_OK;
  140.     int nCidIn = m_pImageHelper->GetBitmapColor( (HXBitmapInfo*)pBitmapInfo );
  141.     //This minisite, as written, is just doing a blind I420->RGB32
  142.     //color convert. Feel free to add whatever you want...
  143.     HX_ASSERT( nCidIn == CID_I420 );
  144.     if( nCidIn == CID_I420 )
  145.     {
  146.         //This calls the m_fpColorConverter init'ed in the base class.
  147.         res =  CMiniBaseSurface::_TransferToDestBuffer(pSrcBuffer,
  148.                                                        pBitmapInfo,
  149.                                                        prSrcRect,
  150.                                                        prDstRect,
  151.                                                        pDstBuffer,
  152.                                                        nDstPitch);
  153.     }
  154.  
  155.     return res;
  156. }
  157.          
  158. HX_RESULT CMiniUnixSurface::_UnlockDestBuffer(UCHAR* pSurfPtr, int nIndex)
  159. {
  160.     return HXR_OK;
  161. }
  162.          
  163. HX_RESULT CMiniUnixSurface::_RenderDestBuffer(HXxRect* prSrcRect,
  164.                                               HXxRect* prDestRect,
  165.                                               int nIndex)
  166. {
  167.     int i = XPutImage(m_pDisplay,
  168.                       m_window,
  169.                       m_GC,
  170.                       m_pXImage,
  171.                       prSrcRect->left, 
  172.                       prSrcRect->top,
  173.                       prDestRect->left,
  174.                       prDestRect->top,
  175.                       prDestRect->right - prDestRect->left,      
  176.                       prDestRect->bottom - prDestRect->top);
  177.     
  178.     return HXR_OK;
  179. }
  180.          
  181. HX_RESULT CMiniUnixSurface::_DestroyDestBuffer(int cid, int nCount)
  182. {
  183.     if( m_pXImage )
  184.     {
  185.         XFree(m_pXImage);
  186.         m_pXImage = NULL;
  187.     }
  188.     HX_FREE(m_pCompositionSurface);
  189.     m_nCompositionSize  = 0;
  190.     m_nCompositionPitch = 0;
  191.     memset(&m_surfaceSize, 0, sizeof( m_surfaceSize ) );
  192.     
  193.     return HXR_OK;
  194. }
  195. int CMiniUnixSurface::GetDstCID(int nIndex)
  196. {
  197.     //Right now the mini site just always outputs in RGB32. 
  198.     return CID_RGB32;
  199. }
  200. HX_RESULT CMiniUnixSurface::_ResizeVideoBuffer( INT32 nSize)
  201. {
  202.     HX_RESULT retVal=HXR_OK;
  203.     //XXXgfw. Trade off here. We can use lots of mem if we just return and
  204.     //the user has scaled the image up very much and then goes back down.
  205.     //If we don't just return we can do tons and tons of mallocs. Maybe we
  206.     //should add a timed callback to reclaim some of this mem after a few
  207.     //seconds.
  208.     if(nSize <= m_nCompositionSize)
  209.         return retVal;
  210.     if(m_pCompositionSurface == NULL)
  211.     {
  212.         m_pCompositionSurface = (UCHAR*) malloc(nSize);
  213.     }
  214.     else
  215.     {
  216.         m_pCompositionSurface = (UCHAR*) realloc(m_pCompositionSurface, nSize);
  217.     }
  218.     if( m_pCompositionSurface )
  219.     {
  220.         m_nCompositionSize = nSize;
  221.     }
  222.     else
  223.     {
  224.         HX_ASSERT("We can't alloc the composition surface." == NULL );
  225.         m_nCompositionSize = 0;
  226.     }
  227.     return retVal;
  228. }
  229. HX_RESULT CMiniUnixSurface::_init()
  230. {
  231.    //get window and display from main Site.
  232.    HXxWindow* pWindow = m_pSite->GetWindow();
  233.    HX_ASSERT(pWindow);
  234.    m_pDisplay = (Display*)pWindow->display;
  235.    m_window   = (Window)pWindow->window;
  236.     
  237.    HX_ASSERT( m_pDisplay );
  238.    HX_ASSERT( m_window );
  239.    //
  240.    // Now see if our X11 server supports the Shared Memory extension.
  241.    //
  242.    //XXXgfw not supported in the mini site for size.
  243.    //ShmHelp::Init(m_pDisplay);
  244.    //m_bUseShm = ShmHelp::ShmAvailable();
  245.    
  246.    //Create the graphics context 
  247.    XGCValues values;
  248.    m_GC = XCreateGC(m_pDisplay, m_window, 0, &values);
  249.     //Get X window attributes & visual
  250.    XWindowAttributes attr;
  251.    XGetWindowAttributes(m_pDisplay, m_window, &attr);
  252.    m_pVisual = attr.visual;
  253.    // get visual info & depth 
  254.    int nv=0;
  255.    XVisualInfo visInfo;
  256.    memset(&visInfo, 0, sizeof(XVisualInfo));
  257.    visInfo.visualid = XVisualIDFromVisual(m_pVisual);
  258.    XVisualInfo* pVisualInfo = XGetVisualInfo (m_pDisplay, VisualIDMask, &visInfo, &nv);
  259.    m_unDepth       = pVisualInfo->depth;
  260.    m_nScreenNumber = DefaultScreen(m_pDisplay);
  261.    m_pScreen       = XScreenOfDisplay(m_pDisplay, m_nScreenNumber);
  262.    XFree( pVisualInfo );
  263.    return HXR_OK;
  264. }