D:/Zythum/DinoKod/Bitmap/Jpeg.cpp

00001 //---------------------------------------------------------------------------------------------
00002 //      This file is a part of "DinoKod".
00003 //      Copyright © 2003 Dino Productions. All Rights Reserved.
00004 //      
00005 //      File                    : Jpeg.cpp
00006 //      Author                  : Sebastien LEIX        sebastien.leix@wanadoo.fr
00007 //      Date                    : 07/09/2002
00008 //      Modification    :
00009 //
00010 //---------------------------------------------------------------------------------------------
00011 #include "Common/Assert.h"
00012 #include "Common/Error.h"
00013 
00014 #pragma pack( push, IJL )
00015 #include <ijl.h>                // !!! A METTRE EN DERNIER, CAR IL CHANGE L ALIGNEMENT !!!
00016 #pragma pack( pop, IJL )
00017 
00018 #include "Bitmap/Jpeg.h"
00019 
00020 //---------------------------------------------------------------------------------------------------------------------
00021 KJpeg::KJpeg()
00022 : KBitmap()
00023 {
00024 }
00025 
00026 //---------------------------------------------------------------------------------------------------------------------
00027 KJpeg::~KJpeg()
00028 {
00029 }
00030 
00031 //---------------------------------------------------------------------------------------------------------------------
00032 s32 KJpeg::LoadJPEG( const char* pFileName )
00033 {
00034         JPEG_CORE_PROPERTIES            Image;
00035         u8*                                                     pBuffer;
00036 
00037         // Ouverture du .JPEG
00038         if( !Open( pFileName ) )
00039                 return false;
00040 
00041     pBuffer = new u8[GetSize()];
00042         Read( pBuffer, GetSize() );
00043         
00044         ZeroMemory( &Image, sizeof( JPEG_CORE_PROPERTIES ) );
00045         
00046         // Init la LIB IJL
00047         if( ijlInit( &Image ) != IJL_OK )
00048         {
00049                 KError::FatalError( NULL, "KJpeg::LoadJPEG(...) : ijlInit Failed" );
00050                 return false;
00051         }
00052 
00053         Image.JPGBytes          = pBuffer;
00054         Image.JPGSizeBytes      = GetSize();
00055 
00056         if( ijlRead( &Image, IJL_JBUFF_READPARAMS ) != IJL_OK )
00057         {
00058                 KError::FatalError( NULL, "KJpeg::LoadJPEG(...) : ijlRead Failed" );
00059                 return false;
00060         }
00061 
00062         u32             Bpp;
00063         u8*             pBits;
00064 
00065         m_Width         = Image.JPGWidth;
00066         m_Height        = Image.JPGHeight;
00067         Bpp                     = Image.JPGChannels * 8;
00068         m_Bpp           = 32;
00069         m_bAlpha        = false;
00070 
00071         m_pBitmap       = new KRgba[m_Width * m_Height];
00072 
00073         switch( Image.JPGChannels )
00074     {
00075         case 1:
00076                 Image.JPGColor    = IJL_G;
00077                 Image.DIBChannels = 3;
00078                 Image.DIBColor    = IJL_BGR;
00079                 break;
00080     case 3:
00081                 Image.JPGColor    = IJL_YCBCR;
00082                 Image.DIBChannels = 3;
00083                 Image.DIBColor    = IJL_BGR;
00084                 break;
00085     case 4:
00086                 Image.JPGColor    = IJL_YCBCRA_FPX;
00087                 Image.DIBChannels = 4;
00088                 Image.DIBColor    = IJL_RGBA_FPX;
00089                 break;
00090     default:
00091                 Image.DIBColor = (IJL_COLOR)IJL_OTHER;
00092                 Image.JPGColor = (IJL_COLOR)IJL_OTHER;
00093                 Image.DIBChannels = Image.JPGChannels;
00094                 break;
00095     }
00096 
00097     Image.DIBWidth              = Image.JPGWidth;
00098     Image.DIBHeight             = Image.JPGHeight;
00099     Image.DIBPadBytes   = IJL_DIB_PAD_BYTES( Image.DIBWidth, Image.DIBChannels );
00100 
00101         pBits                           = new u8[Image.DIBWidth * Image.DIBHeight * (Image.DIBChannels + Image.DIBPadBytes)];
00102         
00103         Image.DIBBytes          = pBits;
00104 
00105         if( ijlRead( &Image, IJL_JBUFF_READWHOLEIMAGE ) != IJL_OK )
00106         {
00107                 KError::FatalError( NULL, "KJpeg::LoadJPEG(...) : ijlRead Failed" );
00108                 return false;
00109         }
00110 
00111         u32             x, y;
00112         u8*             pPtr = pBits;
00113 
00114         for( y = 0; y < m_Height; y ++ )
00115         for( x = 0; x < m_Width; x ++ )
00116         {
00117                 KRgba*  pPix = &m_pBitmap[ y * m_Width + x ];
00118                 switch( Bpp )
00119                 {
00120                 case 8:
00121                         u8              Color;
00122                         Color   = *pPtr++;
00123                         pPix->r = Color;
00124                         pPix->g = Color;
00125                         pPix->b = Color;
00126                         pPix->a = Color;
00127                         break;
00128                 case 24:
00129                         pPix->r = *pPtr++;
00130                         pPix->g = *pPtr++;
00131                         pPix->b = *pPtr++;
00132                         pPix->a = 255;
00133                         break;
00134                 case 32:
00135                         pPix->r = *pPtr++;
00136                         pPix->g = *pPtr++;
00137                         pPix->b = *pPtr++;
00138                         pPix->a = *pPtr++;
00139                         break;
00140                 default:
00141                         KError::FatalError( NULL, "KJpeg::LoadJPEG(...) : Unsupported BPP %i", Bpp );
00142                         return false;
00143                 }
00144         }
00145 
00146         if( ijlFree( &Image ) )
00147         {
00148                 KError::FatalError( NULL, "KJpeg::LoadJPEG(...) : ijlFree Failed" );
00149                 return false;
00150         }
00151 
00152         Deletev( pBits );
00153         Deletev( pBuffer );
00154 
00155         // Fermeture du .JPEG
00156         Close();
00157 
00158         return true;
00159 }

Generated on Sun Mar 25 20:02:10 2007 for Zythum Project by  doxygen 1.5.1-p1