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

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 <stdlib.h> //for atof
  36. #include "hxcom.h"
  37. #include "hxtypes.h"
  38. #include "hxwintyp.h"
  39. #include "ihxpckts.h"
  40. #include "hxwin.h"
  41. #include "hxengin.h"
  42. #include "hxsite2.h"
  43. #include "hxevent.h"
  44. #include "hxcomm.h"
  45. #include "hxassert.h"
  46. #include "hxthread.h"
  47. #include "hxvsurf.h"
  48. #include "basesite.h"
  49. #include "basesurf.h"
  50. #include "baseroot.h"
  51. #ifdef _WINDOWS
  52. #include "winroot.h" //must be included before colormap.h
  53. #endif
  54. #include "colormap.h"
  55. #if defined(_UNIX) && !defined(_MAC_UNIX)
  56. #include "X11/Xlib.h"
  57. #include "X11/keysym.h"
  58. #include "unixsite.h"
  59. #include "hxiids.h"
  60. #include "hxcmenu.h"
  61. #endif
  62. #include "sitetext.h"
  63. //#include "hxwinver.h"
  64. #include "ihxpckts.h"
  65. #include "hxprefs.h"
  66. #include "hxtick.h"
  67. #include "hxcore.h"
  68. #include "hxupgrd.h"
  69. #include "addupcol.h"
  70. #include "mmx_util.h"
  71. #ifdef _WINDOWS
  72. #include "winsite.h"
  73. #endif
  74. #if defined(_MACINTOSH) || defined(_MAC_UNIX)
  75. //#include "../dcondev/dcon.h"
  76. #include "platform/mac/macsite.h"
  77. #endif
  78. #if defined(_UNIX) && !defined(_MAC_UNIX)
  79. #include "unixsite.h"
  80. #endif
  81. #include "hxheap.h"
  82. #include "colormap.h"
  83. #include "drawline.h"
  84. #include "hxvimlog.h"
  85. #include "sitefact.h"
  86. #if defined(HELIX_FEATURE_PREFERENCES)
  87. #include "hxprefs.h"
  88. #include "hxprefutil.h"
  89. #endif /* HELIX_FEATURE_PREFERENCES */
  90. #ifdef _DEBUG
  91. #undef HX_THIS_FILE
  92. static const char HX_THIS_FILE[] = __FILE__;
  93. #endif
  94. //XXXgfw just to clean up the code. We still *REALLY* need to clean
  95. //this up.
  96. #ifdef _WIN32
  97. #define GETBITMAPCOLOR(x) GetBitmapColor( (LPBITMAPINFO)(x) )
  98. #else
  99. #define GETBITMAPCOLOR(x) GetBitmapColor( (HXBitmapInfo*)(x))
  100. #endif
  101. #ifdef _WIN32
  102. #define GETBITMAPPITCH(x) GetBitmapPitch( (LPBITMAPINFO)(x) )
  103. #else
  104. #define GETBITMAPPITCH(x) GetBitmapPitch( (HXBitmapInfo*)(x))
  105. #endif
  106. /*
  107.  *  Full Screen Preferences Information
  108.  */
  109. #define MODE_SEPERATOR                          "|"
  110. #define MODE_DESRIPTION_SEPS                    "xX"
  111. #define REGKEY_TESTED                           "Tested"
  112. #define REGKEY_BLT_TIME                         "BltTime"
  113. #define REGKEY_PASS                             "Passed"
  114. #define DIRECT_DRAW_DLL                         "ddraw.dll"
  115. #define REGKEY_FULLSCREEN_DATA                  "FullScreenData"
  116. #define REGKEY_FULLSCREEN_AVAILIABLE_MODES      "AvailiableModes"
  117. #define REGKEY_FULLSCREEN_TEST_MODES            "TestModes"
  118. #define REGKEY_FULLSCREEN_PREFERED_MODE         "PreferedMode"
  119. #define REGKEY_NEW_FULLSCREEN_CODE              "NewFullScreen"
  120. #define REGKEY_FULLSCREEN_NEW_STRING_FORMAT     "NewStringFormat"
  121. #define REGKEY_DO_NOT_SETUP_DD                  "DoNotSetupDD"
  122. #define TEST_THRESHOLD                          30
  123. #define REGKEY_FULLSCREEN_POSTAGE_STAMP         "PostageStamp"
  124. #define TEST_LENGTH                             6000
  125. #define NUM_OF_TEST_ITTERATIONS                 2000
  126. #define MOVING_TIMEOUT 200 // Milliseconds
  127. BOOL    CHXBaseSite::zm_bInFullScreenTest       = FALSE;
  128. extern  tranType z_TransitionTable[];
  129. extern  INT32 z_nNumberTransitionTypes;
  130. //Out global list of YUV sites.
  131. CHXSimpleList CHXBaseSite::zm_YUVSiteList;
  132. //#define DEBUG_LINKING
  133. /************************************************************************
  134.  *  Method:
  135.  *    Constructor
  136.  */
  137. CHXBaseSite::CHXBaseSite(IUnknown* pContext, IUnknown* pUnkOuter, INT32 lZorder)
  138.     : m_lRefCount(0)
  139.     , zm_pColorAcc(NULL)
  140.     , m_bIsChildWindow(FALSE)
  141.     , m_pValues(0)
  142.     , m_pUser(0)
  143.     , m_pParentSite(0)
  144.     , m_pVideoSurface(0)
  145.     , m_pCCF(0)
  146.     , m_pWatcher(0)
  147.     , m_pContext(pContext)
  148.     , m_pUnkOuter(pUnkOuter)
  149.     , m_lZOrder(lZorder)
  150.     , m_bIsVisible(TRUE)
  151.     , m_bInDestructor(FALSE)
  152.     , m_pRootSurface(NULL)
  153.     , m_CallbackHandle(0)
  154.     , m_ScrollSiteCallbackHandle(0)
  155.     , m_pMouseInSite(0)
  156.     , m_pScheduler(0)
  157.     , m_bRecomputeClipScheduled(FALSE)
  158.     , m_bForceRedrawNeeded(FALSE)
  159.     , m_bInFullScreen(FALSE)
  160.     , m_bSettingDisplayMode(FALSE)
  161.     , m_bRepaintScheduled(FALSE)
  162.     , m_bDisableForceRedraw(FALSE)
  163.     , m_bProcessRepaint(FALSE)
  164.     , m_bAboutToBlt(FALSE)
  165.     , m_fSharpness(DEF_SHARPNESS)
  166.     , m_fHue(DEF_HUE)
  167.     , m_fSaturation(DEF_SATURATION)
  168.     , m_fContrast(DEF_CONTRAST)
  169.     , m_fBrightness(DEF_BRIGHTNESS)
  170.     , m_XSliderPos(0)
  171.     , m_YSliderPos(0)
  172.     , m_XSliderRange(0)
  173.     , m_YSliderRange(0)
  174.     , m_pTopLevelSite(0)
  175.     , m_pFocusSite(0)
  176.     , m_pStatusText(0)
  177.     , m_nStatusTextExpireTime(0)
  178.     , m_pCallback(0)
  179.     , m_pScrollSiteCallback(0)
  180.     , m_bWasTopMost(FALSE)
  181.     , m_bDoNotGenerateWMPPaint(FALSE)
  182.     , m_bSetCaptureOn(FALSE)
  183.     , m_pCaptureUser(0)
  184.     , m_pLastUser(0)
  185.     , m_bModeSharpness(FALSE)
  186.     , m_nLastMoveTime(0)
  187.     , m_bAttachWindowPending(FALSE)
  188.     , m_bDetachWndMsgPending(FALSE)
  189.     , m_nOldBitsPerPixel(0)
  190.     , m_nOldHorzRes(0)
  191.     , m_nOldVertRes(0)
  192.     , m_Region(NULL)
  193.     , m_RegionForMouse(NULL)
  194.     , m_RegionWithoutChildren(NULL)
  195.     , m_nTransitionState(0)
  196.     , m_lBltEntryCount(0)
  197.     , m_bRegionIsValid(FALSE)
  198.     , m_bTransitionReversed(FALSE)
  199.     , m_bTransitionTranIn(TRUE)
  200.     , m_nTransitionVertRepeat(1)
  201.     , m_nTransitionHorzRepeat(1)
  202.     , m_nTransitionBorderWidth(0)
  203.     , m_ulTransitionBorderColor(0)
  204.     , m_ulTransitionFadeColor(0)
  205.     , m_bTransitionBlendBorder(FALSE)
  206.     , m_bTransitionCoordinated(FALSE)
  207.     , m_bTransitionCoordTranIsParentClip(FALSE)
  208.     , m_bWindowCreatedByCreate(FALSE)
  209.     , m_pWindow(NULL)
  210.     , m_bSiteNeverBlts(FALSE)
  211.     , m_bCalledComputeClipFromTransition(FALSE)
  212.     , m_nEventSensitivity(SENSITIVITY_NOT_SET)
  213.     , m_nDelayFillBorders(0)
  214.     , m_bUsingList(FALSE)
  215.     , m_bCompositionLocked(FALSE)
  216.     , m_bCompositionMode(FALSE)
  217.     , m_bScheduleUpgrade(FALSE)
  218.     , m_bVideoUnderTransition(FALSE)
  219.     , m_bInForceRedraw(FALSE)
  220.     , m_bSiteRefresh(FALSE)
  221.     , m_bMoving(FALSE)
  222.     , m_bTestWindowing(FALSE)
  223.     , m_nWindowColor(0)
  224.     , m_bPostageStamp(FALSE)
  225.     , m_bBltHasBeenCalled(FALSE)
  226.     , m_pKeyBoardFocusUser(NULL)
  227.     , m_nTLSMutexLockCount(0)
  228.     , m_ulTLSMutexOwningThread(0)
  229.     , m_pDirtyRegion(NULL)
  230.     , m_bUserWantsSubRects(FALSE)
  231.     , m_bSiteScalingInfo(FALSE)
  232.     , m_bScrollingSite(FALSE)
  233. {
  234.     m_fpTransitionEffect = z_TransitionTable[0].m_pSubTypes[0].m_fpTranFunction;
  235.     //If we are not being aggregated then just point the outer unkown
  236.     //to ourselves....
  237.     if( pUnkOuter == NULL )
  238.     {
  239.         m_pUnkOuter = (IUnknown*)(SiteNonDelegatingUnknown*) this;
  240.     }
  241.     // addref the context
  242.     if( m_pContext )
  243.     {
  244.         m_pContext->AddRef();
  245.         // get the CCF
  246.         m_pContext->QueryInterface(IID_IHXCommonClassFactory,
  247.                                    (void**)&m_pCCF);
  248.     }
  249.     HX_ASSERT( m_pCCF );
  250.     if( m_pCCF )
  251.     {
  252.         m_pCCF->CreateInstance(CLSID_IHXValues, (void**)&m_pValues);
  253.         HX_ASSERT(m_pValues);
  254.     }
  255.     if( m_pContext )
  256.     {
  257.         m_pContext->QueryInterface(IID_IHXScheduler, (void**)&m_pScheduler);
  258.     }
  259.     HX_ASSERT(m_pScheduler);
  260. #if defined(THREADS_SUPPORTED) || defined(_UNIX_THREADS_SUPPORTED)
  261.     HXMutex::MakeMutex(m_pMutex);
  262.     HXThread::MakeThread(m_pDummyThread);
  263. #else
  264.     HXMutex::MakeStubMutex(m_pMutex);
  265.     HXThread::MakeStubThread(m_pDummyThread);
  266. #endif
  267.     m_pVideoSurface = CBaseSurface::Create(m_pContext, this);
  268.     m_pVideoSurface->AddRef();
  269.     memset(&m_TopLevelWindow, 0, sizeof(HXxWindow));
  270.     memset(&m_topleft, 0, sizeof(HXxPoint));
  271.     memset(&m_position, 0, sizeof(HXxPoint));
  272.     memset(&m_positionOrig, 0, sizeof(HXxPoint));
  273.     memset(&m_CreateWindowPos, 0, sizeof(HXxPoint));
  274.     memset(&m_size, 0, sizeof(HXxPoint));
  275.     memset(&m_screenOffset, 0, sizeof(HXxPoint));
  276.     m_pWindow = NULL;
  277.     memset(&m_rectOldClientRect, 0, sizeof(HXxRect));
  278.     memset(&m_rcFocusRect, 0, sizeof(m_rcFocusRect));
  279.     m_pTopLevelSite  = this;
  280.     m_bIsChildWindow = TRUE;
  281.     CreateColorAccess(m_pContext);
  282.     m_pCallback = new BaseSiteCallback(this);
  283.     IHXPreferences*    pPreferences    = NULL;
  284.     IHXBuffer*         pBuffer         = NULL;
  285.     if (HXR_OK == m_pContext->QueryInterface(IID_IHXPreferences,(void**)&pPreferences))
  286.     {
  287. ReadPrefBOOL(pPreferences, "TestWindowing", m_bTestWindowing);
  288.     }
  289.     HX_RELEASE(pPreferences);
  290.     //Create our dirty rect region.
  291.     m_pDirtyRegion = HXCreateRegion();
  292. #ifdef _CHECK_CREATE
  293.  {
  294. #ifdef _WINDOWS
  295.      FILE* f1 = fopen("c:\create.txt", "a+"); /* Flawfinder: ignore */
  296. #elif defined(_UNIX)
  297.      FILE* f1 = fopen("/tmp/create.txt", "a+"); /* Flawfinder: ignore */
  298. #endif
  299.      if( f1 )
  300.      {
  301.          fprintf(f1, "%p Constructor: %pn", GetCurrentThreadId(), this);
  302.          fclose(f1);
  303.      }
  304.  }
  305. #endif
  306. }
  307. /************************************************************************
  308.  *  Method:
  309.  *    Destructor
  310.  */
  311. CHXBaseSite::~CHXBaseSite()
  312. {
  313.     HX_DELETE(m_pMutex);
  314.     HX_DELETE(m_pDummyThread);
  315.     m_bInDestructor = TRUE;
  316.     //Focus
  317.     if(m_pTopLevelSite->GetFocusSite() == this)
  318.     {
  319.         m_pTopLevelSite->SetFocusSite(NULL);
  320.     }
  321.     //Clean up the color access functions
  322.     HX_DELETE(zm_pColorAcc);
  323.     //Cleanup Mouse oversupport
  324.     if (m_pTopLevelSite->m_pMouseInSite == this)
  325.     {
  326.         m_pTopLevelSite->m_pMouseInSite = NULL;
  327.     }
  328.     //Cleanup all remaining callbacks
  329.     if (m_CallbackHandle)
  330.     {
  331.         m_pScheduler->Remove(m_CallbackHandle);
  332.         m_CallbackHandle = 0;
  333.     }
  334.     HX_DELETE(m_pCallback);
  335.     if (m_ScrollSiteCallbackHandle)
  336.     {
  337.         m_pScheduler->Remove(m_ScrollSiteCallbackHandle);
  338.         m_ScrollSiteCallbackHandle = 0;
  339.     }
  340.     HX_DELETE(m_pScrollSiteCallback);
  341.     //Clean up all child sites
  342.     while(m_ChildrenMap.GetCount())
  343.     {
  344.         IHXSite* pSite = NULL;
  345.         pSite = (IHXSite*) (m_ChildrenMap.Begin()).get_key();
  346.         DestroyChild(pSite);
  347.     }
  348.     m_ChildrenInZOrder.RemoveAll();
  349.     //clean up passive site watchers
  350.     while(m_PassiveSiteWatchers.GetCount())
  351.     {
  352.         IHXPassiveSiteWatcher* pWatcher =
  353.             (IHXPassiveSiteWatcher*)m_PassiveSiteWatchers.GetHead();
  354.         HX_RELEASE(pWatcher);
  355.         m_PassiveSiteWatchers.RemoveHead();
  356.     }
  357.     //Check and see if we are in the YUV Site list. If so, remove ourselves.
  358.     LISTPOSITION pPos = zm_YUVSiteList.Find(this);
  359.     if(pPos)
  360.     {
  361.         zm_YUVSiteList.RemoveAt(pPos);
  362.     }
  363.     _EmptyBlenderList();
  364.     _EmptyNotifierList();
  365.     //Remove all pending tasks.
  366.     if (m_pTopLevelSite)
  367.         m_pTopLevelSite->RemovePendingTasks(this);
  368.     // release intefaces
  369.     HX_RELEASE(m_pCCF);
  370.     HX_RELEASE(m_pScheduler);
  371.     HX_RELEASE(m_pContext);
  372.     HX_RELEASE(m_pValues);
  373.     HX_RELEASE(m_pVideoSurface);
  374.     HX_RELEASE(m_pRootSurface);
  375.     if(m_pTopLevelSite != this)
  376.         HX_RELEASE(m_pTopLevelSite);
  377.     HXDestroyRegion(m_Region);
  378.     m_Region=NULL;
  379.     HXDestroyRegion(m_RegionForMouse);
  380.     m_RegionForMouse=NULL;
  381.     HXDestroyRegion(m_RegionWithoutChildren);
  382.     m_RegionWithoutChildren = NULL;
  383.     HXDestroyRegion(m_pDirtyRegion);
  384.     m_pDirtyRegion = NULL;
  385. }
  386. /************************************************************************
  387.  *  Method:
  388.  *    CHXBaseSite::SetParentSite
  389.  */
  390. void
  391. CHXBaseSite::SetParentSite(CHXBaseSite* pParentSite)
  392. {
  393.     m_pParentSite = pParentSite;
  394. }
  395. /************************************************************************
  396.  *  Method:
  397.  *    CHXBaseSite::SetTopLevelSite
  398.  */
  399. void
  400. CHXBaseSite::SetTopLevelSite(CHXBaseSite* pTop)
  401. {
  402.     if (m_pTopLevelSite != this)
  403.     {
  404.         HX_RELEASE(m_pTopLevelSite);
  405.     }
  406.     m_pTopLevelSite = pTop;
  407.     if (m_pTopLevelSite && m_pTopLevelSite != this)
  408.         m_pTopLevelSite->AddRef();
  409. }
  410. /************************************************************************
  411.  *  Method:
  412.  *    IUnknown::QueryInterface
  413.  */
  414. STDMETHODIMP CHXBaseSite::QueryInterface(REFIID riid, void** ppvObj)
  415. {
  416.     return m_pUnkOuter->QueryInterface(riid,ppvObj);
  417. }
  418. /************************************************************************
  419.  *  Method:
  420.  *    IUnknown::AddRef
  421.  */
  422. STDMETHODIMP_(ULONG32) CHXBaseSite::AddRef()
  423. {
  424.     return m_pUnkOuter->AddRef();
  425. }
  426. /************************************************************************
  427.  *  Method:
  428.  *    IUnknown::Release
  429.  */
  430. STDMETHODIMP_(ULONG32) CHXBaseSite::Release()
  431. {
  432.     return m_pUnkOuter->Release();
  433. }
  434. /************************************************************************
  435.  *  Method:
  436.  *    IUnknown::QueryInterface
  437.  */
  438. STDMETHODIMP CHXBaseSite::SiteNonDelegatingQueryInterface(REFIID riid, void** ppvObj)
  439. {
  440.     if (IsEqualIID(riid, IID_IUnknown))
  441.     {
  442.         AddRef();
  443.         *ppvObj = (IUnknown*)(IHXSite*)this;
  444.         return HXR_OK;
  445.     }
  446.     else if (IsEqualIID(riid, IID_IHXSite))
  447.     {
  448.         AddRef();
  449.         *ppvObj = (IHXSite*)this;
  450.         return HXR_OK;
  451.     }
  452.     else if (IsEqualIID(riid, IID_IHXSite2))
  453.     {
  454.         AddRef();
  455.         *ppvObj = (IHXSite2*)this;
  456.         return HXR_OK;
  457.     }
  458.     else if (IsEqualIID(riid, IID_IHXInterruptSafe))
  459.     {
  460.         AddRef();
  461.         *ppvObj = (IHXInterruptSafe*)this;
  462.         return HXR_OK;
  463.     }
  464.     else if (IsEqualIID(riid, IID_IHXSiteWindowless))
  465.     {
  466.         AddRef();
  467.         *ppvObj = (IHXSiteWindowless*)this;
  468.         return HXR_OK;
  469.     }
  470.     else if (IsEqualIID(riid, IID_IHXSiteWindowed))
  471.     {
  472.         AddRef();
  473.         *ppvObj = (IHXSiteWindowed*)this;
  474.         return HXR_OK;
  475.     }
  476.     else if (IsEqualIID(riid, IID_IHXStatusMessage))
  477.     {
  478.         AddRef();
  479.         *ppvObj = (IHXStatusMessage*)this;
  480.         return HXR_OK;
  481.     }
  482.     else if (IsEqualIID(riid, IID_IHXSiteFullScreen))
  483.     {
  484.         AddRef();
  485.         *ppvObj = (IHXSiteFullScreen*)this;
  486.         return HXR_OK;
  487.     }
  488.     else if (IsEqualIID(riid, IID_IHXVideoControl))
  489.     {
  490.         AddRef();
  491.         *ppvObj = (IHXVideoControl*)this;
  492.         return HXR_OK;
  493.     }
  494.     else if (IsEqualIID(riid, IID_IHXSiteTransition))
  495.     {
  496.         AddRef();
  497.         *ppvObj = (IHXSiteTransition*)this;
  498.         return HXR_OK;
  499.     }
  500.     else if (IsEqualIID(riid, IID_IHXSiteComposition))
  501.     {
  502.         AddRef();
  503.         *ppvObj = (IHXSiteComposition*)this;
  504.         return HXR_OK;
  505.     }
  506.     else if (m_pValues &&
  507.              m_pValues->QueryInterface(riid, ppvObj) == HXR_OK)
  508.     {
  509.         return HXR_OK;
  510.     }
  511.     else if (IsEqualIID(riid, IID_IHXKeyBoardFocus))
  512.     {
  513.         AddRef();
  514.         *ppvObj = (IHXKeyBoardFocus*)this;
  515.         return HXR_OK;
  516.     }
  517.     else if (IsEqualIID(riid, IID_IHXDrawFocus))
  518.     {
  519.         AddRef();
  520.         *ppvObj = (IHXDrawFocus*)this;
  521.         return HXR_OK;
  522.     }
  523.     else if (IsEqualIID(riid, IID_IHXSubRectSite))
  524.     {
  525.         AddRef();
  526.         *ppvObj = (IHXSubRectSite*)this;
  527.         return HXR_OK;
  528.     }
  529.     *ppvObj = NULL;
  530.     return HXR_NOINTERFACE;
  531. }
  532. /************************************************************************
  533.  *  Method:
  534.  *    IUnknown::AddRef
  535.  */
  536. STDMETHODIMP_(ULONG32) CHXBaseSite::SiteNonDelegatingAddRef()
  537. {
  538.     return InterlockedIncrement(&m_lRefCount);
  539. }
  540. /************************************************************************
  541.  *  Method:
  542.  *    IUnknown::Release
  543.  */
  544. STDMETHODIMP_(ULONG32) CHXBaseSite::SiteNonDelegatingRelease()
  545. {
  546.     if (InterlockedDecrement(&m_lRefCount) > 0)
  547.     {
  548.         return m_lRefCount;
  549.     }
  550.     delete this;
  551.     return 0;
  552. }
  553. /************************************************************************
  554.  *  Method:
  555.  *    IHXSite::AttachUser
  556.  */
  557. STDMETHODIMP CHXBaseSite::AttachUser(IHXSiteUser* /*IN*/ pUser)
  558. {
  559.     if (m_pUser) return HXR_UNEXPECTED;
  560. #ifndef _DEBUG_WINDOWED_SITES
  561.     if (m_pParentSite && pUser->NeedsWindowedSites())
  562.     {
  563.         _NeedWindowedSite();
  564.     }
  565. #endif
  566.     m_pUser = pUser;
  567.     m_pUser->AddRef();
  568.     //if (!m_pTopLevelSite->m_pKeyBoardFocusUser && m_pTopLevelSite->m_pUser)
  569.     //{
  570.     //    m_pTopLevelSite->m_pKeyBoardFocusUser = m_pTopLevelSite->m_pUser;
  571.     //    m_pTopLevelSite->m_pKeyBoardFocusUser->AddRef();
  572.     //}
  573.     m_pUser->AttachSite(this);
  574.     if (m_bAttachWindowPending)
  575.     {
  576.         m_bAttachWindowPending = FALSE;
  577.         m_bDetachWndMsgPending = TRUE;
  578.         // send HX_ATTACH_WINDOW msg to the renderers
  579.         void *  lpParam1 = NULL;
  580.         void *  lpParam2 = NULL;
  581.         HXxEvent event = {HX_ATTACH_WINDOW, m_pWindow ? m_pWindow->window : NULL, lpParam1, lpParam2, 0, 0};
  582.         m_pUser->HandleEvent(&event);
  583.     }
  584.     /* XXXRA
  585.      * Mac one does scale to full screen and also forces and update message
  586.      * should not need it!
  587.      */
  588.     return HXR_OK;
  589. }
  590. /************************************************************************
  591.  *  Method:
  592.  *    IHXSite::DetachUser
  593.  */
  594. STDMETHODIMP CHXBaseSite::DetachUser()
  595. {
  596.     if (!m_pUser) return HXR_UNEXPECTED;
  597.     /*
  598.      *  SetCapture
  599.      */
  600.     if (m_pTopLevelSite->m_pLastUser == m_pUser)
  601.     {
  602.         m_pTopLevelSite->m_pLastUser = NULL;
  603.     }
  604.     if (m_pTopLevelSite->m_pCaptureUser == m_pUser)
  605.     {
  606.         m_pTopLevelSite->m_pCaptureUser= NULL;
  607.         m_bSetCaptureOn = FALSE;
  608.     }
  609.     if (m_CallbackHandle)
  610.     {
  611.         m_pScheduler->Remove(m_CallbackHandle);
  612.         m_CallbackHandle = 0;
  613.     }
  614.     if (m_ScrollSiteCallbackHandle)
  615.     {
  616.         m_pScheduler->Remove(m_ScrollSiteCallbackHandle);
  617.         m_ScrollSiteCallbackHandle = 0;
  618.     }
  619.     if (m_pUser && m_bDetachWndMsgPending)
  620.     {
  621.         // send HX_DETACH_WINDOW msg to the renderers
  622.         void *  lpParam1 = NULL;
  623.         void *  lpParam2 = NULL;
  624.         HXxEvent event = {HX_DETACH_WINDOW, m_pWindow ? m_pWindow->window : NULL, lpParam1, lpParam2, 0, 0};
  625.         m_bDetachWndMsgPending = FALSE;
  626.         m_pUser->HandleEvent(&event);
  627.     }
  628.     AddRef();
  629.     if (HXR_OK == m_pUser->DetachSite())
  630.     {
  631.         if (m_pTopLevelSite->m_pKeyBoardFocusUser == m_pUser)
  632.             HX_RELEASE(m_pTopLevelSite->m_pKeyBoardFocusUser);
  633.         HX_RELEASE(m_pUser);
  634.     }
  635.     Release();
  636.     return HXR_OK;
  637. }
  638. /************************************************************************
  639.  *  Method:
  640.  *    IHXSite::GetUser
  641.  */
  642. STDMETHODIMP CHXBaseSite::GetUser(REF(IHXSiteUser*) /*OUT*/ pUser)
  643. {
  644.     if (!m_pUser) return HXR_UNEXPECTED;
  645.     pUser = m_pUser;
  646.     pUser->AddRef();
  647.     return HXR_OK;
  648. }
  649. /************************************************************************
  650.  *  Method:
  651.  *    IHXSite::CreateChild
  652.  */
  653. STDMETHODIMP CHXBaseSite::CreateChild(REF(IHXSite*) /*OUT*/ pChildSite)
  654. {
  655.     _TLSLock();
  656.     HRESULT result = HXR_OK;
  657.     // Create an instance of CHXBaseSite, let it know it's in child
  658.     // window mode.
  659.     CHXBaseSite* pChildSiteWindowless = CHXBaseSite::CreateSite(m_pContext, NULL, m_ChildrenMap.GetCount());
  660.     pChildSiteWindowless->AddRef();
  661.     pChildSiteWindowless->SetParentSite(this);
  662.     pChildSiteWindowless->SetTopLevelSite(m_pTopLevelSite);
  663.     pChildSiteWindowless->SetRootSurface(m_pRootSurface);
  664.     pChildSiteWindowless->SetParentWindow(&m_TopLevelWindow);
  665. #ifdef _WIN32
  666.     //this is to give the windows sites a chance to hook themselves
  667.     //into wm_move madness.
  668.     CHXWinSite* pSiteIt = (CHXWinSite*)pChildSiteWindowless;
  669.     pSiteIt->HookParents();
  670. #endif
  671.     // Get the IHXSite interface from the child to return to the
  672.     // outside world.
  673.     pChildSiteWindowless->QueryInterface(IID_IHXSite, (void**)&pChildSite);
  674.     // Store the CHXBaseSite in a list of child windows, always keep
  675.     //a reference to it.  ExSiteInfo does an AddRef in constructor
  676.     m_ChildrenMap.SetAt(pChildSite, pChildSiteWindowless);
  677.     pChildSite->AddRef();
  678.     //Now add the child into or ZOrder sorted list.
  679.     m_ChildrenInZOrder.AddTail( (void*)pChildSiteWindowless );
  680.     //Set the child's origin
  681.     pChildSiteWindowless->SetOrigin(&m_topleft);
  682.     if(m_pTopLevelSite)
  683.         m_pTopLevelSite->ScheduleCallback(CLIP, 0);
  684.     HXxWindow* pWindow = GetWindow();
  685.     //XXXgfw this focus code is disabled for the beamer release.
  686.     //SafeSetFocus(pWindow);
  687.     _TLSUnlock();
  688.     return HXR_OK;
  689. }
  690. /************************************************************************
  691.  *  Method:
  692.  *    IHXSite::DestroyChild
  693.  */
  694. STDMETHODIMP CHXBaseSite::DestroyChild(IHXSite* /*IN*/ pChildSite)
  695. {
  696.     // Avoid dead-lock in vidsurf2
  697.     LockBlitters();
  698.     FlushSurfaces();
  699.     _TLSLock();
  700.     //Check and see if we are in the YUV Site list. If so, remove ourselves.
  701.     LISTPOSITION pPos = zm_YUVSiteList.Find(this);
  702.     if(pPos)
  703.     {
  704.         zm_YUVSiteList.RemoveAt(pPos);
  705.     }
  706.     //Verify that the site is actually a child site and find its
  707.     //position in the list in the event that it is a child.
  708.     HX_RESULT retVal = HXR_FAIL;
  709.     CHXBaseSite* pChildSiteWindowless=NULL;
  710.     if (m_ChildrenMap.Lookup(pChildSite, (void*&) pChildSiteWindowless))
  711.     {
  712.         m_ChildrenMap.RemoveKey(pChildSite);
  713.         pChildSiteWindowless->Destroy();
  714.         pChildSiteWindowless->SetParentSite(NULL);
  715.         //Remove it from our child z-order list.
  716.         LISTPOSITION pos,posNext = m_ChildrenInZOrder.GetHeadPosition();
  717.         while (posNext)
  718.         {
  719.             pos = posNext;
  720.             CHXBaseSite* pSite = (CHXBaseSite*)m_ChildrenInZOrder.GetNext(posNext);
  721.             if( pSite == pChildSiteWindowless )
  722.             {
  723.                 m_ChildrenInZOrder.RemoveAt(pos);
  724.                 while (posNext)
  725.                 {
  726.     pSite = (CHXBaseSite*)m_ChildrenInZOrder.GetNext(posNext);
  727.     INT32 zOrder;
  728.     pSite->GetZOrder(zOrder);
  729.     pSite->SetInternalZOrder(zOrder - 1);
  730.                 }
  731.                 break;
  732.             }
  733.         }
  734.         HX_RELEASE(pChildSite);
  735.         HX_RELEASE(pChildSiteWindowless);
  736.         retVal = HXR_OK;
  737.     }
  738.     HX_ASSERT( m_ChildrenInZOrder.GetCount() == m_ChildrenMap.GetCount() );
  739.     if (m_pTopLevelSite==this)
  740.     {
  741.         m_pTopLevelSite->RecomputeClip();
  742.     }
  743.     else
  744.     {
  745.         if (m_pTopLevelSite)
  746.         {
  747.             m_pTopLevelSite->ScheduleCallback(CLIP, 0);
  748.         }
  749.     }
  750.     _TLSUnlock();
  751.     UnlockBlitters();
  752.     return retVal;
  753. }
  754. /************************************************************************
  755.  *  Method:
  756.  *    IHXSite::AttachWatcher
  757.  */
  758. STDMETHODIMP CHXBaseSite::AttachWatcher(IHXSiteWatcher* /*IN*/ pWatcher)
  759. {
  760.     if (m_pWatcher) return HXR_UNEXPECTED;
  761.     m_pWatcher = pWatcher;
  762.     if (m_pWatcher)
  763.     {
  764.         m_pWatcher->AddRef();
  765.         m_pWatcher->AttachSite(this);
  766.     }
  767.     return HXR_OK;
  768. }
  769. /************************************************************************
  770.  *  Method:
  771.  *    IHXSite::DetachWatcher
  772.  */
  773. STDMETHODIMP CHXBaseSite::DetachWatcher()
  774. {
  775.     if (!m_pWatcher) return HXR_UNEXPECTED;
  776.     m_pWatcher->DetachSite();
  777.     HX_RELEASE(m_pWatcher);
  778.     return HXR_OK;
  779. }
  780. /************************************************************************
  781.  *  Method:
  782.  *    IHXSite::SetSize
  783.  */
  784. STDMETHODIMP CHXBaseSite::SetSize(HXxSize size)
  785. {
  786.     HX_RESULT ret = HXR_OK;
  787.     _TLSLock();
  788.     if (_AtSystemTime())
  789.     {
  790.         m_pTopLevelSite->ExecutePendingTasks();
  791.         ret = _SafeSetSize(size);
  792.         _TLSUnlock();
  793.         return ret;
  794.     }
  795.     PendingTask* pPendingTask = new PendingTask( ONSETSIZE,
  796.                                                  this,
  797.                                                  (void*)size.cx,
  798.                                                  (void*)size.cy,
  799.                                                  (void*)NULL,
  800.                                                  (void*)NULL,
  801.                                                  (void*)NULL,
  802.                                                  (void*)NULL
  803.                                                  );
  804.     m_pTopLevelSite->m_PendingTaskList.AddTail((void*) pPendingTask);
  805.     m_pTopLevelSite->ScheduleCallback(MOUSE, 0);
  806.     _TLSUnlock();
  807.     return TRUE;
  808. }
  809. /************************************************************************
  810.  *  Method:
  811.  *    IHXSite::SetSize
  812.  */
  813. HX_RESULT CHXBaseSite::_SafeSetSize(HXxSize size)
  814. {
  815.     _TLSLock();
  816.     HRESULT hres = HXR_OK;
  817.     CHXSimpleList::Iterator i;
  818.     size.cx = size.cx<0?0:size.cx;
  819.     size.cy = size.cy<0?0:size.cy;
  820.     //Fix up sizes for full screen. Some renderes, MPEG, will get very
  821.     //late setsize calls. If we get a setsize call after we have gone
  822.     //to fullscreen, we need to readjust our full screen window.
  823.     if( IsFullScreen() && this==m_pTopLevelSite )
  824.     {
  825.         double stretchRatio = 0;
  826.         double xRatio       = 0;
  827.         double yRatio       = 0;
  828.         UINT16 newBitsPerPixel = 0;
  829.         UINT16 nHozRes      = 0;
  830.         UINT16 nVertRes     = 0;
  831.         _GetDeviceCaps(NULL, newBitsPerPixel, nHozRes, nVertRes);
  832.         if(m_bPostageStamp)
  833.         {
  834.             if( m_windowSize.cx*2 <= nHozRes &&
  835.                 m_windowSize.cy*2 <= nVertRes)
  836.             {
  837.                 xRatio  = yRatio = 2.0;
  838.             }
  839.             else
  840.             {
  841.                 xRatio  = yRatio = 1.0;
  842.             }
  843.         }
  844.         else
  845.         {
  846.             xRatio = (double)nHozRes  / (double)size.cx ;
  847.             yRatio = (double)nVertRes / (double)size.cy ;
  848.         }
  849.         if (xRatio<yRatio)
  850.             stretchRatio = xRatio;
  851.         else
  852.             stretchRatio = yRatio;
  853.         if( m_bPostageStamp )
  854.         {
  855.             size.cx = (int) ((double) m_windowSize.cx * stretchRatio + 0.5);
  856.             size.cy = (int) ((double) m_windowSize.cy * stretchRatio + 0.5);
  857.         }
  858.         else
  859.         {
  860.             size.cx = (int) ((double) size.cx * stretchRatio + 0.5);
  861.             size.cy = (int) ((double) size.cy * stretchRatio + 0.5);
  862.         }
  863. #if !defined(_UNIX) || defined(_MAC_UNIX)
  864.         m_screenOffset.x = (nHozRes  - size.cx)/2;
  865.         m_screenOffset.y = (nVertRes - size.cy)/2;
  866. #endif
  867.     }
  868.     //before we do anything, we give the SiteWatcher a chance to
  869.     //influence this operation.
  870.     if (m_pWatcher)
  871.     {
  872.         hres = m_pWatcher->ChangingSize(m_size, size);
  873.     }
  874.     //Get rid of our last alpha blend region as it is the wrong size
  875.     //now....
  876.     HX_FREE( m_pVideoSurface->m_pucLastImage );
  877.     if (HXR_OK == hres )
  878.     {
  879.         //We must invalidate our rect.....
  880.         HXxRect pTmp = { m_topleft.x,
  881.                          m_topleft.y,
  882.                          m_topleft.x+m_size.cx,
  883.                          m_topleft.y+m_size.cy};
  884.         m_pTopLevelSite->_RecursiveDamageRect( &pTmp, TRUE );
  885.         m_size = size;
  886.         // iterate child site list
  887.         for(i=m_PassiveSiteWatchers.Begin(); i!= m_PassiveSiteWatchers.End(); ++i)
  888.         {
  889.             ((IHXPassiveSiteWatcher*) *i)->SizeChanged(&m_size);
  890.         }
  891.         if( m_pWindow && m_pWindow->window &&
  892.             (m_pTopLevelSite!=this || m_bWindowCreatedByCreate ) )
  893.         {
  894.             _SetSize(size);
  895.         }
  896.         //Handle scrolling..
  897.         if( m_pValues )
  898.         {
  899.             ULONG32 bScroll = FALSE;
  900.             m_pValues->GetPropertyULONG32("ScrollingSite", bScroll);
  901.             if (bScroll)
  902.             {
  903.                 SetXSliderRange(size.cx);
  904.                 SetYSliderRange(size.cy);
  905.                 m_bScrollingSite = TRUE;
  906.             }
  907.         }
  908.         //We must invalidate our rect after the resize also..
  909.         HXxRect pTmp2 = { m_topleft.x,
  910.                           m_topleft.y,
  911.                           m_topleft.x+m_size.cx,
  912.                           m_topleft.y+m_size.cy};
  913.         m_pTopLevelSite->_RecursiveDamageRect( &pTmp2, TRUE );
  914.     }
  915.     if (this == m_pTopLevelSite && m_pStatusText)
  916.     {
  917.         m_pStatusText->ParentChangedSize();
  918.     }
  919.     if (m_pTopLevelSite==this)
  920.     {
  921.         m_pTopLevelSite->RecomputeClip();
  922.     }
  923.     else
  924.     {
  925.         if(m_pTopLevelSite)
  926.             m_pTopLevelSite->ScheduleCallback(CLIP, 0);
  927.     }
  928.     if( this == m_pTopLevelSite && m_pStatusText )
  929.     {
  930.         m_pStatusText->ParentChangedSize();
  931.     }
  932.     //XXXgfw Don't know where to really do this work. It must be after
  933.     //the site is created and smil can set these values but before we
  934.     //handle events.
  935.     //Get sensitivity setting for mouse clicks.  Only do this
  936.     //once per site on the first event.  If 'sensitivity'
  937.     //isn't set by then too bad.
  938.     if( m_nEventSensitivity==SENSITIVITY_NOT_SET )
  939.     {
  940.         //opaque is the default set by the W3C working group.
  941.         m_nEventSensitivity = SENSITIVITY_OPAQUE;
  942.         if( m_pValues )
  943.         {
  944.             IHXBuffer* pBuf = NULL;
  945.             m_pValues->GetPropertyCString( "sensitivity", pBuf );
  946.             if( pBuf )
  947.             {
  948.                 const char* pszBuff = (const char*)pBuf->GetBuffer();
  949.                 if( pszBuff)
  950.                 {
  951.                     //m_nEventSensitivity is in alpha values [0,255]
  952.                     if( strcmp( pszBuff, "transparent" )==0 )
  953.                     {
  954.                         m_nEventSensitivity = SENSITIVITY_TRANSPARENT;
  955.                     }
  956.                     else if( strcmp( pszBuff, "opaque" )==0 )
  957.                     {
  958.                         m_nEventSensitivity = SENSITIVITY_OPAQUE;
  959.                     }
  960.                     else
  961.                     {
  962.                         double sen = ::atof( pszBuff );
  963.                         if( sen < 0 )
  964.                             sen = 0;
  965.                         if( sen > 100 )
  966.                             sen = 100;
  967.                         //Scale percentages to [0,255]
  968.                         m_nEventSensitivity = 255-(int)(sen*255.0/100.0+0.5);
  969.                     }
  970.                 }
  971.                 HX_RELEASE(pBuf);
  972.             }
  973.         }
  974.     }
  975.     _TLSUnlock();
  976.     return hres;
  977. }
  978. /************************************************************************
  979.  *  Method:
  980.  *    IHXSite::SetPosition
  981.  */
  982. STDMETHODIMP CHXBaseSite::SetPosition(HXxPoint position)
  983. {
  984.     HX_RESULT ret = HXR_OK;
  985.     _TLSLock();
  986.     if (_AtSystemTime())
  987.     {
  988.         m_pTopLevelSite->ExecutePendingTasks();
  989.         ret = _SafeSetPosition(position);
  990.         _TLSUnlock();
  991.         return ret;
  992.     }
  993.     PendingTask* pPendingTask = new PendingTask(ONSETPOSITION,
  994.                                                 this, (void*) position.x,
  995.                                                 (void*) position.y,
  996.                                                 (void*) NULL,
  997.                                                 (void*) NULL,
  998.                                                 (void*) NULL,
  999.                                                 (void*) NULL);
  1000.     m_pTopLevelSite->m_PendingTaskList.AddTail((void*) pPendingTask);
  1001.     m_pTopLevelSite->ScheduleCallback(MOUSE, 0);
  1002.     _TLSUnlock();
  1003.     return TRUE;
  1004. }
  1005. HX_RESULT CHXBaseSite::_SafeSetPosition(HXxPoint position)
  1006. {
  1007.     _TLSLock();
  1008.     HRESULT hres = HXR_OK;
  1009.     CHXSimpleList::Iterator i;
  1010.     CHXMapPtrToPtr::Iterator j;
  1011.     //Before we do anything, we give the SiteWatcher a chance to
  1012.     //influence this operation.
  1013.     if (m_pWatcher)
  1014.     {
  1015.         hres = m_pWatcher->ChangingPosition(m_position, position);
  1016.     }
  1017. #if defined(_MACINTOSH) || defined(_MAC_UNIX)
  1018.     if (this == m_pTopLevelSite)
  1019.     {
  1020.         // xxxbobclark
  1021.         // For the Mac, the top-level site is moved by adjusting
  1022.         // its HXxWindow's x and y values. If we go ahead and
  1023.         // change m_position, it can screw up situations like the
  1024.         // embedded player where it DOES call SetPosition on the
  1025.         // top-level site to move it in its window.
  1026.         _TLSUnlock();
  1027.         return HXR_OK;
  1028.     }
  1029. #endif
  1030.     if (HXR_OK == hres)
  1031.     {
  1032.         //Damage The old position....
  1033.         HXxRect pTmp = { m_topleft.x,
  1034.                          m_topleft.y,
  1035.                          m_topleft.x+m_size.cx,
  1036.                          m_topleft.y+m_size.cy};
  1037.         m_pTopLevelSite->_RecursiveDamageRect( &pTmp, TRUE );
  1038.         if(!m_bWindowCreatedByCreate )
  1039.         {
  1040.             // if we've created the window we don't want to move the site
  1041.             // just the window
  1042.             m_position     = position;
  1043.             m_positionOrig = m_position;
  1044.         }
  1045.         //fixup our top left
  1046.         ResetOrigin();
  1047.         //iterate passive site watcher list
  1048.         for(i=m_PassiveSiteWatchers.Begin(); i!= m_PassiveSiteWatchers.End(); ++i)
  1049.         {
  1050.             ((IHXPassiveSiteWatcher*) *i)->PositionChanged(&m_position);
  1051.         }
  1052.         if( m_pWindow &&
  1053.             m_pWindow->window &&
  1054.             (m_pTopLevelSite!=this || m_bWindowCreatedByCreate )
  1055.             )
  1056.         {
  1057.             m_CreateWindowPos = position;
  1058.             _SetPosition(position);
  1059.         }
  1060.     }
  1061.     //We must first remove our old dirty region because we moved and
  1062.     //we could get negative offsets...
  1063.     HXxRect pTmp2 = { m_topleft.x,
  1064.                       m_topleft.y,
  1065.                       m_topleft.x+m_size.cx,
  1066.                       m_topleft.y+m_size.cy};
  1067.     m_pTopLevelSite->_RecursiveDamageRect( &pTmp2, TRUE );
  1068.     if (m_pTopLevelSite==this)
  1069.     {
  1070.         m_pTopLevelSite->RecomputeClip();
  1071.     }
  1072.     else
  1073.     {
  1074.         if (m_pTopLevelSite)
  1075.         {
  1076.             m_pTopLevelSite->ScheduleCallback(CLIP, 0);
  1077.         }
  1078.     }
  1079.     m_pVideoSurface->UpdateDestRect();
  1080.     _TLSUnlock();
  1081.     return hres;
  1082. }
  1083. /************************************************************************
  1084.  *  Method:
  1085.  *    IHXSite::GetSize
  1086.  */
  1087. STDMETHODIMP CHXBaseSite::GetSize(REF(HXxSize) size)
  1088. {
  1089.     size = m_size;
  1090.     //XXXgfw what???????? why change it after assignment???
  1091. //     m_pValues->GetPropertyULONG32("MediaSizeX", (ULONG32&) ttt.cx);
  1092. //     m_pValues->GetPropertyULONG32("MediaSizeY", (ULONG32&) ttt.cy);
  1093.     return HXR_OK;
  1094. }
  1095. /************************************************************************
  1096.  *  Method:
  1097.  *    IHXSite::GetPosition
  1098.  */
  1099. STDMETHODIMP CHXBaseSite::GetPosition(REF(HXxPoint) position)
  1100. {
  1101.     position = m_position;
  1102.     return HXR_OK;
  1103. }
  1104. //
  1105. // CHXBaseSite::DamageRect()
  1106. //
  1107. // All incoming coordinates are SITE relative...
  1108. //
  1109. STDMETHODIMP CHXBaseSite::DamageRect(HXxRect rect)
  1110. {
  1111. #if defined(_MACINTOSH) || defined(_MAC_UNIX)
  1112.     _TLSLock();
  1113. #endif
  1114.     HXRECTANGLE rectTmp;
  1115.     HXxPoint* pOrigin = GetOrigin();
  1116.     //Crop
  1117.     if( rect.left < 0 )
  1118.         rect.left = 0;
  1119.     if( rect.top < 0 )
  1120.         rect.top = 0;
  1121.     if( rect.right > m_size.cx )
  1122.         rect.right = m_size.cx;
  1123.     if( rect.bottom > m_size.cy )
  1124.         rect.bottom = m_size.cy;
  1125.     //Translate rect to window coordinates.
  1126.     rect.left   += pOrigin->x;
  1127.     rect.right  += pOrigin->x;
  1128.     rect.top    += pOrigin->y;
  1129.     rect.bottom += pOrigin->y;
  1130.     rectTmp.x      = (short)rect.left;
  1131.     rectTmp.y      = (short)rect.top;
  1132.     rectTmp.width  = (short)(rect.right-rect.left);
  1133.     rectTmp.height = (short)(rect.bottom-rect.top);
  1134.     HXUnionRectWithRegion( &rectTmp, m_pDirtyRegion, m_pDirtyRegion);
  1135.     //Do OS specific stuff here.
  1136.     _DamageRect(rect);
  1137. #if defined(_MACINTOSH) || defined(_MAC_UNIX)
  1138.     _TLSUnlock();
  1139. #endif
  1140.     return HXR_OK;
  1141. }
  1142. //This is the same as DamageRect except that the coordinates are in
  1143. //Window relative coords and we don't do the OS specific stuff (like
  1144. //no invalidateRect.
  1145. void CHXBaseSite::DamageRectWindowRel(HXxRect rect)
  1146. {
  1147.     HXxPoint* pPosition = GetOrigin();
  1148.     //Crop
  1149.     HXREGION* pReg = HXCreateRectRegion( rect.left,
  1150.                                          rect.top,
  1151.                                          rect.right-rect.left,
  1152.                                          rect.bottom-rect.top
  1153.                                          );
  1154.     //Find out what part intersects us.
  1155.     HXREGION*   pTemp = Transition( pPosition->x, pPosition->y,
  1156.                                     pPosition->x + m_size.cx,
  1157.                                     pPosition->y + m_size.cy
  1158.                                     );
  1159.     HXIntersectRegion( pTemp, pReg, pReg );
  1160.     if( !HXEmptyRegion(pReg) )
  1161.     {
  1162.         HXUnionRegion( pReg, m_pDirtyRegion, m_pDirtyRegion);
  1163.         // We must call _DamageRect to give windows a chance to see if
  1164.         // we are occluded by a drop down menu. If we are, then we
  1165.         // have to invalidate the OS rect so Windows does not do a
  1166.         // save under.
  1167.         HXxRect rectTmp =
  1168.             {pTemp->extents.x1, pTemp->extents.y1, pTemp->extents.x2, pTemp->extents.y2};
  1169.         _DamageRect(rectTmp);
  1170.     }
  1171.     HXDestroyRegion( pReg );
  1172.     HXDestroyRegion( pTemp );
  1173. }
  1174. /************************************************************************
  1175.  *  Method:
  1176.  *    IHXSite::DamageRegion
  1177.  */
  1178. STDMETHODIMP CHXBaseSite::DamageRegion(HXxRegion region)
  1179. {
  1180.     HX_ASSERT( "Depricated method, do not use. Use the new damage region." == NULL );
  1181.     //This was never used and it was not defined what a HXxRegion was.
  1182.     //So, we just have to invalidate the whole site.
  1183.     //Users should use the new damage region that takes the cross platform
  1184.     //region that actually works.
  1185.     HXxRect rect;
  1186.     HXREGION* reg = (HXREGION*)region;
  1187.     rect.left   = 0;
  1188.     rect.top    = 0;
  1189.     rect.right  = m_size.cx;
  1190.     rect.bottom = m_size.cy;
  1191.     return DamageRect( rect );
  1192. }
  1193. // Method:
  1194. //    IHXSite::ForceRedraw
  1195. STDMETHODIMP CHXBaseSite::ForceRedraw()
  1196. {
  1197.     HXxEvent event;
  1198.     HXxWindow* hxxWin = GetWindow();
  1199.     if( IsCompositionLocked() && m_pVideoSurface->m_nBltMode!=HX_OVERLAY_BLT )
  1200.     {
  1201.         return HXR_OK;
  1202.     }
  1203.     // make sure we have a visible window event though this should be
  1204.     // computed from the list of rects.
  1205.     if (!_ShouldEnterForceRedraw())
  1206.     {
  1207.         return HXR_OK;
  1208.     }
  1209.     _TLSLock();
  1210.     AddRef();
  1211.     memset(&m_UpdateBltStatsRect, 0, sizeof(m_UpdateBltStatsRect));
  1212.     if(m_pTopLevelSite->m_bDisableForceRedraw)
  1213.     {
  1214.         m_pTopLevelSite->m_bDisableForceRedraw = TRUE;
  1215.     }
  1216.     else
  1217.     {
  1218.         BOOL bDoIt =
  1219.             ((m_bIsVisible && m_pUser && m_Region && !HXEmptyRegion(m_Region)) ||
  1220.              (m_AlphaBlendNotifiers.GetCount()!=0 || m_AlphaBlendSites.GetCount()!=0));
  1221.         if( bDoIt )
  1222.         {
  1223.             AboutToBlt();
  1224.             event.handled = 0;
  1225.             if( m_bUserWantsSubRects )
  1226.             {
  1227.                 if( !HXEmptyRegion(m_pDirtyRegion) )
  1228.                 {
  1229.                     HXxExposeInfo exposeInfo;
  1230.                     HXxBoxRegion    dirtRegion;
  1231.                     //Construct a dirty rect that is relative to the
  1232.                     //site's topleft corner.
  1233.                     HXREGION* pTmpReg = HXCreateRegion();
  1234.                     HXUnionRegion( pTmpReg, m_pDirtyRegion, pTmpReg );
  1235.                     HXOffsetRegion( pTmpReg, -m_topleft.x, -m_topleft.y );
  1236.                     // adjust for scrolling; essentially turning off
  1237.                     // subrect blitting while scrolling
  1238.                     if (GetXSliderPos() || GetYSliderPos())
  1239.                     {
  1240. HXREGION* pMe = HXCreateRectRegion( 0,
  1241. 0,
  1242. m_size.cx,
  1243. m_size.cy
  1244. );
  1245. HXUnionRegion(pMe, pTmpReg, pTmpReg);
  1246. HXDestroyRegion(pMe);
  1247.                     }
  1248.                     //Set up the cross platform region.
  1249.                     dirtRegion.numRects = pTmpReg->numRects;
  1250.                     dirtRegion.rects    = pTmpReg->rects;
  1251.                     exposeInfo.extents.left    = pTmpReg->extents.x1;
  1252.                     exposeInfo.extents.right   = pTmpReg->extents.x2;
  1253.                     exposeInfo.extents.top     = pTmpReg->extents.y1;
  1254.                     exposeInfo.extents.bottom  = pTmpReg->extents.y2;
  1255.                     exposeInfo.pRegion         = & dirtRegion;
  1256.                     exposeInfo.pWindow         = GetWindow();
  1257.                     exposeInfo.pParam1         = NULL;
  1258.                     exposeInfo.pParam2         = NULL;
  1259.                     event.event   = HX_SURFACE_UPDATE2;
  1260.                     event.window  = hxxWin?hxxWin->window : NULL;
  1261.                     event.param1  = m_pVideoSurface;
  1262.                     event.param2  = &exposeInfo;
  1263.                     event.result  = 0;
  1264.                     event.handled = 0;
  1265.                     // Clear the dirty region
  1266.                     HXZeroOutRegion( m_pDirtyRegion );
  1267.                     if( m_pUser )
  1268.                     {
  1269.                         if (!m_bDoNotGenerateWMPPaint)
  1270.                         {
  1271.                             m_bInForceRedraw = m_bSiteRefresh;
  1272.                             m_pUser->HandleEvent(&event);
  1273.                             m_bInForceRedraw = FALSE;
  1274.                         }
  1275.                     }
  1276.                     HXDestroyRegion( pTmpReg );
  1277.                 }
  1278.             }
  1279.             else
  1280.             {
  1281. //XXXgfw OK, this is screwed up. Windows renders want a rectangle in
  1282. //XXXgfw param2 while the unix renderers want a Window there. To clean this
  1283. //XXXgfw up we need to clean up and unify the renderers.....
  1284. #if defined(_UNIX) && !defined(_MAC_UNIX)
  1285.                 event.event   = HX_SURFACE_UPDATE;
  1286.                 event.window  = hxxWin?hxxWin->window : NULL;
  1287.                 event.param1  = m_pVideoSurface;
  1288.                 event.param2  = GetWindow();
  1289.                 event.result  = 0;
  1290.                 event.handled = 0;
  1291. #else
  1292.                 event.event   = HX_SURFACE_UPDATE;
  1293.                 event.window  = m_pWindow? m_pWindow->window : NULL;
  1294.                 event.param1  = m_pVideoSurface;
  1295.                 event.param2  = NULL;
  1296.                 event.result  = 0;
  1297.                 event.handled = 0;
  1298. #endif
  1299.                 // Clear the dirty region
  1300.                 HXZeroOutRegion( m_pDirtyRegion );
  1301.                 if( m_pUser )
  1302.                 {
  1303.                     if (!m_bDoNotGenerateWMPPaint)
  1304.                     {
  1305.                         // Distinguishes between a new frame and a repaint of a prior frame
  1306.                         m_bInForceRedraw = m_bSiteRefresh;
  1307.                         m_pUser->HandleEvent(&event);
  1308.                         m_bInForceRedraw = FALSE;
  1309.                     }
  1310.                 }
  1311.             }
  1312.             // If blt has never been called, then blt black to the
  1313.             // background.  Do not do this if we are a windowed
  1314.             // renderer.
  1315.             if (!event.handled && !m_bBltHasBeenCalled
  1316.                 && !m_pWindow && m_pVideoSurface->m_nBltMode!=HX_OVERLAY_BLT )
  1317.             {
  1318.                 // Get the current size of the site The source rect is
  1319.                 // just a 1 by 1 black pixel that gets stretched to
  1320.                 // fit the destination
  1321.                 HXxRect rDestRect   = { 0, 0, m_size.cx, m_size.cy};
  1322.                 HXxRect rSrcRect    = { 0, 0, 1, 1};
  1323.                 HXBitmapInfoHeader bih;
  1324.                 memset(&bih, 0, sizeof(HXBitmapInfoHeader));
  1325.                 bih.biSize          = sizeof(HXBitmapInfoHeader);
  1326.                 bih.biWidth         = 1;
  1327.                 bih.biHeight        = 1;
  1328.                 bih.biPlanes        = 1;
  1329.                 bih.biBitCount      = 32;
  1330.                 bih.biCompression   = HX_RGB;
  1331.                 UCHAR pBuffer[4] = { 0,0,0,0 };
  1332.                 m_pVideoSurface->Blt(pBuffer,
  1333.                                      &bih,
  1334.                                      rDestRect,
  1335.                                      rSrcRect);
  1336.                 m_bBltHasBeenCalled = FALSE;
  1337.             }
  1338.             //Stupid Windowed renderers!
  1339.             if(!m_bDoNotGenerateWMPPaint &&
  1340.                !event.handled            &&
  1341.                m_pWindow                 &&
  1342.                m_pWindow->window )
  1343.             {
  1344.                 _SendOSUpdateMessage();
  1345.             }
  1346.         }
  1347.         m_pVideoSurface->UpdateBltStats(&m_UpdateBltStatsRect);
  1348.     }
  1349.     _TLSUnlock();
  1350.     _ExitForceRedraw();
  1351.     Release();
  1352.     return HXR_OK;
  1353. }
  1354. /************************************************************************
  1355.  *  Method:
  1356.  *    IHXSite2::UpdateSiteWindow
  1357.  *
  1358.  *      Not used on Windows platform
  1359.  */
  1360. STDMETHODIMP CHXBaseSite::UpdateSiteWindow
  1361. (
  1362.     HXxWindow* /*IN*/ pWindow
  1363.     )
  1364. {
  1365.     return HXR_NOTIMPL;
  1366. }
  1367. /************************************************************************
  1368.  *  Method:
  1369.  *    IHXSite2::ShowSite
  1370.  */
  1371. STDMETHODIMP CHXBaseSite::ShowSite(BOOL bShow)
  1372. {
  1373.     _TLSLock();
  1374.     if(m_bIsVisible != bShow)
  1375.     {
  1376.         m_bIsVisible = bShow;
  1377.         //Invalidate the rect....
  1378.         HXxRect pTmp = { m_topleft.x,
  1379.                          m_topleft.y,
  1380.                          m_topleft.x+m_size.cx,
  1381.                          m_topleft.y+m_size.cy};
  1382.         m_pTopLevelSite->_RecursiveDamageRect( &pTmp, TRUE );
  1383.         if( this == m_pTopLevelSite )
  1384.         {
  1385.             RecomputeClip();
  1386.         }
  1387.         else
  1388.         {
  1389.             if(m_pTopLevelSite)
  1390.                 m_pTopLevelSite->ScheduleCallback(CLIP, 0);
  1391.         }
  1392.     }
  1393.     _ShowSite(bShow);
  1394.     SizeSliders();
  1395.     _TLSUnlock();
  1396.     return HXR_OK;
  1397. }
  1398. void CHXBaseSite::_ForceRedrawAll()
  1399. {
  1400.     if( (IsSiteVisible() && m_Region && !HXEmptyRegion(m_Region)) ||
  1401.         (m_AlphaBlendSites.GetCount()||m_AlphaBlendNotifiers.GetCount() )
  1402.         )
  1403.     {
  1404. //         HXREGION* pReg = NULL;
  1405. //         if( pDirtyRect)
  1406. //         {
  1407. //             pReg = HXCreateRectRegion( pDirtyRect->left,
  1408. //                                         pDirtyRect->top,
  1409. //                                         pDirtyRect->right-pDirtyRect->left,
  1410. //                                         pDirtyRect->bottom-pDirtyRect->top );
  1411. //             HXIntersectRegion( m_Region, pReg, pReg );
  1412. //             HXUnionRegion( m_pDirtyRegion, pReg, m_pDirtyRegion );
  1413. //             HXDestroyRegion( pReg );
  1414. //         }
  1415. //         else
  1416. //         {
  1417. //            HXUnionRegion( m_pDirtyRegion, m_Region, m_pDirtyRegion );
  1418. //        }
  1419.         InternalForceRedraw();
  1420.     }
  1421.     //Now do all the children in z-order
  1422.     LISTPOSITION pos = m_ChildrenInZOrder.GetHeadPosition();
  1423.     while(pos)
  1424.     {
  1425.         CHXBaseSite* pSite = (CHXBaseSite*)m_ChildrenInZOrder.GetNext(pos);
  1426.         pSite->_ForceRedrawAll();
  1427.     }
  1428. }
  1429. BOOL CHXBaseSite::_CheckForVisibleChild()
  1430. {
  1431.     BOOL retVal = FALSE;
  1432.     if( m_bIsVisible && !m_bSiteNeverBlts )
  1433.     {
  1434.         retVal = TRUE;
  1435.     }
  1436.     else
  1437.     {
  1438.         LISTPOSITION pos = m_ChildrenInZOrder.GetHeadPosition();
  1439.         while(pos)
  1440.         {
  1441.             CHXBaseSite* pSite = (CHXBaseSite*)m_ChildrenInZOrder.GetNext(pos);
  1442.             if( pSite->_CheckForVisibleChild() )
  1443.             {
  1444.                 retVal = TRUE;
  1445.                 break;
  1446.             }
  1447.         }
  1448.     }
  1449.     return retVal;
  1450. }
  1451. /************************************************************************
  1452.  *  Method:
  1453.  *    IHXSite2::IsSiteVisible
  1454.  */
  1455. STDMETHODIMP_(BOOL) CHXBaseSite::IsSiteVisible()
  1456. {
  1457.     BOOL bIsVisible = m_bIsVisible;
  1458.     if(m_pParentSite)
  1459.     {
  1460.         bIsVisible &= m_pParentSite->IsSiteVisible();
  1461.     }
  1462.     if( bIsVisible )
  1463.     {
  1464.         //If we are a m_bSiteNeverBlts then it doesn't matter if we are
  1465.         //visible or not, we must have at least one child that is
  1466.         //visible and not m_bSiteNeverBlts. Otherwise we really aren't
  1467.         //visible at all. This distinction is needed because of our
  1468.         //favorite logic in computesubrecs not that we have transparent
  1469.         //regions.
  1470.         if(!_CheckForVisibleChild())
  1471.         {
  1472.             bIsVisible = FALSE;
  1473.         }
  1474.     }
  1475.     return bIsVisible;
  1476. }
  1477. /************************************************************************
  1478.  *  Method:
  1479.  *    IHXSite2::UpdateZOrder
  1480.  *    This method updates the Z order of its child sites since one of its
  1481.  *    child sites' Z order is being updated.
  1482.  */
  1483. void
  1484. CHXBaseSite::UpdateZOrder( CHXBaseSite* pUpdatedChildSite, INT32 lOldZOrder, INT32 lNewZOrder)
  1485. {
  1486.     HX_ASSERT(pUpdatedChildSite);
  1487.     LISTPOSITION pos = m_ChildrenInZOrder.Find((void*)pUpdatedChildSite);
  1488.     if (!pos)
  1489.     {
  1490. return;
  1491.     }
  1492.     m_ChildrenInZOrder.RemoveAt(pos);
  1493.     BOOL bHasReinsertedChild = FALSE;
  1494.     INT32 zOrder = 0;
  1495.     INT32 newZOrder = 0;
  1496.     LISTPOSITION posNext = m_ChildrenInZOrder.GetHeadPosition();
  1497.     while (posNext)
  1498.     {
  1499. pos = posNext;
  1500. CHXBaseSite* pSite = (CHXBaseSite*)m_ChildrenInZOrder.GetNext(posNext);
  1501. if (!bHasReinsertedChild)
  1502. {
  1503.     pSite->GetZOrder(zOrder);
  1504.     if (zOrder > lNewZOrder)
  1505.     {
  1506. m_ChildrenInZOrder.InsertBefore(pos, (void*)pUpdatedChildSite);
  1507. bHasReinsertedChild = TRUE;
  1508. pUpdatedChildSite->SetInternalZOrder(newZOrder++);
  1509.     }
  1510. }
  1511. pSite->SetInternalZOrder(newZOrder++);
  1512.     }
  1513.     if (!bHasReinsertedChild)
  1514.     {
  1515. m_ChildrenInZOrder.AddTail((void*)pUpdatedChildSite);
  1516. pUpdatedChildSite->SetInternalZOrder(newZOrder++);
  1517.     }
  1518.     HX_ASSERT((newZOrder == m_ChildrenInZOrder.GetCount()) &&
  1519. (m_ChildrenInZOrder.GetCount() == m_ChildrenMap.GetCount()));
  1520. }
  1521. /************************************************************************
  1522.  *  Method:
  1523.  *    IHXSite2::SetZOrder
  1524.  */
  1525. STDMETHODIMP CHXBaseSite::SetZOrder(INT32 lZOrder)
  1526. {
  1527.     if(!m_pParentSite)
  1528.     {
  1529.         return HXR_UNEXPECTED;
  1530.     }
  1531.     _TLSLock();
  1532.     if (lZOrder == -1)
  1533.     {
  1534.         lZOrder = m_pParentSite->GetNumberOfChildSites() - 1;
  1535.     }
  1536.     if (lZOrder >= (INT32) m_pParentSite->GetNumberOfChildSites())
  1537.     {
  1538.         lZOrder = m_pParentSite->GetNumberOfChildSites() - 1;
  1539.     }
  1540.     if (m_lZOrder != lZOrder)
  1541.     {
  1542.         m_pParentSite->UpdateZOrder(this, m_lZOrder, lZOrder);
  1543.         //Invalidate the rect....
  1544.         if( m_pTopLevelSite )
  1545.         {
  1546.             HXxRect pTmp = { m_topleft.x,
  1547.                              m_topleft.y,
  1548.                              m_topleft.x+m_size.cx,
  1549.                              m_topleft.y+m_size.cy};
  1550.             m_pTopLevelSite->_RecursiveDamageRect( &pTmp, TRUE );
  1551.         }
  1552.     }
  1553.     if( this == m_pTopLevelSite)
  1554.     {
  1555.         RecomputeClip();
  1556.     }
  1557.     else
  1558.     {
  1559.         if (m_pTopLevelSite)
  1560.             m_pTopLevelSite->ScheduleCallback(CLIP, 0);
  1561.     }
  1562.     _TLSUnlock();
  1563.     return HXR_OK;
  1564. }
  1565. /************************************************************************
  1566.  *  Method:
  1567.  *    IHXSite2::GetZOrder
  1568.  */
  1569. STDMETHODIMP CHXBaseSite::GetZOrder(REF(INT32) lZOrder)
  1570. {
  1571.     lZOrder = m_lZOrder;
  1572.     HX_ASSERT(m_lZOrder> -1 && m_lZOrder< 2000);
  1573.     return HXR_OK;
  1574. }
  1575. /************************************************************************
  1576.  *  Method:
  1577.  *    IHXSite2::MoveSiteToTop
  1578.  */
  1579. STDMETHODIMP CHXBaseSite::MoveSiteToTop()
  1580. {
  1581.     SetZOrder(-1); //-1 means the top.
  1582.     return HXR_OK;
  1583. }
  1584. //IHXSubRectSite::GetSubRectVideoSurface()
  1585. STDMETHODIMP CHXBaseSite::GetSubRectVideoSurface( REF(IHXSubRectVideoSurface*) pSurface )
  1586. {
  1587.     HX_RESULT res = HXR_FAIL;
  1588.     if (m_pVideoSurface)
  1589.     {
  1590.         res = m_pVideoSurface->QueryInterface(IID_IHXSubRectVideoSurface,
  1591.                                               (void**)&pSurface);
  1592.     }
  1593.     return res;
  1594. }
  1595. /************************************************************************
  1596.  *  Method:
  1597.  *    IHXSite2::GetVideoSurface
  1598.  */
  1599. STDMETHODIMP CHXBaseSite::GetVideoSurface(REF(IHXVideoSurface*) pSurface)
  1600. {
  1601.     HX_RESULT res = HXR_FAIL;
  1602.     if (m_pVideoSurface)
  1603.     {
  1604.         res = m_pVideoSurface->QueryInterface(IID_IHXVideoSurface,
  1605.                                               (void**)&pSurface);
  1606.     }
  1607.     return res;
  1608. }
  1609. /************************************************************************
  1610.  *  Method:
  1611.  *    IHXSite2::GetNumberOfChildSites
  1612.  */
  1613. STDMETHODIMP_(UINT32) CHXBaseSite::GetNumberOfChildSites()
  1614. {
  1615.     HX_ASSERT( m_ChildrenInZOrder.GetCount() == m_ChildrenMap.GetCount() );
  1616.     return (UINT32)m_ChildrenMap.GetCount();
  1617. }
  1618. /************************************************************************
  1619.  *  Method:
  1620.  *    IHXSite2::AddPassiveSiteWatcher
  1621.  */
  1622. STDMETHODIMP CHXBaseSite::AddPassiveSiteWatcher(IHXPassiveSiteWatcher* pWatcher)
  1623. {
  1624.     pWatcher->AddRef();
  1625.     m_PassiveSiteWatchers.AddTail(pWatcher);
  1626.     return HXR_OK;
  1627. }
  1628. /************************************************************************
  1629.  *  Method:
  1630.  *    IHXSite2::RemovePassiveSiteWatcher
  1631.  */
  1632. STDMETHODIMP CHXBaseSite::RemovePassiveSiteWatcher(IHXPassiveSiteWatcher* pWatcher)
  1633. {
  1634.     // iterate child site list
  1635.     IHXPassiveSiteWatcher* pThisWatcher = NULL;
  1636.     LISTPOSITION pPos = m_PassiveSiteWatchers.Find(pWatcher);
  1637.     HX_RESULT retVal = HXR_FAIL;
  1638.     if (pPos)
  1639.     {
  1640.         m_PassiveSiteWatchers.RemoveAt(pPos);
  1641.         HX_RELEASE(pWatcher);
  1642.         retVal = HXR_OK;
  1643.     }
  1644.     return retVal;
  1645. }
  1646. #if defined(_DEBUG) && !defined(_MACINTOSH) && !defined(_MAC_UNIX)
  1647. void _PrintKeyboardEventInfo(HXxEvent* pEvent )
  1648. {
  1649.     char szBuff[256]; /* Flawfinder: ignore */
  1650.     if( pEvent->event == HX_CHAR )
  1651.         _DumpString( "HX_CHAR     " );
  1652.     if( pEvent->event == HX_KEY_DOWN )
  1653.         _DumpString( "HX_KEY_DOWN " );
  1654.     if( pEvent->event == HX_KEY_UP )
  1655.         _DumpString( "HX_KEY_UP   " );
  1656.     if( ((UINT32)pEvent->param2)&HX_VIRTUAL_KEY_MASK )
  1657.     {
  1658.         _DumpString( " key: " );
  1659.         switch((UINT32)pEvent->param1 )
  1660.         {
  1661.            case HX_VK_LBUTTON       :
  1662.                _DumpString( "HX_VK_LBUTTON   ");
  1663.                break;
  1664.            case HX_VK_RBUTTON       :
  1665.                _DumpString( "HX_VK_RBUTTON   ");
  1666.                break;
  1667.            case HX_VK_CANCEL        :
  1668.                _DumpString( "HX_VK_CANCEL    ");
  1669.                break;
  1670.            case HX_VK_MBUTTON       :
  1671.                _DumpString( "HX_VK_MBUTTON   ");
  1672.                break;
  1673.            case HX_VK_BACK          :
  1674.                _DumpString( "HX_VK_BACK      ");
  1675.                break;
  1676.            case HX_VK_TAB           :
  1677.                _DumpString( "HX_VK_TAB       ");
  1678.                break;
  1679.            case HX_VK_CLEAR         :
  1680.                _DumpString( "HX_VK_CLEAR     ");
  1681.                break;
  1682.            case HX_VK_RETURN        :
  1683.                _DumpString( "HX_VK_RETURN    ");
  1684.                break;
  1685.            case HX_VK_SHIFT         :
  1686.                _DumpString( "HX_VK_SHIFT     ");
  1687.                break;
  1688.            case HX_VK_CONTROL       :
  1689.                _DumpString( "HX_VK_CONTROL   ");
  1690.                break;
  1691.            case HX_VK_MENU          :
  1692.                _DumpString( "HX_VK_MENU      ");
  1693.                break;
  1694.            case HX_VK_PAUSE         :
  1695.                _DumpString( "HX_VK_PAUSE     ");
  1696.                break;
  1697.            case HX_VK_CAPITAL       :
  1698.                _DumpString( "HX_VK_CAPITAL   ");
  1699.                break;
  1700.            case HX_VK_ESCAPE        :
  1701.                _DumpString( "HX_VK_ESCAPE    ");
  1702.                break;
  1703.            case HX_VK_SPACE         :
  1704.                _DumpString( "HX_VK_SPACE     ");
  1705.                break;
  1706.            case HX_VK_PRIOR         :
  1707.                _DumpString( "HX_VK_PRIOR     ");
  1708.                break;
  1709.            case HX_VK_NEXT          :
  1710.                _DumpString( "HX_VK_NEXT      ");
  1711.                break;
  1712.            case HX_VK_END           :
  1713.                _DumpString( "HX_VK_END       ");
  1714.                break;
  1715.            case HX_VK_HOME          :
  1716.                _DumpString( "HX_VK_HOME      ");
  1717.                break;
  1718.            case HX_VK_LEFT          :
  1719.                _DumpString( "HX_VK_LEFT      ");
  1720.                break;
  1721.            case HX_VK_UP            :
  1722.                _DumpString( "HX_VK_UP        ");
  1723.                break;
  1724.            case HX_VK_RIGHT         :
  1725.                _DumpString( "HX_VK_RIGHT     ");
  1726.                break;
  1727.            case HX_VK_DOWN          :
  1728.                _DumpString( "HX_VK_DOWN      ");
  1729.                break;
  1730.            case HX_VK_SELECT        :
  1731.                _DumpString( "HX_VK_SELECT    ");
  1732.                break;
  1733.            case HX_VK_EXECUTE       :
  1734.                _DumpString( "HX_VK_EXECUTE   ");
  1735.                break;
  1736.            case HX_VK_SNAPSHOT      :
  1737.                _DumpString( "HX_VK_SNAPSHOT  ");
  1738.                break;
  1739.            case HX_VK_INSERT        :
  1740.                _DumpString( "HX_VK_INSERT    ");
  1741.                break;
  1742.            case HX_VK_DELETE        :
  1743.                _DumpString( "HX_VK_DELETE    ");
  1744.                break;
  1745.            case HX_VK_HELP          :
  1746.                _DumpString( "HX_VK_HELP      ");
  1747.                break;
  1748.            case HX_VK_LWIN          :
  1749.                _DumpString( "HX_VK_LWIN      ");
  1750.                break;
  1751.            case HX_VK_RWIN          :
  1752.                _DumpString( "HX_VK_RWIN      ");
  1753.                break;
  1754.            case HX_VK_APPS          :
  1755.                _DumpString( "HX_VK_APPS      ");
  1756.                break;
  1757.            case HX_VK_NUMPAD0       :
  1758.                _DumpString( "HX_VK_NUMPAD0   ");
  1759.                break;
  1760.            case HX_VK_NUMPAD1       :
  1761.                _DumpString( "HX_VK_NUMPAD1   ");
  1762.                break;
  1763.            case HX_VK_NUMPAD2       :
  1764.                _DumpString( "HX_VK_NUMPAD2   ");
  1765.                break;
  1766.            case HX_VK_NUMPAD3       :
  1767.                _DumpString( "HX_VK_NUMPAD3   ");
  1768.                break;
  1769.            case HX_VK_NUMPAD4       :
  1770.                _DumpString( "HX_VK_NUMPAD4   ");
  1771.                break;
  1772.            case HX_VK_NUMPAD5       :
  1773.                _DumpString( "HX_VK_NUMPAD5   ");
  1774.                break;
  1775.            case HX_VK_NUMPAD6       :
  1776.                _DumpString( "HX_VK_NUMPAD6   ");
  1777.                break;
  1778.            case HX_VK_NUMPAD7       :
  1779.                _DumpString( "HX_VK_NUMPAD7   ");
  1780.                break;
  1781.            case HX_VK_NUMPAD8       :
  1782.                _DumpString( "HX_VK_NUMPAD8   ");
  1783.                break;
  1784.            case HX_VK_NUMPAD9       :
  1785.                _DumpString( "HX_VK_NUMPAD9   ");
  1786.                break;
  1787.            case HX_VK_MULTIPLY      :
  1788.                _DumpString( "HX_VK_MULTIPLY  ");
  1789.                break;
  1790.            case HX_VK_ADD           :
  1791.                _DumpString( "HX_VK_ADD       ");
  1792.                break;
  1793.            case HX_VK_SEPARATOR     :
  1794.                _DumpString( "HX_VK_SEPARATOR ");
  1795.                break;
  1796.            case HX_VK_SUBTRACT      :
  1797.                _DumpString( "HX_VK_SUBTRACT  ");
  1798.                break;
  1799.            case HX_VK_DECIMAL       :
  1800.                _DumpString( "HX_VK_DECIMAL   ");
  1801.                break;
  1802.            case HX_VK_DIVIDE        :
  1803.                _DumpString( "HX_VK_DIVIDE    ");
  1804.                break;
  1805.            case HX_VK_F1            :
  1806.                _DumpString( "HX_VK_F1        ");
  1807.                break;
  1808.            case HX_VK_F2            :
  1809.                _DumpString( "HX_VK_F2        ");
  1810.                break;
  1811.            case HX_VK_F3            :
  1812.                _DumpString( "HX_VK_F3        ");
  1813.                break;
  1814.            case HX_VK_F4            :
  1815.                _DumpString( "HX_VK_F4        ");
  1816.                break;
  1817.            case HX_VK_F5            :
  1818.                _DumpString( "HX_VK_F5        ");
  1819.                break;
  1820.            case HX_VK_F6            :
  1821.                _DumpString( "HX_VK_F6        ");
  1822.                break;
  1823.            case HX_VK_F7            :
  1824.                _DumpString( "HX_VK_F7        ");
  1825.                break;
  1826.            case HX_VK_F8            :
  1827.                _DumpString( "HX_VK_F8        ");
  1828.                break;
  1829.            case HX_VK_F9            :
  1830.                _DumpString( "HX_VK_F9        ");
  1831.                break;
  1832.            case HX_VK_F10           :
  1833.                _DumpString( "HX_VK_F10       ");
  1834.                break;
  1835.            case HX_VK_F11           :
  1836.                _DumpString( "HX_VK_F11       ");
  1837.                break;
  1838.            case HX_VK_F12           :
  1839.                _DumpString( "HX_VK_F12       ");
  1840.                break;
  1841.            case HX_VK_F13           :
  1842.                _DumpString( "HX_VK_F13       ");
  1843.                break;
  1844.            case HX_VK_F14           :
  1845.                _DumpString( "HX_VK_F14       ");
  1846.                break;
  1847.            case HX_VK_F15           :
  1848.                _DumpString( "HX_VK_F15       ");
  1849.                break;
  1850.            case HX_VK_F16           :
  1851.                _DumpString( "HX_VK_F16       ");
  1852.                break;
  1853.            case HX_VK_F17           :
  1854.                _DumpString( "HX_VK_F17       ");
  1855.                break;
  1856.            case HX_VK_F18           :
  1857.                _DumpString( "HX_VK_F18       ");
  1858.                break;
  1859.            case HX_VK_F19           :
  1860.                _DumpString( "HX_VK_F19       ");
  1861.                break;
  1862.            case HX_VK_F20           :
  1863.                _DumpString( "HX_VK_F20       ");
  1864.                break;
  1865.            case HX_VK_F21           :
  1866.                _DumpString( "HX_VK_F21       ");
  1867.                break;
  1868.            case HX_VK_F22           :
  1869.                _DumpString( "HX_VK_F22       ");
  1870.                break;
  1871.            case HX_VK_F23           :
  1872.                _DumpString( "HX_VK_F23       ");
  1873.                break;
  1874.            case HX_VK_F24           :
  1875.                _DumpString( "HX_VK_F24       ");
  1876.                break;
  1877.            case HX_VK_NUMLOCK       :
  1878.                _DumpString( "HX_VK_NUMLOCK   ");
  1879.                break;
  1880.            case HX_VK_SCROLL        :
  1881.                _DumpString( "HX_VK_SCROLL    ");
  1882.                break;
  1883.            default:
  1884.                _DumpString( " !! UNKOWN VIRTUAL !! " );
  1885.         }
  1886.     }
  1887.     else
  1888.     {
  1889.         sprintf( szBuff, " key: "%c" (%d) ", pEvent->param1, pEvent->param1 ); /* Flawfinder: ignore */
  1890.         _DumpString( szBuff );
  1891.     }
  1892.     sprintf( szBuff, "scancode: %d flags: ", ((UINT32)pEvent->param2)&0x000000ff ); /* Flawfinder: ignore */
  1893.     _DumpString( szBuff );
  1894.     if( (UINT32)pEvent->param2 & HX_VIRTUAL_KEY_MASK )
  1895.         _DumpString( "VirtualKey " );
  1896.     if( (UINT32)pEvent->param2 & HX_EXTENDED_KEY_MASK )
  1897.         _DumpString( "ExtendedKey " );
  1898.     if( (UINT32)pEvent->param2 & HX_SHIFT_MASK )
  1899.         _DumpString( "ShiftKey " );
  1900.     if( (UINT32)pEvent->param2 & HX_CTRL_MASK )
  1901.         _DumpString( "ControlKey " );
  1902.     if( (UINT32)pEvent->param2 & HX_ALT_MASK )
  1903.         _DumpString( "AltKey " );
  1904.     if( (UINT32)pEvent->param2 & HX_CAPS_LOCK_MASK )
  1905.         _DumpString( "CapsLock " );
  1906.     if( (UINT32)pEvent->param2 & HX_NUM_LOCK_MASK )
  1907.         _DumpString( "NumLock " );
  1908.     if( (UINT32)pEvent->param2 & HX_SCROLL_LOCK_MASK )
  1909.         _DumpString( "ScrollLock " );
  1910.     _DumpString( "n" );
  1911. }
  1912. #endif
  1913. CHXBaseSite* CHXBaseSite::_GetSiteFromPixel(HXxPoint& point)
  1914. {
  1915.     CHXBaseSite* pRet = this;
  1916.     if( (  m_bSiteNeverBlts ||
  1917.            m_nEventSensitivity == SENSITIVITY_TRANSPARENT ||
  1918.            ( m_pVideoSurface &&
  1919.              m_pVideoSurface->IsPixelTransparent(point, m_nEventSensitivity)
  1920.              )
  1921.            ) &&
  1922.         !(m_nEventSensitivity == SENSITIVITY_OPAQUE )
  1923.         )
  1924.     {
  1925.         //Now go through all the alphablend regions and see who this
  1926.         //pixel belongs to.
  1927.         CHXMapPtrToPtr::Iterator i = m_AlphaBlendSites.Begin();
  1928.         for( ; i!=m_AlphaBlendSites.End() ; ++i)
  1929.         {
  1930.             CHXBaseSite* pSite    = (CHXBaseSite*) i.get_key();
  1931.             HXREGION*      pRegion = (HXREGION*)*i;
  1932.             if( HXPointInRegion( pRegion, point.x, point.y ) )
  1933.             {
  1934.                 pRet=pSite->_GetSiteFromPixel(point);
  1935.                 break;
  1936.             }
  1937.         }
  1938.         //If we are transparent here we MUST be blending with someone.
  1939.         HX_ASSERT( this!=pRet);
  1940.     }
  1941.     return pRet;
  1942. }
  1943. /************************************************************************
  1944.  *  Method:
  1945.  *    IHXSiteWindowless::EventOccurred
  1946.  */
  1947. STDMETHODIMP CHXBaseSite::EventOccurred(HXxEvent* /*IN*/ pEvent)
  1948. {
  1949.     HX_RESULT hr = HXR_OK;
  1950.     CHXMapPtrToPtr::Iterator i;
  1951.     HXxEvent event;
  1952.     if( NULL == pEvent )
  1953.     {
  1954.         return HXR_OK;
  1955.     }
  1956.     memcpy(&event, pEvent, sizeof(HXxEvent)); /* Flawfinder: ignore */
  1957.     AddRef();
  1958.     if(!_HandleOSEvents(pEvent) && !_ConvertToHXEvent(pEvent) )
  1959.     {
  1960.         if( _ConvertToHXEvent(pEvent))
  1961.         {
  1962.             Release();
  1963.             return hr;
  1964.         }
  1965.         switch((ULONG32)pEvent->event)
  1966.         {
  1967.            case HX_KEY_UP:
  1968.            case HX_KEY_DOWN:
  1969. #if defined(_DEBUG) && 0
  1970.                _PrintKeyboardEventInfo(pEvent);
  1971. #endif
  1972.                // Always send <CR> and <TAB> to the top level site for smil
  1973. #if !defined(_MACINTOSH) && !defined(_MAC_UNIX) // XXXSEH: Is this the correct solution?
  1974.                if (HX_VK_TAB == (int)pEvent->param1 || HX_VK_RETURN == (int)pEvent->param1)
  1975. #else
  1976.                    if (0)
  1977. #endif
  1978.                        m_pTopLevelSite->m_pUser->HandleEvent(pEvent);
  1979.                // Send keyboard messages to the user that has focus
  1980.                    else if (m_pTopLevelSite->m_pKeyBoardFocusUser)
  1981.                        m_pTopLevelSite->m_pKeyBoardFocusUser->HandleEvent(pEvent);
  1982.                    else if (m_pUser)
  1983.                        m_pUser->HandleEvent(pEvent);
  1984.                break;
  1985.            case HX_CHAR:
  1986. #if defined(_DEBUG) && 0
  1987.                _PrintKeyboardEventInfo(pEvent);
  1988. #endif
  1989.                // Always send <CR> and <TAB> to the top level site for smil
  1990. #if !defined(_MACINTOSH) && !defined(_MAC_UNIX) // XXXSEH: Is this the correct solution?
  1991.                if (HX_VK_TAB == (int)pEvent->param1 || HX_VK_RETURN == (int)pEvent->param1)
  1992. #else
  1993.                    if (0)
  1994. #endif
  1995.                        m_pTopLevelSite->m_pUser->HandleEvent(pEvent);
  1996.                // Send keyboard messages to the user that has focus
  1997.                    else if (m_pTopLevelSite->m_pKeyBoardFocusUser)
  1998.                        m_pTopLevelSite->m_pKeyBoardFocusUser->HandleEvent(pEvent);
  1999.                    else if (m_pUser)
  2000.                        m_pUser->HandleEvent(pEvent);
  2001.                break;
  2002.            case HX_SET_FOCUS:
  2003.            case HX_LOSE_FOCUS:
  2004.                if (m_pUser)
  2005.                    m_pUser->HandleEvent(pEvent);
  2006.                break;
  2007.            case HX_SET_STATUS:
  2008.            case HX_SET_CURSOR:
  2009.                if (m_pUser)
  2010.                    m_pUser->HandleEvent(pEvent);
  2011.                break;
  2012.            case HX_MOUSE_LEAVE:
  2013.            case HX_MOUSE_ENTER:
  2014.            {
  2015.                HXxEvent tempEvent;
  2016.                memcpy( &tempEvent, pEvent, sizeof( HXxEvent ) ); /* Flawfinder: ignore */
  2017.                if (m_pUser)
  2018.                    m_pUser->HandleEvent(pEvent);
  2019.                //Also send a set status and set cursor to the user.
  2020.                tempEvent.event = HX_SET_CURSOR;
  2021.                if (m_pUser)
  2022.                    m_pUser->HandleEvent(&tempEvent);
  2023.                tempEvent.event   = HX_SET_STATUS;
  2024.                tempEvent.handled = FALSE;
  2025.                if (m_pUser)
  2026.                    m_pUser->HandleEvent(&tempEvent);
  2027.            }
  2028.            break;
  2029.            case HX_PRIMARY_BUTTON_UP:
  2030.            case HX_PRIMARY_BUTTON_DOWN:
  2031.            case HX_CONTEXT_BUTTON_UP:
  2032.            case HX_CONTEXT_BUTTON_DOWN:
  2033.            case HX_MOUSE_MOVE:
  2034.            case HX_PRIMARY_DBLCLK:
  2035.            case HX_CONTEXT_DBLCLK:
  2036.            case HX_THIRD_DBLCLK:
  2037.            {
  2038.                HXxPoint point = *((HXxPoint*)pEvent->param1);
  2039.                HX_ASSERT( m_nEventSensitivity != SENSITIVITY_NOT_SET || m_pWindow);
  2040. #if defined(_DEBUG) && 0
  2041.                //XXXgfw just so I can set break points.
  2042.                if( pEvent->event == HX_PRIMARY_BUTTON_DOWN )
  2043.                {
  2044.                    int MasterSlaveFlipFlop=1;
  2045.                }
  2046. #endif
  2047.                // check to see if this message is within my bounding box.
  2048.                if( m_RegionWithoutChildren &&
  2049.                    ::HXPointInRegion( m_RegionWithoutChildren, point.x, point.y))
  2050.                {
  2051.                    // ok check to see it is within our clipping area
  2052.                    if (::HXPointInRegion(m_RegionForMouse, point.x, point.y) )
  2053.                    {
  2054.                        //Get the site under the point that isn't transparent.
  2055.                        CHXBaseSite* pRealSite = this;
  2056.                        pRealSite = _GetSiteFromPixel(point);
  2057.                        pRealSite->_HandleMouseEvent(pEvent);
  2058. #if defined(_UNIX) && !defined(_MAC_UNIX)
  2059.                        // for unix only, post context menu if the event is unhandled
  2060.                        if (!pEvent->handled && pEvent->event == HX_CONTEXT_BUTTON_DOWN)
  2061.                        {
  2062.                            IHXClientEngineMapper* pCleng = NULL;
  2063.                            if (m_pContext)
  2064.                            {
  2065.                                m_pContext->QueryInterface(IID_IHXClientEngineMapper,
  2066.                                                           (void**)&pCleng);
  2067.                                if (pCleng)
  2068.                                {
  2069.                                    IUnknown* pUnknown = NULL;
  2070.                                    if (HXR_OK != pCleng->GetPlayerBySite(this, pUnknown))
  2071.                                    {
  2072.                                        // check our children
  2073.                                        CHXMapPtrToPtr::Iterator i = m_ChildrenMap.Begin();
  2074.                                        for ( ; i != m_ChildrenMap.End(); ++i)
  2075.                                        {
  2076.                                            CHXBaseSite* pSite = (CHXBaseSite*) *i;
  2077.                                            if (HXR_OK == pCleng->GetPlayerBySite(pSite, pUnknown))
  2078.                                                break;
  2079.                                        }
  2080.                                    }
  2081.                                    if (pUnknown)
  2082.                                    {
  2083.                                        IHXContextMenu *pContextMenu = NULL;
  2084.                                        pUnknown->QueryInterface(IID_IHXContextMenu, (void**)&pContextMenu);
  2085.                                        HX_RELEASE(pUnknown);
  2086.                                        if (pContextMenu)
  2087.                                        {
  2088.                                            pContextMenu->InitContextMenu("Contextual Menu");
  2089.                                            pContextMenu->ShowMenu(NULL, point);
  2090.                                            HX_RELEASE(pContextMenu);
  2091.                                        }
  2092.                                    }
  2093.                                    HX_RELEASE(pCleng);
  2094.                                }
  2095.                            }
  2096.                        }
  2097. #endif
  2098.                    }
  2099.                    else
  2100.                    {
  2101.                        INT32 handledCount = 0;
  2102.                        INT32 mapCount     = 0;
  2103.                        LISTPOSITION pos   = NULL;
  2104.                        // try send this to all of our children
  2105.                      mapchanged2:
  2106.                        mapCount = m_ChildrenInZOrder.GetCount();
  2107.                        pos = m_ChildrenInZOrder.GetHeadPosition();
  2108.                        while(pos)
  2109.                        {
  2110.                            CHXBaseSite* pSite = (CHXBaseSite*)m_ChildrenInZOrder.GetNext(pos);
  2111.                            pSite->EventOccurred(pEvent);
  2112.                            if (pEvent->handled)
  2113.                            {
  2114.                                break;
  2115.                            }
  2116.                            handledCount+=pEvent->handled;
  2117.                            pEvent->handled=0;
  2118.                            if (m_ChildrenInZOrder.GetCount() != mapCount)
  2119.                            {
  2120.                                goto mapchanged2;
  2121.                            }
  2122.                        }
  2123.                        if (handledCount)
  2124.                        {
  2125.                            pEvent->handled = 1;
  2126.                        }
  2127.                        HX_ASSERT(handledCount<2);
  2128.                    }
  2129.                }
  2130.                break;
  2131.            }
  2132.            default:
  2133. #if defined(_DEBUG) && 0
  2134.                _DumpString("CHXBaseSite::EventOccurred Unkown event type........n");
  2135. #endif
  2136.                break;
  2137.         }
  2138.     }
  2139.     event.handled = pEvent->handled;
  2140.     event.result  = pEvent->result;
  2141.     memcpy( pEvent, &event, sizeof( event ) ); /* Flawfinder: ignore */
  2142.     Release();
  2143.     return hr;
  2144. }
  2145. void CHXBaseSite::_HandleMouseEvent(HXxEvent* pEvent)
  2146. {
  2147.     HXxEvent event;
  2148.     memcpy( &event, pEvent, sizeof(event) ); /* Flawfinder: ignore */
  2149.     HXxPoint point = *((HXxPoint*)pEvent->param1);
  2150.     m_pTopLevelSite->m_pLastUser = m_pUser;
  2151.     //If this is a click then this is the site with "focus"
  2152.     if (pEvent->event == HX_PRIMARY_BUTTON_DOWN)
  2153.     {
  2154.         m_pTopLevelSite->SetFocusSite(this);
  2155.         HXxWindow* pTempwindow = GetWindow();
  2156.         if(pTempwindow && pTempwindow->window)
  2157.         {
  2158.             SafeSetFocus(pTempwindow);
  2159.         }
  2160.         // Keyboard focus must change to match the site focus
  2161.         if (m_pTopLevelSite->m_pKeyBoardFocusUser &&
  2162.             m_pTopLevelSite->m_pKeyBoardFocusUser != m_pUser)
  2163.         {
  2164.             HXxEvent focusEvent;
  2165.             memcpy(&focusEvent, pEvent, sizeof(focusEvent)); /* Flawfinder: ignore */
  2166.             focusEvent.handled = FALSE;
  2167.             focusEvent.event = HX_SET_FOCUS;
  2168.             EventOccurred(&focusEvent);
  2169.             if (focusEvent.handled)
  2170.                 SetKeyboardFocus(m_pUser);
  2171.             else
  2172.                 SetKeyboardFocus(m_pTopLevelSite->m_pUser);
  2173.         }
  2174.     }
  2175.     // translate point and send it off to our user
  2176.     float xf = 0.0;
  2177.     float yf = 0.0;
  2178.     if( m_pParentSite )
  2179.     {
  2180.         int dX = (m_size.cx-m_pParentSite->m_size.cx);
  2181.         int dY = (m_size.cy-m_pParentSite->m_size.cy);
  2182.         if( dX && dY )
  2183.         {
  2184.             xf = (float)GetXSliderPos()/(float)(dX);
  2185.             yf = (float)GetYSliderPos()/(float)(dY);
  2186.         }
  2187.     }
  2188.     point.x = point.x - (short)((m_topleft.x - GetXSliderPos()) + GetSliderWidth()*xf);
  2189.     point.y = point.y - (short)((m_topleft.y - GetYSliderPos()) + GetSliderHeight()*yf);
  2190.     memcpy(&event, pEvent, sizeof(HXxEvent)); /* Flawfinder: ignore */
  2191.     event.param1 = &point;
  2192.     // hey do we think that we are the window with the mouse?
  2193.     CHXBaseSite* pTopLevelSite = m_pTopLevelSite;
  2194.     if (pTopLevelSite->m_pMouseInSite != this)
  2195.     {
  2196.         if (pTopLevelSite->m_pMouseInSite)
  2197.         {
  2198.             HXxPoint oobPoint;
  2199.             oobPoint.x = -1;
  2200.             oobPoint.y = -1;
  2201.             HXxEvent Outevent = { HX_MOUSE_LEAVE,
  2202.                                   m_pWindow ? m_pWindow->window : NULL,
  2203.                                   (void*)&oobPoint,
  2204.                                   0, 0,
  2205.                                   FALSE };
  2206.             pTopLevelSite->m_pMouseInSite->EventOccurred(&Outevent);
  2207.         }
  2208.         //Generate a mouse enter message
  2209.         pTopLevelSite->m_pMouseInSite = this;
  2210.         HXxEvent tempevent = {HX_MOUSE_ENTER,
  2211.                               m_pWindow ? m_pWindow->window : NULL,
  2212.                               (void*)&point,
  2213.                               0, 0,
  2214.                               FALSE};
  2215.         if (m_pUser)
  2216.         {
  2217.             m_pUser->HandleEvent(&tempevent);
  2218.         }
  2219.         // hey, have we started the mouseleave generator?
  2220.         pTopLevelSite->ScheduleCallback(MOUSE, 100);
  2221.     }
  2222.     // we have already called HandleEvent on the
  2223.     // original user in HandleWndProc
  2224.     if(pEvent->window != (m_pWindow ? m_pWindow->window : NULL))
  2225.     {
  2226.         _GenerateOSEvent(&event, pEvent);
  2227.     }
  2228.     //Send out the HX_SET_CURSOR and HX_SET_STATUS *after*
  2229.     //the mouse leave/enter messages. These are sent out for
  2230.     //all mouse move messages.
  2231.     if( pEvent->event==HX_MOUSE_MOVE && m_pUser )
  2232.     {
  2233.         HXxEvent stTmpEvent;
  2234.         memcpy( &stTmpEvent, pEvent, sizeof( HXxEvent ) ); /* Flawfinder: ignore */
  2235.         //Set Cursor....
  2236.         stTmpEvent.event   = HX_SET_CURSOR;
  2237.         stTmpEvent.handled = FALSE;
  2238.         m_pUser->HandleEvent(&stTmpEvent);
  2239.         //Set Status....
  2240.         stTmpEvent.event   = HX_SET_STATUS;
  2241.         stTmpEvent.handled = FALSE;
  2242.         m_pUser->HandleEvent(&stTmpEvent);
  2243.     }
  2244.     //ALWAYS send the RMA MOUSE messages...  Needed for
  2245.     //hyperlinks to work in SMIL since the native
  2246.     //message is handled by...say...the Flash
  2247.     //renderer... and SMIL only understands the RMA
  2248.     //mouse messages.
  2249.     if(m_pUser)
  2250.     {
  2251.         m_pUser->HandleEvent(&event);
  2252.         pEvent->handled |= event.handled;
  2253.     }
  2254. #if !defined(_UNIX) || defined(_MAC_UNIX)
  2255. //XXXgfw We should change the realtext renderer to use
  2256. //HX_SET_CURSOR and HX_SET_STATUS instead and then
  2257. //just get rid of this....
  2258.     // and now for the real text renderer we will
  2259.     // check to see if this was a mouse move
  2260.     // message. If so we will give the user a
  2261.     // WM_SETCURSOR
  2262.     if (m_pUser && pEvent->event == HX_MOUSE_MOVE)
  2263.     {
  2264.         _GenerateSetCursorEvent();
  2265.     }
  2266. #endif
  2267. }
  2268. /************************************************************************
  2269.  *  Method:
  2270.  *    IHXSiteWindowless::GetParentWindow
  2271.  */
  2272. STDMETHODIMP_(HXxWindow*) CHXBaseSite::GetParentWindow()
  2273. {
  2274.     if (m_pWindow && m_pWindow->window)
  2275.     {
  2276.         return m_pWindow;
  2277.     }
  2278.     else
  2279.     {
  2280.         if(m_pParentSite)
  2281.         {
  2282.             return m_pParentSite->GetParentWindow();
  2283.         }
  2284.         else
  2285.         {
  2286.             return NULL;
  2287.         }
  2288.     }
  2289. }
  2290. /************************************************************************
  2291.  *  Method:
  2292.  *    CHXBaseSite::GetTopLevelSite
  2293.  */
  2294. CHXBaseSite*
  2295. CHXBaseSite::GetTopLevelSite()
  2296. {
  2297.     if (!m_pParentSite)
  2298.     {
  2299.         return this;
  2300.     }
  2301.     else
  2302.     {
  2303.         return m_pParentSite->GetTopLevelSite();
  2304.     }
  2305. }
  2306. CHXBaseSite*
  2307. CHXBaseSite::GetContainingCHXBaseSite()
  2308. {
  2309.     if (m_pWindow && m_pWindow->window)
  2310.     {
  2311.         return this;
  2312.     }
  2313.     else
  2314.     {
  2315.         if (m_pParentSite)
  2316.         {
  2317.             return m_pParentSite->GetContainingCHXBaseSite();
  2318.         }
  2319.     }
  2320.     return NULL;
  2321. }
  2322. /************************************************************************
  2323.  *  Method:
  2324.  *    CHXBaseSite::AttachWindow
  2325.  */
  2326. STDMETHODIMP CHXBaseSite::AttachWindow(HXxWindow* pWindow)
  2327. {
  2328.     if (m_pWindow && m_pWindow->window) return HXR_UNEXPECTED;
  2329.     _TLSLock();
  2330.     if (!m_pParentSite)
  2331.     {
  2332.         memcpy(&m_TopLevelWindow, pWindow, sizeof(HXxWindow)); /* Flawfinder: ignore */
  2333.     }
  2334.     m_pWindow = pWindow;
  2335.     if (!m_pRootSurface && !m_pParentSite)
  2336.     {
  2337.         m_pRootSurface = CBaseRootSurface::Create(m_pContext, this);
  2338.         m_pRootSurface->AddRef();
  2339.     }
  2340.     _AttachWindow();
  2341.     if (!m_pParentSite)
  2342.     {
  2343.         _GetDeviceCaps(NULL, m_nOldBitsPerPixel, m_nOldHorzRes, m_nOldVertRes);
  2344.         m_pRootSurface->AddRef();
  2345.         SetRootSurface(m_pRootSurface);
  2346.         m_pRootSurface->Release();
  2347.         SetParentWindow(&m_TopLevelWindow);
  2348.     }
  2349.     if (m_pUser)
  2350.     {
  2351.         m_bAttachWindowPending = FALSE;
  2352.         m_bDetachWndMsgPending = TRUE;
  2353.         // send HX_ATTACH_WINDOW msg to the renderers
  2354.         void *  lpParam1 = NULL;
  2355.         void *  lpParam2 = NULL;
  2356.         HXxEvent event = {HX_ATTACH_WINDOW, m_pWindow ? m_pWindow->window : NULL, lpParam1, lpParam2, 0, 0};
  2357.         m_pUser->HandleEvent(&event);
  2358.     }
  2359.     else
  2360.     {
  2361.         m_bAttachWindowPending = TRUE;
  2362.     }
  2363.     //XXXgfw This focus code is disabled for the Beamer release.
  2364. //     if (!m_pParentSite)
  2365. //     {
  2366. //         SafeSetFocus(m_pWindow);
  2367. //     }
  2368.     _TLSUnlock();
  2369.     return HXR_OK;
  2370. }
  2371. /************************************************************************
  2372.  *  Method:
  2373.  *    IHXSiteWindowed::DetachWindow
  2374.  */
  2375. STDMETHODIMP CHXBaseSite::DetachWindow()
  2376. {
  2377.     if (!m_pWindow || !m_pWindow->window) return HXR_UNEXPECTED;
  2378.     if (m_pVideoSurface)
  2379.     {
  2380. m_pVideoSurface->EndOptimizedBlt();
  2381.     }
  2382.   
  2383.     // Avoid dead-lock in vidsurf2
  2384.     LockBlitters();
  2385.     FlushSurfaces();
  2386.     _TLSLock();
  2387.     if (m_pUser && m_bDetachWndMsgPending)
  2388.     {
  2389.         // send HX_DETACH_WINDOW msg to the renderers
  2390.         void *  lpParam1 = NULL;
  2391.         void *  lpParam2 = NULL;
  2392.         HXxEvent event = {HX_DETACH_WINDOW, m_pWindow ? m_pWindow->window : NULL, lpParam1, lpParam2, 0, 0};
  2393.         m_bDetachWndMsgPending = FALSE;
  2394.         m_pUser->HandleEvent(&event);
  2395.     }
  2396.     //Status text
  2397.     if (m_pStatusText)
  2398.     {
  2399.         m_pStatusText->Destroy();
  2400. #ifdef _WINDOWS
  2401.         HX_DELETE(m_pStatusText);
  2402. #else
  2403.         HX_RELEASE(m_pStatusText);
  2404. #endif
  2405.         HX_DELETE(m_pStatusText);
  2406.     }
  2407.     _DestroySliders();
  2408.     // let the OS specific site do its cleanup.
  2409.     _DetachWindow();
  2410.     m_pWindow = NULL;
  2411.     DestroySurfaces();
  2412.     HX_RELEASE(m_pRootSurface);
  2413.     if (m_pTopLevelSite)
  2414.         m_pTopLevelSite->RemovePendingTasks(this);
  2415.     SetRootSurface(NULL);
  2416.     SetParentWindow(NULL);
  2417.     if (m_pTopLevelSite == this)
  2418.     {
  2419.         if (m_CallbackHandle)
  2420.         {
  2421.             m_pScheduler->Remove(m_CallbackHandle);
  2422.             m_CallbackHandle = 0;
  2423.         }
  2424.         if (m_ScrollSiteCallbackHandle)
  2425.         {
  2426.             m_pScheduler->Remove(m_ScrollSiteCallbackHandle);
  2427.             m_ScrollSiteCallbackHandle = 0;
  2428.         }
  2429.     }
  2430.     _TLSUnlock();
  2431.     UnlockBlitters();
  2432.     return HXR_OK;
  2433. }
  2434. /************************************************************************
  2435.  *  Method:
  2436.  *    IHXSiteWindowed::Create
  2437.  */
  2438. STDMETHODIMP CHXBaseSite::Create(void* ParentWindow, UINT32 style)
  2439. {
  2440.     HRESULT retVal = HXR_OK;
  2441.     if( m_pWindow && m_pWindow->window )
  2442.     {
  2443.         //We already have one.
  2444.         return HXR_FAIL;
  2445.     }
  2446.     _TLSLock();
  2447.     void* hWnd = _Create(ParentWindow, style);
  2448.     if (!hWnd)
  2449.     {
  2450.         retVal = HXR_FAIL;
  2451.     }
  2452.     else
  2453.     {
  2454.         HXxWindow* pWindow = new HXxWindow;
  2455.         memset(pWindow,0,sizeof(HXxWindow));
  2456.         pWindow->window = hWnd;
  2457.         if( this == m_pTopLevelSite )
  2458.         {
  2459.             //This flags tells us if Create was used to make the window
  2460.             //or not. We use this in SetSize and SetPosition so that we
  2461.             //never resize or move the TLCs window. But, in TLC that call
  2462.             //create, like testplay, we need to do the move and resize
  2463.             //for them.
  2464.             m_bWindowCreatedByCreate = TRUE;
  2465.         }
  2466.         //This way we always pass through attach window.
  2467.         AttachWindow(pWindow);
  2468.     }
  2469.     _TLSUnlock();
  2470.     return retVal;
  2471. }
  2472. /************************************************************************
  2473.  *  Method:
  2474.  *    IHXSiteWindowed::Destroy
  2475.  */
  2476. STDMETHODIMP CHXBaseSite::Destroy()
  2477. {
  2478.     //This could be the site that owns the overlay even though
  2479.     //it doesn't have a window. Give it a chance to clean up
  2480.     //here...
  2481.     if( m_pVideoSurface )
  2482.     {
  2483.         m_pVideoSurface->EndOptimizedBlt();
  2484.     }
  2485.     _DestroySliders();
  2486.     if(!m_pWindow || !m_pWindow->window)
  2487.     {
  2488.         return HXR_UNEXPECTED;
  2489.     }
  2490.     _TLSLock();
  2491.     HXxWindow tempWindow;
  2492.     memcpy( &tempWindow, m_pWindow, sizeof( HXxWindow ) ); /* Flawfinder: ignore */
  2493.     DetachWindow();
  2494.     _Destroy(&tempWindow);
  2495.     m_pWindow = NULL;
  2496.     if (m_pTopLevelSite && m_pTopLevelSite != this)
  2497.         m_pTopLevelSite->ScheduleCallback(CLIP, 0);
  2498.     _TLSUnlock();
  2499.     return HXR_OK;
  2500. }
  2501. STDMETHODIMP_(HXxWindow*) CHXBaseSite::GetWindow()
  2502. {
  2503.     return GetParentWindow();
  2504. }
  2505. /************************************************************************
  2506.  *  Method:
  2507.  *    IHXSite2::SetCursor
  2508.  */
  2509. STDMETHODIMP CHXBaseSite::SetCursor(HXxCursor cursor, REF(HXxCursor) oldCursor)
  2510. {
  2511.     return HXR_NOTIMPL;
  2512. }
  2513. /************************************************************************
  2514.  *  Method:
  2515.  *    IHXCallback::Func
  2516.  */
  2517. STDMETHODIMP CHXBaseSite::Func(void)
  2518. {
  2519.     _TLSLock();
  2520.     m_CallbackHandle = 0;
  2521.     AddRef();
  2522.     ExecutePendingTasks();
  2523.     if (m_bRecomputeClipScheduled)
  2524.     {
  2525.         m_bDisableForceRedraw = TRUE;
  2526.         m_bRecomputeClipScheduled = FALSE;
  2527.         RecomputeClip();
  2528.         m_bDisableForceRedraw = FALSE;
  2529.         _ForceRedrawAll();
  2530.         m_bForceRedrawNeeded = FALSE;
  2531.         m_bCalledComputeClipFromTransition = FALSE;
  2532.         FillColorKey();
  2533.     }
  2534.     if (m_bProcessRepaint)
  2535.     {
  2536.         _ForceRedrawAll();
  2537.         m_bProcessRepaint = FALSE;
  2538.     }
  2539.     if( m_bForceRedrawNeeded )
  2540.     {
  2541.         _ForceRedrawAll();
  2542.         m_bForceRedrawNeeded = FALSE;
  2543.         FillColorKey();
  2544.     }
  2545.     //The preferable fix is during WM_PAINT, if in full screen, to call
  2546.     //FillBorders.  However, we are currently generating quite a number
  2547.     //of spurious WM_PAINT callbacks and this would further degrade
  2548.     //performance. If some day we reduce the number of spurious
  2549.     //WM_PAINT callbacks then this code (which is hookey) should be
  2550.     //placed in * the WM_PAINT handler (too many handlers in that
  2551.     //sentence).
  2552.     if (m_nDelayFillBorders)
  2553.     {
  2554.         m_nDelayFillBorders--;
  2555.         m_pRootSurface->FillBorders();
  2556.     }
  2557.     if (m_nStatusTextExpireTime)
  2558.     {
  2559.         if (m_pStatusText && (HX_GET_TICKCOUNT() - m_nStatusTextExpireTime > 100))
  2560.         {
  2561.             if (m_pStatusText)
  2562.             {
  2563.                 m_pStatusText->SetStatusText(NULL);
  2564.                 if (IsFullScreen())
  2565.                 {
  2566.                     m_pRootSurface->FillBorders();
  2567.                 }
  2568.             }
  2569.             m_nStatusTextExpireTime = 0;
  2570.         }
  2571.     }
  2572.     if (m_nLastMoveTime)
  2573.     {
  2574.         if (HX_GET_TICKCOUNT() - m_nLastMoveTime > MOVING_TIMEOUT)
  2575.         {
  2576.             SiteNotMoving();
  2577.             m_nLastMoveTime = 0;
  2578.         }
  2579.     }
  2580.     if (m_bScheduleUpgrade)
  2581.     {
  2582.         ScheduleUpgrade();
  2583.     }
  2584. #ifdef _DEBUG_WINDOWED_SITES
  2585.     DrawAllSites();
  2586. #endif
  2587.     //TEST TEST TEST TEST XXXgfw
  2588. //     SetCompositionMode(1);
  2589. //     UnlockComposition();
  2590. //     BltComposition();
  2591. //     LockComposition();
  2592. //     ScheduleCallback(MOUSE, 45);
  2593.     //TEST TEST TEST TEST XXXgfw
  2594.     ScheduleCallback(MOUSE, 100);
  2595. #if !defined(_UNIX) && !defined(_MACINTOSH)
  2596.     //XXXgfw this whole section of code should go away when we add
  2597.     //       HX_SET_CURSOR and HX_SET_STATUS messages....
  2598.     //We don't need this in UNIX because we have EnterNotify and
  2599.     //LeaveNotify events that the OS supplies. This will be
  2600.     //handled in the OS specific class.
  2601.     // xxxbobclark The mac site call generate mouse leave message.
  2602.     if (_AtSystemTime())
  2603.     {
  2604.         GenerateMouseLeaveMessage();
  2605.     }
  2606. #endif
  2607.     Release();
  2608.     _TLSUnlock();
  2609.     return HXR_OK;
  2610. }
  2611. /************************************************************************
  2612.  *  Method:
  2613.  *    SetStatus
  2614.  */
  2615. STDMETHODIMP CHXBaseSite::SetStatus(const char* pText)
  2616. {
  2617.     if (this != m_pTopLevelSite)
  2618.     {
  2619.         m_pTopLevelSite->SetStatus(pText);
  2620.     }
  2621.     /*
  2622.      * if we get a zero length string we will remove the Status Text
  2623.      * in 100 milliseconds.
  2624.      */
  2625.     _TLSLock();
  2626.     if (!pText || !*pText)
  2627.     {
  2628.         m_nStatusTextExpireTime = HX_GET_TICKCOUNT();
  2629.         ScheduleCallback(MOUSE, 100);
  2630.         _TLSUnlock();
  2631.         return HXR_OK;
  2632.     }
  2633.     m_nStatusTextExpireTime = 0;
  2634.     if (!m_pStatusText)
  2635.     {
  2636.         m_pStatusText = new CHXSiteStatusText();
  2637.         //XXXgfw We need to make this interface cross platform.
  2638. #ifdef _WINDOWS
  2639.         m_pStatusText->Create( GetWindow()->window );
  2640. #else
  2641.         m_pStatusText->AddRef();
  2642.         m_pStatusText->Create( this );
  2643. #endif
  2644.         m_pStatusText->ParentChangedSize();
  2645.     }
  2646.     m_pStatusText->SetStatusText(pText);
  2647.     _TLSUnlock();
  2648.     return HXR_OK;
  2649. }
  2650. HXxPoint
  2651. CHXBaseSite::GetScreenOffset()
  2652. {
  2653.     if (m_pParentSite)
  2654.     {
  2655.         return m_pParentSite->GetScreenOffset();
  2656.     }
  2657.     return m_screenOffset;
  2658. }
  2659. STDMETHODIMP CHXBaseSite::EnterFullScreen()
  2660. {
  2661.     IHXPreferences* pPreferences = NULL;
  2662.     HX_RESULT        ret = HXR_OK;
  2663.     //Check to see if we are in postage stamp mode.
  2664.     m_bPostageStamp = FALSE;
  2665.     if (HXR_OK == m_pContext->QueryInterface(IID_IHXPreferences,(void**)&pPreferences))
  2666.     {
  2667.         IHXBuffer* pBuffer = NULL;
  2668.         char        szBuffer[255]; /* Flawfinder: ignore */
  2669.         strcpy(szBuffer, REGKEY_FULLSCREEN_DATA); /* Flawfinder: ignore */
  2670.         strcat(szBuffer, "\"); /* Flawfinder: ignore */
  2671.         strcat(szBuffer, REGKEY_FULLSCREEN_POSTAGE_STAMP); /* Flawfinder: ignore */
  2672. ReadPrefBOOL(pPreferences, szBuffer, m_bPostageStamp);
  2673.     }
  2674.     if (m_pParentSite)
  2675.     {
  2676.         return m_pParentSite->EnterFullScreen();
  2677.     }
  2678.     if (IsFullScreen())
  2679.     {
  2680.         return HXR_OK;
  2681.     }
  2682.     _TLSLock();
  2683.     ret = _EnterFullScreen();
  2684.     _TLSUnlock();
  2685.     return ret;
  2686. }
  2687. STDMETHODIMP CHXBaseSite::ExitFullScreen()
  2688. {
  2689.     HX_RESULT ret = HXR_OK;
  2690.     if (m_pParentSite)
  2691.     {
  2692.         return m_pParentSite->ExitFullScreen();
  2693.     }
  2694.     if( !m_bInFullScreen )
  2695.     {
  2696.         return HXR_OK;
  2697.     }
  2698.     // Avoid dead-lock in vidsurf2
  2699.     LockBlitters();
  2700.     FlushSurfaces();
  2701.     _TLSLock();
  2702.     ret = _ExitFullScreen();
  2703.     _TLSUnlock();
  2704.     UnlockBlitters();
  2705.     return ret;
  2706. }
  2707. STDMETHODIMP CHXBaseSite::TestFullScreen(void* hTestBitmap,const char* pszStatusText)
  2708. {
  2709.     return _TestFullScreen(hTestBitmap, pszStatusText);
  2710. }
  2711. STDMETHODIMP_(BOOL) CHXBaseSite::IsFullScreen()
  2712. {
  2713.     if (m_pParentSite)
  2714.     {
  2715.         return m_pParentSite->IsFullScreen();
  2716.     }
  2717.     return m_bInFullScreen;
  2718. }
  2719. STDMETHODIMP CHXBaseSite::Initialize (IHXValues* pParams)
  2720. {
  2721.     INT32 transitionType    = 0;
  2722.     INT32 transitionSubType = 0;
  2723.     BOOL  bFoundType        = FALSE;
  2724.     BOOL  bFoundSubType     = FALSE;
  2725.     IHXBuffer* pPropertyValue = NULL;
  2726.     pParams->GetPropertyCString("type", (IHXBuffer*&)pPropertyValue);
  2727.     if (pPropertyValue)
  2728.     {
  2729.         char* pString;
  2730.         pString = (char*)pPropertyValue->GetBuffer();
  2731.         if (pString)
  2732.         {
  2733.             for(int i = 0; i < z_nNumberTransitionTypes; ++i)
  2734.             {
  2735.                 tranType* pStruct;
  2736.                 pStruct = &z_TransitionTable[i];
  2737.                 if (pStruct->m_pName)
  2738.                 {
  2739.                     if (!strcmp(pStruct->m_pName, pString))
  2740.                     {
  2741.                         bFoundType = TRUE;
  2742.                         transitionType = i;
  2743.                         break;
  2744.                     }
  2745.                 }
  2746.             }
  2747.         }
  2748.     }
  2749.     HX_RELEASE(pPropertyValue);
  2750.     pParams->GetPropertyCString("subType", (IHXBuffer*&)pPropertyValue);
  2751.     if (bFoundType && pPropertyValue)
  2752.     {
  2753.         char* pString;
  2754.         pString = (char*)pPropertyValue->GetBuffer();
  2755.         if (pString)
  2756.         {
  2757.             for(int i = 0; i < z_TransitionTable[transitionType].m_nNum; ++i)
  2758.             {
  2759.                 tranStruct* pStruct;
  2760.                 pStruct = &z_TransitionTable[transitionType].m_pSubTypes[i];
  2761.                 if (pStruct->m_pTranName)
  2762.                 {
  2763.                     if (!strcmp(pStruct->m_pTranName, pString))
  2764.                     {
  2765.                         bFoundSubType = TRUE;
  2766.                         transitionSubType = i;
  2767.                         break;
  2768.                     }
  2769.                 }
  2770.             }
  2771.         }
  2772.     }
  2773.     HX_RELEASE(pPropertyValue);
  2774.     pParams->GetPropertyCString("reverse", (IHXBuffer*&)pPropertyValue);
  2775.     if (pPropertyValue)
  2776.     {
  2777.         m_bTransitionReversed = (::atoi((const char *)pPropertyValue->GetBuffer())==1);
  2778.         HX_RELEASE(pPropertyValue);
  2779.     }
  2780.     pParams->GetPropertyCString("TranIn", (IHXBuffer*&)pPropertyValue);
  2781.     if (pPropertyValue)
  2782.     {
  2783.         m_bTransitionTranIn = (::atoi((const char *)pPropertyValue->GetBuffer())==1);
  2784.         HX_RELEASE(pPropertyValue);
  2785.     }
  2786.     pParams->GetPropertyCString("VerticalRepeat", (IHXBuffer*&)pPropertyValue);
  2787.     if (pPropertyValue)
  2788.     {
  2789.         m_nTransitionVertRepeat = ::atoi((const char *)pPropertyValue->GetBuffer());
  2790.         HX_RELEASE(pPropertyValue);
  2791.     }
  2792.     pParams->GetPropertyCString("HorizontalRepeat", (IHXBuffer*&)pPropertyValue);
  2793.     if (pPropertyValue)
  2794.     {
  2795.         m_nTransitionHorzRepeat = ::atoi((const char *)pPropertyValue->GetBuffer());
  2796.         HX_RELEASE(pPropertyValue);
  2797.     }
  2798.     pParams->GetPropertyCString("BorderWidth", (IHXBuffer*&)pPropertyValue);
  2799.     if (pPropertyValue)
  2800.     {
  2801.         m_nTransitionBorderWidth = ::atoi((const char *)pPropertyValue->GetBuffer());
  2802.         HX_RELEASE(pPropertyValue);
  2803.     }
  2804.     pParams->GetPropertyCString("BorderColor", (IHXBuffer*&)pPropertyValue);
  2805.     if (pPropertyValue)
  2806.     {
  2807.         m_ulTransitionBorderColor = ::atoi((const char *)pPropertyValue->GetBuffer());
  2808.         HX_RELEASE(pPropertyValue);
  2809.     }
  2810.     pParams->GetPropertyCString("FadeColor", (IHXBuffer*&)pPropertyValue);
  2811.     if (pPropertyValue)
  2812.     {
  2813.         m_ulTransitionFadeColor = ::atoi((const char *)pPropertyValue->GetBuffer());
  2814.         HX_RELEASE(pPropertyValue);
  2815.     }
  2816.     pParams->GetPropertyCString("BlendBorder", (IHXBuffer*&)pPropertyValue);
  2817.     if (pPropertyValue)
  2818.     {
  2819.         m_bTransitionBlendBorder = (::atoi((const char *)pPropertyValue->GetBuffer())==1);
  2820.         HX_RELEASE(pPropertyValue);
  2821.     }
  2822.     pParams->GetPropertyCString("Coordinated", (IHXBuffer*&)pPropertyValue);
  2823.     if (pPropertyValue)
  2824.     {
  2825.         m_bTransitionCoordinated = (::atoi((const char *)pPropertyValue->GetBuffer())==1);
  2826.         HX_RELEASE(pPropertyValue);
  2827.     }
  2828.     pParams->GetPropertyCString("ClipBoundary", (IHXBuffer*&)pPropertyValue);
  2829.     if (pPropertyValue)
  2830.     {
  2831.         const char* pszType = (const char*)pPropertyValue->GetBuffer();
  2832.         BOOL        bIsParent = TRUE;
  2833.         if( pszType && strlen( pszType ) )
  2834.         {
  2835.             bIsParent = pszType[0]=='p' || pszType[0]=='P';
  2836.         }
  2837.         m_bTransitionCoordTranIsParentClip = bIsParent;
  2838.         HX_RELEASE(pPropertyValue);
  2839.     }
  2840.     if (bFoundSubType && bFoundType)
  2841.     {
  2842.         m_fpTransitionEffect        =
  2843.             z_TransitionTable[transitionType].m_pSubTypes[transitionSubType].m_fpTranFunction;
  2844.         m_nTransitionState = 0;
  2845.         return HXR_OK;
  2846.     }
  2847.     else
  2848.     {
  2849.         return HXR_FAIL;
  2850.     }
  2851. }
  2852. STDMETHODIMP CHXBaseSite::SetPercentage (UINT32 nThousandnthsComplete)
  2853. {
  2854.     _TLSLock();
  2855.     if( nThousandnthsComplete != (UINT32)m_nTransitionState )
  2856.     {
  2857.         m_nTransitionState = nThousandnthsComplete;
  2858.         // We need to invalidate the rect first before we may
  2859.         // update m_topleft and m_postion. This would happen
  2860.         // if we are doing some sort of slideWipe transition.
  2861.         // The first rect will be the "old" position of a
  2862.         // slideWipe. If we are not using some sort of
  2863.         // slideWipe, then the rect won't change and we
  2864.         // won't damage again.
  2865.         HXxRect cTmp = { m_topleft.x,
  2866.                          m_topleft.y,
  2867.                          m_topleft.x+m_size.cx,
  2868.                          m_topleft.y+m_size.cy};
  2869.         m_pTopLevelSite->_RecursiveDamageRect( &cTmp, TRUE );
  2870.         int completeness = m_nTransitionState;
  2871.         if(m_bTransitionReversed)
  2872.             completeness = 1000 - completeness;
  2873.         if( m_fpTransitionEffect == SlideFromLeft )
  2874.         {
  2875.             m_position.x = m_positionOrig.x -
  2876.                 ((INT32)(m_size.cx - (double(m_size.cx)/1000.0)*(double)completeness));
  2877.             ResetOrigin();
  2878.         }
  2879.         else if( m_fpTransitionEffect == SlideFromTop )
  2880.         {
  2881.             m_position.y = m_positionOrig.y -
  2882.                 ((INT32)(m_size.cy - (double(m_size.cy)/1000.0)*(double)completeness));
  2883.             ResetOrigin();
  2884.         }
  2885.         else if( m_fpTransitionEffect == SlideFromRight )
  2886.         {
  2887.             m_position.x = m_positionOrig.x +
  2888.                 ((INT32)(m_size.cx - (double(m_size.cx)/1000.0)*(double)completeness));
  2889.             ResetOrigin();
  2890.         }
  2891.         else if( m_fpTransitionEffect == SlideFromBottom )
  2892.         {
  2893.             m_position.y = m_positionOrig.y +
  2894.                 ((INT32)(m_size.cy - (double(m_size.cy)/1000.0)*(double)completeness));
  2895.             ResetOrigin();
  2896.         }
  2897.         // Did we change the rect? If so, then damage with
  2898.         // the new rect
  2899.         if (cTmp.left   != m_topleft.x             ||
  2900.             cTmp.top    != m_topleft.y             ||
  2901.             cTmp.right  != m_topleft.x + m_size.cx ||
  2902.             cTmp.bottom != m_topleft.y + m_size.cy)
  2903.         {
  2904.             // Invalidate the changed rect
  2905.             cTmp.left   = m_topleft.x;
  2906.             cTmp.top    = m_topleft.y;
  2907.             cTmp.right  = m_topleft.x + m_size.cx;
  2908.             cTmp.bottom = m_topleft.y + m_size.cy;
  2909.             m_pTopLevelSite->_RecursiveDamageRect(&cTmp, TRUE);
  2910.         }
  2911.         if( this==m_pTopLevelSite)
  2912.         {
  2913.             m_pTopLevelSite->RecomputeClip();
  2914.         }
  2915.         else
  2916.         {
  2917.             if(m_pTopLevelSite)
  2918.                 m_pTopLevelSite->ScheduleCallback(CLIP, 0);
  2919.             m_pTopLevelSite->m_bCalledComputeClipFromTransition = TRUE;
  2920.         }
  2921.     }
  2922.     _TLSUnlock();
  2923.     return HXR_OK;
  2924. }
  2925. /*
  2926.  * IHXVideoControls methods
  2927.  */
  2928. STDMETHODIMP_(float) CHXBaseSite::GetBrightness(void)
  2929. {
  2930.     if (m_pParentSite)
  2931.     {
  2932.         return m_pParentSite->GetBrightness();
  2933.     }
  2934.     return m_fBrightness;
  2935. }
  2936. STDMETHODIMP CHXBaseSite::SetBrightness(float brightness)
  2937. {
  2938.     if (m_pParentSite)
  2939.     {
  2940.         return m_pParentSite->SetBrightness(brightness);
  2941.     }
  2942.     m_fBrightness = brightness;
  2943.     ScheduleCallback(REPAINT, 0);
  2944.     return HXR_OK;
  2945. }
  2946. STDMETHODIMP_(float) CHXBaseSite::GetContrast(void)
  2947. {
  2948.     if (m_pParentSite)
  2949.     {
  2950.         return m_pParentSite->GetContrast();
  2951.     }
  2952.     return m_fContrast;
  2953. }
  2954. STDMETHODIMP CHXBaseSite::SetContrast(float contrast)
  2955. {
  2956.     if (m_pParentSite)
  2957.     {
  2958.         return m_pParentSite->SetContrast(contrast);
  2959.     }
  2960.     m_fContrast = contrast;
  2961.     ScheduleCallback(REPAINT, 0);
  2962.     return HXR_OK;
  2963. }
  2964. STDMETHODIMP_(float) CHXBaseSite::GetSaturation(void)
  2965. {
  2966.     if (m_pParentSite)
  2967.     {
  2968.         return m_pParentSite->GetSaturation();
  2969.     }
  2970.     return m_fSaturation;
  2971. }
  2972. STDMETHODIMP CHXBaseSite::SetSaturation(float saturation)
  2973. {
  2974.     if (m_pParentSite)
  2975.     {
  2976.         return m_pParentSite->SetSaturation(saturation);
  2977.     }
  2978.     m_fSaturation = saturation;
  2979.     ScheduleCallback(REPAINT, 0);
  2980.     return HXR_OK;
  2981. }
  2982. STDMETHODIMP_(float) CHXBaseSite::GetHue(void)
  2983. {
  2984.     if (m_pParentSite)
  2985.     {
  2986.         return m_pParentSite->GetHue();
  2987.     }
  2988.     return m_fHue;
  2989. }
  2990. STDMETHODIMP CHXBaseSite::SetHue(float hue)
  2991. {
  2992.     if (m_pParentSite)
  2993.     {
  2994.         return m_pParentSite->SetHue(hue);
  2995.     }
  2996.     m_fHue = hue;
  2997.     ScheduleCallback(REPAINT, 0);
  2998.     return HXR_OK;
  2999. }
  3000. STDMETHODIMP_(float) CHXBaseSite::GetSharpness(void)
  3001. {
  3002.     if (m_pParentSite)
  3003.     {
  3004.         return m_pParentSite->GetSharpness();
  3005.     }
  3006.     return m_fSharpness;
  3007. }
  3008. STDMETHODIMP CHXBaseSite::SetSharpness(float sharpness)
  3009. {
  3010.     if (m_pParentSite)
  3011.     {
  3012.         return m_pParentSite->SetSharpness(sharpness);
  3013.     }
  3014.     m_fSharpness = sharpness;
  3015.     ScheduleCallback(REPAINT, 0);
  3016.     return HXR_OK;
  3017. }
  3018. STDMETHODIMP CHXBaseSite::SetModeSharpness(UINT16 dFlag)
  3019. {
  3020.     m_bModeSharpness = dFlag;
  3021.     return HXR_OK;
  3022. }
  3023. STDMETHODIMP_(BOOL) CHXBaseSite::IsInterruptSafe()
  3024. {
  3025.     return TRUE;
  3026. }
  3027. STDMETHODIMP CHXBaseSite::SetKeyboardFocus(IHXSiteUser* pSiteUser)
  3028. {
  3029. #ifdef FUTURE_WORKING_FOCUS
  3030.     if (m_pTopLevelSite->m_pKeyBoardFocusUser)
  3031.     {
  3032.         HXxEvent event = {HX_LOSE_FOCUS, m_pWindow ? m_pWindow->window : NULL, NULL, NULL, 0, 0};
  3033.         m_pTopLevelSite->m_pKeyBoardFocusUser->HandleEvent(&event);
  3034.         m_pTopLevelSite->m_pKeyBoardFocusUser->Release();
  3035.         m_pTopLevelSite->m_pKeyBoardFocusUser = NULL;