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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: macsurf.cpp,v 1.5.20.3 2004/07/09 01:59:02 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. /****************************************************************************
  50.  * 
  51.  *  $Id: macsurf.cpp,v 1.5.20.3 2004/07/09 01:59:02 hubbe Exp $
  52.  *  
  53.  */
  54. #include "hxcom.h"
  55. #include "hxtypes.h"
  56. #include "hxwintyp.h"
  57. #include "hxmap.h"
  58. #include "hxslist.h"
  59. #include "ihxpckts.h"
  60. #include "hxwin.h"
  61. #include "hxengin.h"
  62. #include "hxsite2.h"
  63. #include "chxxtype.h"
  64. #include "hxvctrl.h"
  65. #include "hxvsurf.h"
  66. #include "hxcodec.h"
  67. #include "surface.h"
  68. #include "vidosurf.h"
  69. #include "sitetext.h"
  70. #include "chxpckts.h"
  71. #include "hxevent.h"
  72. #include "bltpatch.h"
  73. #ifndef _MAC_UNIX
  74. #include "hxmm.h"
  75. #endif
  76. #include "hxprefs.h"
  77. #include "hxevent.h"
  78. #include "hxthread.h"
  79. #include "platform/mac/macsurf.h"
  80. #include "platform/mac/macroot.h"
  81. #include "baseroot.h"
  82. #include "basesite.h"
  83. #include "platform/mac/macsite.h"
  84. #include "platform/mac/hx_moreprocesses.h"
  85. #ifndef _MACINTOSH
  86. #ifndef _MAC_UNIX
  87. #error This is the Macintosh platform specific implementation.
  88. #endif
  89. #endif
  90. #include "hxheap.h"
  91. #ifdef _DEBUG
  92. #undef HX_THIS_FILE
  93. static const char HX_THIS_FILE[] = __FILE__;
  94. #endif
  95. CHXSimpleList CMacSurface::zm_SurfaceList;
  96. void* CMacSurface::zm_pOverlayBuf = nil;
  97. long CMacSurface::zm_nOverlayRowBytes = 0;
  98. RgnHandle CMacSurface::zm_OverlayMaskRgn = NULL;
  99. BOOL CMacSurface::zm_bSafeToOverlayBlit = FALSE;
  100. CMacSurface* CMacSurface::zm_pOverlaySurface = nil;
  101. BOOL CMacSurface::zm_bOverlayRequiresKeyColor = FALSE;
  102. BOOL CMacSurface::zm_bOverlayRequiresDrawBand = FALSE;
  103. ImageSequence CMacSurface::zm_SequenceID = NULL;
  104. ImageDescriptionHandle CMacSurface::zm_ImageDescriptionHandle = NULL;
  105. long CMacSurface::zm_nOverlayBufferSize = 0;
  106. void* CMacSurface::zm_pHoldOverlayBuf = NULL;
  107. long CMacSurface::zm_nHoldOverlayBufSize = 0;
  108. #pragma options align=mac68k
  109. struct BogusCodecDecompressParams
  110. {
  111.     CodecDecompressParams decompParams;
  112.     long dummy[100];
  113.     // XXXbobclark
  114.     // sheesh. OK, when ImageCodecNewImageBufferMemory() is
  115.     // called, memory can be corrupted. The address of a
  116.     // CodecDecompressParams is passed to the call, and it
  117.     // pokes memory past the end of the 210-byte structure.
  118.     // I've reproduced this in ATI's YUVSDK as well. ATI
  119.     // insists that it can't be their fault and they don't
  120.     // think it's Apple's fault either. Whatever. Memory
  121.     // is still getting corrupted. By including a bunch of
  122.     // dummy space, that corruption happens in a harmless
  123.     // place. Instead of, like it was doing for weeks, in
  124.     // some random variable that would cause strange behavior
  125.     // and/or crashes at ill-defined times.
  126. };
  127. typedef BogusCodecDecompressParams BogusCodecDecompressParams;
  128. ComponentInstanceRecord *gYUV = nil;
  129. BogusCodecDecompressParams bogusDecompParams;
  130. ImageSubCodecDecompressRecord drp;
  131. #pragma options align=reset
  132. /************************************************************************
  133.  *  Method:
  134.  *    CMacSurface constructor
  135.  */
  136. CMacSurface::CMacSurface(IUnknown* pContext, CHXBaseSite* pSite)
  137.  : CBaseSurface(pContext, pSite)
  138. {
  139.     zm_SurfaceList.AddTail(this);
  140. }
  141. /************************************************************************
  142.  *  Method:
  143.  *    CHXMacSite destructor
  144.  */
  145. CMacSurface::~CMacSurface()
  146. {
  147.     
  148.     if (CMacSurface::zm_pOverlaySurface == this)
  149.     {
  150. CleanUpOverlay();
  151. CMacSurface::zm_pOverlaySurface = nil;
  152. ::DisposePtr((Ptr)zm_pHoldOverlayBuf);
  153. zm_pHoldOverlayBuf = NULL;
  154. zm_nHoldOverlayBufSize = 0;
  155.     }
  156.     
  157.     LISTPOSITION pos = zm_SurfaceList.Find(this);
  158.     zm_SurfaceList.RemoveAt(pos);
  159. }
  160. /************************************************************************
  161.  *  Method:
  162.  *    CMacSurface::_ReleaseSurface
  163.  */
  164. void
  165. CMacSurface::_ReleaseSurface(CBaseRootSurface* pSurface)
  166. {
  167. }
  168. /************************************************************************
  169.  *  Method:
  170.  *    CMacSurface::_DrawBlack
  171.  */
  172. void
  173. CMacSurface::_DrawBlack(void* pWindow)
  174. {
  175. }
  176. /************************************************************************
  177.  *  Method:
  178.  *    CMacSurface::__Sleep
  179.  */
  180. void
  181. CMacSurface::__Sleep(int milliseconds)
  182. {
  183. }
  184. /************************************************************************
  185.  *  Method:
  186.  *    CMacSurface::_BltToPrimary
  187.  */
  188. HX_RESULT
  189. CMacSurface::_BltToPrimary(REF(HXxRect) rDestRect, REF(HXxRect) rSrcRect)
  190. {
  191.     return HXR_OK;
  192. }
  193. /************************************************************************
  194.  *  Method:
  195.  *    CMacSurface::_CreateBuffer
  196.  */
  197. void
  198. CMacSurface::_CreateBuffer()
  199. {
  200. }
  201. /************************************************************************
  202.  *  Method:
  203.  *    CMacSurface::_GetCaps
  204.  */
  205. HX_RESULT
  206. CMacSurface::_GetCaps(UINT32* pfSurfaceCaps)
  207. {
  208.     // see if it supports stuff like overlay.
  209.     
  210.     if (pfSurfaceCaps)
  211.     {
  212. *pfSurfaceCaps = 0;
  213. if (_OverlayAvailable())
  214. {
  215.     *pfSurfaceCaps |= HX_OVERLAY;
  216. }
  217.     }
  218.     return HXR_OK;
  219. }
  220. /************************************************************************
  221.  *  Method:
  222.  *    CMacSurface::_CreateOverlay
  223.  */
  224. HX_RESULT
  225. CMacSurface::_CreateOverlay(BOOL bOverlay, int cid, int x, int y)
  226. {
  227.     HX_ASSERT(_OverlayAvailable());
  228.     if (CMacSurface::zm_pOverlaySurface == nil)
  229.     {
  230. CMacSurface::zm_pOverlaySurface = this;
  231. // we don't want to construct the overlay here, uhhh, because
  232. // we don't yet know WHERE it's gonna be. We'll construct it
  233. // the first time we need it.
  234.     }
  235.     else if (CMacSurface::zm_pOverlaySurface == this)
  236.     {
  237. CleanUpOverlay();
  238.     }
  239.     if (CMacSurface::zm_pOverlaySurface == this)
  240.     {
  241. m_nBltMode = HX_OVERLAY_BLT;
  242. m_surfaceSize.cx = x;
  243. m_surfaceSize.cy = y;
  244.     }
  245.     return HXR_OK;
  246. }
  247. // xxxbobclark weird, it looks like the first time the color convertor is used,
  248. // it slams something weird into the mouse pointer. I'm just doing a quick
  249. // (unnoticeable really) cursor switch to obscure the garbagey stuff.
  250. BOOL gDumbCursorRedrawNeeded = FALSE;
  251. /************************************************************************
  252.  *  Method:
  253.  *    CMacSurface::_LockInternalSurface
  254.  */
  255. HX_RESULT
  256. CMacSurface::_LockInternalSurface(UCHAR** ppSurPtr, LONG32* pnSurfPitch, REF(HXxSize) srcSize)
  257. {
  258.     HX_RESULT retVal = HXR_OK;
  259.     
  260.     GrafPtr savePort = nil;
  261.     
  262.     if (IsMacInCooperativeThread())
  263.     {
  264. ::GetPort(&savePort);
  265. HXxWindow* pWindow = m_pSite->m_pTopLevelSite->GetWindow();
  266. HX_ASSERT(pWindow);
  267. if (!pWindow)
  268. {
  269.     return HXR_FAIL;
  270. }
  271. HX_ASSERT(pWindow->window);
  272. ::SetPort( GetWindowPort( (WindowPtr)pWindow->window ) );
  273.     }
  274.     
  275.     if (zm_pOverlayBuf == nil)
  276.     {
  277. CMacSurface::zm_pOverlaySurface = this;
  278. m_nSurfaceCID = CID_YUY2;
  279.     }
  280.     if (CMacSurface::zm_pOverlaySurface == this)
  281.     {
  282. static Point sLastPoint = {-1,-1};
  283. static HXxSize sLastSize = {0,0};
  284. static HXxSize sLastSrcSize = {0,0};
  285. static Point sP = {-1,-1};
  286. HX_ASSERT(m_pSite);
  287. HXxSize s;
  288. m_pSite->GetSize(s);
  289. sP.h = 0;
  290. sP.v = 0;
  291. BOOL bOverlayRebuildingRequired = FALSE;
  292. if (sLastPoint.h != sP.h || sLastPoint.v != sP.v) bOverlayRebuildingRequired = TRUE;
  293. if (sLastSize.cx != s.cx || sLastSize.cy != s.cy) bOverlayRebuildingRequired = TRUE;
  294. if (sLastSrcSize.cx != srcSize.cx || sLastSrcSize.cy != srcSize.cy) bOverlayRebuildingRequired = TRUE;
  295. if (zm_pOverlayBuf == nil) bOverlayRebuildingRequired = TRUE;
  296. // xxxbobclark this catch up workaround is necessary because with some
  297. // parameters of the overlay while the TLC is resizing, a glitch can
  298. // happen and blits start happening outside of our window onto the
  299. // desktop.
  300. // If (a) the overlay extends beyond the window or (b) a mask region
  301. // is used when creating the overlay, then when the TLC resizes the
  302. // following sequence of events takes place:
  303. // 1. overlay (sequenceID) created.
  304. // 2. blit happens (DecompressSequenceFrameWhen) successfully
  305. // 3. All future blits fail with slamming the frame onto the
  306. //    desktop area.
  307. //
  308. // But if we ensure that after the first successful blit we
  309. // then rebuild the overlay, we never encounter the problem
  310. // in the sequence of events. I need to revisit this!
  311. // I created a stand-alone app that tried to repro the problem
  312. // and I couldn't. I added window sizing code to CarbMini and
  313. // couldn't repro the problem. I don't know if we're getting
  314. // called when we're in a bad state in the middle of resizing
  315. // or what.
  316. //
  317. // The whole notion of the image sequence technique is that when
  318. // you know that your grafport is going to be consistent for awhile
  319. // you can take advantage of that by using a sequence ID so each
  320. // blit can rely on the parameters that remain consistent. What this
  321. // workaround is doing is probably that something in the
  322. // grafport has changed and we haven't detected it. What I don't
  323. // know, but I should look into the sequence of events of first
  324. // overlay rebuild, actual SizeWindow() command, second overlay blit
  325. // that would slam to the desktop if we didn't kludge.
  326. //
  327. // Initially I thought that there were two possible kludges that
  328. // would avoid the problem. One was to delay the Carbon Timer by
  329. // a millisecond. The other was to use this "catch up" technique.
  330. // It turns out that when I delayed the Carbon Timer, I was able
  331. // to reproduce the problem by actively resizing the simple case,
  332. // and most of the time using a more complex SMIL repro case.
  333. // The "catch up" technique used to have a simple boolean for
  334. // whether the kludge should kick in. Now it has a counter that's
  335. // higher for more complicated SMIL presentations. I don't know
  336. // what the magic number is, but using a boolean (i.e. "one")
  337. // was too low in complex SMIL presentations, and the number of
  338. // sites seems to work.
  339. //
  340. // xxxbobclark 20 Sep 02
  341. static ULONG32 sbCatchUp = 0;
  342. RgnHandle newMaskRgn = nil;
  343. if (bOverlayRebuildingRequired)
  344. {
  345.     CHXMacSite* pSite = (CHXMacSite*)zm_pOverlaySurface->m_pSite;
  346.     HXREGION* pEntireReg = HXCreateRegion();
  347.     HXUnionRegion(pEntireReg, pSite->m_Region, pEntireReg);
  348.     // xxxbobclark do this "manual clipping" thing to ensure that opaque
  349.     // parents are clipped out.
  350.     CHXMacSite* parentSite = (CHXMacSite*)pSite->GetParentSite();
  351.     while (parentSite)
  352.     {
  353. HXIntersectRegion(pEntireReg, parentSite->m_RegionWithoutChildren, pEntireReg);
  354. parentSite = (CHXMacSite*)parentSite->GetParentSite();
  355.     }
  356.     // xxxbobclark chunk of code snagged from CBaseSurface::FillColorKey.
  357.     // Necessary because our overlay clip region needs to be able to
  358.     // differentiate between clipped-out areas and alpha-blended areas.
  359.     CHXMapPtrToPtr::Iterator ii;
  360.     for( ii=pSite->m_AlphaBlendNotifiers.Begin() ;
  361.  ii!=pSite->m_AlphaBlendNotifiers.End()  ;
  362.  ++ii)
  363.     {
  364. CHXBaseSite* pPotentialAlphaBlendedSite = (CHXBaseSite*)*ii;
  365. HXREGION* pReg = NULL;
  366. CHXMapPtrToPtr::Iterator j = pPotentialAlphaBlendedSite->m_AlphaBlendSites.Begin();
  367. CHXBaseSite* pTmpSite = NULL;
  368. while( j != pPotentialAlphaBlendedSite->m_AlphaBlendSites.End() && pTmpSite != pSite )
  369. {
  370.     pTmpSite = (CHXBaseSite*)j.get_key();
  371.     if( pTmpSite == pSite )
  372.     {
  373. pReg = (HXREGION*)*j;
  374. HXUnionRegion( pEntireReg, pReg, pEntireReg );
  375. break;
  376.     }
  377.     ++j;
  378. }
  379.     }
  380.     // xxxbobclark is this involved in a linked overlay?
  381.     // If so, we need to include the linked site's regions.
  382.     CHXSimpleList::Iterator linkedSitesIter;
  383.     for ( linkedSitesIter = m_LinkedSites.Begin();
  384. linkedSitesIter != m_LinkedSites.End();
  385. ++linkedSitesIter)
  386.     {
  387. CHXBaseSite* pSite = (CHXBaseSite*)(*linkedSitesIter);
  388. HXUnionRegion(pEntireReg, pSite->m_Region, pEntireReg);
  389. CHXMapPtrToPtr::Iterator ii;
  390. for( ii=pSite->m_AlphaBlendNotifiers.Begin() ;
  391. ii!=pSite->m_AlphaBlendNotifiers.End()  ;
  392. ++ii)
  393. {
  394.     CHXBaseSite* pPotentialAlphaBlendedSite = (CHXBaseSite*)*ii;
  395.     HXREGION* pReg = NULL;
  396.     CHXMapPtrToPtr::Iterator j = pPotentialAlphaBlendedSite->m_AlphaBlendSites.Begin();
  397.     CHXBaseSite* pTmpSite = NULL;
  398.     while( j != pPotentialAlphaBlendedSite->m_AlphaBlendSites.End() && pTmpSite != pSite )
  399.     {
  400. pTmpSite = (CHXBaseSite*)j.get_key();
  401. if( pTmpSite == pSite )
  402. {
  403.     pReg = (HXREGION*)*j;
  404.     HXUnionRegion( pEntireReg, pReg, pEntireReg );
  405.     break;
  406. }
  407. ++j;
  408.     }
  409. }
  410.     }
  411.     newMaskRgn = CHXMacSite::_ConvertRegionToMacRegion(pEntireReg);
  412.             CHXMacSite* pMacSite = (CHXMacSite*)zm_pOverlaySurface->m_pSite;
  413.             // xxxbobclark should we shrink the region if we have scrollbars? I certainly think so!
  414.             if (pMacSite->m_hHScrollBar || pMacSite->m_hVScrollBar)
  415.             {
  416.                 Rect rgnBounds;
  417.                 ::GetRegionBounds(newMaskRgn, &rgnBounds);
  418.                 if (pMacSite->m_hHScrollBar)
  419.                 {
  420.                     rgnBounds.bottom -= 16;
  421.                 }
  422.                 if (pMacSite->m_hVScrollBar)
  423.                 {
  424.                     rgnBounds.right -= 16;
  425.                 }
  426.                 RgnHandle rectRgn = ::NewRgn();
  427.                 if (rectRgn)
  428.                 {
  429.                     RectRgn(rectRgn, &rgnBounds);
  430.                     ::SectRgn(rectRgn, newMaskRgn, newMaskRgn);
  431.                     ::DisposeRgn(rectRgn);
  432.                 }
  433.             }
  434.             
  435.     OffsetRgn(newMaskRgn, -pEntireReg->extents.x1, -pEntireReg->extents.y1);
  436.     HXDestroyRegion(pEntireReg);
  437.     // xxxbobclark now intersect with current port's clip region and vis region.
  438.     RgnHandle trimRgn = ::NewRgn();
  439.     ::GetPortVisibleRegion(::GetQDGlobalsThePort(), trimRgn);
  440.     ::SectRgn(newMaskRgn, trimRgn, newMaskRgn);
  441.     if (1 /*pSite->m_bIsRealPlayerTLC*/)
  442.     {
  443. ::GetClip(trimRgn);
  444. ::SectRgn(newMaskRgn, trimRgn, newMaskRgn);
  445.     }
  446.     else
  447.     {
  448. // xxxbobclark now intersect with PNxWindow's clip rect. Only if we're
  449. // in an embedded player; this whole mechanism relies on browsers setting
  450. // up clip regions before sending null events.
  451. HXxWindow* pWindow = pSite->GetWindow();
  452. if ((pWindow->x < pWindow->clipRect.left) || ((pWindow->x + pWindow->width)  > pWindow->clipRect.right) ||
  453.         (pWindow->y < pWindow->clipRect.top)  || ((pWindow->y + pWindow->height) > pWindow->clipRect.bottom))
  454. {
  455.     bOverlayRebuildingRequired = TRUE;
  456. }
  457. ::SetRectRgn(trimRgn, pWindow->clipRect.left, pWindow->clipRect.top, pWindow->clipRect.right, pWindow->clipRect.bottom);
  458. // offset region
  459. ::OffsetRgn(trimRgn, -pWindow->x, -pWindow->y);
  460. ::SectRgn(newMaskRgn, trimRgn, newMaskRgn);
  461.     }
  462.     ::DisposeRgn(trimRgn);
  463.     if ( (!bOverlayRebuildingRequired) && (!zm_OverlayMaskRgn || !::EqualRgn(newMaskRgn, zm_OverlayMaskRgn)))
  464.     {
  465. bOverlayRebuildingRequired = TRUE;
  466.     }
  467. }
  468. if (bOverlayRebuildingRequired)
  469. {
  470.     // reset the workaround counter
  471.     sbCatchUp = CHXMacSite::zm_ListOfMacSites.GetCount();
  472. }
  473. else if (sbCatchUp > 0)
  474. {
  475.     bOverlayRebuildingRequired = TRUE;
  476.     sbCatchUp--;
  477. }
  478. if (bOverlayRebuildingRequired)
  479. {
  480.     if (!IsMacInCooperativeThread())
  481.     {
  482. // // xxxbobclark these shouldn't be here 'cause they can
  483. // // force it out of overlay mode even as it's switching
  484. // // to full-screen mode, for example.
  485. // retVal = HXR_FAIL;
  486. // goto exit;
  487.     }
  488.     else
  489.     {
  490. sLastPoint = sP;
  491. sLastSize = s;
  492. sLastSrcSize = srcSize;
  493.                 
  494.                 if (!newMaskRgn && zm_OverlayMaskRgn)
  495.                 {
  496.                     // CleanUpOverlay is going to clear out
  497.                     // zm_OverlayMaskRgn. Since newMaskRgn is
  498.                     // null and zm_OverlayMaskRgn exists we know
  499.                     // that we're in the sbCatchUp workaround,
  500.                     // and we need to remember the mask region
  501.                     // around the CleanUpOverlay function call.
  502.                     newMaskRgn = ::NewRgn();
  503.                     ::CopyRgn(zm_OverlayMaskRgn, newMaskRgn);
  504.                 }
  505. CleanUpOverlay();
  506. if (newMaskRgn)
  507. {
  508.     HX_ASSERT(!zm_OverlayMaskRgn);
  509.     zm_OverlayMaskRgn = newMaskRgn;
  510.     newMaskRgn = NULL;
  511. }
  512. HX_ASSERT(zm_OverlayMaskRgn);
  513. ConstructOverlay(sP.h, sP.v, s.cx, s.cy, srcSize.cx, srcSize.cy, zm_OverlayMaskRgn);
  514.     }
  515. }
  516. if (newMaskRgn)
  517. {
  518.     ::DisposeRgn(newMaskRgn);
  519. }
  520.     }
  521.     else
  522.     {
  523. retVal = HXR_FAIL;
  524. goto exit;
  525.     }
  526.     if (zm_pOverlayBuf == nil || zm_nOverlayRowBytes == 0)
  527.     {
  528. retVal = HXR_FAIL;
  529. goto exit;
  530.     }
  531.     *ppSurPtr = (UCHAR*)zm_pOverlayBuf;
  532.     *pnSurfPitch = zm_nOverlayRowBytes;
  533.     
  534. exit:
  535.     HX_ASSERT(savePort != nil);
  536.     ::SetPort(savePort);
  537.     return retVal;
  538. }
  539. /************************************************************************
  540.  *  Method:
  541.  *    CMacSurface::_UnlockInternalSurface
  542.  */
  543. HX_RESULT
  544. CMacSurface::_UnlockInternalSurface(UCHAR* pSurfPtr)
  545. {
  546.     // On RagePro, the ImageCodecDrawBand call does not NEED to
  547.     // be made. Since it uses a key color, whatever's drawn
  548.     // to the overlay magically shows up through the key color.
  549.     // The Rage128 ignores key color, though, and requires a
  550.     // call to ImageCodecDrawBand to update the overlay. This
  551.     // blasts through everything, obeying the mask region.
  552.     // So if the mask region may be outdated we will not make
  553.     // the call to ImageCodecDrawBand.
  554.     
  555.     if (gDumbCursorRedrawNeeded)
  556.     {
  557. gDumbCursorRedrawNeeded = FALSE;
  558.     }
  559.     
  560.     BOOL bDoOverlayBlit = TRUE;
  561.     
  562.     CHXMacSite* pSite = (CHXMacSite*)zm_pOverlaySurface->m_pSite;
  563.     HXxPoint offset;
  564.     offset.x = 0;
  565.     offset.y = 0;
  566.     pSite->GetMacContentAreaOffset(offset);
  567.     SetOriginAndMaintainClipRgn(-offset.x, -offset.y);
  568.     if (bDoOverlayBlit)
  569.     {
  570.         if (zm_SequenceID)
  571.         {
  572.             short err = DecompressSequenceFrameWhen(
  573.                             zm_SequenceID,
  574.                             (Ptr)zm_pOverlayBuf, zm_nOverlayBufferSize,
  575.                             0, // flags
  576.                             nil,
  577.                             nil,
  578.                             nil);
  579.         }
  580.     }
  581.     
  582.     SetOriginAndMaintainClipRgn(0,0);
  583.     return HXR_OK;
  584. }
  585. /************************************************************************
  586.  *  Method:
  587.  *    CMacSurface::_SetupDCObjects
  588.  */
  589. void
  590. CMacSurface::_SetupDCObjects(HXxDC hxxDC, void** phOldBrush, void** phOldPen)
  591. {
  592. }
  593. /************************************************************************
  594.  *  Method:
  595.  *    CMacSurface::_FillRectangle
  596.  */
  597. void
  598. CMacSurface::_FillRectangle(HXxDC hxxDC, UINT32 left, UINT32 top, UINT32 right, UINT32 bottom)
  599. {
  600.     if (zm_bOverlayRequiresKeyColor)
  601.     {
  602. GrafPtr savePort;
  603. ::GetPort(&savePort);
  604. HX_ASSERT(m_pSite);
  605. HXxWindow* pWindow = m_pSite->GetWindow();
  606. HX_ASSERT(pWindow && pWindow->window);
  607. ::SetPort((GrafPtr)pWindow->window);
  608. Rect r;
  609. r.left = left + pWindow->x;
  610. r.top = top + pWindow->y;
  611. r.right = right + pWindow->x;
  612. r.bottom = bottom + pWindow->y;
  613. // xxxbobclark for ATI RagePro cards, they use a key
  614. // color, and the key color is hardcoded. I don't
  615. // know, but this may change if we stumble across a
  616. // card that supports key colors that aren't hard-
  617. // coded -- or that use a DIFFERENT hard-coded one.
  618. static RGBColor keyColor = {0x0000, 0x1000, 0x0000};
  619. RGBColor hold;
  620. ::GetForeColor(&hold);
  621. ::RGBForeColor(&keyColor);
  622. PaintRect(&r);
  623. ::RGBForeColor(&hold);
  624. ::SetPort(savePort);
  625.     }
  626. }
  627. /************************************************************************
  628.  *  Method:
  629.  *    CMacSurface::_RestoreDCObjects
  630.  */
  631. void
  632. CMacSurface::_RestoreDCObjects(HXxDC hxxDC, void* hOldBrush, void* hOldPen)
  633. {
  634. }
  635. /************************************************************************
  636.  *  Method:
  637.  *    CMacSurface::_GetCompositeionSurfacePNxDC
  638.  */
  639. void
  640. CMacSurface::_GetCompositionSurfaceHXxDC(HXxDC* hdc)
  641. {
  642. }
  643. /************************************************************************
  644.  *  Method:
  645.  *    CMacSurface::_ReleaseCompositionSurfaceHXxDC
  646.  */
  647. void
  648. CMacSurface::_ReleaseCompositionSurfaceHXxDC(HXxDC hdc)
  649. {
  650. }
  651. /************************************************************************
  652.  *  Method:
  653.  *    CMacSurface::_InsureColorMatch
  654.  */
  655. INT32
  656. CMacSurface::_InsureColorMatch(INT32 InColor)
  657. {
  658.     return InColor; // XXXbobclark
  659. }
  660. /************************************************************************
  661.  *  Method:
  662.  *    CMacSurface::_SetColorKey
  663.  */
  664. void
  665. CMacSurface::_SetColorKey(INT32 nColorSpaceLowValue, INT32 nColorSpaceHighValue)
  666. {
  667. }
  668. /************************************************************************
  669.  *  Method:
  670.  *    CMacSurface::_UpdateOverlay
  671.  */
  672. void
  673. CMacSurface::_UpdateOverlay(HXxRect* src, HXxRect* dest, INT32 inFlags)
  674. {
  675. }
  676. /************************************************************************
  677.  *  Method:
  678.  *    CMacSurface::_IsSurfaceVisible
  679.  */
  680. BOOL
  681. CMacSurface::_IsSurfaceVisible()
  682. {
  683.     return TRUE;
  684. }
  685. /************************************************************************
  686.  *  Method:
  687.  *    CMacSurface::_ReleaseSurface
  688.  */
  689. void
  690. CMacSurface::_ReleaseSurface()
  691. {
  692.     if (CMacSurface::zm_pOverlaySurface == this)
  693.     {
  694. CleanUpOverlay();
  695. CMacSurface::zm_pOverlaySurface = nil;
  696.     }
  697. }
  698. /************************************************************************
  699.  *  Method:
  700.  *    CMacSurface::_GetDC
  701.  */
  702. HXxDC
  703. CMacSurface::_GetDC(HXxWindow* pWindow)
  704. {
  705.     return NULL; // XXXbobclark gotta figure out what to return, duh
  706. }
  707. /************************************************************************
  708.  *  Method:
  709.  *    CMacSurface::_ReleaseDC
  710.  */
  711. void
  712. CMacSurface::_ReleaseDC(HXxWindow* pWindow, HXxDC pdc)
  713. {
  714. }
  715. /************************************************************************
  716.  *  Method:
  717.  *    CMacSurface::_GetWindowDeviceCords
  718.  */
  719. void
  720. CMacSurface::_GetWindowDeviceCords(HXxRect* rect)
  721. {
  722.     static Point sLastCords = {0,0};
  723.     
  724.     sLastCords.h = 0;
  725.     sLastCords.v = 0;
  726.     ::LocalToGlobal(&sLastCords);
  727.     rect->left = sLastCords.h;
  728.     rect->top = sLastCords.v;
  729. }
  730. /************************************************************************
  731.  *  Method:
  732.  *    CMacSurface::_OverlayAvailable
  733.  */
  734. BOOL
  735. CMacSurface::_OverlayAvailable()
  736. {
  737.     if (!m_bUseOverlays) return FALSE;
  738.     
  739.     return TRUE;
  740. }
  741. /************************************************************************
  742.  *  Method:
  743.  *    CMacSurface::_AllowsOverlayShrinking
  744.  */
  745. BOOL
  746. CMacSurface::_AllowsOverlayShrinking()
  747. {
  748.     return TRUE;
  749. }
  750. // some of the following is from ATI's YUVSDK.
  751. // Some ATI specific definitions
  752. #define  kATIYUVComponentType 'imdc'
  753. #define kATIYUVComponentSubType 'yuvs'
  754. #define kATIYUVComponentManufacturer 'ATI '
  755. #pragma options align=mac68k
  756. //QT 3.x stuff : begin -- Anita
  757. struct YUVSdecompressRecord {
  758. short width; // width (in pixels) of a row
  759. long numStrips; // number of strips to draw
  760. long srcDataIncrement; // increment for srcData between strips
  761. long baseAddrIncrement; // increment for baseAddr between strips
  762. struct Globals *glob; // pointer to our globals
  763. };
  764. typedef struct YUVSdecompressRecord YUVSdecompressRecord;
  765. // Added for VAU
  766. struct BDCTextureDRP
  767. {
  768. ByteCount dataSize; // Number of bytes in compressed data
  769. SInt16  width; // Width in pixels
  770. SInt16  height; // Height in lines
  771. };
  772. typedef struct BDCTextureDRP BDCTextureDRP;
  773. pascal void MymemoryGoneProc(Ptr memoryBlock, void *refcon);
  774. ICMMemoryDisposedUPP theMemoryProc = nil;
  775. pascal void MymemoryGoneProc(Ptr memoryBlock, void *refcon)
  776. {
  777. // do nothing.
  778. }
  779. /* static */
  780. void CMacSurface::ConstructOverlay(long screenCoorX, long screenCoorY, long screenWidth, long screenHeight, long sourceWidth, long sourceHeight,
  781. RgnHandle maskRgn)
  782. {
  783.     // first let's find our component.
  784.     ComponentDescription cd;
  785.     Component c = NULL;
  786.     Component foundComponent = NULL;
  787.     cd.componentType = 'imdc';
  788.     cd.componentSubType = 'yuvs';
  789.     cd.componentManufacturer = 0;
  790.     
  791.     cd.componentFlags = 0;
  792.     cd.componentFlagsMask = 0;
  793.     while ((c = FindNextComponent(c, &cd)) != 0)
  794.     {
  795.         HX_ASSERT(foundComponent == NULL);
  796.         foundComponent = c;
  797.         break;
  798.     }
  799.     // this chunk o' code assumes local coordinates.
  800.     Point local;
  801.     local.h = screenCoorX;
  802.     local.v = screenCoorY;
  803.     if (!IsRunningNativeOnMacOSX())
  804.     {
  805.         GlobalToLocal(&local);
  806.     }
  807.     Rect srcR, dstR;
  808.     srcR.left = 0;
  809.     srcR.top = 0;
  810.     srcR.right = sourceWidth;
  811.     srcR.bottom = sourceHeight;
  812.     dstR.left = local.h;
  813.     dstR.top = local.v;
  814.     dstR.right = local.h + screenWidth;
  815.     dstR.bottom = local.v + screenHeight;
  816.     zm_ImageDescriptionHandle = (ImageDescriptionHandle)NewHandleClear(sizeof(ImageDescription));
  817.     (**zm_ImageDescriptionHandle).idSize = sizeof(ImageDescription);
  818.     (**zm_ImageDescriptionHandle).cType = 'yuvs';
  819.     (**zm_ImageDescriptionHandle).width = srcR.right-srcR.left;
  820.     (**zm_ImageDescriptionHandle).height = srcR.bottom-srcR.top;
  821.     (**zm_ImageDescriptionHandle).hRes = 72L << 16;
  822.     (**zm_ImageDescriptionHandle).vRes = 72L << 16;
  823.     (**zm_ImageDescriptionHandle).frameCount = 1;
  824.     (**zm_ImageDescriptionHandle).clutID = -1;
  825.     MatrixRecord matrix;
  826.     RectMatrix(&matrix, &srcR, &dstR);
  827.     OSErr err = DecompressSequenceBeginS(
  828.                     &zm_SequenceID,
  829.                     zm_ImageDescriptionHandle,
  830.                     nil, 0, // data pointer and data length
  831.                     nil, // use the current port
  832.                     nil, // go to screen
  833.                     &srcR,
  834.                     &matrix,
  835.                     ditherCopy,
  836.                     maskRgn,
  837.                     codecFlagUseImageBuffer,
  838.                     codecNormalQuality,
  839.                     foundComponent);
  840.     zm_nOverlayRowBytes = (srcR.right-srcR.left) * 2;
  841.     zm_nOverlayBufferSize = (srcR.bottom - srcR.top) * zm_nOverlayRowBytes;
  842.     
  843.     if ((zm_nOverlayBufferSize == zm_nHoldOverlayBufSize) && zm_pHoldOverlayBuf)
  844.     {
  845.         zm_pOverlayBuf = zm_pHoldOverlayBuf;
  846.     }
  847.     else
  848.     {
  849.         zm_pOverlayBuf = ::NewPtr(zm_nOverlayBufferSize);
  850.         if (zm_pHoldOverlayBuf)
  851.         {
  852.             ::DisposePtr((Ptr)zm_pHoldOverlayBuf);
  853.         }
  854.         zm_pHoldOverlayBuf = zm_pOverlayBuf;
  855.         zm_nHoldOverlayBufSize = zm_nOverlayBufferSize;
  856.     }
  857. }
  858. void CMacSurface::CleanUpOverlay()
  859. {
  860.     if (zm_SequenceID)
  861.     {
  862.         CDSequenceEnd(zm_SequenceID);
  863.     }
  864.     zm_SequenceID = NULL;
  865.     
  866.     if (zm_pOverlayBuf)
  867.     {
  868.         // xxxbobclark don't dispose this; hold on to it in
  869.         // zm_pHoldOverlayBuf in case we create another overlay
  870.         // of the same size. Saves allocation and initialization
  871.         // time, plus sidesteps some alpha-blending bugs.
  872.         // DisposePtr((Ptr)zm_pOverlayBuf);
  873.     }
  874.     zm_pOverlayBuf = nil;
  875.     
  876.     zm_nOverlayRowBytes = 0;
  877.     zm_nOverlayBufferSize = 0;
  878.     
  879.     if (zm_OverlayMaskRgn)
  880.     {
  881.         ::DisposeRgn(zm_OverlayMaskRgn);
  882.     }
  883.     zm_OverlayMaskRgn = NULL;
  884.     if (zm_ImageDescriptionHandle)
  885.     {
  886.         ::DisposeHandle((Handle)zm_ImageDescriptionHandle);
  887.     }
  888.     zm_ImageDescriptionHandle = NULL;
  889. }
  890. RgnHandle
  891. CMacSurface::BuildOverlayVisRgn()
  892. {
  893.     // This assumes that the decomp params
  894.     // rectangle has already been set up!
  895.     //
  896.     // It also assumes that the port has
  897.     // been set to the correct window!
  898.     //
  899.     // The caller must dispose of the
  900.     // region!
  901.     
  902.     HX_ASSERT(IsMacInCooperativeThread());
  903.     
  904.     RgnHandle rgn = ::NewRgn();
  905.     
  906.     ::RectRgn(rgn, &bogusDecompParams.decompParams.dstRect);
  907.     return rgn;
  908. }
  909. #pragma options align=reset