satengine/satserver/Engine/src/CSatSBasicIconConverter.cpp
author hgs
Fri, 17 Sep 2010 17:09:13 +0300
changeset 48 78df25012fda
parent 33 8d5d7fcf9b59
permissions -rw-r--r--
201037
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
33
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2002-2007 Nokia Corporation and/or its subsidiary(-ies). 
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:  Converts basic icon to CFbsBitmap
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
#include    <fbs.h>
hgs
parents:
diff changeset
    20
#include    <gdi.h>
hgs
parents:
diff changeset
    21
#include    "CSatSBasicIconConverter.h"
hgs
parents:
diff changeset
    22
#include    "TSatBitOP.h"
hgs
parents:
diff changeset
    23
#include    "SatLog.h"
hgs
parents:
diff changeset
    24
hgs
parents:
diff changeset
    25
// Black&white icon uses 1 bpp.
hgs
parents:
diff changeset
    26
const TUint8 KBpp = 1;
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
// Black&white icon header size is 2.
hgs
parents:
diff changeset
    29
const TUint8 KHeaderSize( 2 );
hgs
parents:
diff changeset
    30
hgs
parents:
diff changeset
    31
// Value of icon data, which means that pixel is lit.
hgs
parents:
diff changeset
    32
const TInt KPixelIsLit = 1;
hgs
parents:
diff changeset
    33
const TUint KBitCount( 8 );
hgs
parents:
diff changeset
    34
hgs
parents:
diff changeset
    35
// ======== MEMBER FUNCTIONS ========
hgs
parents:
diff changeset
    36
hgs
parents:
diff changeset
    37
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    38
// CSatSBasicIconConverter::CSatSBasicIconConverter
hgs
parents:
diff changeset
    39
// C++ default constructor can NOT contain any code, that
hgs
parents:
diff changeset
    40
// might leave.
hgs
parents:
diff changeset
    41
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    42
//
hgs
parents:
diff changeset
    43
CSatSBasicIconConverter::CSatSBasicIconConverter() :
hgs
parents:
diff changeset
    44
