javauis/lcdui_akn/lcdgd/inc/lcdgdrvif.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 15 Jul 2010 18:31:06 +0300
branchRCL_3
changeset 23 e5618cc85d74
parent 14 04becd199f91
permissions -rw-r--r--
Revision: v2.1.32 Kit: 2010127

/*
* Copyright (c) 2005 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:
*
*/


#ifndef LCDGDRVIF_H
#define LCDGDRVIF_H

#include <e32std.h>
#include <gdi.h>
#include <lcdgdrv.h>
#include "lcdgd.hrh"

class TAcceleratedBitmapInfo;
class TRect;
class TLcdTransform;

/**
 * Render function composites pixels with optional transformation
 * Target image is always opaque.
 * Source image is may have optional transparency bitmap, or may
 * contain transparency channel in color bitmap.
 */
typedef void (*TImageRenderFunction)
(
    const TAcceleratedBitmapInfo*   aDstColorBitmap,
    const TAcceleratedBitmapInfo*   aDstAlphaBitmap,
    const TRect&                    aDstRect,
    const TAcceleratedBitmapInfo*   aSrcColorBitmap,
    const TAcceleratedBitmapInfo*   aSrcAlphaBitmap,
    const TLcdTransform&            aTransform          // from dst to src coords
);

/**
 * Color map function maps a pixel from one RGB format to another.
 */
typedef TUint32(*TColorMapFunction)(TUint32);

/**
 *
 */
typedef TBool(*TCollisionDetectorFunction)
(
    const TAcceleratedBitmapInfo*   aBitmap1,
    const TAcceleratedBitmapInfo*   aBitmap2,
    const TRect&                    aRect1,
    const TRect&                    aRect2,
    const TLcdTransform&            aTransform1,
    const TLcdTransform&            aTransform2
);

/**
 * Quantize function maps color triplet on lattice of discreet 888-RGB space
 * to closest color in another discreet RGB space that can be mapped without
 * loss of information from a point on the lattice in 888-RGB space.
 */
typedef TUint32(*TQuantizeFunction)(TUint32);


/**
 * Rendering composition rule.
 */
enum TCompositRule
{
    ECompositeSrcCopy,  // copy source to destination
    ECompositeSrcOver,  // alpha blend source over destination, (also used for binary masks)
};

/**
 * Renderer descriptor
 */
struct TImageRenderer
{
    TImageType iTargetType;             // target image type.
    TImageType iSourceType;             // source image type
    TUint32 iTransformMask;             // supported symmetry transforms.
    TCompositRule iCompositeRule;       // composition rule
    TImageRenderFunction iFunction;     // draw source image type onto an iTargetMode bitmap with symmetry transform.
};

struct TColorMap
{
    TDisplayMode iTargetMode;
    TColorMapFunction iForward;     // RGB888 to iTargetMode
    TColorMapFunction iReverse;     // iTargetMode to RGB888
    TQuantizeFunction iQuantize;    // quantizes RGB888 color to closest color in target mode, returns RGB888
};

/**
 * CollisionDetector descriptor
 */
struct TCollisionDetector
{
    TUint iDisplayMode1;            // mask of supported display modes: bitwise OR of (1<<TDisplayMode)
    TUint iTransparency1;           // mask of supported transparencies: bitwise OR of (1<<TTransparency)
    TUint iDisplayMode2;            // mask of supported display modes: bitwise OR of (1<<TDisplayMode)
    TUint iTransparency2;           // mask of supported transparencies: bitwise OR of (1<<TTransparency)
    TCollisionDetectorFunction iFunction;
};

enum TTransformBit
{
    ETransNoneBit = (1<<ETransNone),
    ETransMirrorRot180Bit = (1<<ETransMirrorRot180),
    ETransMirrorBit = (1<<ETransMirror),
    ETransRot180Bit = (1<<ETransRot180),
    ETransMirrorRot270Bit = (1<<ETransMirrorRot270),
    ETransRot90Bit = (1<<ETransRot90),
    ETransRot270Bit = (1<<ETransRot270),
    ETransMirrorRot90Bit = (1<<ETransMirrorRot90)
};

