📄 minisymbiansite.cpp
字号:
/* ***** 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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -