satengine/satserver/Engine/src/CSatSBasicIconConverter.cpp
changeset 33 8d5d7fcf9b59
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/satengine/satserver/Engine/src/CSatSBasicIconConverter.cpp	Wed Jul 21 18:26:52 2010 +0300
@@ -0,0 +1,173 @@
+/*
+* Copyright (c) 2002-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:  Converts basic icon to CFbsBitmap
+*
+*/
+
+
+#include    <fbs.h>
+#include    <gdi.h>
+#include    "CSatSBasicIconConverter.h"
+#include    "TSatBitOP.h"
+#include    "SatLog.h"
+
+// Black&white icon uses 1 bpp.
+const TUint8 KBpp = 1;
+
+// Black&white icon header size is 2.
+const TUint8 KHeaderSize( 2 );
+
+// Value of icon data, which means that pixel is lit.
+const TInt KPixelIsLit = 1;
+const TUint KBitCount( 8 );
+
+// ======== MEMBER FUNCTIONS ========
+
+// -----------------------------------------------------------------------------
+// CSatSBasicIconConverter::CSatSBasicIconConverter
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CSatSBasicIconConverter::CSatSBasicIconConverter() :
+CSatSIconConverter()
+    {
+    LOG( SIMPLE, "SATENGINE: \
+        CSatSBasicIconConverter::CSatSBasicIconConverter calling - exiting" )
+    }
+
+// -----------------------------------------------------------------------------
+// CSatSBasicIconConverter::ConvertL
+// Converts the basic icon format (ETSI TS 131 102 V4.10.0) to CFbsBitmap
+// The format of aData has to be following:
+//  1st byte:           Image width
+//  2nd byte:           Image height
+//  3rd byte to end:    Image body.
+// Image body has to be in following format:
+//  Bit 8:  1st pixel
+//  Bit 7:  2nd pixel
+//  Bit 6:  3rd pixel
+//  etc...
+//
+// Clut is not needed for converting basic icon.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+CFbsBitmap* CSatSBasicIconConverter::ConvertL(
+    const TDesC8& aData,
+    const TDesC8& /*aClut*/ ) const
+    {
+    LOG( SIMPLE, "SATENGINE: CSatSBasicIconConverter::ConvertL calling" )
+
+    CheckDataValidityL( aData );
+    const TUint8 width( aData[0] );
+    const TUint8 height( aData[1] );
+
+    // Create black and white bitmap.
+    CFbsBitmap* bitmap = CreateBitmapL( width, height, EGray2 );
+
+    // Extract the header information away from icon data.
+    const TPtrC8 iconData(
+        aData.Mid( KHeaderSize, aData.Length() - KHeaderSize ) );
+
+    TBitmapUtil bitmapUtil( bitmap );
+    bitmapUtil.Begin( TPoint( 0, 0 ) );
+    TInt x( 0 );
+    TInt y( 0 );
+    // Convert the icon data.
+    for ( y = 0; y < height; y++ )
+        {
+        bitmapUtil.SetPos( TPoint( 0, y ) );
+        for ( x = 0; x < width; x++ )
+            {
+            const TInt startingBit( y * width + x );
+            const TUint8 color =
+                TSatBitOP::ExtractBits( startingBit, KBpp, iconData );
+
+            if ( KPixelIsLit == color )
+                {
+                // Black is lit pixel.
+                bitmapUtil.SetPixel( KRgbBlack.Value() );
+                }
+            else
+                {
+                // White means no pixel.
+                bitmapUtil.SetPixel( KRgbWhite.Value() );
+                }
+
+            bitmapUtil.IncXPos();
+            }
+        }
+
+    bitmapUtil.End();
+    LOG3( SIMPLE,"SATENGINE: CSatSBasicIconConverter::ConvertL, \
+          x: %d, y: %d", x, y )
+    LOG( SIMPLE, "SATENGINE: CSatSBasicIconConverter::ConvertL exiting" )
+    return bitmap;
+    }
+
+// -----------------------------------------------------------------------------
+// CSatSBasicIconConverter::CheckDataValidityL
+// Checks that icon data has valid length.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CSatSBasicIconConverter::CheckDataValidityL( const TDesC8& aData ) const
+    {
+    LOG( SIMPLE,
+        "SATENGINE: CSatSBasicIconConverter::CheckDataValidityL calling" )
+
+    TInt err( KErrNone );
+
+    // Is there at least width and height in aData.
+    const TInt dataLength( aData.Length() );
+
+    if ( dataLength > KHeaderSize )
+        {
+        LOG( SIMPLE, "SATENGINE: CSatSBasicIconConverter::CheckDataValidityL \
+             dataLength bigger than KHeaderSize" )
+        const TUint8 width( aData[0] );
+        const TUint8 height( aData[1] );
+
+        // Width and height does not belong to image body.
+        const TInt imageBodyLength( dataLength - KHeaderSize );
+
+        // Check that image body has at least as many
+        // bits than width and height succest. There might
+        // be more bits because the actual size of the image
+        // body may occupie only couple bits from
+        // last byte in image body.
+        const TInt bitsInImageBody( imageBodyLength * KBitCount );
+        const TInt bitsExpectedInImageBody( width * height );
+
+        if ( bitsInImageBody < bitsExpectedInImageBody )
+            {
+            LOG( SIMPLE, "SATENGINE: CSatSBasicIconConverter::\
+            CheckDataValidityL bitsInImageBody < bitsExpectedInImageBody" )
+            err = KErrCorrupt;
+            }
+        }
+    else
+        {
+        LOG( SIMPLE, "SATENGINE: CSatSBasicIconConverter::CheckDataValidityL \
+             dataLength less than KHeaderSize" )
+        err = KErrCorrupt;
+        }
+
+    User::LeaveIfError( err );
+    LOG( SIMPLE,
+        "SATENGINE: CSatSBasicIconConverter::CheckDataValidityL exiting" )
+    }
+
+//  End of File