javauis/mmapi_akn/baseline/src/cmmacanvasdisplay.cpp
branchRCL_3
changeset 19 04becd199f91
child 71 d5e927d5853b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/mmapi_akn/baseline/src/cmmacanvasdisplay.cpp	Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,217 @@
+/*
+* Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "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:  Draws to Canvas.
+*
+*/
+
+
+//  Include Files
+#include <jdebug.h>
+#include <lcdui.h> // MMIDCanvas
+
+#ifdef EXTENDED_LCDUI_CANVAS
+#include <MMIDCanvasExtended.h>
+#endif
+
+#include "cmmacanvasdisplay.h"
+#include "cmmabitmapwindow.h"
+
+// CONSTRUCTION
+// Static constructor, leaves pointer to cleanup-stack
+CMMACanvasDisplay* CMMACanvasDisplay::NewLC(MMIDCanvas* aCanvas)
+{
+    CMMACanvasDisplay* self =
+        new(ELeave) CMMACanvasDisplay(aCanvas);
+
+    CleanupStack::PushL(self);
+    self->Construct(&aCanvas->DirectContainer());
+    return self;
+}
+
+// Destructor (virtual by CBase)
+CMMACanvasDisplay::~CMMACanvasDisplay()
+{
+}
+
+CMMACanvasDisplay::CMMACanvasDisplay(MMIDCanvas* aCanvas):
+        iCanvas(aCanvas)
+{
+}
+
+void CMMACanvasDisplay::SourceSizeChanged(const TSize& aSourceSize)
+{
+    DEBUG_INT("MMA::CMMACanvasDisplay::SourceSizeChanged %d",
+              aSourceSize.iWidth);
+    DEBUG_INT("MMA::CMMACanvasDisplay::SourceSizeChanged %d",
+              aSourceSize.iHeight);
+
+    iSourceSize = aSourceSize;
+    TSize fullScreenSize(iCanvas->ContentSize());
+
+    TBool sourceIsBigger = (aSourceSize.iWidth > fullScreenSize.iWidth ||
+                            aSourceSize.iHeight > fullScreenSize.iHeight);
+
+    if (iWindow)
+    {
+#ifdef RD_JAVA_NGA_ENABLED
+        TPoint topLeft(0, 0);
+        iWindow->SetVideoCropRegion(TRect(topLeft, aSourceSize));
+#endif
+
+        if (sourceIsBigger)
+        {
+            // Source is larger than display area.
+            // Shrink draw are to fit in display.
+            iWindow->SetDrawRect(ScaleToFullScreen(fullScreenSize, iSourceSize));
+        }
+        else
+        {
+            // source is smaller than display area
+            iWindow->SetDrawRect(TRect(iUserRect.iTl, iSourceSize));
+        }
+    }
+    SetClippingRegion();
+
+    if (iUserRect.IsEmpty())
+    {
+        if (iWindow)
+        {
+            // Java side hasn't set size.
+            iUserRect = iWindow->DrawRect();
+        }
+
+        if (!sourceIsBigger)
+        {
+            // Addjusting rect to top left corner.
+            iUserRect = TRect(iUserRect.Size());
+        }
+    }
+}
+
+
+void CMMACanvasDisplay::SetFullScreenL(TBool aFullScreen)
+{
+    iFullScreen = aFullScreen;
+    if (iContainerVisible)
+    {
+        RemoveClippingRegion();
+
+        if (aFullScreen)
+        {
+            // use new scaled rect
+            iWindow->SetDrawRect(ScaleToFullScreen(
+                                     iCanvas->ContentSize(), iSourceSize));
+        }
+        else
+        {
+            // use size set from java
+            iWindow->SetDrawRect(iUserRect);
+        }
+
+        AddClippingRegion();
+    }
+}
+
+void CMMACanvasDisplay::SetWindowL(MMMADisplayWindow* aWindow)
+{
+    DEBUG("CMMACanvasDisplay::SetWindowL");
+    CMMADisplay::SetWindowL(aWindow);
+    if (!iWindow)
+    {
+        DEBUG("CMMACanvasDisplay::SetWindowL: NULL window, returning");
+        return;
+    }
+
+    CFbsBitmap* bitmap = iCanvas->FrameBuffer();
+
+    __ASSERT_DEBUG(bitmap,
+                   User::Panic(_L("Canvas has no bitmap"),
+                               KErrNotFound));
+
+    iWindow->SetDestinationBitmapL(bitmap);
+
+    // Check that container exists
+    User::LeaveIfNull(iDirectContainer);
+
+    DEBUG_INT2("MMA::CMMACanvasDisplay::SetWindowL iDirectContainer->MdcContentBounds() TL %d %d", iDirectContainer->MdcContentBounds().iTl.iX, iDirectContainer->MdcContentBounds().iTl.iY);
+    DEBUG_INT2("MMA::CMMACanvasDisplay::SetWindowL iDirectContainer->MdcContentBounds() BR %d %d", iDirectContainer->MdcContentBounds().iBr.iX, iDirectContainer->MdcContentBounds().iBr.iY);
+
+    iWindow->SetWindowRect(iDirectContainer->MdcContentBounds(), MMMADisplay::EMmaThread);
+#ifdef RD_JAVA_NGA_ENABLED
+    iWindow->SetRWindowRect(iDirectContainer->MdcContainerWindowRect(),
+                            MMMADisplay::EMmaThread);
+#endif
+}
+
+void CMMACanvasDisplay::SetDisplayLocationL(const TPoint& aPosition)
+{
+    // Move iUserRect top left corner to aPosition.
+    TSize size(iUserRect.Size());
+    iUserRect.iTl = aPosition;
+    iUserRect.SetSize(size);
+
+    if (iContainerVisible && !iFullScreen && iWindow)
+    {
+        iWindow->SetDrawRect(iUserRect);
+        SetClippingRegion();
+    }
+    else
+    {
+        iResetDrawRect = ETrue;
+    }
+}
+
+TPoint CMMACanvasDisplay::DisplayLocation()
+{
+    if (iWindow && iFullScreen)
+    {
+        return iWindow->DrawRect().iTl;
+    }
+    else
+    {
+        return iUserRect.iTl;
+    }
+}
+
+void CMMACanvasDisplay::MdcContentBoundsChanged(const TRect& aRect)
+{
+    DEBUG_INT2("MID::CMMACanvasDisplay::MdcContentBoundsChanged aRect TL %d %d",
+               aRect.iTl.iX, aRect.iTl.iY);
+    DEBUG_INT2("MID::CMMACanvasDisplay::MdcContentBoundsChanged aRect BR %d %d",
+               aRect.iBr.iX, aRect.iBr.iY);
+
+    if (iWindow)
+    {
+        // Set new rect to window.
+        iWindow->SetWindowRect(aRect, MMMADisplay::EUiThread);
+
+        if (iFullScreen)
+        {
+            TRect fullRect = ScaleToFullScreen(iCanvas->ContentSize(),
+                                               iSourceSize);
+
+            // use SetDrawRectThread because this code is executed
+            // in lcdui thread
+            iWindow->SetDrawRectThread(fullRect);
+        }
+        else
+        {
+            // move to user defined position.
+            iWindow->SetPosition(iUserRect.iTl);
+        }
+    }
+    SetClippingRegion();
+}
+
+//  END OF FILE