diff -r f5050f1da672 -r 04becd199f91 javauis/lcdui_akn/lcdui/src/CMIDCanvasGraphicsItemPainter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javauis/lcdui_akn/lcdui/src/CMIDCanvasGraphicsItemPainter.cpp Tue Apr 27 16:30:29 2010 +0300 @@ -0,0 +1,514 @@ +/* +* Copyright (c) 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: Implements the native part of Canvas Graphics Item painter. +* +*/ + + +// EXTERNAL INCLUDES +#include +#include +#include +#include +#include +#include + +// INTERNAL INCLUDES +#include "CMIDCanvasGraphicsItem.h" +#include "CMIDCanvasGraphicsItemPainter.h" + +// --------------------------------------------------------------------------- +// CMIDCanvasGraphicsItemPainter::NewL +// --------------------------------------------------------------------------- +// +CMIDCanvasGraphicsItemPainter* CMIDCanvasGraphicsItemPainter::NewL( + const TCtorParams& aParams) +{ + CMIDCanvasGraphicsItemPainter* self = + new(ELeave) CMIDCanvasGraphicsItemPainter(*aParams.iEnv); + + CleanupStack::PushL(self); + self->ConstructL(aParams); + CleanupStack::Pop(self); + + return self; +} + +// --------------------------------------------------------------------------- +// CMIDCanvasGraphicsItemPainter::ConstructL +// --------------------------------------------------------------------------- +// +void CMIDCanvasGraphicsItemPainter::ConstructL( + const TCtorParams& aParams) +{ + iContentRect = TRect(0, 0, aParams.iWidth, aParams.iHeight); + SetFocusing(EFalse); + SetSize(TSize(aParams.iWidth, aParams.iHeight)); + CreateBuffersL(); + iVisible = EFalse; +} + +// --------------------------------------------------------------------------- +// CMIDCanvasGraphicsItemPainter::CMIDCanvasGraphicsItemPainter +// --------------------------------------------------------------------------- +// +CMIDCanvasGraphicsItemPainter::CMIDCanvasGraphicsItemPainter(MMIDEnv& aEnv) : + iEnv(aEnv) +{ + // No implementation. +} + +// --------------------------------------------------------------------------- +// CMIDCanvasGraphicsItemPainter::~CMIDCanvasGraphicsItemPainter +// --------------------------------------------------------------------------- +// +CMIDCanvasGraphicsItemPainter::~CMIDCanvasGraphicsItemPainter() +{ + DEBUG("CMIDCanvasGraphicsItemPainter::~CMIDCanvasGraphicsItemPainter +"); + + // Release buffers + ResetBuffers(); + + // Remove association from direct container. + if (iDirectContainer) + { + iDirectContainer->MdcRemoveContent(this); + } + + iItem = NULL; + + DEBUG("CMIDCanvasGraphicsItemPainter::~CMIDCanvasGraphicsItemPainter -"); +} + +enum TOpCode +{ + ESync, + ESyncRect +}; + +/** Copy the content (iFrameBuffer) into iOffScreenBuffer and then draw. +Either do a full copy or copy only the clipped area. +*/ +#ifdef RD_JAVA_NGA_ENABLED +TBool CMIDCanvasGraphicsItemPainter::ProcessL( + const TMIDBufferOp*& aOp, const TMIDBufferOp* aEnd, + TInt& /*aCycles*/, java::util::Monitor* /*aMonitor*/) +#else +TBool CMIDCanvasGraphicsItemPainter::ProcessL( + const TMIDBufferOp*& aOp, const TMIDBufferOp* aEnd, + TInt& /*aCycles*/, TRequestStatus* /*aStatus*/) +#endif +{ + DEBUG("< CMIDCanvasGraphicsItemPainter::ProcessL"); + + while (aOp < aEnd) + { + switch (aOp->OpCode()) + { + case ESync: + DrawNow(); + break; + + case ESyncRect: + TRect clip = *static_cast(aOp->Data()); + + clip.Move(iContentRect.iTl); + clip.Intersection(Rect()); + + ActivateGc(); + Draw(clip); + DeactivateGc(); + + break; + } + aOp += aOp->Size(); + } + + DEBUG("> CMIDCanvasGraphicsItemPainter::ProcessL"); + return EFalse; +} + +void CMIDCanvasGraphicsItemPainter::AbortAsync() +{ + // nope +} + +// --------------------------------------------------------------------------- +// CMIDCanvasGraphicsItemPainter::SetDirectContainerL +// (other items are commented in the header file) +// --------------------------------------------------------------------------- +// +void CMIDCanvasGraphicsItemPainter::SetDirectContainerL( + MDirectContainer* aDirectContainer) +{ + // Remove association from the previous direct container. + if (iDirectContainer) + { + iDirectContainer->MdcRemoveContent(this); + } + + // Associate this component to the new direct container. Note that this + // needs to be done in order to disable the direct screen access of + // the MID parent component. This way it does not draw on top of + // the canvas graphics item when repaint etc. methods are called. + if (aDirectContainer) + { + aDirectContainer->MdcAddContent(this); + } + + // Store new container. Or NULL if passed. + iDirectContainer = aDirectContainer; +} + +void CMIDCanvasGraphicsItemPainter::SetParentL(MMIDCustomComponentContainer* aComponentContainer) +{ + CCoeControl& control = aComponentContainer->Control(); + SetContainerWindowL(control); + ActivateL(); + if (iVisible) + { + // Paint the control + iEnv.PostJavaEvent(*this, ECanvasGraphicsItemPainterEvent, + ECanvasGraphicsItemRepaint, 0); + } + else + { + MakeVisible(iVisible); + } +} + +void CMIDCanvasGraphicsItemPainter::SetVisibleL(TBool aVisible) +{ + if (iVisible != aVisible) + { + if (aVisible) + { + DEBUG("CMIDCanvasGraphicsItemPainter::SetVisibleL, setting painter visible"); + + // Show the graphics item when it is hidden. + MakeVisible(aVisible); + iVisible = aVisible; + // Paint the control + iEnv.PostJavaEvent(*this, ECanvasGraphicsItemPainterEvent, + ECanvasGraphicsItemRepaint, 0); + } + else if (!aVisible) + { + DEBUG("CMIDCanvasGraphicsItemPainter::SetVisibleL, setting painter hidden"); + + // Hide the graphics item when it is visible. + MakeVisible(aVisible); + iVisible = aVisible; + } + } +} + +// --------------------------------------------------------------------------- +// CMIDCanvasGraphicsItem::SetPosition +// (other items are commented in the header file) +// --------------------------------------------------------------------------- +// +void CMIDCanvasGraphicsItemPainter::SetPosition(const TInt aX, const TInt aY) +{ + DEBUG("CMIDCanvasGraphicsItemPainter::SetPosition +"); + + //Previous position is moved to new location. New location + //is relative to canvas point of origin (0,0). + TInt moveX = aX - iContentRect.iTl.iX; + TInt moveY = aY - iContentRect.iTl.iY; + iContentRect.Move(moveX, moveY); + + SetRect(iContentRect); + + if (IsVisible()) + { + iEnv.PostJavaEvent(*this, ECanvasGraphicsItemPainterEvent, + ECanvasGraphicsItemRepaint, 0); + } + + DEBUG("CMIDCanvasGraphicsItemPainter::SetPosition -"); +} + + +// --------------------------------------------------------------------------- +// CMIDCanvasGraphicsItemPainter::SetItemSize +// (other items are commented in the header file) +// --------------------------------------------------------------------------- +// +void CMIDCanvasGraphicsItemPainter::SetItemSizeL( + const TInt aWidth, + const TInt aHeight) +{ + DEBUG_INT2( + "CMIDCanvasGraphicsItemPainter::SetItemSize +, aWidth=%d, aHeight=%d", + aWidth, + aHeight); + + if (iContentRect.Size().iWidth != aWidth || + iContentRect.Size().iHeight != aHeight) + { + iContentRect.SetSize(TSize(aWidth, aHeight)); + + SetSize(iContentRect.Size()); + + // Recreate buffers with new size + CreateBuffersL(); + + if (IsVisible()) + { + iEnv.PostJavaEvent(*this, ECanvasGraphicsItemPainterEvent, + ESizeChanged, aWidth, aHeight, 0); + } + } + + DEBUG("CMIDCanvasGraphicsItemPainter::SetItemSize -"); +} + + +// --------------------------------------------------------------------------- +// CMIDCanvasGraphicsItemPainter::Dispose +// (other items are commented in the header file) +// --------------------------------------------------------------------------- +// +void CMIDCanvasGraphicsItemPainter::Dispose() +{ + DEBUG("CMIDCanvasGraphicsItemPainter::Dispose +"); + + delete this; + + DEBUG("CMIDCanvasGraphicsItemPainter::Dispose -"); +} + +// --------------------------------------------------------------------------- +// From class MMIDComponent. +// CMIDCanvas::Processor +// Always returns this-> as buffer processor associated with this component. +// --------------------------------------------------------------------------- +// +MMIDBufferProcessor* CMIDCanvasGraphicsItemPainter::Processor() +{ + return this; +} + +// --------------------------------------------------------------------------- +// CMIDCanvasGraphicsItemPainter::MdcContainerWindowRectChanged +// (other items are commented in the header file) +// --------------------------------------------------------------------------- +// + +void CMIDCanvasGraphicsItemPainter::MdcContainerWindowRectChanged( + const TRect& /*aRect*/) +{ + DEBUG("CMIDCanvasGraphicsItemPainter::MdcContainerWindowRectChanged +"); + + // Not used at the moment. + + DEBUG("CMIDCanvasGraphicsItemPainter::MdcContainerWindowRectChanged -"); +} + +// --------------------------------------------------------------------------- +// CMIDCanvasGraphicsItemPainter::MdcContainerVisibilityChanged +// (other items are commented in the header file) +// --------------------------------------------------------------------------- +// +void CMIDCanvasGraphicsItemPainter::MdcContainerVisibilityChanged( + TBool /*aVisible*/) +{ + DEBUG("CMIDCanvasGraphicsItemPainter::MdcContainerVisibilityChanged +"); + + // Not used at the moment. + + DEBUG("CMIDCanvasGraphicsItemPainter::MdcContainerVisibilityChanged -"); +} + +// --------------------------------------------------------------------------- +// CMIDCanvasGraphicsItemPainter::MdcContentBoundsChanged +// (other items are commented in the header file) +// --------------------------------------------------------------------------- +// +void CMIDCanvasGraphicsItemPainter::MdcContentBoundsChanged( + const TRect& /*aRect*/) +{ + DEBUG("CMIDCanvasGraphicsItemPainter::MdcContentBoundsChanged +"); + + // Not used at the moment. + + DEBUG("CMIDCanvasGraphicsItemPainter::MdcContentBoundsChanged -"); +} + +// --------------------------------------------------------------------------- +// CMIDCanvasGraphicsItemPainter::MdcItemContentRectChanged +// (other items are commented in the header file) +// --------------------------------------------------------------------------- +// +void CMIDCanvasGraphicsItemPainter::MdcItemContentRectChanged( + const TRect& /*aContentRect*/, + const TRect& /*aScreenRect*/) +{ + DEBUG("CMIDCanvasGraphicsItemPainter::MdcItemContentRectChanged +"); + + // Not used at the moment. + + DEBUG("CMIDCanvasGraphicsItemPainter::MdcItemContentRectChanged -"); +} + +// --------------------------------------------------------------------------- +// CMIDCanvasGraphicsItemPainter::MdcContainerDestroyed +// (other items are commented in the header file) +// --------------------------------------------------------------------------- +// +void CMIDCanvasGraphicsItemPainter::MdcContainerDestroyed() +{ + DEBUG("CMIDCanvasGraphicsItemPainter::MdcContainerDestroyed +"); + + iDirectContainer = NULL; + + DEBUG("CMIDCanvasGraphicsItemPainter::MdcContainerDestroyed -"); +} + +// --------------------------------------------------------------------------- +// CMIDCanvasGraphicsItemPainter::MdcAbortDSA +// (other items are commented in the header file) +// --------------------------------------------------------------------------- +// +void CMIDCanvasGraphicsItemPainter::MdcAbortDSA() +{ + DEBUG("CMIDCanvasGraphicsItemPainter::MdcAbortDSA +"); + + // Not used at the moment. + + DEBUG("CMIDCanvasGraphicsItemPainter::MdcAbortDSA -"); +} + +// --------------------------------------------------------------------------- +// CMIDCanvasGraphicsItemPainter::MdcResumeDSA +// (other items are commented in the header file) +// --------------------------------------------------------------------------- +// +void CMIDCanvasGraphicsItemPainter::MdcResumeDSA() +{ + DEBUG("CMIDCanvasGraphicsItemPainter::MdcResumeDSA +"); + + // Not used at the moment. + + DEBUG("CMIDCanvasGraphicsItemPainter::MdcResumeDSA -"); +} + +// --------------------------------------------------------------------------- +// CMIDCanvasGraphicsItemPainter::CreateBuffersL +// (other items are commented in the header file) +// --------------------------------------------------------------------------- +// +void CMIDCanvasGraphicsItemPainter::CreateBuffersL() +{ + DEBUG("< CMIDCanvasGraphicsItemPainter::CreateBuffersL"); + ResetBuffers(); + + TRect rect = TRect( + 0, + 0, + iContentRect.Size().iWidth, + iContentRect.Size().iHeight); + + iFrameBuffer = new(ELeave) CFbsBitmap; + User::LeaveIfError(iFrameBuffer->Create(rect.Size(), iEnv.DisplayMode())); + + iFrameDevice = CFbsBitmapDevice::NewL(iFrameBuffer); + User::LeaveIfError(iFrameDevice->CreateContext(iFrameContext)); + + DEBUG("> CMIDCanvasGraphicsItemPainter::CreateBuffersL"); +} + +// --------------------------------------------------------------------------- +// CMIDCanvasGraphicsItemPainter::ResetBuffers +// (other items are commented in the header file) +// --------------------------------------------------------------------------- +// +void CMIDCanvasGraphicsItemPainter::ResetBuffers() +{ + delete iFrameBuffer; + delete iFrameContext; + delete iFrameDevice; + + iFrameBuffer = NULL; + iFrameContext = NULL; + iFrameDevice = NULL; +} + +// --------------------------------------------------------------------------- +// CMIDCanvasGraphicsItemPainter::FrameBuffer +// (other items are commented in the header file) +// --------------------------------------------------------------------------- +// +CFbsBitmap* CMIDCanvasGraphicsItemPainter::FrameBuffer() const +{ + return iFrameBuffer; +} + +// --------------------------------------------------------------------------- +// CMIDCanvasGraphicsItemPainter::ResetFrameBuffer +// (other items are commented in the header file) +// --------------------------------------------------------------------------- +// +void CMIDCanvasGraphicsItemPainter::ResetFrameBuffer( + const TPoint& aPosition, const TSize& aSize) +{ + if (iFrameBuffer) + { + //calculate stride: scanline should have the same width as frame buffer, + //size of one pixel is defined by frame buffer display mode + TInt stride = iFrameBuffer->ScanLineLength( + iFrameBuffer->SizeInPixels().iWidth, iFrameBuffer->DisplayMode()); + + iFrameBuffer->LockHeap(); + + for (TInt i = aPosition.iY; i < aSize.iHeight; i++) + { + const void *srcAddr = + ((const char *) iFrameBuffer->DataAddress()) + i * stride; + unsigned int *src = (unsigned int *) srcAddr; + //starting adress should be shifted to clipping x-position + src += aPosition.iX; + for (TInt j = aPosition.iX; j < aSize.iWidth; j++) + { + //reset pixel to fully transparent + *src++ = 0x00000000; + } + } + + iFrameBuffer->UnlockHeap(); + } +} + +// --------------------------------------------------------------------------- +// CMIDCanvasGraphicsItemPainter::Draw +// (other items are commented in the header file) +// --------------------------------------------------------------------------- +// +void CMIDCanvasGraphicsItemPainter::Draw(const TRect& /*aRect*/) const +{ + DEBUG("+ CMIDCanvasGraphicsItemPainter::Draw"); + ASSERT(iFrameBuffer); + + if (IsVisible()) + { + CWindowGc& gc = SystemGc(); + + gc.BitBlt(iContentRect.iTl, iFrameBuffer); + } + + DEBUG("- CMIDCanvasGraphicsItemPainter::Draw"); +} + +// End of file