browser/engine/src/Screenshot.cpp
author David Caabeiro <david.caabeiro@seqpoint.com>
Fri, 25 Jun 2010 12:50:05 +0200
changeset 0 c316ab048e9d
permissions -rw-r--r--
First public commit

/*
 * Name        : Screenshot.cpp
 * Description : Performs screenshot and bitmap conversion
 * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
 * Website     : http://OpenMAR.org
 *
 * Copyright (c) 2010 David Caabeiro
 *
 * 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
 *
 */

#include "Screenshot.h"

#include <eikenv.h>
#include <fbs.h>
#include <ImageConversion.h> 
#include <PathInfo.h>
#include <w32std.h>

#include "Logger.h"

CScreenshot* CScreenshot::NewL(MObserver& aObserver, const TSize& aSize, const TDisplayMode& aDisplayMode)
{
    CScreenshot* self = new(ELeave) CScreenshot(aObserver);
    CleanupStack::PushL(self);
    self->ConstructL(aSize, aDisplayMode);
    CleanupStack::Pop();

    return self;
}

CScreenshot::~CScreenshot()
{
    Cancel();

    delete iEncoder;
    
    delete iBitmapContext;
    delete iBitmapDevice;
    delete iBitmap;
}

CScreenshot::CScreenshot(MObserver& aObserver)
    :CActive(EPriorityStandard), iObserver(aObserver)
{
    CActiveScheduler::Add(this);
}

void CScreenshot::ConstructL(const TSize& aSize, const TDisplayMode& aDisplayMode)
{
    // Create bitmap where screen bitmap will be blitted
    iBitmap = new(ELeave) CFbsBitmap;
    iBitmap->Create(aSize, aDisplayMode);

    iBitmapDevice = CFbsBitmapDevice::NewL(iBitmap);
    User::LeaveIfError(iBitmapDevice->CreateContext(iBitmapContext));

    LOGARG("Bitmap capture size is %d x %d", aSize.iWidth, aSize.iHeight);
}

void CScreenshot::RequestL(const CFbsBitmap& aSourceBitmap, const TSize& aSize)
{
    // Blit screen bitmap into internal bitmap
    iBitmapContext->BitBlt(TPoint(0, 0), &aSourceBitmap, TRect(TPoint(0, 0), aSize));

    // Generate file name
    TTime time;
    time.HomeTime();

    TDateTime dateTime = time.DateTime();

#if defined(__WINS__)
    iFilename.Copy(PathInfo::PhoneMemoryRootPath());
#else
    iFilename.Copy(PathInfo::MemoryCardRootPath());
#endif
    iFilename.Append(PathInfo::ImagesPath());

    _LIT(KFormat, "%04d%02d%02d%02d%02d%02d.png");
    iFilename.AppendFormat(KFormat, dateTime.Year(), dateTime.Month() + 1, dateTime.Day() + 1, dateTime.Hour(), dateTime.Minute(), dateTime.Second());

    // Convert to PNG
    delete iEncoder;
    iEncoder = 0;

    iEncoder = CImageEncoder::FileNewL(CCoeEnv::Static()->FsSession(), iFilename, CImageEncoder::EOptionAlwaysThread, KImageTypePNGUid);
    iEncoder->Convert(&iStatus, *iBitmap);
    SetActive();
}

void CScreenshot::RunL()
{   
    iObserver.ScreenshotReadyL(iStatus.Int(), iFilename);
}

void CScreenshot::DoCancel()    
{
    if (iEncoder)
        iEncoder->Cancel();
}