maasurf.cpp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:11k
源码类别:

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: maasurf.cpp,v 1.5.12.1 2004/07/09 01:59:14 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. // Here is a little site I did as an example of a replacement site. It
  50. // shows how you can tailor the mini site to output to just about any
  51. // kind of device. This one outputs all the RGB and video in Ascii Art! 
  52. // :) It is just a wrapper, basically, around the very nice AALib,
  53. // which you need to have installed:
  54. //    http://aa-project.sourceforge.net/aalib
  55. //
  56. #include <aalib.h>
  57. #include "minisite.h"
  58. #include "hxvsurf.h"
  59. #include "coloracc.h"
  60. #include "minisurf.h"
  61. #include "maasurf.h"
  62. #include "minifmt.h"
  63. CMiniUnixSurface::CMiniUnixSurface(IUnknown* pContext, CMiniBaseSite* pSite)
  64.     :  CMiniBaseSurface(pContext, pSite)
  65.        , m_context(NULL)
  66.        , m_nAAScale(2)
  67.        , m_nWidth(0)
  68.        , m_nHeight(0)
  69. {
  70.     memset( &m_hardware_params, 0, sizeof(m_hardware_params) );
  71.     memset( &m_hardware_params, 0, sizeof(m_hardware_params) );
  72.     //Init the rendering params...
  73.     m_render_params.bright    = 40;
  74. m_render_params.contrast  = 2;
  75. m_render_params.gamma     = 4;
  76. m_render_params.dither    = AA_FLOYD_S;
  77. m_render_params.inversion = 0;
  78. m_render_params.randomval = 0;
  79.     //Just output a little help text.
  80.     fprintf( stderr, "nnThe Ascii Art player!nn" );
  81.     fprintf( stderr, "This site takes keyboard input to control the contrastn" );
  82.     fprintf( stderr, "brightness and gamma settings. You will need these to n" );
  83.     fprintf( stderr, "adjust for movies that are overly dark or bright:nn" );
  84.     fprintf( stderr, "'G'/'g' increase/decrease gamma.n" );
  85.     fprintf( stderr, "'B'/'b' increase/decrease brightness.n" );
  86.     fprintf( stderr, "'C'/'c' increase/decrease contrast.n" ); 
  87.     fprintf( stderr, "'S'/'s' increase/decrease scaling.nn" );
  88.     fprintf( stderr, "n" ); 
  89. }
  90. CMiniUnixSurface::~CMiniUnixSurface()
  91. {
  92. }
  93. HX_RESULT CMiniUnixSurface::_CreateDestBuffer(int cidIn,
  94.                                               int nWidth,
  95.                                               int nHeight,
  96.                                               int& nCount)
  97. {
  98.     HX_ASSERT( m_pSite );
  99.     
  100.     //For now, we just support RGB32
  101.     HX_ASSERT( cidIn == CID_I420 );
  102.     if( m_context )
  103.     {
  104.         aa_close(m_context);
  105.         m_context = NULL;
  106.     }
  107.     m_nWidth  = nWidth;
  108.     m_nHeight = nHeight;
  109.     
  110.     //XXXgwright must be even and 2 or larger.
  111.     HX_ASSERT( m_nAAScale>=2 );
  112.     HX_ASSERT( m_nAAScale%2 == 0 );
  113.     
  114.     //Init the AA
  115.     m_hardware_params.width     = nWidth/m_nAAScale;
  116.     m_hardware_params.height    = nHeight/(m_nAAScale*2);
  117.     m_hardware_params.font      = &aa_font16;
  118.     m_hardware_params.supported =
  119.         AA_NORMAL_MASK | AA_BOLD_MASK | AA_DIM_MASK | AA_EXTENDED;
  120.     //Init the context.
  121.     m_context = aa_autoinit(&m_hardware_params);
  122.     HX_ASSERT( m_context );
  123.     //Init the keyboard.
  124.     aa_autoinitkbd(m_context, 0);
  125.     //Allocate.
  126. aa_resize(m_context);
  127.     return HXR_OK;
  128. }
  129.          
  130. HX_RESULT CMiniUnixSurface::_LockDestBuffer(UCHAR** ppDestPtr,
  131.                                             LONG32* pnDestPitch,
  132.                                             int& cid,
  133.                                             REF(HXxSize) srcSize,
  134.                                             int nIndex)
  135. {
  136.     *ppDestPtr   = aa_image(m_context);
  137.     *pnDestPitch = aa_imgwidth(m_context);
  138.     cid = CID_RGB8;
  139.     
  140.     return HXR_OK;
  141. }
  142.          
  143. HX_RESULT CMiniUnixSurface::_TransferToDestBuffer(UCHAR* pSrcBuffer,
  144.                                                   HXBitmapInfoHeader* pBitmapInfo,
  145.                                                   HXxRect* prSrcRect,
  146.                                                   HXxRect* prDstRect,
  147.                                                   UCHAR* pDstBuffer,
  148.                                                   LONG32 nDstPitch)
  149. {
  150.     BOOL bRecreateSurface = FALSE;
  151.     int key       = 0;
  152.     HX_RESULT res = HXR_OK;
  153.     int nCidIn    = m_pImageHelper->GetBitmapColor( (HXBitmapInfo*)pBitmapInfo );
  154.     //The input has to be a planar YUV format because I just use the lum
  155.     //plane as the 8-bit greyscale and I don't do any color convertions.
  156.     //It would be good to make a full-site version of this AA site. That
  157.     //way we would already have the code to do all the color conversions
  158.     //from any incoming format (YUY2, RGB, etc) to our 8-bit grey scale.
  159.     //But for now, I am just assuming that whatever renderer is being used
  160.     //is outputing in I420.
  161.     HX_ASSERT( nCidIn == CID_I420 );
  162.     if( nCidIn == CID_I420 )
  163.     {
  164.         //Try a little c loop to convert to grey scale. It would be
  165.         //nice to use our fast color coverters for this. We will just
  166.         //use the lum plain as a greyscale image and do scaling
  167.         //here. If we can get the above color coverters working then I
  168.         //think the picture would look a lot better because it would
  169.         //be using some of the color info.
  170.         int nSrcPitch = m_pImageHelper->GetBitmapPitch((HXBitmapInfo*)pBitmapInfo);
  171.         UCHAR* pDestBuff = aa_image(m_context);
  172.         UCHAR* pSrcBuff = pSrcBuffer;
  173.         
  174.         for( int y=0; y<aa_imgheight(m_context); y++)
  175.         {
  176.             //We are just going to throw away each row.
  177.             for( int x=0; x<aa_imgwidth(m_context); x++ )
  178.             {
  179.                 int t = 0;
  180.                 int z = 0;
  181.                 for( ; z<m_nAAScale/2 ; z++ )
  182.                 {
  183.                     t += *pSrcBuff;
  184.                     pSrcBuff++;
  185.                 }
  186.                 *pDestBuff = t/z;
  187.                 pDestBuff++;
  188.             }
  189.             pSrcBuff = pSrcBuffer+(y*m_nAAScale*nSrcPitch);
  190.         }
  191.         key = aa_getkey( m_context, 0 );
  192.         switch( key )
  193.         {
  194.            case 'c':
  195.                m_render_params.contrast--;
  196.                break;
  197.            case 'C':
  198.                m_render_params.contrast++;
  199.                break;
  200.            case 'b':
  201.                m_render_params.bright--;
  202.                break;
  203.            case 'B':
  204.                m_render_params.bright++;
  205.                break;
  206.            case 'g':
  207.                m_render_params.gamma-=.5;
  208.                break;
  209.            case 'G':
  210.                m_render_params.gamma+=.5;
  211.                break;
  212.            case 'S':
  213.                m_nAAScale+= 2;
  214.                bRecreateSurface=TRUE;
  215.                break;
  216.            case 's':
  217.                m_nAAScale-=2;
  218.                if( m_nAAScale<2)
  219.                    m_nAAScale=2;
  220.                bRecreateSurface=TRUE;
  221.                break;
  222.            default:
  223.                break;
  224.         }
  225.         
  226.         if( bRecreateSurface )
  227.         {
  228.             //User changed the scale. We have to tear down our window and
  229.             //rebuild it.
  230.             int n = 0;
  231.             _CreateDestBuffer( CID_I420, m_nWidth, m_nHeight, n );
  232.         }
  233.         
  234. #if defined( _DEBUG)
  235.         if( key != 0 )
  236.         {
  237.             fprintf( stderr, "Scale: %d Gamma: %f   Brightness: %d   Contrast: %dn",
  238.                      m_nAAScale,
  239.                      m_render_params.gamma,
  240.                      m_render_params.bright,
  241.                      m_render_params.contrast);
  242.         }
  243. #endif  
  244.         
  245.         aa_render( m_context,
  246.                    &m_render_params,
  247.                    0, 0,
  248.                    aa_imgwidth(m_context),
  249.                    aa_imgheight(m_context)
  250.                    );
  251.     }
  252.     else
  253.     {
  254.         fprintf( stderr, "You need to play content that outputs in I420.n" );
  255.         fprintf( stderr, "Like RealVideo for example.n" ); 
  256.     }
  257.     
  258.  
  259.     return res;
  260. }
  261.          
  262. HX_RESULT CMiniUnixSurface::_UnlockDestBuffer(UCHAR* pSurfPtr, int nIndex=0)
  263. {
  264.     return HXR_OK;
  265. }
  266.          
  267. HX_RESULT CMiniUnixSurface::_RenderDestBuffer(HXxRect* prSrcRect,
  268.                                               HXxRect* prDestRect,
  269.                                               int nIndex)
  270. {
  271.     aa_flush(m_context);
  272.     return HXR_OK;
  273. }
  274.          
  275. HX_RESULT CMiniUnixSurface::_DestroyDestBuffer(int cid, int nCount)
  276. {
  277.     if( m_context )
  278.     {
  279.         aa_close(m_context);
  280.         m_context = NULL;
  281.     }
  282.     return HXR_OK;
  283. }
  284. int CMiniUnixSurface::GetDstCID(int nIndex)
  285. {
  286.     //XXXgwright This can be anything because I just grab the lum plane
  287.     //from the incoming I420 frames and use that as my 8bit greyscale.
  288.     return CID_RGB32;
  289. }
  290. HX_RESULT CMiniUnixSurface::_ResizeVideoBuffer( INT32 nSize)
  291. {
  292.     return HXR_OK;
  293. }
  294. HX_RESULT CMiniUnixSurface::_init()
  295. {
  296.     return HXR_OK;
  297. }