javauis/mmapi_qt/baseline/src/cmmacanvasdisplay.cpp
branchRCL_3
changeset 65 ae942d28ec0e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/mmapi_qt/baseline/src/cmmacanvasdisplay.cpp	Tue Aug 31 15:09:22 2010 +0300
@@ -0,0 +1,361 @@
+/*
+* 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 <logger.h>
+//#include <lcdui.h> // MMIDCanvas
+
+#ifdef EXTENDED_LCDUI_CANVAS
+#include <MMIDCanvasExtended.h>
+#endif
+
+#include "cmmacanvasdisplay.h"
+#include "cmmabitmapwindow.h"
+#include "mmafunctionserver.h"
+
+// CONSTRUCTION
+// Static constructor, leaves pointer to cleanup-stack
+CMMACanvasDisplay* CMMACanvasDisplay::NewLC(MMAFunctionServer* aEventSource, jobject obj/*MMIDCanvas* aCanvas*/)
+{
+    CMMACanvasDisplay* self =
+        new(ELeave) CMMACanvasDisplay();
+
+    CleanupStack::PushL(self);
+    self->Construct(aEventSource,NULL,obj);
+    return self;
+}
+
+// Destructor (virtual by CBase)
+CMMACanvasDisplay::~CMMACanvasDisplay()
+{
+}
+
+
+
+
+/*
+void CMMACanvasDisplay::SourceSizeChanged(const TSize& aSourceSize)
+{
+    LOG(EJavaMMAPI,EInfo,"CMMACanvasDisplay::SourceSizeChanged");
+
+    #ifdef RD_JAVA_NGA_ENABLED
+    if ( iWindow )
+            {
+        iWindow->SetVideoCropRegion( TRect( iUserRect.iTl, aSourceSize ) );
+        }
+    #endif
+
+    iSourceSize = aSourceSize;
+    jmethodID getDisplayWidthID = iJni->GetMethodID(
+                                         iJavaDisplayClass,
+                                         "getDisplayWidth",
+                                         "()I");
+
+    jmethodID getDisplayHeightID = iJni->GetMethodID(
+                                         iJavaDisplayClass,
+                                         "getDisplayHeight",
+                                         "()I");
+
+
+     TInt x =  iJni->CallIntMethod(iJavaDisplayObject,getDisplayWidthID);
+     TInt y = iJni->CallIntMethod(iJavaDisplayObject,getDisplayHeightID);
+
+   // TSize iFullScreenSize(100,100);    // TO-Do remove hardcoded with the relevent one
+    LOG2(EJavaMMAPI,EInfo,"CMMACanvasdisplay.cpp : SourceSizeChanged () iFullScreenSize is x = %d ,y = %d ",x,y);
+    // get the ScreenSize from canvas in java
+    TSize canvasSize(x, y);
+    iFullScreenSize = canvasSize;
+    TBool sourceIsBigger = (aSourceSize.iWidth > iFullScreenSize.iWidth ||
+                            aSourceSize.iHeight > iFullScreenSize.iHeight);
+
+    if (sourceIsBigger)
+    {
+        // Source is larger than display area.
+        // Shrink draw are to fit in display.
+        iWindow->SetDrawRect(ScaleToFullScreen(iFullScreenSize, iSourceSize));
+    }
+    else
+    {
+        // source is smaller than display area
+        iWindow->SetDrawRect(TRect(iUserRect.iTl, iSourceSize));
+    }
+
+    SetClippingRegion();
+
+    if (iUserRect.IsEmpty())
+    {
+        // Java side hasn't set size.
+        iUserRect = iWindow->DrawRect();
+
+        if (!sourceIsBigger)
+        {
+            // Addjusting rect to top left corner.
+            iUserRect = TRect(iUserRect.Size());
+        }
+    }
+}
+
+*/
+
+void CMMACanvasDisplay::SourceSizeChanged(TInt aJavaControlWidth, TInt aJavaControlHeight,TInt /*x*/, TInt /*y*/,TRect /*aBoundsRect*/)
+{
+    JELOG2(EJavaMMAPI);
+    LOG2(EJavaMMAPI,EInfo,"CMMACanvasDisplay::SourceSizeChanged(aSourceSize,aJavaControlWidth,aJavaControlHeight) + aJavaControlWidth = %d ,aJavaControlHeight = %d",aJavaControlWidth,aJavaControlHeight);
+    iSourceSize = SourceSize();
+    LOG2(EJavaMMAPI,EInfo,"CMMACanvasDisplay::SourceSizeChanged(aSourceSize,aJavaControlWidth,aJavaControlHeight) + sourcesize = %d X %d",iSourceSize.iWidth , iSourceSize.iHeight);
+#ifdef RD_JAVA_NGA_ENABLED
+    if (iWindow)
+    {
+        iWindow->SetVideoCropRegion(TRect(iUserRect.iTl, iSourceSize));
+    }
+#endif
+
+    // size of canvas in java
+    TSize canvasSize(aJavaControlWidth, aJavaControlHeight);
+    iFullScreenSize = canvasSize;
+    TBool sourceIsBigger = (iSourceSize.iWidth > iFullScreenSize.iWidth ||
+                            iSourceSize.iHeight > iFullScreenSize.iHeight);
+
+    if (sourceIsBigger)
+    {
+        // Source is larger than display area.
+        // Shrink draw are to fit in display.
+        LOG(EJavaMMAPI,EInfo,"CMMACanvasDisplay::SourceSizeChanged - source is bigger than display area");
+        iWindow->SetDrawRect(ScaleToFullScreen(iFullScreenSize, iSourceSize));
+        LOG(EJavaMMAPI,EInfo,"CMMACanvasDisplay::SourceSizeChanged - source is bigger than display area - after SetDrawRect");
+
+    }
+    else
+    {
+        // source is smaller than display area
+        LOG(EJavaMMAPI,EInfo,"CMMACanvasDisplay::SourceSizeChanged - source is smaller than display area");
+        iWindow->SetDrawRect(TRect(iUserRect.iTl, iSourceSize));
+    }
+
+    SetClippingRegion();
+
+    if (iUserRect.IsEmpty())
+    {
+        // Java side hasn't set size.
+        iUserRect = iWindow->DrawRect();
+
+        if (!sourceIsBigger)
+        {
+            // Addjusting rect to top left corner.
+            iUserRect = TRect(iUserRect.Size());
+        }
+    }
+    LOG(EJavaMMAPI,EInfo,"CMMACanvasDisplay::SourceSizeChanged(aJavaControlWidth,aJavaControlHeight)-");
+}
+
+
+void CMMACanvasDisplay::SetFullScreenL(TBool aFullScreen)
+{
+    LOG(EJavaMMAPI,EInfo,"CMMACanvasDisplay::SetFullScreenL +");
+    iFullScreen = aFullScreen;
+    if (iContainerVisible)
+    {
+        LOG2(EJavaMMAPI,EInfo,"CMMACanvasDisplay::SetFullScreenL widht=%d height=%d", iFullScreenSize.iWidth,
+             iFullScreenSize.iHeight);
+        RemoveClippingRegion();
+        LOG2(EJavaMMAPI,EInfo,"CMMACanvasDisplay::SetFullScreenL widht=%d height=%d", iFullScreenSize.iWidth,
+             iFullScreenSize.iHeight);
+        LOG2(EJavaMMAPI,EInfo,"CMMACanvasDisplay::SetFullScreenL::iSourceSize widht=%d height=%d", iSourceSize.iWidth,
+             iSourceSize.iHeight);
+        if (aFullScreen)
+        {
+            // use new scaled rect
+            // iWindow->SetDrawRect(ScaleToFullScreen(fullScreenSize, iSourceSize));
+            LOG(EJavaMMAPI,EInfo,"CMMACanvasDisplay::SetFullScreenL -  true scale to fullscreen");
+            iWindow->SetDrawRect(ScaleToFullScreen(iFullScreenSize, iSourceSize));
+        }
+        else
+        {
+            // use size set from java
+            LOG(EJavaMMAPI,EInfo,"CMMACanvasDisplay::SetFullScreenL -  false - draw the user rect set previously");
+            LOG2(EJavaMMAPI,EInfo,"CMMACanvasDisplay::SetFullScreenL iUserRect = (%d,%d) ",iUserRect.Width(),iUserRect.Height());
+            iWindow->SetDrawRect(iUserRect);
+        }
+
+        AddClippingRegion();
+    }
+    LOG(EJavaMMAPI,EInfo,"CMMACanvasDisplay::SetFullScreenL -");
+}
+
+void CMMACanvasDisplay::SetWindowL(MMMADisplayWindow* aWindow)
+{
+    LOG(EJavaMMAPI, EInfo, "CMMACanvasDisplay::SetWindowL");
+    CMMADisplay::SetWindowL(aWindow);
+    if (!iWindow)
+    {
+        LOG(EJavaMMAPI, EInfo, "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);
+
+    LOG2( EJavaMMAPI, EInfo, "MMA::CMMACanvasDisplay::SetWindowL iDirectContainer->MdcContentBounds() TL %d %d", iDirectContainer->MdcContentBounds().iTl.iX, iDirectContainer->MdcContentBounds().iTl.iY);
+    LOG2( EJavaMMAPI, EInfo, "MMA::CMMACanvasDisplay::SetWindowL iDirectContainer->MdcContentBounds() BR %d %d", iDirectContainer->MdcContentBounds().iBr.iX, iDirectContainer->MdcContentBounds().iBr.iY);
+    */
+    LOG(EJavaMMAPI,EInfo,"MMA::CMMACanvasDisplay::before calling  BoundRect");
+    TRect boundrect = BoundRect();
+    iWindow->SetWindowRect(boundrect/*iDirectContainer->MdcContentBounds()*/, MMMADisplay::EMmaThread);
+
+#ifdef RD_JAVA_NGA_ENABLED
+    //iWindow->SetRWindowRect( iDirectContainer->MdcContainerWindowRect(),
+    //                         MMMADisplay::EMmaThread );
+    iWindow->SetRWindowRect(boundrect,
+                            MMMADisplay::EMmaThread);
+#endif
+
+    SetClippingRegion();
+}
+
+
+
+TRect CMMACanvasDisplay::BoundRect()
+{
+    LOG(EJavaMMAPI,EInfo,"MMA::CMMACanvasDisplay::BoundRect +");
+    jmethodID getBoundRectID = iJni->GetMethodID(
+                                   iJavaDisplayClass,
+                                   "getBoundRect",
+                                   "()V");
+
+    LOG(EJavaMMAPI,EInfo,"MMA::CMMACanvasDisplay::BoundRect --1");
+    // set the value to java,so that we can access those from array
+    iJni->CallVoidMethod(iJavaDisplayObject,getBoundRectID);
+    jfieldID field = iJni->GetFieldID(iJavaDisplayClass, "displayboundarr", "[I");
+    if (field == NULL)
+    {
+        // handle error
+    }
+    /* Read the instance field s */
+    jintArray javaboundinfoarr = (jintArray)iJni->GetObjectField(iJavaDisplayObject, field);
+    LOG(EJavaMMAPI,EInfo,"MMA::CMMACanvasDisplay::BoundRect --2");
+    jint* nativeboundinfoarr = iJni->GetIntArrayElements(javaboundinfoarr, NULL);
+    LOG(EJavaMMAPI,EInfo,"MMA::CMMACanvasDisplay::BoundRect --3");
+    if (!nativeboundinfoarr)
+    {
+        // outputBuffer was already allocated
+        iJni->ReleaseIntArrayElements(javaboundinfoarr, nativeboundinfoarr, JNI_ABORT);
+        // return invalid rect.
+        TRect rect(0,0,0,0);
+        return rect;
+    }
+    LOG(EJavaMMAPI,EInfo,"MMA::CMMACanvasDisplay::BoundRect --4");
+// create TRect
+    TInt xcoordinate = nativeboundinfoarr[0];
+    TInt ycoordinate = nativeboundinfoarr[1];
+    TInt width = nativeboundinfoarr[2];
+    TInt height = nativeboundinfoarr[3];
+    LOG2(EJavaMMAPI,EInfo,"CMMACanvasDisplay: BoundRect() co-ordinate of topleftcorner is x = %d,y =%d",xcoordinate,ycoordinate);
+    LOG2(EJavaMMAPI,EInfo,"CMMACanvasDisplay: BoundRect() size of bound rect is width = %d,height =%d",width,height);
+    TPoint topleft(xcoordinate,ycoordinate);
+    TSize rectsize(width,height);
+    TRect boundRect(topleft,rectsize);
+    iJni->ReleaseIntArrayElements(javaboundinfoarr, nativeboundinfoarr,0);
+    LOG(EJavaMMAPI,EInfo,"MMA::CMMACanvasDisplay::BoundRect -");
+    return boundRect;
+}
+
+// ask java side peer about the container rect size
+// currently assuming the boundrect and containerrect will be same in case of canvas
+TRect CMMACanvasDisplay::ContainerWindowRect()
+{
+
+    return BoundRect();
+
+}
+
+
+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)
+{
+    LOG2(EJavaMMAPI,EInfo,"MID::CMMACanvasDisplay::MdcContentBoundsChanged aRect TL %d %d",
+               aRect.iTl.iX, aRect.iTl.iY);
+    LOG2(EJavaMMAPI,EInfo,"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