diff -r 7c90e6132015 -r 10e98eab6f85 webengine/osswebengine/WebKit/s60/webview/WebSprite.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/osswebengine/WebKit/s60/webview/WebSprite.cpp Fri Jul 03 15:54:40 2009 +0100 @@ -0,0 +1,376 @@ +/* +* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Handles the viewing of a single frame. If the page is not frame +* enabled, this class is used as the single view. If frame +* enabled, there is one instance of this class for each frame. +* +*/ + +#include "../../bidi.h" +#include +#include +#include "WebSprite.h" + + +/* + * CWebSprite class serves as a replacement for Symbian RWsSprite + * in the cases when transparent window is possible (platform supports it). + * It's a window owning CCoeControl which window gets highest priority and + * smallest ordinal number. That allows to CWebSprite be on top of all windows + * in the same window group. The movement is restricted by boundaries of the + * parent CCoeControl window or Root Window if parent is NULL. + * Only one bitmap is supported, so animation is not possible. + * If platform doesn't support window transparency CWebSprite acts as wrapper + * around RWsSprite. + */ + +// ====================================================================== +// CWebSprite::NewL +// ====================================================================== +CWebSprite* CWebSprite::NewL(TPoint& aPos, CFbsBitmap* aBitmap, + CFbsBitmap* aMask, TBool aInvertMask) + { + CWebSprite* self = new(ELeave)CWebSprite(NULL, aBitmap, aMask, aInvertMask); + CleanupStack::PushL(self); + self->ConstructL(aPos); + CleanupStack::Pop(); + return self; + } + +// ====================================================================== +// CWebSprite::NewL +// ====================================================================== +CWebSprite* CWebSprite::NewL(CCoeControl* aParent, TPoint& aPos, + CFbsBitmap* aBitmap, CFbsBitmap* aMask, + TBool aInvertMask) + { + CWebSprite* self = new(ELeave)CWebSprite(aParent, aBitmap, aMask, aInvertMask); + CleanupStack::PushL(self); + self->ConstructL(aParent, aPos); + CleanupStack::Pop(); + return self; + } + +// ====================================================================== +// CWebSprite::BaseConstructL +// ====================================================================== +void CWebSprite::BaseConstructL(TPoint& aPos, CFbsBitmap* aBitmap, + CFbsBitmap* aMask, TBool aInvertMask) + { + iBitmap = aBitmap; + iMask = aMask; + iInvertMask = aInvertMask; + iParent = NULL; + ConstructL(aPos); + } + +// ====================================================================== +// CWebSprite::BaseConstructL +// ====================================================================== +void CWebSprite::BaseConstructL(CCoeControl* aParent, TPoint& aPos, + CFbsBitmap* aBitmap, CFbsBitmap* aMask, + TBool aInvertMask) + { + iBitmap = aBitmap; + iMask = aMask; + iInvertMask = aInvertMask; + iParent = aParent; + ConstructL(aParent, aPos); + } + +// ====================================================================== +// CWebSprite::CWebSprite() +// ====================================================================== +CWebSprite::CWebSprite() + { + } + +// ====================================================================== +// CWebSprite::CWebSprite() +// ====================================================================== +CWebSprite::CWebSprite(CCoeControl* aParent, CFbsBitmap* aBitmap, + CFbsBitmap* aMask, TBool aInvertMask) : + iParent(aParent), iBitmap(aBitmap), iMask(aMask), + iInvertMask(aInvertMask), iWin(NULL) + { + } + +// ====================================================================== +// CWebSprite::ConstructL +// ====================================================================== +void CWebSprite::ConstructL(TPoint& aPos) + { + ConstructL(NULL, aPos); + } + +// ====================================================================== +// CWebSprite::ConstructL +// ====================================================================== +void CWebSprite::ConstructL(CCoeControl* aParent, TPoint& aPos) + { + TInt err = KErrNone; + if (aParent) + { + CreateWindowL(aParent); + } + else + { + CreateWindowL(); + } + + iWin = &(Window()); + iWin->SetRequiredDisplayMode(EColor16MA); + err = iWin->SetTransparencyAlphaChannel(); + if (err != KErrNone) + { + // Transparency is not possible - close window and use sprites + CloseWindow(); + iWin = NULL; + } + + if (iWin) + { + iWin->SetOrdinalPosition(0, KPasswordWindowGroupPriority - 1); + iWin->SetBackgroundColor(TRgb(0,0)); + if (iBitmap) + { + init(aPos, iBitmap->SizeInPixels()); + ActivateL(); + } + else + { + SetPosition(aPos); + Hide(); + } + } + else + { + MakeVisible(EFalse); + CreateSprite(aPos); + } + } + +// ====================================================================== +// CWebSprite::CreateSprite +// ====================================================================== +void CWebSprite::CreateSprite(TPoint& aPos) + { + /* + * We should come here only if iWin is NULL since it will mean that + * transparent windowis not possible and we are using sprite + */ + RWindowTreeNode* window = iParent ? static_cast(iParent->DrawableWindow()) : + static_cast(&(ControlEnv()->RootWin())); + iSprite = RWsSprite(ControlEnv()->WsSession()); + iSprite.Construct(*window, aPos, ESpriteNoChildClip); + + TSpriteMember spriteMem; + spriteMem.iBitmap = iBitmap; + spriteMem.iMaskBitmap = iMask; + spriteMem.iInvertMask = iInvertMask; + + iSprite.AppendMember(spriteMem); + iSprite.Activate(); + } + +// ====================================================================== +// CWebSprite::UpdateSprite +// ====================================================================== +void CWebSprite::UpdateSprite() + { + /* + * We should come here only if iWin is NULL since it will mean that + * transparent windowis not possible and we are using sprite + */ + TSpriteMember spriteMem; + spriteMem.iBitmap = iBitmap; + spriteMem.iMaskBitmap = iMask; + spriteMem.iInvertMask = iInvertMask; + + iSprite.UpdateMember(0, spriteMem); + } + +// ====================================================================== +// CWebSprite::init +// ====================================================================== +void CWebSprite::init(TPoint& aPos, TSize aSize) + { + if (iWin) + { // we have a window - let's set position and size + SetPosition(aPos); + SetSizeWithoutNotification(aSize); + } + } + +// ====================================================================== +// CWebSprite::Draw +// ====================================================================== +void CWebSprite::Draw(const TRect& aRect) const + { + if (IsActivated() && iBitmap) + { + CWindowGc& gc = SystemGc(); + gc.Clear(aRect); + Window().SetOrdinalPosition(0, KPasswordWindowGroupPriority - 1); + TPoint pt = TPoint(0,0); + TRect rect = TRect(pt, iBitmap->SizeInPixels()); + gc.BitBltMasked(pt, iBitmap, rect, iMask, iInvertMask); + } + } + +// ====================================================================== +// CWebSprite::SetBitmap +// ====================================================================== +void CWebSprite::SetBitmap(CFbsBitmap* aBitmap, CFbsBitmap* aMask, TBool aInvertMask) + { + iBitmap = aBitmap; + iMask = aMask; + iInvertMask = aInvertMask; + + if(iWin && aBitmap) + { + TPoint pos = Position(); + init(pos, aBitmap->SizeInPixels()); + } + } + +// ====================================================================== +// CWebSprite::Update +// ====================================================================== +void CWebSprite::Update(const TPoint& aPos, CFbsBitmap* aBitmap, + CFbsBitmap* aMask) + { + SetPos(aPos); + Update(aBitmap, aMask); + } + +// ====================================================================== +// CWebSprite::Update +// ====================================================================== +void CWebSprite::Update(CFbsBitmap* aBitmap, CFbsBitmap* aMask) + { + TInt err = KErrNone; + if(iWin && aBitmap) // if we have a window and bitmap check if we need + { // to finish initialization + if (!IsActivated() || !iBitmap) // if control wasn't activated + { // or bitmap was reset last time to NULL, + TPoint pos = Position(); // because somebody wanted to reuse this control, + init(pos, aBitmap->SizeInPixels()); // we will try to initialize the control. + TRAP(err, ActivateL()); + } + } + + if (err == KErrNone) + { + iBitmap = aBitmap; + iMask = aMask; + } + else + { + iBitmap = NULL; + iMask = NULL; + } + + if (!iWin) + { + UpdateSprite(); + } + else if (iBitmap) + { + Show(); + DrawNow(); + } + } + +// ====================================================================== +// CWebSprite::Update +// ====================================================================== +void CWebSprite::Update(CFbsBitmap* aBitmap, CFbsBitmap* aMask, + TBool aInvertMask) + { + iInvertMask = aInvertMask; + Update(aBitmap, aMask); + } + +// ====================================================================== +// CWebSprite::Show +// ====================================================================== +void CWebSprite::Show() + { + if (iWin) + { + MakeVisible(ETrue); + } + else + { + UpdateSprite(); + } + } + +// ====================================================================== +// CWebSprite::Hide +// ====================================================================== +void CWebSprite::Hide() + { + if (iWin) + { + MakeVisible(EFalse); + } + else + { + Update(NULL, NULL); + } + } + +// ====================================================================== +// CWebSprite::~CWebSprite +// ====================================================================== +CWebSprite::~CWebSprite() + { + if (!iWin) + { + iSprite.Close(); + } + } + +// ====================================================================== +// CWebSprite::SetPos +// ====================================================================== +void CWebSprite::SetPos(const TPoint& aPos) + { + if (!iWin) + { + iSprite.SetPosition(aPos); + } + else + { + TPoint pos = Position(); + if (pos != aPos) + { + CCoeControl::SetPosition(aPos); + } + } + } + + +// ====================================================================== +// CWebSprite::IsShown +// ====================================================================== +TBool CWebSprite::IsShown() + { + // if it's a window owning CoeControl just return IsVisible() + // otherwise check if bitmap != NULL and if it's not then + // sprite is shown. + return (iWin && IsVisible()) || iBitmap != NULL; + }