<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>ImageStone: ImageHandle_Tga.h Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.4.1 -->
<div class="qindex"><a class="qindex" href="index.html">Main Page</a> | <a class="qindex" href="hierarchy.html">Class Hierarchy</a> | <a class="qindex" href="annotated.html">Class List</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="functions.html">Class Members</a></div>
<h1>ImageHandle_Tga.h</h1><div class="fragment"><pre class="fragment">00001 <span class="comment">/*</span>
00002 <span class="comment"> * Copyright (C) =USTC= Fu Li</span>
00003 <span class="comment"> *</span>
00004 <span class="comment"> * Author : Fu Li</span>
00005 <span class="comment"> * Create : 2004-4-9</span>
00006 <span class="comment"> * Home : http://www.crazy-bit.com/</span>
00007 <span class="comment"> * Mail : crazybit@263.net</span>
00008 <span class="comment"> * History : </span>
00009 <span class="comment"> */</span>
00010 <span class="preprocessor">#ifndef __PCL_IMAGE_HANDLE_TGA__2004_04_09__H__</span>
00011 <span class="preprocessor"></span><span class="preprocessor">#define __PCL_IMAGE_HANDLE_TGA__2004_04_09__H__</span>
00012 <span class="preprocessor"></span><span class="preprocessor">#include "ImageHandleBase.h"</span>
00013 <span class="preprocessor">#include "../compress/Rle.h"</span>
00014
00015 <span class="comment">//class FCImageHandle ;</span>
00016 <span class="keyword">class </span><a class="code" href="class_f_c_image_handle___tga.html">FCImageHandle_Tga</a> ;
00017
00018 <span class="comment">//=============================================================================</span>
<a name="l00022"></a><a class="code" href="class_f_c_image_handle___tga.html">00022</a> <span class="comment"></span><span class="keyword">class </span><a class="code" href="class_f_c_image_handle___tga.html">FCImageHandle_Tga</a> : <span class="keyword">public</span> <a class="code" href="class_f_c_image_handle.html">FCImageHandle</a>
00023 {
00024 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="class_f_c_image_handle_base.html#a1">LoadImageMemory</a> (<span class="keyword">const</span> BYTE* pStart, <span class="keywordtype">int</span> nFileSize) ;
00025
00029 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="class_f_c_image_handle_base.html#a2">SaveImage</a> (<span class="keyword">const</span> <span class="keywordtype">char</span>* szFileName, <span class="keywordtype">int</span> nFlag = -1) ;
00030
00031 <span class="comment">// Definitions for TGA image types.</span>
00032 <span class="keyword">enum</span>
00033 {
00034 TGA_NULL = 0,
00035 TGA_UCPAL = 1,
00036 TGA_UCRGB = 2,
00037 TGA_UCMONO = 3,
00038 TGA_RLEPAL = 9,
00039 TGA_RLERGB = 10,
00040 TGA_RLEMONO = 11,
00041 };
00042
00043 <span class="comment">// TGA file header (same as BMP format, pixel store from left-bottom)</span>
00044 <span class="preprocessor">#pragma pack(1)</span>
00045 <span class="preprocessor"></span> <span class="keyword">struct </span>TGAHEAD
00046 {
00047 BYTE byID_Length ; <span class="comment">// ͼ��ʶ����Ϣ��С</span>
00048 BYTE byPalType ; <span class="comment">// 00 : no-palette 01 : has-palette</span>
00049 BYTE byImageType ; <span class="comment">// ����</span>
00050 WORD wPalFirstNdx ; <span class="comment">// ��ɫ����ʼ����</span>
00051 WORD wPalLength ; <span class="comment">// ��ɫ�峤��</span>
00052 BYTE byPalBits ; <span class="comment">// ��ɫ����ÿһ��ɫ��ռλ��</span>
00053 WORD wLeft ; <span class="comment">// �������Ļ���½�X����</span>
00054 WORD wBottom ; <span class="comment">// �������Ļ���½�Y����</span>
00055 WORD wWidth ; <span class="comment">// width</span>
00056 WORD wHeight ; <span class="comment">// height</span>
00057 BYTE byColorBits ; <span class="comment">// bpp</span>
00058 <span class="keyword">struct</span>
00059 <span class="keyword"> </span>{
00060 BYTE AlphaBits : 4 ; <span class="comment">// ÿ����Alpha Channelλ��</span>
00061 BYTE HorMirror : 1 ; <span class="comment">// Ϊ1��ʾͼ���������ҵߵ��洢</span>
00062 BYTE VerMirror : 1 ; <span class="comment">// Ϊ1��ʾͼ���������µߵ��洢</span>
00063 BYTE Reserved : 2 ;
00064 } Descriptor ;
00065 }; <span class="comment">// 18 - Bytes</span>
00066 <span class="preprocessor">#pragma pack()</span>
00067 <span class="preprocessor"></span>};
00068
00069 <span class="comment">//=============================================================================</span>
00070 <span class="comment">// inline Implement</span>
00071 <span class="comment">//=============================================================================</span>
00072 <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="class_f_c_image_handle_base.html#a1">FCImageHandle_Tga::LoadImageMemory</a> (<span class="keyword">const</span> BYTE* pStart, <span class="keywordtype">int</span> nFileSize)
00073 {
00074 <span class="keyword">const</span> TGAHEAD * pTga = (TGAHEAD*)pStart ;
00075 <span class="keywordflow">if</span> (!pStart)
00076 return false ;
00077 if ((pTga->byPalBits == 15) || (pTga->byPalBits == 16))
00078 return false ; <span class="comment">// not support 15 or 16 bit palette</span>
00079
00080 <span class="comment">// create image</span>
00081 <a class="code" href="class_f_c_obj_image.html">FCObjImage</a> * pImg = new <a class="code" href="class_f_c_obj_image.html">FCObjImage</a> ;
00082 if (!pImg->Create (pTga->wWidth, pTga->wHeight, (pTga->byColorBits == 15) ? 16 : pTga->byColorBits))
00083 {
00084 <span class="keyword">delete</span> pImg; <span class="keywordflow">return</span> false ;
00085 }
00086
00087 <span class="comment">// set palette</span>
00088 <span class="keyword">const</span> BYTE * pCurr = pStart + <span class="keyword">sizeof</span>(TGAHEAD) + pTga->byID_Length ;
00089 <span class="keywordflow">if</span> (pTga->byPalType == 1)
00090 {
00091 <span class="keywordflow">if</span> (pTga->wPalFirstNdx + pTga->wPalLength > 256)
00092 {
00093 <span class="keyword">delete</span> pImg; <span class="keywordflow">return</span> false ;
00094 }
00095
00096 RGBQUAD pPal[256] = {0} ;
00097 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0 ; i < pTga->wPalLength ; i++)
00098 {
00099 PCL_B(&pPal[pTga->wPalFirstNdx + i]) = *pCurr++ ;
00100 PCL_G(&pPal[pTga->wPalFirstNdx + i]) = *pCurr++ ;
00101 PCL_R(&pPal[pTga->wPalFirstNdx + i]) = *pCurr++ ;
00102 <span class="keywordflow">if</span> (pTga->byPalBits == 32)
00103 PCL_A(&pPal[pTga->wPalFirstNdx + i]) = *pCurr++ ;
00104 }
00105 pImg->SetColorTable (0, 256, pPal) ;
00106 }
00107
00108 <span class="comment">// start decode</span>
00109 for (<span class="keywordtype">int</span> i=0 ; i < pImg->Height() ; i++)
00110 {
00111 BYTE * pDest ;
00112 <span class="keywordflow">if</span> (pStart[17] & 0x20)
00113 pDest = pImg->GetBits(i) ; <span class="comment">// top to bottom</span>
00114 else
00115 pDest = pImg->GetBits(pImg->Height() - 1 - i) ; <span class="comment">// bottom to top</span>
00116
00117 if ((pTga->byImageType == TGA_RLEPAL) || (pTga->byImageType == TGA_RLERGB) || (pTga->byImageType == TGA_RLEMONO)) <span class="comment">// ѹ��</span>
00118 {
00119 pCurr = <a class="code" href="class_f_c_compress.html#e3">FCCompress::RLE_TGA_DecodeLine</a> (pCurr, pImg->ColorBits(), pImg->Width(), pDest) ;
00120 }
00121 <span class="keywordflow">else</span> <span class="comment">// not-compressed</span>
00122 {
00123 <span class="keywordtype">int</span> nPitch = pImg->Width() * pImg->ColorBits() / 8 ;
00124 memcpy (pDest, pCurr, nPitch) ;
00125 pCurr += nPitch ;
00126 }
00127 }
00128 <a class="code" href="class_p_c_l___interface___composite.html#a2">PCL_PushObject</a> (pImg) ; <span class="comment">// pImg's ownership</span>
00129 <span class="keywordflow">return</span> true ;
00130 }
00131 <span class="comment">//-----------------------------------------------------------------------------</span>
00132 <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="class_f_c_image_handle_base.html#a2">FCImageHandle_Tga::SaveImage</a> (<span class="keyword">const</span> <span class="keywordtype">char</span>* szFileName, <span class="keywordtype">int</span> nFlag)
00133 {
00134 <span class="keywordflow">if</span> (<a class="code" href="class_f_c_image_handle_base.html#p0">m_SaveImg</a>.empty())
00135 <span class="keywordflow">return</span> false ;
00136 <span class="keyword">const</span> <a class="code" href="class_f_c_obj_image.html">FCObjImage</a> &img = *<a class="code" href="class_f_c_image_handle_base.html#p0">m_SaveImg</a>[0] ;
00137
00138 <span class="comment">// validate</span>
00139 <span class="keywordflow">if</span> ((img.<a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() != 8) && (img.<a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() != 16) && (img.<a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() != 24) && (img.<a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() != 32))
00140 <span class="keywordflow">return</span> false ;
00141
00142 <span class="comment">// create image file</span>
00143 std::ofstream outFile (szFileName, std::ios::out|std::ios::binary|std::ios::trunc) ;
00144 <span class="keywordflow">if</span> (!outFile.is_open())
00145 <span class="keywordflow">return</span> false ;
00146
00147 <span class="comment">// Initialize TGA Header</span>
00148 <span class="keyword">const</span> BYTE fTgaInfo[] = {<span class="stringliteral">"PhoXo -- TGA"</span>} ;
00149 TGAHEAD TgaHead ;
00150 memset (&TgaHead, 0, <span class="keyword">sizeof</span>(TgaHead)) ;
00151 TgaHead.byID_Length = <span class="keyword">sizeof</span>(fTgaInfo) - 1 ; <span class="comment">// tga size</span>
00152 TgaHead.byPalType = ((img.<a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() == 8) ? 1 : 0) ;
00153
00154 <span class="keywordflow">if</span> (nFlag == -1)
00155 TgaHead.byImageType = ((img.ColorBits() == 8) ? TGA_UCPAL : TGA_UCRGB) ;
00156 else if (nFlag == 1)
00157 TgaHead.byImageType = ((img.ColorBits() == 8) ? TGA_RLEPAL : TGA_RLERGB) ;
00158
00159 TgaHead.wPalFirstNdx = 0 ;
00160 TgaHead.wPalLength = 256 ;
00161 TgaHead.byPalBits = 24 ; <span class="comment">// palette's bit</span>
00162 TgaHead.wWidth = img.Width() ;
00163 TgaHead.wHeight = img.Height() ;
00164 TgaHead.byColorBits = (BYTE)img.ColorBits() ;
00165 ((BYTE*)&TgaHead)[17] = 0x20 ; <span class="comment">// top to bottom</span>
00166 outFile.write ((<span class="keywordtype">char</span>*)&TgaHead, sizeof(TGAHEAD)) ;
00167 outFile.write ((<span class="keywordtype">char</span>*)fTgaInfo, TgaHead.byID_Length) ;
00168
00169 <span class="comment">// write palette</span>
00170 if (img.ColorBits() == 8)
00171 {
00172 RGBQUAD pPal[256] ;
00173 img.<a class="code" href="class_f_c_obj_image.html#z33_0">GetColorTable</a> (0, 256, pPal) ;
00174 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0 ; i < 256 ; i++)
00175 outFile.write ((<span class="keywordtype">char</span>*)&pPal[i], 3) ;
00176 }
00177
00178 <span class="comment">// write pixels</span>
00179 const <span class="keywordtype">int</span> nLineByte = img.ColorBits() * img.Width() / 8 ;
00180 if (nFlag == -1)
00181 {
00182 <span class="comment">// not compress</span>
00183 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> y=0 ; y < img.<a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>() ; y++)
00184 outFile.write ((<span class="keywordtype">char</span>*)img.<a class="code" href="class_f_c_obj_image.html#z29_1">GetBits</a>(y), nLineByte) ;
00185 }
00186 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (nFlag == 1)
00187 {
00188 <span class="comment">// RLE compress</span>
00189 <a class="code" href="class_p_c_l__array.html">PCL_array<BYTE></a> pStart (nLineByte * 2 + 4096) ;
00190 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> y=0 ; y < img.<a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>() ; y++)
00191 {
00192 BYTE * pEn = <a class="code" href="class_f_c_compress.html#e2">FCCompress::RLE_TGA_EncodeLine</a> (img.<a class="code" href="class_f_c_obj_image.html#z29_1">GetBits</a>(y), img.<a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>(), img.<a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>(), pStart.get()) ;
00193 outFile.write ((<span class="keywordtype">char</span>*)pStart.get(), (int)(pEn - pStart.get())) ;
00194 }
00195 }
00196 <span class="keywordflow">return</span> true ;
00197 }
00198
00199 <span class="preprocessor">#endif</span>
</pre></div><hr size="1"><address style="align: right;"><small>Generated on Wed Mar 8 11:12:46 2006 for ImageStone by
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.1 </small></address>
</body>
</html>