📄 sitewatc.cpp
字号:
}
delete this;
return 0;
}
STDMETHODIMP CSmilSiteWatcher::AttachSite(IHXSite* pSite)
{
HX_RESULT retVal = HXR_OK;
HX_RELEASE(m_pSite);
m_pSite = pSite;
if(m_pSite)
{
m_pSite->AddRef();
}
return retVal;
}
STDMETHODIMP CSmilSiteWatcher::DetachSite()
{
HX_RESULT retVal = HXR_OK;
HX_RELEASE(m_pSite);
return HXR_OK;
}
STDMETHODIMP CSmilSiteWatcher::ChangingPosition(HXxPoint oldPos,
REF(HXxPoint) newPos)
{
HX_RESULT retVal = HXR_OK;
if(!m_bChangingSize)
{
CSmilBasicRegion* pRegion = m_pDoc->getRegionByID(m_id);
if(pRegion && m_bMediaSizeSet)
{
// Pick the rect to use as the parent. If we
// have a ResizeBehavior of Zoom and are indeed
// zooming, then use the unzoomed parent width.
// Otherwise, use the regular zoomed parent width.
HXxRect cRect = pRegion->m_rect;
if ((m_dZoomScaleFactorX != 1.0 ||
m_dZoomScaleFactorY != 1.0) &&
m_eResizeBehavior == ResizeZoom)
{
cRect = pRegion->m_RectNoZoom;
}
// First we need to compute the subregion rect. We can't
// do this just once, since the subregion rect parameters
// may be getting animated.
HXxRect cSubRegionRect = {0, 0, 0, 0};
CSmilBasicRegion::resolveDimension(m_Rect.m_dLeft, m_Rect.m_eLeftType,
m_Rect.m_dRight, m_Rect.m_eRightType,
m_Rect.m_dWidth, m_Rect.m_eWidthType,
TRUE, HXxRECT_WIDTH(cRect),
cSubRegionRect.left,
cSubRegionRect.right);
CSmilBasicRegion::resolveDimension(m_Rect.m_dTop, m_Rect.m_eTopType,
m_Rect.m_dBottom, m_Rect.m_eBottomType,
m_Rect.m_dHeight, m_Rect.m_eHeightType,
TRUE, HXxRECT_HEIGHT(cRect),
cSubRegionRect.top,
cSubRegionRect.bottom);
// The calculation above was done in the space of the
// region. The calculations below are done in the space
// of the region's parent, so we need to offset the subregion
// rect by the region's upper left corner.
cSubRegionRect.left += cRect.left;
cSubRegionRect.top += cRect.top;
cSubRegionRect.right += cRect.left;
cSubRegionRect.bottom += cRect.top;
// Now we need to compute the absolute coordinates
// of the regPoint. Since the regPoint could be in
// percentage values, and the size of the region
// could be changing under animation, then we
// must recompute the absolute coordinates of the
// regPoint every time. This regPoint is in the
// space of the region's PARENT and not in the space
// of the region's rect itself.
HXxPoint cRegPoint = {0, 0};
m_pDoc->computeRegPoint(cSubRegionRect,
m_RegPoint,
cRegPoint);
// Now that we know the absolute coordinates
// of the regPoint, then we can compute the
// media layout within the region rect. Note
// that the following calculation takes place
// in the coordinate space of the region's PARENT,
// and not the region's rect itself.
HXxRect cMediaRect = {0, 0, 0, 0};
retVal = m_pDoc->computeMediaLayout(cSubRegionRect,
m_eFit,
cRegPoint,
m_RegPoint.m_eRegAlign,
m_MediaSize,
cMediaRect,
m_bMediaIsBrush);
if (SUCCEEDED(retVal))
{
// Now since the calculation of the media size was
// done in the space of the region's PARENT, then
// and we need to set the size of the media in the
// coordinate space of the REGION, then we need
// to translate the media rect to the coordinate
// space of the region.
cMediaRect.left -= cRect.left;
cMediaRect.top -= cRect.top;
cMediaRect.right -= cRect.left;
cMediaRect.bottom -= cRect.top;
// Now we can assign the new position
newPos.x = cMediaRect.left;
newPos.y = cMediaRect.top;
// If we have a resize behavior of Zoom, then
// we compute everything off of the original root-layout
// size, and then simply scale by the zoom factors.
if ((m_dZoomScaleFactorX != 1.0 ||
m_dZoomScaleFactorY != 1.0) &&
m_eResizeBehavior == ResizeZoom)
{
newPos.x = (INT32) floor(m_dZoomScaleFactorX * ((double) newPos.x) + 0.5);
newPos.y = (INT32) floor(m_dZoomScaleFactorY * ((double) newPos.y) + 0.5);
}
}
}
}
MLOG_LAYOUT(NULL,
"%lu\tChangingPosition((%ld,%ld),(%ld,%ld)) m_id=%s m_SourceID=%s\n",
HX_GET_BETTERTICKCOUNT(),
oldPos.x, oldPos.y, newPos.x, newPos.y,
(const char*) m_id,
(const char*) m_SourceID);
return retVal;
}
STDMETHODIMP CSmilSiteWatcher::ChangingSize(HXxSize oldSize,
REF(HXxSize) newSize)
{
HX_RESULT retVal = HXR_OK;
if(!m_bChangingSize &&
(newSize.cx != 0 || newSize.cy != 0))
{
CSmilBasicRegion* pRegion = m_pDoc->getRegionByID(m_id);
if(pRegion)
{
// For almost all renderers, here's the sequence of
// events: the core calls them with IHXSite::AttachSite()
// and in that call, they call IHXSite::SetSize() with
// the native size of their media. Therefore, we will assume
// that the first call we get will be the native size of
// the media.
BOOL bForceSetPosition = FALSE;
if (m_bFirstSizeChange)
{
MLOG_LAYOUT(NULL,
"Media size for %s is (%ld,%ld)\n",
(const char*) m_SourceID,
newSize.cx, newSize.cy);
// Save off the native media size
m_MediaSize = newSize;
m_bMediaSizeSet = TRUE;
m_bFirstSizeChange = FALSE;
bForceSetPosition = TRUE;
if (m_pDoc)
{
m_pDoc->setMediaNativeSize(m_SourceID, newSize);
}
// XXXMEH - this is legacy, which saves
// the media size into the region. However,
// this SHOULD NOT be used, since multiple media
// can play to the same region. TODO - if we
// can, make sure this is not used and then
// delete it from the region object.
pRegion->m_originalMediaSize = newSize;
pRegion->m_bMediaSizeSet = TRUE;
}
// Pick the rect to use as the parent. If we
// have a ResizeBehavior of Zoom and are indeed
// zooming, then use the unzoomed parent width.
// Otherwise, use the regular zoomed parent width.
HXxRect cRect = pRegion->m_rect;
if ((m_dZoomScaleFactorX != 1.0 ||
m_dZoomScaleFactorY != 1.0) &&
m_eResizeBehavior == ResizeZoom)
{
cRect = pRegion->m_RectNoZoom;
}
// First we need to compute the subregion rect. We can't
// do this just once, since the subregion rect parameters
// may be getting animated.
HXxRect cSubRegionRect = {0, 0, 0, 0};
CSmilBasicRegion::resolveDimension(m_Rect.m_dLeft, m_Rect.m_eLeftType,
m_Rect.m_dRight, m_Rect.m_eRightType,
m_Rect.m_dWidth, m_Rect.m_eWidthType,
TRUE, HXxRECT_WIDTH(cRect),
cSubRegionRect.left,
cSubRegionRect.right);
CSmilBasicRegion::resolveDimension(m_Rect.m_dTop, m_Rect.m_eTopType,
m_Rect.m_dBottom, m_Rect.m_eBottomType,
m_Rect.m_dHeight, m_Rect.m_eHeightType,
TRUE, HXxRECT_HEIGHT(cRect),
cSubRegionRect.top,
cSubRegionRect.bottom);
// The calculation above was done in the space of the
// region. The calculations below are done in the space
// of the region's parent, so we need to offset the subregion
// rect by the region's upper left corner.
cSubRegionRect.left += cRect.left;
cSubRegionRect.top += cRect.top;
cSubRegionRect.right += cRect.left;
cSubRegionRect.bottom += cRect.top;
// Now we need to compute the absolute coordinates
// of the regPoint. Since the regPoint could be in
// percentage values, and the size of the region
// could be changing under animation, then we
// must recompute the absolute coordinates of the
// regPoint every time. This regPoint is in the
// space of the region's PARENT and not in the space
// of the region's rect itself.
HXxPoint cRegPoint = {0, 0};
m_pDoc->computeRegPoint(cSubRegionRect,
m_RegPoint,
cRegPoint);
// Now that we know the absolute coordinates
// of the regPoint, then we can compute the
// media layout within the region rect. Note
// that the following calculation takes place
// in the coordinate space of the region's PARENT,
// and not the region's rect itself.
HXxRect cMediaRect = {0, 0, 0, 0};
retVal = m_pDoc->computeMediaLayout(cSubRegionRect,
m_eFit,
cRegPoint,
m_RegPoint.m_eRegAlign,
m_MediaSize,
cMediaRect,
m_bMediaIsBrush);
if (SUCCEEDED(retVal))
{
// Now since the calculation of the media size was
// done in the space of the region's PARENT, then
// and we need to set the size of the media in the
// coordinate space of the REGION, then we need
// to translate the media rect to the coordinate
// space of the region.
cMediaRect.left -= cRect.left;
cMediaRect.top -= cRect.top;
cMediaRect.right -= cRect.left;
cMediaRect.bottom -= cRect.top;
// So now the new width and height
// can be calculated.
newSize.cx = HXxRECT_WIDTH(cMediaRect);
newSize.cy = HXxRECT_HEIGHT(cMediaRect);
// If we have a resize behavior of Zoom, then
// we compute everything off of the original root-layout
// size, and then simply scale by the zoom factors.
if ((m_dZoomScaleFactorX != 1.0 ||
m_dZoomScaleFactorY != 1.0) &&
m_eResizeBehavior == ResizeZoom)
{
newSize.cx = (INT32) floor(m_dZoomScaleFactorX * ((double) newSize.cx) + 0.5);
newSize.cy = (INT32) floor(m_dZoomScaleFactorY * ((double) newSize.cy) + 0.5);
}
// Set the current media size to this value
// XXXMEH - TODO is this actually used anywhere? We
// should not really have a media size set into
// the region object anywhere, since multiple
// media can play to the same region
pRegion->m_mediaSize = newSize;
// As mentioned above, the renderers will usually
// call IHXSite::SetSize() when they are FIRST called
// with IHXSite::AttachSite(). However, since renderers
// don't have an idea of relative position to other renderers,
// then they rarely call IHXSite::SetPosition(). Therefore,
// if this is the first time through, we will need to explicitly
// call IHXSite::SetPosition().
if (bForceSetPosition)
{
// Since we have a site watcher, then it
// doesn't matter what we pass in, the site
// watcher will change it to what it needs to
// be. So pass in some arbitrary position.
HXxPoint cPos = {1, 1};
if (m_pSite)
{
m_pSite->SetPosition(cPos);
}
}
// If this is a scrolling site, then set the flag
if (m_eFit == FitScroll && m_pSite)
{
IHXValues* pValues = NULL;
m_pSite->QueryInterface(IID_IHXValues, (void**) &pValues);
if (pValues)
{
pValues->SetPropertyULONG32("ScrollingSite", 1);
}
HX_RELEASE(pValues);
}
}
}
}
MLOG_LAYOUT(NULL,
"%lu\tChangingSize((%ld,%ld),(%ld,%ld)) m_id=%s m_SourceID=%s\n",
HX_GET_BETTERTICKCOUNT(),
oldSize.cx, oldSize.cy, newSize.cx, newSize.cy,
(const char*) m_id,
(const char*) m_SourceID);
return retVal;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -