00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "Common/Assert.h"
00012 #include "Common/Error.h"
00013
00014 #pragma pack( push, IJL )
00015 #include <ijl.h>
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
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
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
00156 Close();
00157
00158 return true;
00159 }