javauis/lcdui_akn/javalcdui/inc.nokialcdui/CMIDNativeConverter.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 14 Sep 2010 21:06:50 +0300
branchRCL_3
changeset 71 d5e927d5853b
parent 19 04becd199f91
permissions -rw-r--r--
Revision: v2.2.11 Kit: 201035

/*
* Copyright (c) 2006-2007 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:  Wrapper for converter used for drawing to Canvas or Image.
*
*/


#ifndef CMIDNATIVECONVERTER_H
#define CMIDNATIVECONVERTER_H

//  INCLUDES
#include "TMIDFormatConverter.h"
#include "TMID8888Format.h"

//  CONSTANTS
const TUint16 K565RMax = 0xF800;
const TUint16 K565GMax = 0x07E0;
const TUint16 K565BMax = 0x001F;
const TInt KBytesPerPixel565 = 2;

// FORWARD DECLARATIONS
class CMIDConvertFactory;

//  CLASS DEFINITION
/**
 * Wrapper for converter that is used for drawing to either Canvas or Image
 *
 */
NONSHARABLE_CLASS(CMIDNativeConverter): public CBase
{
public: // Destructor
    ~CMIDNativeConverter();

public: // Initialization
    static CMIDNativeConverter* NewL(const TMIDBitmapParameters& aParameters);

public: // new methods

    // Convert using default converter
    void Convert(TMIDInternalARGB& aResult, TUint32 aColor) const;

    // Get pixel from current position (includes alpha)
    void GetPixel(TMIDInternalARGB& aResult) const;

    // Plot pixel to current position
    void PlotPixel(const TMIDInternalARGB& aInternal);

    // Plot pixel with alpha calcultion
    void PlotPixelWithAlpha(const TMIDInternalARGB& aInternal);

    // Plot pixel with alpha calcultion from bitmap
    void PlotPixelWithAlphaBitmap(const TMIDInternalARGB& aInternal);

    // Advance position in x-axis, returns EFalse if advancing is in the end
    inline TBool AdvanceX();

    // Advance position in y-axis, returns EFalse if advancing is in the end
    inline TBool AdvanceY();

    // Set bitmaps to native converter.
    void SetBitmaps(TUint32* aBitmap);

    // Start point setting
    void SetDrawRect(TRect aDrawRect);

    // Draw pixel to specified point (checks clipping rect)
    void PlotPixel(const TPoint& aPos, const TMIDInternalARGB& aInternal,
                   const TRect& aClip);

    // Draws scanline from aPos to aLenght with aColor
    void DrawScanLine(TPoint aPos, TInt aLength,
                      const TMIDInternalARGB& aInternal, const TRect& aClip);

    // True if native converter has alpha bitmap
    TBool HasAlphaBitmap();

protected: // Construction
    virtual void ConstructL(const TMIDBitmapParameters& aParameters);
    CMIDNativeConverter();

private: // new methods
    void CalculateAlpha(TMIDInternalARGB& aTargetColor,
                        const TMIDInternalARGB& aBelowColor);

private: // data
    TRect iDrawRect;
    TPoint iPosition;

    TInt iScanlength;

    TUint32* iAlphaBitmap;
    TDisplayMode iAlphaMode;

    // default converter
    TMID8888Format iDefaultConverter;

    TMIDFormatConverter* iNativeFormat;

};

inline TBool CMIDNativeConverter::AdvanceX()
{
    ++iPosition.iX;
    ++iNativeFormat->iOffset;
    if (iPosition.iX >= iDrawRect.iBr.iX)
    {
        iPosition.iX = iDrawRect.iTl.iX;
        return EFalse;
    }
    return ETrue;
}

inline TBool CMIDNativeConverter::AdvanceY()
{
    ++iPosition.iY;
    iNativeFormat->iOffset += iScanlength - iDrawRect.Width();
    return(iPosition.iY < iDrawRect.iBr.iY);
}
#endif // CMIDNATIVECONVERTER_H