CSatSIconConverter()
hgs
parents:
diff changeset
    45
    {
hgs
parents:
diff changeset
    46
    LOG( SIMPLE, "SATENGINE: \
hgs
parents:
diff changeset
    47
        CSatSBasicIconConverter::CSatSBasicIconConverter calling - exiting" )
hgs
parents:
diff changeset
    48
    }
hgs
parents:
diff changeset
    49
hgs
parents:
diff changeset
    50
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    51
// CSatSBasicIconConverter::ConvertL
hgs
parents:
diff changeset
    52
// Converts the basic icon format (ETSI TS 131 102 V4.10.0) to CFbsBitmap
hgs
parents:
diff changeset
    53
// The format of aData has to be following:
hgs
parents:
diff changeset
    54
//  1st byte:           Image width
hgs
parents:
diff changeset
    55
//  2nd byte:           Image height
hgs
parents:
diff changeset
    56
//  3rd byte to end:    Image body.
hgs
parents:
diff changeset
    57
// Image body has to be in following format:
hgs
parents:
diff changeset
    58
//  Bit 8:  1st pixel
hgs
parents:
diff changeset
    59
//  Bit 7:  2nd pixel
hgs
parents:
diff changeset
    60
//  Bit 6:  3rd pixel
hgs
parents:
diff changeset
    61
//  etc...
hgs
parents:
diff changeset
    62
//
hgs
parents:
diff changeset
    63
// Clut is not needed for converting basic icon.
hgs
parents:
diff changeset
    64
// (other items were commented in a header).
hgs
parents:
diff changeset
    65
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    66
//
hgs
parents:
diff changeset
    67
CFbsBitmap* CSatSBasicIconConverter::ConvertL(
hgs
parents:
diff changeset
    68
    const TDesC8& aData,
hgs
parents:
diff changeset
    69
    const TDesC8& /*aClut*/ ) const
hgs
parents:
diff changeset
    70
    {
hgs
parents:
diff changeset
    71
    LOG( SIMPLE, "SATENGINE: CSatSBasicIconConverter::ConvertL calling" )
hgs
parents:
diff changeset
    72
hgs
parents:
diff changeset
    73
    CheckDataValidityL( aData );
hgs
parents:
diff changeset
    74
    const TUint8 width( aData[0] );
hgs
parents:
diff changeset
    75
    const TUint8 height( aData[1] );
hgs
parents:
diff changeset
    76
hgs
parents:
diff changeset
    77
    // Create black and white bitmap.
hgs
parents:
diff changeset
    78
    CFbsBitmap* bitmap = CreateBitmapL( width, height, EGray2 );
hgs
parents:
diff changeset
    79
hgs
parents:
diff changeset
    80
    // Extract the header information away from icon data.
hgs
parents:
diff changeset
    81
    const TPtrC8 iconData(
hgs
parents:
diff changeset
    82
        aData.Mid( KHeaderSize, aData.Length() - KHeaderSize ) );
hgs
parents:
diff changeset
    83
hgs
parents:
diff changeset
    84
    TBitmapUtil bitmapUtil( bitmap );
hgs
parents:
diff changeset
    85
    bitmapUtil.Begin( TPoint( 0, 0 ) );
hgs
parents:
diff changeset
    86
    TInt x( 0 );
hgs
parents:
diff changeset
    87
    TInt y( 0 );
hgs
parents:
diff changeset
    88
    // Convert the icon data.
hgs
parents:
diff changeset
    89
    for ( y = 0; y < height; y++ )
hgs
parents:
diff changeset
    90
        {
hgs
parents:
diff changeset
    91
        bitmapUtil.SetPos( TPoint( 0, y ) );
hgs
parents:
diff changeset
    92
        for ( x = 0; x < width; x++ )
hgs
parents:
diff changeset
    93
            {
hgs
parents:
diff changeset
    94
            const TInt startingBit( y * width + x );
hgs
parents:
diff changeset
    95
            const TUint8 color =
hgs
parents:
diff changeset
    96
                TSatBitOP::ExtractBits( startingBit, KBpp, iconData );
hgs
parents:
diff changeset
    97
hgs
parents:
diff changeset
    98
            if ( KPixelIsLit == color )
hgs
parents:
diff changeset
    99
                {
hgs
parents:
diff changeset
   100
                // Black is lit pixel.
hgs
parents:
diff changeset
   101
                bitmapUtil.SetPixel( KRgbBlack.Value() );
hgs
parents:
diff changeset
   102
                }
hgs
parents:
diff changeset
   103
            else
hgs
parents:
diff changeset
   104
                {
hgs
parents:
diff changeset
   105
                // White means no pixel.
hgs
parents:
diff changeset
   106
                bitmapUtil.SetPixel( KRgbWhite.Value() );
hgs
parents:
diff changeset
   107
                }
hgs
parents:
diff changeset
   108
hgs
parents:
diff changeset
   109
            bitmapUtil.IncXPos();
hgs
parents:
diff changeset
   110
            }
hgs
parents:
diff changeset
   111
        }
hgs
parents:
diff changeset
   112
hgs
parents:
diff changeset
   113
    bitmapUtil.End();
hgs
parents:
diff changeset
   114
    LOG3( SIMPLE,"SATENGINE: CSatSBasicIconConverter::ConvertL, \
hgs
parents:
diff changeset
   115
          x: %d, y: %d", x, y )
hgs
parents:
diff changeset
   116
    LOG( SIMPLE, "SATENGINE: CSatSBasicIconConverter::ConvertL exiting" )
hgs
parents:
diff changeset
   117
    return bitmap;
hgs
parents:
diff changeset
   118
    }
hgs
parents:
diff changeset
   119
hgs
parents:
diff changeset
   120
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   121
// CSatSBasicIconConverter::CheckDataValidityL
hgs
parents:
diff changeset
   122
// Checks that icon data has valid length.
hgs
parents:
diff changeset
   123
// (other items were commented in a header).
hgs
parents:
diff changeset
   124
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   125
//
hgs
parents:
diff changeset
   126
void CSatSBasicIconConverter::CheckDataValidityL( const TDesC8& aData ) const
hgs
parents:
diff changeset
   127
    {
hgs
parents:
diff changeset
   128
    LOG( SIMPLE,
hgs
parents:
diff changeset
   129
        "SATENGINE: CSatSBasicIconConverter::CheckDataValidityL calling" )
hgs
parents:
diff changeset
   130
hgs
parents:
diff changeset
   131
    TInt err( KErrNone );
hgs
parents:
diff changeset
   132
hgs
parents:
diff changeset
   133
    // Is there at least width and height in aData.
hgs
parents:
diff changeset
   134
    const TInt dataLength( aData.Length() );
hgs
parents:
diff changeset
   135
hgs
parents:
diff changeset
   136
    if ( dataLength > KHeaderSize )
hgs
parents:
diff changeset
   137
        {
hgs
parents:
diff changeset
   138
        LOG( SIMPLE, "SATENGINE: CSatSBasicIconConverter::CheckDataValidityL \
hgs
parents:
diff changeset
   139
             dataLength bigger than KHeaderSize" )
hgs
parents:
diff changeset
   140
        const TUint8 width( aData[0] );
hgs
parents:
diff changeset
   141
        const TUint8 height( aData[1] );
hgs
parents:
diff changeset
   142
hgs
parents:
diff changeset
   143
        // Width and height does not belong to image body.
hgs
parents:
diff changeset
   144
        const TInt imageBodyLength( dataLength - KHeaderSize );
hgs
parents:
diff changeset
   145
hgs
parents:
diff changeset
   146
        // Check that image body has at least as many
hgs
parents:
diff changeset
   147
        // bits than width and height succest. There might
hgs
parents:
diff changeset
   148
        // be more bits because the actual size of the image
hgs
parents:
diff changeset
   149
        // body may occupie only couple bits from
hgs
parents:
diff changeset
   150
        // last byte in image body.
hgs
parents:
diff changeset
   151
        const TInt bitsInImageBody( imageBodyLength * KBitCount );
hgs
parents:
diff changeset
   152
        const TInt bitsExpectedInImageBody( width * height );
hgs
parents:
diff changeset
   153
hgs
parents:
diff changeset
   154
        if ( bitsInImageBody < bitsExpectedInImageBody )
hgs
parents:
diff changeset
   155
            {
hgs
parents:
diff changeset
   156
            LOG( SIMPLE, "SATENGINE: CSatSBasicIconConverter::\
hgs
parents:
diff changeset
   157
            CheckDataValidityL bitsInImageBody < bitsExpectedInImageBody" )
hgs
parents:
diff changeset
   158
            err = KErrCorrupt;
hgs
parents:
diff changeset
   159
            }
hgs
parents:
diff changeset
   160
        }
hgs
parents:
diff changeset
   161
    else
hgs
parents:
diff changeset
   162
        {
hgs
parents:
diff changeset
   163
        LOG( SIMPLE, "SATENGINE: CSatSBasicIconConverter::CheckDataValidityL \
hgs
parents:
diff changeset
   164
             dataLength less than KHeaderSize" )
hgs
parents:
diff changeset
   165
        err = KErrCorrupt;
hgs
parents:
diff changeset
   166
        }
hgs
parents:
diff changeset
   167
hgs
parents:
diff changeset
   168
    User::LeaveIfError( err );
hgs
parents:
diff changeset
   169
    LOG( SIMPLE,
hgs
parents:
diff changeset
   170
        "SATENGINE: CSatSBasicIconConverter::CheckDataValidityL exiting" )
hgs
parents:
diff changeset
   171
    }
hgs
parents:
diff changeset
   172
hgs
parents:
diff changeset
   173
//  End of File