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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: surface.cpp,v 1.4.4.1 2004/07/09 01:59:28 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. #include "hxcom.h"
  50. #include "hxtypes.h"
  51. #include "hxmtypes.h"
  52. #include "hxwintyp.h"
  53. #include "chxxtype.h"
  54. #include "hxwin.h"
  55. #include "hxengin.h"
  56. #include "hxcodec.h"
  57. #include "hxalloc.h"
  58. #ifdef _WINDOWS
  59. #include "diballoc.h"
  60. #ifdef _WIN32
  61. #include <vfw.h>
  62. #else
  63. #include <drawdib.h>
  64. #endif // _WIN32
  65. #endif // _WINDOWS
  66. //#include "color.h"
  67. #include "coloracc.h"
  68. #include "hxcolor.h"
  69. #include "hxvctrl.h"
  70. #include "hxvsurf.h"
  71. #include "hxsite2.h"
  72. #include "ihxpckts.h"
  73. #include "surface.h"
  74. #include "vidosurf.h"
  75. #ifdef _WIN32
  76. #include "fullsurf.h"
  77. #endif // _WIN32
  78. #include "sitewnd.h"
  79. #include "mmx_util.h"
  80. #ifndef WIDTHBYTES
  81. #define WIDTHBYTES(i)           ((unsigned long)((i+31)&(~31))/8)
  82. #endif
  83. #include "dbgtimer.h" // for blit time debugging
  84. #include "hxheap.h"
  85. #ifdef _DEBUG
  86. #undef HX_THIS_FILE
  87. static const char HX_THIS_FILE[] = __FILE__;
  88. #endif
  89. CHXSurface::CHXSurface(IUnknown* pContext, CHXSiteWindowed* pSite)
  90.     : m_lRefCount(0)
  91.     , m_pContext(pContext)
  92.     , m_pConverter(NULL)
  93.     , m_Brightness((float) DEF_BRIGHTNESS)
  94.     , m_Contrast((float) DEF_CONTRAST)
  95.     , m_Saturation((float) DEF_SATURATION)
  96.     , m_Hue((float) DEF_HUE)
  97.     , m_Sharpness((float) DEF_SHARPNESS)
  98.     , m_PrevBrightness((float) MAX_BRIGHTNESS)
  99.     , m_PrevContrast((float) MAX_CONTRAST)
  100.     , m_PrevSaturation((float) MAX_SATURATION)
  101.     , m_PrevSharpness((float) MAX_SHARPNESS)
  102.     , m_PrevHue((float) MAX_HUE)
  103.     , m_pSite(pSite)
  104.     , m_PreferredFormat(HXCOLOR_RGB3_ID)
  105.     , m_nBitDepth(32)
  106. {
  107.     if (pContext)
  108.     {
  109. pContext->AddRef();
  110.     }
  111. #ifndef _WIN16
  112.     // Load color conversion library
  113.     m_pConverter = new ColorFuncAccess(m_pContext);
  114.     HX_ASSERT(m_pConverter);
  115.     if (!m_pConverter)
  116.     {
  117.        return;
  118.     }
  119.     m_pConverter->InitColorConverter();
  120. #endif /* _WIN16 */
  121. }
  122. CHXSurface::~CHXSurface()
  123. {
  124. #ifndef _WIN16
  125.     if (m_pConverter)
  126.     {
  127. delete m_pConverter;
  128. m_pConverter = NULL;
  129.     }
  130. #endif /* _WIN16 */
  131.     HX_RELEASE(m_pContext);
  132. }
  133. // *** IUnknown methods ***
  134. /////////////////////////////////////////////////////////////////////////
  135. //  Method:
  136. //      IUnknown::QueryInterface
  137. //  Purpose:
  138. //      Implement this to export the interfaces supported by your
  139. //      object.
  140. //
  141. STDMETHODIMP
  142. CHXSurface::QueryInterface(REFIID riid, void** ppvObj)
  143. {
  144.     QInterfaceList qiList[] =
  145.     {
  146. { GET_IIDHANDLE(IID_IUnknown), this },
  147. { GET_IIDHANDLE(IID_IHXVideoSurface), (IHXVideoSurface*) this },
  148. { GET_IIDHANDLE(IID_IHXVideoControl), (IHXVideoControl*) this },
  149.     };
  150.     return ::QIFind(qiList, QILISTSIZE(qiList), riid, ppvObj);
  151. }
  152. /////////////////////////////////////////////////////////////////////////
  153. //  Method:
  154. //      IUnknown::AddRef
  155. //  Purpose:
  156. //      Everyone usually implements this the same... feel free to use
  157. //      this implementation.
  158. //
  159. STDMETHODIMP_(ULONG32)
  160. CHXSurface::AddRef()
  161. {
  162.     return InterlockedIncrement(&m_lRefCount);
  163. }
  164. /////////////////////////////////////////////////////////////////////////
  165. //  Method:
  166. //      IUnknown::Release
  167. //  Purpose:
  168. //      Everyone usually implements this the same... feel free to use
  169. //      this implementation.
  170. //
  171. STDMETHODIMP_(ULONG32)
  172. CHXSurface::Release()
  173. {
  174.     if (InterlockedDecrement(&m_lRefCount) > 0)
  175.     {
  176. return m_lRefCount;
  177.     }
  178.     delete this;
  179.     return 0;
  180. }
  181. STDMETHODIMP
  182. CHXSurface::Blt(UCHAR* pImageData,
  183.  HXBitmapInfoHeader* pBitmapInfo,
  184.  REF(HXxRect) inDestRect,
  185.  REF(HXxRect) inSrcRect)
  186. {
  187.     //DebugTimer timer("CHXSurface::Blt");
  188.     #ifdef XXXBHG_TRACE_CODE
  189.     char szOut[256]; /* Flawfinder: ignore */
  190.     sprintf(szOut,"CHXSurface::Blt(%lx Dest[%d,%d,%d,%d] Src[%d,%d,%d,%d])rn",this, /* Flawfinder: ignore */
  191.     inDestRect.left,inDestRect.top,inDestRect.right,inDestRect.bottom,
  192.     inSrcRect.left,inSrcRect.top,inSrcRect.right,inSrcRect.bottom
  193.     );
  194.     OutputDebugString(szOut);
  195.     #endif
  196.     HX_RESULT hr = HXR_OK;
  197.     UCHAR* pNewImageData = NULL;
  198.     HXBitmapInfoHeader* pNewBitmapInfo = NULL;
  199.     BOOL bInterpolate = FALSE;
  200.     CHXxRect rDestRect = inDestRect;
  201.     CHXxRect rSrcRect = inSrcRect;
  202.     INT32 ulOldWidth = rSrcRect.Width();
  203.     INT32 ulOldHeight = rSrcRect.Height();
  204.     INT32 ulNewWidth = ulOldWidth;
  205.     INT32 ulNewHeight = ulOldHeight;
  206. // This whole segment of code will be removed once we implement Yuriy's
  207. // color converters for all Windows builds.
  208. #ifndef _MACINTOSH
  209.     // Convert the data from YUV if necessary
  210.     if (pBitmapInfo->biCompression == HXCOLOR_YUV420_ID)
  211.     {
  212. UCHAR*   uBase = pImageData + (pBitmapInfo->biWidth * pBitmapInfo->biHeight);
  213. UCHAR*   vBase = uBase + ((pBitmapInfo->biWidth * pBitmapInfo->biHeight) / 4);
  214. INT32   ulYOffset = (rSrcRect.top * pBitmapInfo->biWidth) + rSrcRect.left;
  215. INT32   ulUVOffset = ((pBitmapInfo->biWidth * rSrcRect.top) / 4) + (rSrcRect.left / 2);
  216. UCHAR*   ySrc = pImageData + ulYOffset;
  217. UCHAR*   uSrc = uBase + ulUVOffset;
  218. UCHAR*   vSrc = vBase + ulUVOffset;
  219. INT32   ulSrcPitch = pBitmapInfo->biWidth;
  220. #ifdef _MACINTOSH
  221. INT32   ulDstPitch = rSrcRect.Width();
  222. #else
  223. INT32   ulDstPitch = -rSrcRect.Width();
  224. #endif
  225. UINT16   nNewBitDepth = CalculateNewBitDepth(m_PreferredFormat);
  226. INT32   ulSizeImage = WIDTHBYTES((rSrcRect.Width() * nNewBitDepth) * rSrcRect.Height());
  227. bInterpolate = ((rSrcRect.Width()*2 == rDestRect.Width()) &&
  228.   (rSrcRect.Height()*2 == rDestRect.Height()));
  229. if (bInterpolate)
  230. {
  231.     #ifdef XXXBHG_TRACE_CODE
  232.     OutputDebugString("let's interpolate!rn");
  233.     #endif
  234.     ulNewWidth  = rDestRect.Width();
  235.     ulNewHeight = rDestRect.Height();
  236.     ulSizeImage = WIDTHBYTES((rDestRect.Width() * nNewBitDepth) * rDestRect.Height());
  237. #ifdef _MACINTOSH
  238.     ulDstPitch = rDestRect.Width();
  239. #else
  240.     ulDstPitch = -rDestRect.Width();
  241. #endif
  242. }
  243. pNewBitmapInfo = new HXBitmapInfoHeader();
  244. pNewImageData  = new UCHAR[ulSizeImage];
  245. memcpy(pNewBitmapInfo, pBitmapInfo, sizeof(HXBitmapInfoHeader)); /* Flawfinder: ignore */
  246. #ifdef XXXBHG_TRACE_CODE
  247. OutputDebugString("color conversion!rn");
  248. #endif
  249. // Actually convert the data to RGB format
  250. PerformYUVConversion(ySrc, uSrc, vSrc, ulSrcPitch, pNewImageData,
  251.      rSrcRect.Width(), rSrcRect.Height(),
  252.      ulDstPitch, m_PreferredFormat, bInterpolate);
  253. // Adjust bitmap info header to account for conversion
  254. pNewBitmapInfo->biWidth  = ulNewWidth;
  255. pNewBitmapInfo->biHeight = ulNewHeight;
  256. pNewBitmapInfo->biSizeImage = ulSizeImage;
  257. AdjustBitmapHeader(pNewBitmapInfo, m_PreferredFormat);
  258. //Reset the src rect's origin so BltImageToDC() can go ahead and
  259. // honor the source rect passed to it when calling DrawDibDraw(),
  260. // SetDIBitsToDevice(), and StretchDIBits():
  261. rSrcRect.left = 0;
  262. rSrcRect.top = 0;
  263. rSrcRect.right = ulNewWidth;
  264. rSrcRect.bottom = ulNewHeight;
  265. // Use the new data instead of that which was passed in
  266. pBitmapInfo = pNewBitmapInfo;
  267. pImageData  = pNewImageData;
  268.     }
  269.     else if (pBitmapInfo->biCompression == HXCOLOR_RGB3_ID   ||
  270.      pBitmapInfo->biCompression == HXCOLOR_RGB555_ID ||
  271.      pBitmapInfo->biCompression == HXCOLOR_RGB565_ID ||
  272.      pBitmapInfo->biCompression == HXCOLOR_RGB24_ID)
  273.     {
  274. pNewBitmapInfo = new HXBitmapInfoHeader();
  275. memcpy(pNewBitmapInfo, pBitmapInfo, sizeof(HXBitmapInfoHeader)); /* Flawfinder: ignore */
  276. AdjustBitmapHeader(pNewBitmapInfo, pNewBitmapInfo->biCompression);
  277. // Use the new data instead of that which was passed in
  278. pBitmapInfo = pNewBitmapInfo;
  279.     }
  280.     if (bInterpolate)
  281.     {
  282. // we also need to fake out the source size so things don't stretch
  283. // further down the road.
  284. rSrcRect.right  = rSrcRect.left + ulNewWidth;
  285. rSrcRect.bottom = rSrcRect.top  + ulNewHeight;
  286.     }
  287. #endif
  288.     // Call the platform dependent blitter
  289.     hr = BltImage(pImageData, pBitmapInfo, rDestRect, rSrcRect);
  290.     if (bInterpolate)
  291.     {
  292. // we need to adjust back from our previous fake out
  293. // so things don't freak out even more further down the road.
  294. rSrcRect.right  = rSrcRect.left + ulOldWidth;
  295. rSrcRect.bottom = rSrcRect.top  + ulOldHeight;
  296.     }
  297.     if (pNewImageData)
  298.     {
  299. delete []pNewImageData;
  300. pNewImageData = NULL;
  301.     }
  302.     if (pNewBitmapInfo)
  303.     {
  304. delete pNewBitmapInfo;
  305. pNewBitmapInfo = NULL;
  306.     }
  307.     return hr;
  308. }
  309. STDMETHODIMP
  310. CHXSurface::BeginOptimizedBlt(HXBitmapInfoHeader* pBitmapInfo)
  311. {
  312.     // Check for a bad header
  313.     HX_ASSERT(pBitmapInfo);
  314.     HX_ASSERT(pBitmapInfo->biSizeImage >= (pBitmapInfo->biWidth *
  315. pBitmapInfo->biBitCount * pBitmapInfo->biHeight)/8);
  316.     if (!pBitmapInfo)
  317.     {
  318. return HXR_FAIL;
  319.     }
  320.     if (pBitmapInfo->biCompression == HX_RGB     ||
  321. pBitmapInfo->biCompression == HX_BITFIELDS ||
  322. pBitmapInfo->biCompression == HXCOLOR_RGB3_ID   ||
  323. pBitmapInfo->biCompression == HXCOLOR_RGB555_ID ||
  324. pBitmapInfo->biCompression == HXCOLOR_RGB565_ID ||
  325. pBitmapInfo->biCompression == HXCOLOR_RGB24_ID  ||
  326. pBitmapInfo->biCompression == HXCOLOR_8BIT_ID   ||
  327. pBitmapInfo->biCompression == HXCOLOR_YUV420_ID)
  328.     {
  329. m_pSite->SetOptimizedFormat(pBitmapInfo);
  330. return HXR_OK;
  331.     }
  332.     return HXR_FAIL;
  333. }
  334. STDMETHODIMP
  335. CHXSurface::OptimizedBlt(UCHAR* pImageBits,
  336.   REF(HXxRect) rDestRect,
  337.   REF(HXxRect) rSrcRect)
  338. {
  339.     //DebugTimer timer("CHXSurface::OptimizedBlt");
  340.     HXBitmapInfoHeader* pOptimizedFormat = m_pSite->GetOptimizedFormat();
  341.     HX_ASSERT(pOptimizedFormat);
  342.     if (!pOptimizedFormat)
  343.     {
  344. return HXR_UNEXPECTED;
  345.     }
  346.     return Blt(pImageBits, pOptimizedFormat, rDestRect, rSrcRect);
  347. }
  348. STDMETHODIMP
  349. CHXSurface::EndOptimizedBlt(void)
  350. {
  351.     HXBitmapInfoHeader* pOptimizedFormat = m_pSite->GetOptimizedFormat();
  352.     HX_ASSERT(pOptimizedFormat);
  353.     if (!pOptimizedFormat)
  354.     {
  355. return HXR_UNEXPECTED;
  356.     }
  357.     m_pSite->SetOptimizedFormat(NULL);
  358.     return HXR_OK;
  359. }
  360. STDMETHODIMP
  361. CHXSurface::GetOptimizedFormat(REF(HX_COMPRESSION_TYPE) ulType)
  362. {
  363.     HXBitmapInfoHeader* pOptimizedFormat = m_pSite->GetOptimizedFormat();
  364.     if (!pOptimizedFormat)
  365.     {
  366. return HXR_FAIL;
  367.     }
  368.     ulType = pOptimizedFormat->biCompression;
  369.     return HXR_OK;
  370. }
  371. STDMETHODIMP
  372. CHXSurface::GetPreferredFormat(REF(HX_COMPRESSION_TYPE) ulType)
  373. {
  374.     ulType = m_PreferredFormat;
  375.     return HXR_OK;
  376. }
  377. /*
  378.  * IHXVideoControls methods
  379.  */
  380. STDMETHODIMP_(float)
  381. CHXSurface::GetBrightness(void)
  382. {
  383.     return m_Brightness;
  384. }
  385. STDMETHODIMP
  386. CHXSurface::SetBrightness(float Brightness)
  387. {
  388.     if (Brightness > MAX_BRIGHTNESS)
  389.     {
  390. m_Brightness = (float) MAX_BRIGHTNESS;
  391.     }
  392.     else if (Brightness < MIN_BRIGHTNESS)
  393.     {
  394. m_Brightness = (float) MIN_BRIGHTNESS;
  395.     }
  396.     else
  397.     {
  398. m_Brightness = Brightness;
  399.     }
  400.     return HXR_OK;
  401. }
  402. STDMETHODIMP_(float)
  403. CHXSurface::GetContrast(void)
  404. {
  405.     return m_Contrast;
  406. }
  407. STDMETHODIMP
  408. CHXSurface::SetContrast(float Contrast)
  409. {
  410.     if (Contrast > MAX_CONTRAST)
  411.     {
  412. m_Contrast = (float) MAX_CONTRAST;
  413.     }
  414.     else if (Contrast < MIN_CONTRAST)
  415.     {
  416. m_Contrast = (float) MIN_CONTRAST;
  417.     }
  418.     else
  419.     {
  420. m_Contrast = Contrast;
  421.     }
  422.     return HXR_OK;
  423. }
  424. STDMETHODIMP_(float)
  425. CHXSurface::GetSaturation(void)
  426. {
  427.     return m_Saturation;
  428. }
  429. STDMETHODIMP
  430. CHXSurface::SetSaturation(float Saturation)
  431. {
  432.     if (Saturation > MAX_SATURATION)
  433.     {
  434. m_Saturation = (float) MAX_SATURATION;
  435.     }
  436.     else if (Saturation < MIN_SATURATION)
  437.     {
  438. m_Saturation = (float) MIN_SATURATION;
  439.     }
  440.     else
  441.     {
  442. m_Saturation = Saturation;
  443.     }
  444.     return HXR_OK;
  445. }
  446. STDMETHODIMP_(float)
  447. CHXSurface::GetHue(void)
  448. {
  449.     return m_Hue;
  450. }
  451. STDMETHODIMP
  452. CHXSurface::SetHue(float Hue)
  453. {
  454.     if (Hue > MAX_HUE)
  455.     {
  456. m_Hue = (float) MAX_HUE;
  457.     }
  458.     else if (Hue < MIN_HUE)
  459.     {
  460. m_Hue = (float) MIN_HUE;
  461.     }
  462.     else
  463.     {
  464. m_Hue = Hue;
  465.     }
  466.     return HXR_OK;
  467. }
  468. STDMETHODIMP_(float)
  469. CHXSurface::GetSharpness(void)
  470. {
  471.     return m_Sharpness;
  472. }
  473. STDMETHODIMP
  474. CHXSurface::SetSharpness(float Sharpness)
  475. {
  476.     if (Sharpness > MAX_SHARPNESS)
  477.     {
  478. m_Sharpness = (float) MAX_SHARPNESS;
  479.     }
  480.     else if (Sharpness < MIN_SHARPNESS)
  481.     {
  482. m_Sharpness = (float) MIN_SHARPNESS;
  483.     }
  484.     else
  485.     {
  486. m_Sharpness = Sharpness;
  487.     }
  488.     return HXR_OK;
  489. }
  490. STDMETHODIMP
  491. CHXSurface::SetModeSharpness(UINT16 dFlag)
  492. {
  493.     //set m_ModeSharpness =1 when deblocking filter is on
  494.     //set m_ModeSharpness =0 when deblocking filter is off
  495.     //find the deblocking filter on/off by getstreampreoperty
  496.     m_ModeSharpness=dFlag;
  497.     return HXR_OK;
  498. }
  499. void
  500. CHXSurface::PerformYUVConversion(UCHAR* ySrc,
  501.   UCHAR* uSrc,
  502.   UCHAR* vSrc,
  503.   INT32  nPitchSrc,
  504.   UCHAR* Dst,
  505.   INT32  nWidth,
  506.   INT32  nHeight,
  507.   INT32  nPitchDst,
  508.   HX_MOFTAG Format,
  509.   INT16  nExpand)
  510. {
  511.     INT16 nNewFormat = 0;
  512.     if (Format == HXCOLOR_RGB3_ID)
  513.     {
  514. nNewFormat = T_RGB888;
  515.     }
  516.     else if (Format == HXCOLOR_RGB565_ID)
  517.     {
  518. nNewFormat = T_RGB565;
  519.     }
  520.     else if (Format == HXCOLOR_RGB555_ID)
  521.     {
  522. nNewFormat = T_RGB555;
  523.     }
  524.     else
  525.     {
  526. HX_ASSERT(0); // Invalid format
  527.     }
  528.     // We only need to Set the Color Adjustments if they've changed
  529.     if (CheckColorSettings())
  530.     {
  531. // Adjust colors according to video control settings
  532. m_pConverter->SetColorAdjustments(m_Brightness, m_Contrast, m_Saturation, m_Hue);
  533. // Reset Previous values so next time we'll know if they've changed
  534. m_PrevBrightness = m_Brightness;
  535. m_PrevContrast  = m_Contrast;
  536. m_PrevSaturation = m_Saturation;
  537. m_PrevHue  = m_Hue;
  538.     }
  539.     // We only need to Set the Color Adjustments if they've changed
  540.     if (CheckSharpness())
  541.     {
  542. // Adjust colors according to video control settings
  543. m_pConverter->SetSharpnessAdjustments(m_Sharpness,nExpand);
  544. // Reset Previous values so next time we'll know if they've changed
  545. m_PrevSharpness = m_Sharpness;
  546.    }
  547.     if (ySrc[0] != 1)
  548.     {
  549. //if Sharpness is -1.0 (or close) do not do any edge enhancement
  550. //check necessary because intel mmx edge enhacement does not check this
  551. if( (m_Sharpness+1.0)>0.1 )
  552. {
  553. if(m_ModeSharpness)
  554. {
  555.     //Deblocking filter is ON
  556.     m_pConverter->EnhanceUniform(ySrc,nHeight,nWidth,nPitchSrc,m_Sharpness);
  557. }
  558. else
  559. {
  560.     //Deblocking filter is OFF
  561.     m_pConverter->Enhance(ySrc,nHeight,nWidth,nPitchSrc,m_Sharpness);
  562. }
  563. }
  564.     }
  565.     else
  566.     {
  567. ySrc[0] = ySrc[1];
  568.     }
  569.     // Execute the conversion
  570.     m_pConverter->ConvertYUVtoRGB(ySrc, uSrc, vSrc, nPitchSrc, Dst, nWidth,
  571. nHeight, nPitchDst, nNewFormat, nExpand);
  572.     //change one corner pixel to put a digital watermark
  573.     ySrc[0] = 1;
  574. }
  575. UINT16
  576. CHXSurface::CheckColorSettings()
  577. {
  578. // NOTE 40 steps of granularity for color control parameters (based on
  579. // below float to int precision; proper rounding is not essential)
  580.     if( (int)(m_PrevBrightness * 20.f) != (int)(m_Brightness * 20.f) ||
  581. (int)(m_PrevContrast * 20.f) != (int)(m_Contrast * 20.f) ||
  582. (int)(m_PrevSaturation * 20.f) != (int)(m_Saturation * 20.f) ||
  583. (int)(m_PrevHue * 20.f) != (int)(m_Hue * 20.f) )
  584.     {
  585. return 1; // reinitializationing of color table required
  586.     }
  587.     else
  588.     {
  589. return 0; // no change in color controls
  590.     }
  591. }
  592. UINT16
  593. CHXSurface::CheckSharpness()
  594. {
  595. // NOTE 40 steps of granularity for sharpness control parameters (based on
  596. // below float to int precision; proper rounding is not essential)
  597.     if( (int)(m_PrevSharpness * 20.f) != (int)(m_Sharpness * 20.f)  )
  598.     {
  599. return 1; // reinitializationing of sharpness table required
  600.     }
  601.     else
  602.     {
  603. return 0; // no change in sharpness table
  604.     }
  605. }
  606. UINT16
  607. CHXSurface::CalculateNewBitDepth(HX_COMPRESSION_TYPE nNewFormat)
  608. {
  609.     UINT16 nNewBitDepth = 0;
  610.     switch (nNewFormat)
  611.     {
  612. case HXCOLOR_RGB3_ID:
  613. {
  614. #ifdef _MACINTOSH
  615.     nNewBitDepth = 32;
  616. #else
  617.     nNewBitDepth = 24;
  618. #endif
  619. }
  620. break;
  621. case HXCOLOR_RGB24_ID:
  622. {
  623.     nNewBitDepth = 24;
  624. }
  625. break;
  626. #ifdef _WINDOWS
  627. case HXCOLOR_RGB555_ID:
  628. {
  629.     nNewBitDepth = 16;
  630. }
  631. break;
  632. case HXCOLOR_RGB565_ID:
  633. {
  634.     nNewBitDepth = 16;
  635. }
  636. break;
  637. #endif
  638. default:
  639.     HX_ASSERT(0);   // Invalid format
  640.     break;
  641.     }
  642.     return nNewBitDepth;
  643. }
  644. void
  645. CHXSurface::AdjustBitmapHeader(HXBitmapInfoHeader* pBitmapInfo,
  646. HX_MOFTAG NewFormat)
  647. {
  648.     switch (NewFormat)
  649.     {
  650. case HXCOLOR_RGB3_ID:
  651. {
  652. #ifdef _MACINTOSH
  653.     pBitmapInfo->biCompression = HX_RGB;
  654.     pBitmapInfo->biBitCount  = 32;
  655. #else
  656.     pBitmapInfo->biCompression = HX_RGB;
  657.     pBitmapInfo->biBitCount  = 24;
  658. #endif
  659. }
  660. break;
  661. case HXCOLOR_RGB24_ID:
  662. {
  663.     pBitmapInfo->biCompression = HX_RGB;
  664.     pBitmapInfo->biBitCount  = 24;
  665. }
  666. break;
  667. #ifdef _WINDOWS
  668. case HXCOLOR_RGB555_ID:
  669. {
  670.     pBitmapInfo->biCompression = HX_BITFIELDS;
  671.     pBitmapInfo->biBitCount    = 16;
  672.     pBitmapInfo->rcolor =   0x00007C00; // red
  673.     pBitmapInfo->gcolor =   0x000003E0; // green
  674.     pBitmapInfo->bcolor =   0x0000001F; // blue
  675. }
  676. break;
  677. case HXCOLOR_RGB565_ID:
  678. {
  679.     pBitmapInfo->biCompression = HX_BITFIELDS;
  680.     pBitmapInfo->biBitCount    = 16;
  681.     pBitmapInfo->rcolor =    0x0000F800; // red
  682.     pBitmapInfo->gcolor =    0x000007E0; // green
  683.     pBitmapInfo->bcolor =    0x0000001F; // blue
  684. }
  685. break;
  686. #endif
  687. default:
  688.     HX_ASSERT(0);   // Invalid format
  689.     break;
  690.     }
  691. }