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

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. // Here is a little site I did as an example of a replacement site. It
  36. // shows how you can tailor the mini site to output to just about any
  37. // kind of device. This one outputs all the RGB and video in Ascii Art! 
  38. // :) It is just a wrapper, basically, around the very nice AALib,
  39. // which you need to have installed:
  40. //    http://aa-project.sourceforge.net/aalib
  41. //
  42. #include <aalib.h>
  43. #include "minisite.h"
  44. #include "hxvsurf.h"
  45. #include "coloracc.h"
  46. #include "minisurf.h"
  47. #include "maasurf.h"
  48. #include "minifmt.h"
  49. CMiniUnixSurface::CMiniUnixSurface(IUnknown* pContext, CMiniBaseSite* pSite)
  50.     :  CMiniBaseSurface(pContext, pSite)
  51.        , m_context(NULL)
  52.        , m_nAAScale(2)
  53.        , m_nWidth(0)
  54.        , m_nHeight(0)
  55. {
  56.     memset( &m_hardware_params, 0, sizeof(m_hardware_params) );
  57.     memset( &m_hardware_params, 0, sizeof(m_hardware_params) );
  58.     //Init the rendering params...
  59.     m_render_params.bright    = 40;
  60. m_render_params.contrast  = 2;
  61. m_render_params.gamma     = 4;
  62. m_render_params.dither    = AA_FLOYD_S;
  63. m_render_params.inversion = 0;
  64. m_render_params.randomval = 0;
  65.     //Just output a little help text.
  66.     fprintf( stderr, "nnThe Ascii Art player!nn" );
  67.     fprintf( stderr, "This site takes keyboard input to control the contrastn" );
  68.     fprintf( stderr, "brightness and gamma settings. You will need these to n" );
  69.     fprintf( stderr, "adjust for movies that are overly dark or bright:nn" );
  70.     fprintf( stderr, "'G'/'g' increase/decrease gamma.n" );
  71.     fprintf( stderr, "'B'/'b' increase/decrease brightness.n" );
  72.     fprintf( stderr, "'C'/'c' increase/decrease contrast.n" ); 
  73.     fprintf( stderr, "'S'/'s' increase/decrease scaling.nn" );
  74.     fprintf( stderr, "n" ); 
  75. }
  76. CMiniUnixSurface::~CMiniUnixSurface()
  77. {
  78. }
  79. HX_RESULT CMiniUnixSurface::_CreateDestBuffer(int cidIn,
  80.                                               int nWidth,
  81.                                               int nHeight,
  82.                                               int& nCount)
  83. {
  84.     HX_ASSERT( m_pSite );
  85.     
  86.     //For now, we just support RGB32
  87.     HX_ASSERT( cidIn == CID_I420 );
  88.     if( m_context )
  89.     {
  90.         aa_close(m_context);
  91.         m_context = NULL;
  92.     }
  93.     m_nWidth  = nWidth;
  94.     m_nHeight = nHeight;
  95.     
  96.     //XXXgwright must be even and 2 or larger.
  97.     HX_ASSERT( m_nAAScale>=2 );
  98.     HX_ASSERT( m_nAAScale%2 == 0 );
  99.     
  100.     //Init the AA
  101.     m_hardware_params.width     = nWidth/m_nAAScale;
  102.     m_hardware_params.height    = nHeight/(m_nAAScale*2);
  103.     m_hardware_params.font      = &aa_font16;
  104.     m_hardware_params.supported =
  105.         AA_NORMAL_MASK | AA_BOLD_MASK | AA_DIM_MASK | AA_EXTENDED;
  106.     //Init the context.
  107.     m_context = aa_autoinit(&m_hardware_params);
  108.     HX_ASSERT( m_context );
  109.     //Init the keyboard.
  110.     aa_autoinitkbd(m_context, 0);
  111.     //Allocate.
  112. aa_resize(m_context);
  113.     return HXR_OK;
  114. }
  115.          
  116. HX_RESULT CMiniUnixSurface::_LockDestBuffer(UCHAR** ppDestPtr,
  117.                                             LONG32* pnDestPitch,
  118.                                             int& cid,
  119.                                             REF(HXxSize) srcSize,
  120.                                             int nIndex)
  121. {
  122.     *ppDestPtr   = aa_image(m_context);
  123.     *pnDestPitch = aa_imgwidth(m_context);
  124.     cid = CID_RGB8;
  125.     
  126.     return HXR_OK;
  127. }
  128.          
  129. HX_RESULT CMiniUnixSurface::_TransferToDestBuffer(UCHAR* pSrcBuffer,
  130.                                                   HXBitmapInfoHeader* pBitmapInfo,
  131.                                                   HXxRect* prSrcRect,
  132.                                                   HXxRect* prDstRect,
  133.                                                   UCHAR* pDstBuffer,
  134.                                                   LONG32 nDstPitch)
  135. {
  136.     BOOL bRecreateSurface = FALSE;
  137.     int key       = 0;
  138.     HX_RESULT res = HXR_OK;
  139.     int nCidIn    = m_pImageHelper->GetBitmapColor( (HXBitmapInfo*)pBitmapInfo );
  140.     //The input has to be a planar YUV format because I just use the lum
  141.     //plane as the 8-bit greyscale and I don't do any color convertions.
  142.     //It would be good to make a full-site version of this AA site. That
  143.     //way we would already have the code to do all the color conversions
  144.     //from any incoming format (YUY2, RGB, etc) to our 8-bit grey scale.
  145.     //But for now, I am just assuming that whatever renderer is being used
  146.     //is outputing in I420.
  147.     HX_ASSERT( nCidIn == CID_I420 );
  148.     if( nCidIn == CID_I420 )
  149.     {
  150.         //Try a little c loop to convert to grey scale. It would be
  151.         //nice to use our fast color coverters for this. We will just
  152.         //use the lum plain as a greyscale image and do scaling
  153.         //here. If we can get the above color coverters working then I
  154.         //think the picture would look a lot better because it would
  155.         //be using some of the color info.
  156.         int nSrcPitch = m_pImageHelper->GetBitmapPitch((HXBitmapInfo*)pBitmapInfo);
  157.         UCHAR* pDestBuff = aa_image(m_context);
  158.         UCHAR* pSrcBuff = pSrcBuffer;
  159.         
  160.         for( int y=0; y<aa_imgheight(m_context); y++)
  161.         {
  162.             //We are just going to throw away each row.
  163.             for( int x=0; x<aa_imgwidth(m_context); x++ )
  164.             {
  165.                 int t = 0;
  166.                 int z = 0;
  167.                 for( ; z<m_nAAScale/2 ; z++ )
  168.                 {
  169.                     t += *pSrcBuff;
  170.                     pSrcBuff++;
  171.                 }
  172.                 *pDestBuff = t/z;
  173.                 pDestBuff++;
  174.             }
  175.             pSrcBuff = pSrcBuffer+(y*m_nAAScale*nSrcPitch);
  176.         }
  177.         key = aa_getkey( m_context, 0 );
  178.         switch( key )
  179.         {
  180.            case 'c':
  181.                m_render_params.contrast--;
  182.                break;
  183.            case 'C':
  184.                m_render_params.contrast++;
  185.                break;
  186.            case 'b':
  187.                m_render_params.bright--;
  188.                break;
  189.            case 'B':
  190.                m_render_params.bright++;
  191.                break;
  192.            case 'g':
  193.                m_render_params.gamma-=.5;
  194.                break;
  195.            case 'G':
  196.                m_render_params.gamma+=.5;
  197.                break;
  198.            case 'S':
  199.                m_nAAScale+= 2;
  200.                bRecreateSurface=TRUE;
  201.                break;
  202.            case 's':
  203.                m_nAAScale-=2;
  204.                if( m_nAAScale<2)
  205.                    m_nAAScale=2;
  206.                bRecreateSurface=TRUE;
  207.                break;
  208.            default:
  209.                break;
  210.         }
  211.         
  212.         if( bRecreateSurface )
  213.         {
  214.             //User changed the scale. We have to tear down our window and
  215.             //rebuild it.
  216.             int n = 0;
  217.             _CreateDestBuffer( CID_I420, m_nWidth, m_nHeight, n );
  218.         }
  219.         
  220. #if defined( _DEBUG)
  221.         if( key != 0 )
  222.         {
  223.             fprintf( stderr, "Scale: %d Gamma: %f   Brightness: %d   Contrast: %dn",
  224.                      m_nAAScale,
  225.                      m_render_params.gamma,
  226.                      m_render_params.bright,
  227.                      m_render_params.contrast);
  228.         }
  229. #endif  
  230.         
  231.         aa_render( m_context,
  232.                    &m_render_params,
  233.                    0, 0,
  234.                    aa_imgwidth(m_context),
  235.                    aa_imgheight(m_context)
  236.                    );
  237.     }
  238.     else
  239.     {
  240.         fprintf( stderr, "You need to play content that outputs in I420.n" );
  241.         fprintf( stderr, "Like RealVideo for example.n" ); 
  242.     }
  243.     
  244.  
  245.     return res;
  246. }
  247.          
  248. HX_RESULT CMiniUnixSurface::_UnlockDestBuffer(UCHAR* pSurfPtr, int nIndex=0)
  249. {
  250.     return HXR_OK;
  251. }
  252.          
  253. HX_RESULT CMiniUnixSurface::_RenderDestBuffer(HXxRect* prSrcRect,
  254.                                               HXxRect* prDestRect,
  255.                                               int nIndex)
  256. {
  257.     aa_flush(m_context);
  258.     return HXR_OK;
  259. }
  260.          
  261. HX_RESULT CMiniUnixSurface::_DestroyDestBuffer(int cid, int nCount)
  262. {
  263.     if( m_context )
  264.     {
  265.         aa_close(m_context);
  266.         m_context = NULL;
  267.     }
  268.     return HXR_OK;
  269. }
  270. int CMiniUnixSurface::GetDstCID(int nIndex)
  271. {
  272.     //XXXgwright This can be anything because I just grab the lum plane
  273.     //from the incoming I420 frames and use that as my 8bit greyscale.
  274.     return CID_RGB32;
  275. }
  276. HX_RESULT CMiniUnixSurface::_ResizeVideoBuffer( INT32 nSize)
  277. {
  278.     return HXR_OK;
  279. }
  280. HX_RESULT CMiniUnixSurface::_init()
  281. {
  282.     return HXR_OK;
  283. }