javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swtrotateimage.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 13 Oct 2010 14:23:59 +0300
branchRCL_3
changeset 83 26b2b12093af
parent 66 2455ef1f5bbc
permissions -rw-r--r--
Revision: v2.2.17 Kit: 201041

/*******************************************************************************
 * Copyright (c) 2007, 2010 Nokia Corporation and/or its subsidiary(-ies).
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Nokia Corporation - S60 implementation
 *******************************************************************************/


#include <w32std.h>
#include <coecntrl.h>
#include <bitmaptransforms.h>
#include "swtrotateimage.h"
#include "eswtwidgetscore.h"


// ======== MEMBER FUNCTIONS ========


CAORotateImage* CAORotateImage::NewL()
{
    CAORotateImage* self = new(ELeave) CAORotateImage();
    CleanupStack::PushL(self);
    self->ConstructL();
    CleanupStack::Pop(self);
    return self;
}

CAORotateImage::CAORotateImage()
        : CActive(CActive::EPriorityHigh)
{
    CActiveScheduler::Add(this);
    iStep       = -1;
    iIsFinish   = EFalse;
}

CAORotateImage::~CAORotateImage()
{
    Cancel();

    iImages.Reset();

    delete iBitmapRotator;

    iControl    = NULL;
}

void CAORotateImage::ConstructL()
{
    iBitmapRotator      = CBitmapRotator::NewL();
}

void CAORotateImage::Start(MSwtControl* aControl)
{
    Cancel();
    iIsFinish   = EFalse;

    iControl    = aControl;
    if (aControl)
    {
        iRedraw = ETrue;
    }

    iStep = 0;
    Queue();
}

void CAORotateImage::RemoveAllImages()
{
    iStep = -1;
    iIsFinish   = EFalse;
    iRedraw = EFalse;
    Cancel();

    iImages.Reset();
}

void CAORotateImage::AddImage(CFbsBitmap* aImage)
{
    ASSERT(aImage);
    ASSERT(!aImage->IsCompressedInRAM());

    Cancel();
    if (!aImage->IsCompressedInRAM())
    {
        iImages.Append(aImage);
    }
}

void CAORotateImage::AddImages(const RArray<CFbsBitmap*>& aImages)
{
    Cancel();
    for (TInt i = 0; i < aImages.Count(); i++)
    {
        if (aImages[i])
        {
            ASSERT(!aImages[i]->IsCompressedInRAM());

            if (!aImages[i]->IsCompressedInRAM())
            {
                iImages.Append(aImages[i]);
            }
        }
    }
}

void CAORotateImage::SetRedrawAfterRotation(TBool aRedrawAfterRotation)
{
    iRedraw = aRedrawAfterRotation;
}

TBool CAORotateImage::IsFinish() const
{
    return iIsFinish;
}

void CAORotateImage::DoCancel()
{
    iBitmapRotator->Cancel();

    iImages.Reset();

    iStep       = -1;
    iIsFinish   = EFalse;
}

void CAORotateImage::Queue()
{
    if (iStep < iImages.Count() && iStep != -1)
    {
        iIsFinish   = EFalse;
        iBitmapRotator->Rotate(&iStatus, *iImages[iStep++],
                               CBitmapRotator::ERotation270DegreesClockwise);

        SetActive();
    }
    else
    {
        iIsFinish   = ETrue;

        if (iRedraw && iControl)
        {
            if (iControl->IsPaintingUrgently())
            {
                iControl->PaintUrgently(iControl->CoeControl().Rect());
            }
            else
            {
                iControl->Paint(TRect((iControl->CoeControl()).PositionRelativeToScreen(),
                                      iControl->GetWidgetSize()));
            }
        }
    }
}

void CAORotateImage::RunL()
{
    Queue();
}