minisymbiansite.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:7k
- /* ***** BEGIN LICENSE BLOCK *****
- * Version: RCSL 1.0/RPSL 1.0
- *
- * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved.
- *
- * The contents of this file, and the files included with this file, are
- * subject to the current version of the RealNetworks Public Source License
- * Version 1.0 (the "RPSL") available at
- * http://www.helixcommunity.org/content/rpsl unless you have licensed
- * the file under the RealNetworks Community Source License Version 1.0
- * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl,
- * in which case the RCSL will apply. You may also obtain the license terms
- * directly from RealNetworks. You may not use this file except in
- * compliance with the RPSL or, if you have a valid RCSL with RealNetworks
- * applicable to this file, the RCSL. Please see the applicable RPSL or
- * RCSL for the rights, obligations and limitations governing use of the
- * contents of the file.
- *
- * This file is part of the Helix DNA Technology. RealNetworks is the
- * developer of the Original Code and owns the copyrights in the portions
- * it created.
- *
- * This file, and the files included with this file, is distributed and made
- * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
- * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES,
- * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS
- * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
- *
- * Technology Compatibility Kit Test Suite(s) Location:
- * http://www.helixcommunity.org/content/tck
- *
- * Contributor(s):
- *
- * ***** END LICENSE BLOCK ***** */
- #include "minisite.h"
- #include "minisymbiansite.h"
- #include "minisymbiansurf.h"
- #include <e32std.h>
- #include <eikenv.h>
- #include <eikdef.h>
- #include <gdi.h>
- #include <fbs.h>
- #include "hxprefs.h"
- #include "hxprefutil.h"
- //Well, I hate to add this, but we really have to keep track of how
- //many sites have been made so we can center and scale video only
- //playback. Not the cleanest thing in the world.
- const INT32 _zm_nSiteCount = 0;
- #define zm_nSiteCount HXGlobalInt32::Get(&_zm_nSiteCount)
- CHXSymbianSite::CHXSymbianSite( IUnknown* pContext,
- IUnknown* pUnkOuter,
- INT32 lZorder)
- : CMiniBaseSite(pContext, pUnkOuter, lZorder),
- m_bAutoScale(TRUE)
- {
- memset(&m_OrigSize, 0, sizeof(m_OrigSize));
- zm_nSiteCount++;
- }
- CHXSymbianSite::~CHXSymbianSite()
- {
- zm_nSiteCount--;
- }
- void* CHXSymbianSite::_Create(void* pParentWindow, UINT32 style)
- {
- //XXXGfw Don't use.
- HX_ASSERT("Not supported on Symbian"==NULL);
-
- return (void*)NULL;
- }
- void CHXSymbianSite::_Destroy(HXxWindow* pWindow)
- {
- }
- void CHXSymbianSite::_ChildCreated()
- {
- //If we have a child created, stop doing any of the
- //centering or scaling.
- if( m_pWindow && m_pWindow->window && m_bAutoScale )
- {
- SetSize(m_OrigSize);
- }
- }
- void CHXSymbianSite::_SetSize(HXxSize size)
- {
- }
- void CHXSymbianSite::_SetPosition(HXxPoint position)
- {
- }
- void CHXSymbianSite::_AttachWindow()
- {
- }
- BOOL CHXSymbianSite::_MoveWindow( void* window ,
- INT32 X, INT32 Y,
- INT32 nWidth, INT32 nHeight,
- BOOL bRepaint)
-
- {
- return TRUE;
- }
- STDMETHODIMP CHXSymbianSite::SetSize(HXxSize size)
- {
- //First, call the basesite's impl.
- HX_RESULT ret = CMiniBaseSite::SetSize(size);
- //Now do our scaling..
- //There is often a border around our display window and the edge
- //of the physical phone display. So, if you play back a 176x144
- //video on a 176x144 screen it won't quite fit. Instead of
- //shrinking this to 1/2, go ahead and just lose some pixels
- //around the edges and display it at 1:1.
- UINT32 nPixelWaste = 2;
- IHXPreferences* pPreferences = NULL;
- if (HXR_OK == m_pContext->QueryInterface(IID_IHXPreferences, (void**)&pPreferences))
- {
- ReadPrefINT32(pPreferences, "PixelWaste", nPixelWaste );
- ReadPrefBOOL(pPreferences, "AutoScale", m_bAutoScale);
- HX_RELEASE(pPreferences);
- }
-
- //Only do the centering and scaling for the top level site. If
- //CreateChild is ever called on this top level site, then we will
- //revert this site back to 0,0 and the size of the window. Until
- //then, we assume this is an single video playback only and center
- //scale it.
- if( m_pWindow && m_pWindow->window && 1==zm_nSiteCount )
- {
- //Get the size of the screen device.
- RDrawableWindow* pWin = (RDrawableWindow*)m_pWindow->window;
- TSize windowSize = pWin->Size();
- int nWidth = windowSize.iWidth;
- int nHeight = windowSize.iHeight;
- int nRatio = 1;
- if( m_bAutoScale )
- {
- m_OrigSize = m_size;
-
- //Now figure out what scale factor to play back at: .5, 1, 2.
- nRatio = min( (nWidth+nPixelWaste)/size.cx,
- (nHeight+nPixelWaste)/size.cy
- );
- if( 2 < nRatio )
- nRatio = 2;
- switch( nRatio )
- {
- case 0:
- //Go to 1/2, its the best we can do.
- //XXXGfw TODO: if its too big lets not even play this clip.
- m_size.cx = size.cx/2;
- m_size.cy = size.cy/2;
- break;
- case 1:
- //Just leave it alone.
- break;
- case 2:
- //Go to double size.
- m_size.cx = size.cx*2;
- m_size.cy = size.cy*2;
- break;
- default:
- break;
- }
- }
-
- #ifndef HELIX_FEATURE_SMIL_SITE
- //There are no site-watchers in non-smil site cases. So,
- //the TLC has no chance to center the site. We will do
- //it here.
- HXxPoint point;
- point.x = (nWidth-m_size.cx)/2;
- point.y = (nHeight-m_size.cy)/2;
- SetPosition( point );
- #else
- //If we changed size, due to autoscaling, call the site
- //watchers and let them know. On symbian this lets the TLC
- //do auto centering.
- if( 1 != nRatio )
- {
- CHXSimpleList::Iterator i;
- for(i=m_PassiveSiteWatchers.Begin(); i!= m_PassiveSiteWatchers.End(); ++i)
- {
- ((IHXPassiveSiteWatcher*) *i)->SizeChanged(&m_size);
- }
- }
- #endif
- }
- return ret;
- }