--- /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 <fbs.h>
+#include <coemain.h>
+#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<RWindowTreeNode*>(iParent->DrawableWindow()) :
+ static_cast<RWindowTreeNode*>(&(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;
+ }