enum TTransformMask
{
    ETransNoneMask = ETransNoneBit,
    ETransVertMask = ETransMirrorRot180Bit, // drawRGB/createRGBImage
    ETransStretch  = 0x100,                 // not supported yet!
    ETransAllMask  = ETransNoneBit|ETransMirrorRot180Bit|ETransMirrorBit|ETransRot180Bit|ETransMirrorRot270Bit|ETransRot90Bit|ETransRot270Bit|ETransMirrorRot90Bit
};

typedef void (*TDrawLineFunction)(const TAcceleratedBitmapInfo* aBitmap, const TPoint& aStart, const TPoint& aEnd, TUint32 aColor, TStrokeStyle aStyle, const TRect& aClipRect);
typedef void (*TDrawRectFunction)(const TAcceleratedBitmapInfo* aDstBitmap,const TRect& aRect,TUint32 aRGB,TStrokeStyle aStyle,const TRect& aClipRect);
typedef void (*TFillRectFunction)(const TAcceleratedBitmapInfo* aDstBitmap,const TRect& aRect,TUint32 aRGB,const TRect& aClipRect);
typedef void (*TDrawArcFunction)(const TAcceleratedBitmapInfo* aDstBitmap,const TRect& aBoundingRect,const TInt aStartAngle,const TInt aArcAngle,TUint32 aRGB,TStrokeStyle aStyle,const TRect& aClipRect);
typedef void (*TFillArcFunction)(const TAcceleratedBitmapInfo* aDstBitmap,const TRect& aBoundingRect,const TInt aStartAngle,const TInt aArcAngle,TUint32 aRGB,const TRect& aClipRect);
typedef void (*TFillTriangleFunction)(const TAcceleratedBitmapInfo* aBitmap, const TPoint aPoints[3], TUint32 aColor, const TRect& aClipRect);
typedef void (*TDrawTextFunction)(const TAcceleratedBitmapInfo* aBitmap, const TDesC& aText, const TPoint& aPoint, TUint32 aColor, const CFont* aFont, const TRect& aClipRect);

struct TDrawFunctions
{
    TDisplayMode iDisplayMode;
    TUint32 iDrawCaps;
    TDrawLineFunction iDrawLine;
    TDrawRectFunction iDrawRect;
    TFillRectFunction iFillRect;
    TDrawArcFunction iDrawArc;
    TFillArcFunction iFillArc;
    TFillTriangleFunction iFillTriangle;
    TDrawTextFunction iDrawText;
};


/**
 * ECOM plugin driver implementation base class.
 *
 * construction/factory methods, members and private/protected methods
 * may be changed providing the CLcdGraphicsDriver interface is maintained.
 */
class CLcdGraphicsDriverImpl : public CLcdGraphicsDriver
{
public:
    /**
     * Selects implementation dll
     */
    IMPORT_C static CLcdGraphicsDriverImpl* NewL(TDisplayMode aDisplayMode);

    IMPORT_C CLcdGraphicsDriverImpl
    (
        const TDriverInfo& aInfo,
        const TImageRenderer* aRendererArray,
        TInt aRendererCount,
        const TColorMap* aColorMapArray,
        TInt aColorMapCount,
        const TCollisionDetector* aCollisionDetectorArray,
        TInt aCollisionDetectorCount,
        const TDrawFunctions* aDrawFunctionsArray,
        TInt aDrawFunctionsCount
    );

    /**
     *
     */
    IMPORT_C ~CLcdGraphicsDriverImpl();

    /**
     *
     */
    IMPORT_C void  GetDriverInfo(CLcdGraphicsDriver::TDriverInfo& aDriverInfo) const;

    IMPORT_C TInt DrawRegion
    (
        const TAcceleratedBitmapInfo* aDstColorBitmap,
        const TRect&                  aDstRect,
        const TAcceleratedBitmapInfo* aSrcColorBitmap,
        const TAcceleratedBitmapInfo* aSrcAlphaBitmap,
        TTransparency                 aSrcTransparency,
        const TRect&                  aSrcRect,
        TTransformType                aSrcTransform,
        const TRect&                  aClipRect
    );

    IMPORT_C TInt CopyRegion
    (
        const TAcceleratedBitmapInfo*   aDstColorBitmap,
        const TAcceleratedBitmapInfo*   aDstAlphaBitmap,
        TTransparency                   aDstTransparency,
        const TRect&                    aDstRect,
        const TAcceleratedBitmapInfo*   aSrcColorBitmap,
        const TAcceleratedBitmapInfo*   aSrcAlphaBitmap,
        TTransparency                   aSrcTransparency,
        const TRect&                    aSrcRect,
        TTransformType                  aSrcTransform,
        const TRect&                    aClipRect
    );

    IMPORT_C TBool DetectCollision
    (
        const TAcceleratedBitmapInfo* aMask1,
        TTransparency       aTransparency1,
        const TSize&        aSize1,
        const TRect&        aRect1,
        TInt                aTransform1,
        const TPoint&       aPoint1,

        const TAcceleratedBitmapInfo* aMask2,
        TTransparency       aTransparency2,
        const TSize&        aSize2,
        const TRect&        aRect2,
        TInt                aTransform2,
        const TPoint&       aPoint2
    );

    IMPORT_C CLcdGraphicsDevice* CreateDeviceL(const TImageType& aImageType);

protected:
    /**
     *
     */
    IMPORT_C const TImageRenderer* GetRenderer
    (
        const TImageType& aDstType,
        const TImageType& aSrcType,
        TTransformType aTransform,
        TCompositRule aCompositRule
    ) const;

    /**
     *
     */
    IMPORT_C const TColorMap* GetColorMap(TDisplayMode aMode);

    /**
     *
     */
    IMPORT_C const TCollisionDetector* GetCollisionDetector
    (
        TDisplayMode    aDisplayMode1,
        TTransparency   aTransparency1,
        TDisplayMode    aDisplayMode2,
        TTransparency   aTransparency2
    ) const;

    IMPORT_C const TDrawFunctions* GetDrawFunctions(TDisplayMode aMode) const;

protected:
    const TDriverInfo       iDriverInfo;

    //
    // simple array representation
    //

    const TImageRenderer*   iRendererArray;
    const TInt              iRendererCount;

    const TColorMap*        iColorMapArray;
    const TInt              iColorMapCount;

    const TCollisionDetector* iCollisionDetectorArray;
    const TInt              iCollisionDetectorCount;

    const TDrawFunctions*   iDrawFunctionsArray;
    const TInt              iDrawFunctionsCount;

private:
    TUid iDtor_ID_Key;
};

const TInt KLcdImgVersionMajor = 0;
const TInt KLcdImgVersionMinor = 0;
const TUid KLcdDriverInterfaceUid = { LCDGD_DRIVER_INTERFACE_UID };

/**
 * Display mode to use for 32bpp ARGB8888 image data
 *
 * This format is not supported on all OS releases so we
 * select an appropriate format here.
 */
//
// EColor16MA is exact match
//
const TDisplayMode EColorARGB8888 = EColor16MA;

#ifdef _DEBUG
TBool DbgCheckBounds(const TSize& aDstSize, const TSize& aSrcSize, const TRect& aDstRect, const TLcdTransform& aTransform);
#endif

/**
 * driver capability macros
 */
#if defined(LCDGD_SUPPORT_1BPP_MASK_BITMAP)
#define CAP_1BPP_MASK_BITMAP CLcdGraphicsDriver::ECapTransparencyMask1Bpp
#else
#define CAP_1BPP_MASK_BITMAP 0
#endif

#if defined(LCDGD_SUPPORT_MATCHED_MASK_BITMAP)
#define CAP_MATCHED_MASK_BITMAP CLcdGraphicsDriver::ECapTransparencyMaskMatched
#else
#define CAP_MATCHED_MASK_BITMAP 0
#endif

#if defined(LCDGD_SUPPORT_ALPHA_BITMAP)
#define CAP_ALPHA_BITMAP CLcdGraphicsDriver::ECapTransparencyAlpha8Bpp
#else
#define CAP_ALPHA_BITMAP 0
#endif

#endif // LCDGDRVIF_H