Click here to Skip to main content
15,897,334 members
Articles / Desktop Programming / MFC

ImageStone - A Powerful C++ Class Library for Image Manipulation

Rate me:
Please Sign up or sign in to vote.
4.81/5 (250 votes)
6 Dec 2011Zlib3 min read 121.8K   51.5K   405  
An article on a library for image manipulation
<!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: ObjImage.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&nbsp;Page</a> | <a class="qindex" href="hierarchy.html">Class&nbsp;Hierarchy</a> | <a class="qindex" href="annotated.html">Class&nbsp;List</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="functions.html">Class&nbsp;Members</a></div>
<h1>ObjImage.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   :  2001-4-27</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_OBJECT_IMAGE__2001_04_27__H__</span>
00011 <span class="preprocessor"></span><span class="preprocessor">#define __PCL_OBJECT_IMAGE__2001_04_27__H__</span>
00012 <span class="preprocessor"></span><span class="preprocessor">#include "ObjBase.h"</span>
00013 <span class="preprocessor">#include "FColor.h"</span>
00014 <span class="preprocessor">#include "ObjProgress.h"</span>
00015 <span class="preprocessor">#include "oxo_helper.h"</span>
00016 <span class="preprocessor">#include "imagefile/Interface_ImageHandle.h"</span>
00017 <span class="preprocessor">#include "imagefile/Interface_ImageHandleFactory.h"</span>
00018 <span class="preprocessor">#include "pixelprocessor/Interface_PixelProcessor.h"</span>
00019 
00020 <span class="comment">//=============================================================================</span>
<a name="l00031"></a><a class="code" href="class_f_c_obj_image.html">00031</a> <span class="comment"></span><span class="keyword">class </span><a class="code" href="class_f_c_obj_image.html">FCObjImage</a> : <span class="keyword">public</span> <a class="code" href="class_f_c_obj_graph.html">FCObjGraph</a>
00032 {
00033 <span class="keyword">public</span>:
00038 
00039     <a class="code" href="class_f_c_obj_image.html#z25_0">FCObjImage</a> () ;
00041     <a class="code" href="class_f_c_obj_image.html#z25_0">FCObjImage</a> (<span class="keyword">const</span> <a class="code" href="class_f_c_obj_image.html">FCObjImage</a>&amp; img) ;
00043     <a class="code" href="class_f_c_obj_image.html#z25_0">FCObjImage</a> (<span class="keywordtype">int</span> nWidth, <span class="keywordtype">int</span> nHeight, <span class="keywordtype">int</span> nColorBit) ;
00045     <a class="code" href="class_f_c_obj_image.html#z25_0">FCObjImage</a> (<span class="keyword">const</span> <span class="keywordtype">char</span>* szFileName) ;
00046     <a class="code" href="class_f_c_obj_image.html">FCObjImage</a>&amp; operator= (<span class="keyword">const</span> <a class="code" href="class_f_c_obj_image.html">FCObjImage</a>&amp; img) ;
00047     <span class="keyword">virtual</span> ~<a class="code" href="class_f_c_obj_image.html">FCObjImage</a>() {<a class="code" href="class_f_c_obj_image.html#z27_2">Destroy</a>();}
00049 
00054     <span class="keyword">virtual</span> <span class="keywordtype">int</span> <a class="code" href="class_f_c_obj_image.html#a0">Serialize</a> (<span class="keywordtype">bool</span> bSave, BYTE* pSave) ;
00055 
00068     <span class="keywordtype">bool</span> <a class="code" href="class_f_c_obj_image.html#z27_0">Create</a> (<span class="keyword">const</span> BITMAPINFOHEADER* pBmif) ;
00070     <span class="keywordtype">bool</span> <a class="code" href="class_f_c_obj_image.html#z27_0">Create</a> (<span class="keywordtype">int</span> nWidth, <span class="keywordtype">int</span> nHeight, <span class="keywordtype">int</span> nColorBit) ;
00072     <span class="keywordtype">void</span> <a class="code" href="class_f_c_obj_image.html#z27_2">Destroy</a>() ;
00074 
00079 
<a name="l00080"></a><a class="code" href="class_f_c_obj_image.html#z29_0">00080</a>     <span class="keywordtype">bool</span> <a class="code" href="class_f_c_obj_image.html#z29_0">IsValidImage</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> (m_pByte != 0);}
00082     BYTE* <a class="code" href="class_f_c_obj_image.html#z29_1">GetBits</a> (<span class="keywordtype">int</span> iLine) <span class="keyword">const </span>;
00084     BYTE* <a class="code" href="class_f_c_obj_image.html#z29_1">GetBits</a> (<span class="keywordtype">int</span> x, <span class="keywordtype">int</span> y) <span class="keyword">const </span>;
<a name="l00086"></a><a class="code" href="class_f_c_obj_image.html#z29_3">00086</a>     BYTE* <a class="code" href="class_f_c_obj_image.html#z29_3">GetMemStart</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_pByte;}
<a name="l00088"></a><a class="code" href="class_f_c_obj_image.html#z29_4">00088</a>     <span class="keywordtype">int</span> <a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_DibInfo.biWidth;}
<a name="l00090"></a><a class="code" href="class_f_c_obj_image.html#z29_5">00090</a>     <span class="keywordtype">int</span> <a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_DibInfo.biHeight;}
<a name="l00092"></a><a class="code" href="class_f_c_obj_image.html#z29_6">00092</a>     WORD <a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_DibInfo.biBitCount;}
<a name="l00094"></a><a class="code" href="class_f_c_obj_image.html#z29_7">00094</a>     <span class="keywordtype">int</span> <a class="code" href="class_f_c_obj_image.html#z29_7">GetPitch</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> 4 * ((<a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>() * <a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() + 31) / 32);}
00106     BITMAPINFOHEADER* <a class="code" href="class_f_c_obj_image.html#z29_8">NewImgInfoWithPalette</a>() <span class="keyword">const </span>;
<a name="l00108"></a><a class="code" href="class_f_c_obj_image.html#z29_9">00108</a>     <span class="keywordtype">int</span> <a class="code" href="class_f_c_obj_image.html#z29_9">GetNextFrameDelay</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_nNextFrameDelay;}
<a name="l00110"></a><a class="code" href="class_f_c_obj_image.html#z29_10">00110</a>     <span class="keywordtype">void</span> <a class="code" href="class_f_c_obj_image.html#z29_10">SetNextFrameDelay</a> (<span class="keywordtype">int</span> nNextFrameDelay) {m_nNextFrameDelay=nNextFrameDelay;}
00113     <span class="keywordtype">void</span> <a class="code" href="class_f_c_obj_image.html#z29_11">BoundRect</a> (RECT&amp; rc) <span class="keyword">const </span>;
00115 
00120 
<a name="l00121"></a><a class="code" href="class_f_c_obj_image.html#z31_0">00121</a>     <span class="keywordtype">bool</span> <a class="code" href="class_f_c_obj_image.html#z31_0">IsInside</a> (<span class="keywordtype">int</span> x, <span class="keywordtype">int</span> y)<span class="keyword"> const </span>{<span class="keywordflow">return</span> (x&gt;=0) &amp;&amp; (x&lt;Width()) &amp;&amp; (y&gt;=0) &amp;&amp; (y&lt;<a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>());}
00123     DWORD <a class="code" href="class_f_c_obj_image.html#z31_1">GetPixelData</a> (<span class="keywordtype">int</span> x, <span class="keywordtype">int</span> y) <span class="keyword">const </span>;
00125     <span class="keywordtype">void</span> <a class="code" href="class_f_c_obj_image.html#z31_2">SetPixelData</a> (<span class="keywordtype">int</span> x, <span class="keywordtype">int</span> y, DWORD dwPixel) ;
00127 
00132 
00133 
00134     <span class="keywordtype">bool</span> <a class="code" href="class_f_c_obj_image.html#z33_0">GetColorTable</a> (<span class="keywordtype">int</span> iFirstIndex, <span class="keywordtype">int</span> iNumber, RGBQUAD* pColors) <span class="keyword">const </span>;
00137     <span class="keywordtype">bool</span> <a class="code" href="class_f_c_obj_image.html#z33_1">SetColorTable</a> (<span class="keywordtype">int</span> iFirstIndex, <span class="keywordtype">int</span> iNumber, RGBQUAD* pColors) ;
00139     <span class="keywordtype">void</span> <a class="code" href="class_f_c_obj_image.html#z33_2">CopyPalette</a> (<span class="keyword">const</span> <a class="code" href="class_f_c_obj_image.html">FCObjImage</a>&amp; imgSrc) ;
00141 
00146 
<a name="l00147"></a><a class="code" href="class_f_c_obj_image.html#z35_0">00147</a>     <span class="keywordtype">void</span> <a class="code" href="class_f_c_obj_image.html#z35_0">ConvertTo24Bit</a>() {__ConvertToTrueColor(24);}
<a name="l00149"></a><a class="code" href="class_f_c_obj_image.html#z35_1">00149</a>     <span class="keywordtype">void</span> <a class="code" href="class_f_c_obj_image.html#z35_1">ConvertTo32Bit</a>() {__ConvertToTrueColor(32);}
00151 
00156 
00157     <span class="keywordtype">void</span> <a class="code" href="class_f_c_obj_image.html#z37_0">GetAlphaChannel</a> (<a class="code" href="class_f_c_obj_image.html">FCObjImage</a>* imgAlpha) <span class="keyword">const </span>;
00159     <span class="keywordtype">void</span> <a class="code" href="class_f_c_obj_image.html#z37_1">AppendAlphaChannel</a> (<span class="keyword">const</span> <a class="code" href="class_f_c_obj_image.html">FCObjImage</a>&amp; alpha8) ;
00161     <span class="keywordtype">void</span> <a class="code" href="class_f_c_obj_image.html#z37_2">SetAlphaChannelValue</a> (<span class="keywordtype">int</span> nValue) ;
00163 
00168 
00169 
00170     <span class="keywordtype">bool</span>    <a class="code" href="class_f_c_obj_image.html#z39_0">GetSubBlock</a> (<a class="code" href="class_f_c_obj_image.html">FCObjImage</a>* SubImg, RECT rcBlock) <span class="keyword">const </span>;
00172     <span class="keywordtype">bool</span>    <a class="code" href="class_f_c_obj_image.html#z39_1">CoverBlock</a> (<span class="keyword">const</span> <a class="code" href="class_f_c_obj_image.html">FCObjImage</a>&amp; Img, <span class="keywordtype">int</span> x, <span class="keywordtype">int</span> y) ;
00173     <span class="keywordtype">void</span>    TileBlock (<span class="keyword">const</span> <a class="code" href="class_f_c_obj_image.html">FCObjImage</a>&amp; Img, <span class="keywordtype">int</span> x, <span class="keywordtype">int</span> y) ;
00175     <span class="keywordtype">void</span>    <a class="code" href="class_f_c_obj_image.html#z39_3">AlphaBlend</a> (<span class="keyword">const</span> <a class="code" href="class_f_c_obj_image.html">FCObjImage</a>&amp; img32, <span class="keyword">const</span> RECT&amp; rcDest, <span class="keyword">const</span> RECT&amp; rcSrc, <span class="keywordtype">int</span> nAlphaPercent) ;
00177     <span class="keywordtype">void</span>    <a class="code" href="class_f_c_obj_image.html#z39_4">CombineImage</a> (<span class="keyword">const</span> <a class="code" href="class_f_c_obj_image.html">FCObjImage</a>&amp; img32, <span class="keywordtype">int</span> x=0, <span class="keywordtype">int</span> y=0, <span class="keywordtype">int</span> nAlphaPercent=100) ;
00178     <span class="keywordtype">void</span>    LogicalBlend (<span class="keyword">const</span> <a class="code" href="class_f_c_obj_image.html">FCObjImage</a> &amp; MaskImg, LOGICAL_OP LogOP, <span class="keywordtype">int</span> x=0, <span class="keywordtype">int</span> y=0) ;
00180     <span class="keywordtype">void</span>    <a class="code" href="class_f_c_obj_image.html#z39_6">ExpandFrame</a> (<span class="keywordtype">bool</span> bCopyEdge, <span class="keywordtype">int</span> iLeft, <span class="keywordtype">int</span> iTop, <span class="keywordtype">int</span> iRight, <span class="keywordtype">int</span> iBottom) ; <span class="comment">// add frame</span>
00182 <span class="comment"></span>    <span class="keywordtype">void</span>    <a class="code" href="class_f_c_obj_image.html#z39_7">Stretch</a> (<span class="keywordtype">int</span> nNewWidth, <span class="keywordtype">int</span> nNewHeight) ; <span class="comment">// stretch</span>
00184 <span class="comment"></span>    <span class="keywordtype">void</span>    <a class="code" href="class_f_c_obj_image.html#z39_8">Stretch_Smooth</a> (<span class="keywordtype">int</span> nNewWidth, <span class="keywordtype">int</span> nNewHeight, <a class="code" href="class_f_c_obj_progress.html">FCObjProgress</a> * progress = NULL) ; <span class="comment">// stretch</span>
00186 <span class="comment"></span>    <span class="keywordtype">void</span>    <a class="code" href="class_f_c_obj_image.html#z39_9">SinglePixelProcessProc</a> (<a class="code" href="class_f_c_interface___pixel_process.html">FCInterface_PixelProcess</a>&amp; rProcessor, <a class="code" href="class_f_c_obj_progress.html">FCObjProgress</a>* pProgress=NULL) ;
00188 
<a name="l00200"></a><a class="code" href="class_f_c_obj_image.html#z41_5">00200</a>     <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="class_f_c_obj_image.html#z41_5">SetImageHandleFactory</a> (<a class="code" href="class_f_c_image_handle_factory.html">FCImageHandleFactory</a>* pFactory) {__ManageImageHandleFactory(<span class="keyword">false</span>,pFactory);}
<a name="l00202"></a><a class="code" href="class_f_c_obj_image.html#z41_6">00202</a>     <span class="keyword">static</span> <a class="code" href="class_f_c_image_handle_factory.html">FCImageHandleFactory</a>* <a class="code" href="class_f_c_obj_image.html#z41_6">GetImageHandleFactory</a>() {<span class="keywordflow">return</span> __ManageImageHandleFactory(<span class="keyword">true</span>,0);}
00204     <span class="keywordtype">bool</span> <a class="code" href="class_f_c_obj_image.html#z41_0">Load</a> (<a class="code" href="class_f_c_image_handle_base.html">FCImageHandleBase</a>* pHandler) ;
00206     <span class="keywordtype">bool</span> <a class="code" href="class_f_c_obj_image.html#z41_0">Load</a> (<span class="keyword">const</span> <span class="keywordtype">char</span>* szFileName) ;
00208     <span class="keywordtype">bool</span> <a class="code" href="class_f_c_obj_image.html#z41_0">Load</a> (BYTE* pStart, <span class="keywordtype">int</span> iFileSize, IMAGE_TYPE imgType) ;
00210     <span class="keywordtype">bool</span> <a class="code" href="class_f_c_obj_image.html#z41_3">Save</a> (<a class="code" href="class_f_c_image_handle_base.html">FCImageHandleBase</a>* pHandler, <span class="keyword">const</span> <span class="keywordtype">char</span>* szFileName, <span class="keywordtype">int</span> nFlag = -1) <span class="keyword">const </span>;
00217     <span class="keywordtype">bool</span> <a class="code" href="class_f_c_obj_image.html#z41_3">Save</a> (<span class="keyword">const</span> <span class="keywordtype">char</span>* szFileName, <span class="keywordtype">int</span> nFlag = -1) <span class="keyword">const </span>;
00219 
00220 <span class="keyword">private</span>:
00221     BITMAPINFOHEADER   m_DibInfo ; <span class="comment">// DIB Info</span>
00222     BYTE             * m_pByte ;   <span class="comment">// Bitmap start bits, from left-bottom start</span>
00223     BYTE            ** m_ppLine ;  <span class="comment">// Line-pointer, ppLine[] ; from top to bottom</span>
00224     DWORD              m_dwBitFields[3] ; <span class="comment">// only 16bit image, order R,G,B</span>
00225     RGBQUAD          * m_pPalette ; <span class="comment">// palette</span>
00226 
00227     <span class="keywordtype">int</span>                m_nNextFrameDelay ; <span class="comment">// to next frame delay milliseconds</span>
00228 
00229 <span class="keyword">private</span>:
00230     <span class="keywordtype">void</span> __SetGrayPalette() ;
00231     <span class="keywordtype">void</span> __InitClassMember() ; <span class="comment">// initialize the member variant</span>
00232     <span class="keywordtype">void</span> __ConvertToTrueColor (<span class="keywordtype">int</span> iColor) ; <span class="comment">// iColor == 24 or 32</span>
00233     <span class="keyword">static</span> RGBQUAD __Split16Bit_565 (WORD wPixel) ;
00234     <span class="keyword">static</span> RGBQUAD __Split16Bit_555 (WORD wPixel) ;
00235     <span class="keyword">static</span> <span class="keywordtype">void</span> __FillImageRect (<span class="keyword">const</span> <a class="code" href="class_f_c_obj_image.html">FCObjImage</a>&amp; img, <span class="keyword">const</span> RECT&amp; rcBlock, <span class="keyword">const</span> <span class="keywordtype">void</span>* pSrc) ;
00236     <span class="keyword">static</span> <a class="code" href="class_f_c_image_handle_factory.html">FCImageHandleFactory</a>* __ManageImageHandleFactory (<span class="keywordtype">bool</span> bGet, <a class="code" href="class_f_c_image_handle_factory.html">FCImageHandleFactory</a>* pFactory) ;
00237 } ;
00238 
00239 <span class="comment">//=============================================================================</span>
00240 <span class="comment">// inline Implement</span>
00241 <span class="comment">//=============================================================================</span>
00242 <span class="keyword">inline</span> <span class="keywordtype">void</span> FCObjImage::__InitClassMember()
00243 {
00244     memset (&amp;m_DibInfo, 0, <span class="keyword">sizeof</span>(m_DibInfo)) ;
00245     m_dwBitFields[0]=m_dwBitFields[1]=m_dwBitFields[2]=0 ;
00246     m_pByte=0 ; m_ppLine=0 ; m_pPalette=0 ;
00247 
00248     m_nNextFrameDelay = 0 ;
00249 }
00250 <span class="comment">//-----------------------------------------------------------------------------</span>
<a name="l00251"></a><a class="code" href="class_f_c_obj_image.html#z25_0">00251</a> <span class="keyword">inline</span> <a class="code" href="class_f_c_obj_image.html#z25_0">FCObjImage::FCObjImage</a>()
00252 {
00253     __InitClassMember() ;
00254 }
<a name="l00255"></a><a class="code" href="class_f_c_obj_image.html#z25_1">00255</a> <span class="keyword">inline</span> <a class="code" href="class_f_c_obj_image.html#z25_0">FCObjImage::FCObjImage</a> (<span class="keyword">const</span> <a class="code" href="class_f_c_obj_image.html">FCObjImage</a>&amp; img)
00256 {
00257     __InitClassMember() ;
00258     *<span class="keyword">this</span> = img ;
00259 }
<a name="l00260"></a><a class="code" href="class_f_c_obj_image.html#z25_2">00260</a> <span class="keyword">inline</span> <a class="code" href="class_f_c_obj_image.html#z25_0">FCObjImage::FCObjImage</a> (<span class="keywordtype">int</span> nWidth, <span class="keywordtype">int</span> nHeight, <span class="keywordtype">int</span> nColorBit)
00261 {
00262     __InitClassMember() ;
00263     <a class="code" href="class_f_c_obj_image.html#z27_0">Create</a> (nWidth, nHeight, nColorBit) ;
00264 }
<a name="l00265"></a><a class="code" href="class_f_c_obj_image.html#z25_3">00265</a> <span class="keyword">inline</span> <a class="code" href="class_f_c_obj_image.html#z25_0">FCObjImage::FCObjImage</a> (<span class="keyword">const</span> <span class="keywordtype">char</span>* szFileName)
00266 {
00267     __InitClassMember() ;
00268     <a class="code" href="class_f_c_obj_image.html#z41_0">Load</a> (szFileName) ;
00269 }
00270 <span class="comment">//-----------------------------------------------------------------------------</span>
<a name="l00271"></a><a class="code" href="class_f_c_obj_image.html#z27_0">00271</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="class_f_c_obj_image.html#z27_0">FCObjImage::Create</a> (<span class="keyword">const</span> BITMAPINFOHEADER* pBmif)
00272 {
00273     <span class="comment">// unsupported store format</span>
00274     <span class="keywordflow">if</span> (!pBmif || (pBmif-&gt;biHeight &lt;= 0) || (pBmif-&gt;biWidth &lt;= 0))
00275         {assert(<span class="keyword">false</span>); <span class="keywordflow">return</span> <span class="keyword">false</span>;}
00276     <span class="keywordflow">if</span> (!((pBmif-&gt;biCompression == BI_RGB) || (pBmif-&gt;biCompression == BI_BITFIELDS)))
00277         {assert(<span class="keyword">false</span>); <span class="keywordflow">return</span> <span class="keyword">false</span>;}
00278     <span class="keywordflow">switch</span> (pBmif-&gt;biBitCount) <span class="comment">// validate bpp</span>
00279     {
00280         <span class="keywordflow">case</span> 1 :
00281         <span class="keywordflow">case</span> 4 :
00282         <span class="keywordflow">case</span> 8 :
00283         <span class="keywordflow">case</span> 16 :
00284         <span class="keywordflow">case</span> 24 :
00285         <span class="keywordflow">case</span> 32 : break ;
00286         <span class="keywordflow">default</span> : assert(<span class="keyword">false</span>); <span class="keywordflow">return</span> <span class="keyword">false</span>;
00287     }
00288 
00289     <span class="keywordflow">if</span> (<a class="code" href="class_f_c_obj_image.html#z29_0">IsValidImage</a>())
00290         <a class="code" href="class_f_c_obj_image.html#z27_2">Destroy</a>() ;
00291 
00292     <span class="comment">// init struct</span>
00293     memset (&amp;m_DibInfo, 0, <span class="keyword">sizeof</span>(m_DibInfo)) ;
00294     m_DibInfo.biSize          = <span class="keyword">sizeof</span>(BITMAPINFOHEADER) ;
00295     m_DibInfo.biWidth         = pBmif-&gt;biWidth ;
00296     m_DibInfo.biHeight        = pBmif-&gt;biHeight ;
00297     m_DibInfo.biPlanes        = 1 ;
00298     m_DibInfo.biBitCount      = pBmif-&gt;biBitCount ;
00299     m_DibInfo.biCompression   = pBmif-&gt;biCompression ;
00300     m_DibInfo.biXPelsPerMeter = pBmif-&gt;biXPelsPerMeter ;
00301     m_DibInfo.biYPelsPerMeter = pBmif-&gt;biYPelsPerMeter ;
00302 
00303     <span class="comment">// now flag BI_BITFIELDS is only valid in 16bit image</span>
00304     <span class="keywordflow">if</span> (pBmif-&gt;biBitCount == 16)
00305     {
00306         m_dwBitFields[0] = MASK16_RED_555 ; <span class="comment">// 16-bit default format : 5-5-5</span>
00307         m_dwBitFields[1] = MASK16_GREEN_555 ;
00308         m_dwBitFields[2] = MASK16_BLUE_555 ;
00309         <span class="keywordflow">if</span> (pBmif-&gt;biCompression == BI_BITFIELDS) <span class="comment">// custom</span>
00310             memcpy (m_dwBitFields, pBmif + 1, 12) ;
00311     }
00312     <span class="keywordflow">else</span>
00313         m_DibInfo.biCompression = BI_RGB ; <span class="comment">// i think it's unnecessary to use mask in 32bit image</span>
00314 
00315     <span class="comment">// create pixel buffer, pixel must must must initialized to zero !!!</span>
00316     m_pByte = <a class="code" href="class_f_c_o_x_o_helper.html#z45_0">FCOXOHelper::ZeroMalloc</a> (<a class="code" href="class_f_c_obj_image.html#z29_7">GetPitch</a>()*<a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>()) ;
00317     assert (((<span class="keywordtype">long</span>)m_pByte % 4) == 0) ; <span class="comment">// DWORD align</span>
00318 
00319     <span class="comment">// create a line pointer, to accelerate pixel access</span>
00320     m_ppLine = (BYTE **) <span class="keyword">new</span> BYTE [<span class="keyword">sizeof</span>(BYTE*) * <a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>()] ;
00321     <span class="keyword">const</span> <span class="keywordtype">int</span>     nPitch = <a class="code" href="class_f_c_obj_image.html#z29_7">GetPitch</a>() ;
00322     m_ppLine[0] = m_pByte + (<a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>() - 1) * nPitch ;
00323     <span class="keywordflow">for</span> (<span class="keywordtype">int</span> y = 1 ; y &lt; <a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>() ; y++)
00324         m_ppLine[y] = m_ppLine[y - 1] - nPitch ;
00325 
00326     <span class="comment">// 8bit color image default set a gray palette</span>
00327     <span class="keywordflow">if</span> (<a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() &lt;= 8)
00328     {
00329         m_pPalette = <span class="keyword">new</span> RGBQUAD[1 &lt;&lt; <a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>()] ;
00330         __SetGrayPalette() ;
00331     }
00332     <span class="keywordflow">return</span> true ;
00333 }
00334 <span class="comment">//-----------------------------------------------------------------------------</span>
<a name="l00335"></a><a class="code" href="class_f_c_obj_image.html#z27_1">00335</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="class_f_c_obj_image.html#z27_0">FCObjImage::Create</a> (<span class="keywordtype">int</span> nWidth, <span class="keywordtype">int</span> nHeight, <span class="keywordtype">int</span> nColorBit)
00336 {
00337     BITMAPINFOHEADER     bmih ;
00338     memset (&amp;bmih, 0, <span class="keyword">sizeof</span>(bmih)) ;
00339     bmih.biWidth = nWidth ;
00340     bmih.biHeight = nHeight ;
00341     bmih.biBitCount = nColorBit ;
00342     bmih.biCompression = BI_RGB ;
00343     <span class="keywordflow">return</span> this-&gt;<a class="code" href="class_f_c_obj_image.html#z27_0">Create</a> (&amp;bmih) ;
00344 }
00345 <span class="comment">//-----------------------------------------------------------------------------</span>
<a name="l00346"></a><a class="code" href="class_f_c_obj_image.html#z27_2">00346</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="class_f_c_obj_image.html#z27_2">FCObjImage::Destroy</a>()
00347 {
00348     <span class="keywordflow">if</span> (m_ppLine)
00349         <span class="keyword">delete</span>[] m_ppLine ;
00350 
00351     <a class="code" href="class_f_c_o_x_o_helper.html#z45_1">FCOXOHelper::ZeroFree</a> (m_pByte) ;
00352 
00353     <span class="keywordflow">if</span> (m_pPalette)
00354         <span class="keyword">delete</span>[] m_pPalette ;
00355 
00356     __InitClassMember() ;
00357 }
00358 <span class="comment">//-----------------------------------------------------------------------------</span>
<a name="l00359"></a><a class="code" href="class_f_c_obj_image.html#z29_1">00359</a> <span class="keyword">inline</span> BYTE* <a class="code" href="class_f_c_obj_image.html#z29_1">FCObjImage::GetBits</a> (<span class="keywordtype">int</span> iLine)<span class="keyword"> const</span>
00360 <span class="keyword"></span>{
00361     assert (<a class="code" href="class_f_c_obj_image.html#z31_0">IsInside</a>(0,iLine)) ;
00362     <span class="keywordflow">return</span> m_ppLine[iLine] ;
00363 }
00364 <span class="comment">//-----------------------------------------------------------------------------</span>
<a name="l00365"></a><a class="code" href="class_f_c_obj_image.html#z29_2">00365</a> PCL_forceinline BYTE* <a class="code" href="class_f_c_obj_image.html#z29_1">FCObjImage::GetBits</a> (<span class="keywordtype">int</span> x, <span class="keywordtype">int</span> y)<span class="keyword"> const</span>
00366 <span class="keyword"></span>{
00367     assert (<a class="code" href="class_f_c_obj_image.html#z31_0">IsInside</a>(x,y)) ;
00368     <span class="keywordflow">if</span> (<a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() == 32)
00369         <span class="keywordflow">return</span> (m_ppLine[y] + x * 4) ;
00370     <span class="keywordflow">if</span> (<a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() == 8)
00371         <span class="keywordflow">return</span> (m_ppLine[y] + x) ;
00372     <span class="keywordflow">return</span> (m_ppLine[y] + x * <a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() / 8) ;
00373 }
00374 <span class="comment">//-----------------------------------------------------------------------------</span>
<a name="l00375"></a><a class="code" href="class_f_c_obj_image.html#z29_8">00375</a> <span class="keyword">inline</span> BITMAPINFOHEADER* <a class="code" href="class_f_c_obj_image.html#z29_8">FCObjImage::NewImgInfoWithPalette</a>()<span class="keyword"> const</span>
00376 <span class="keyword"></span>{
00377     <span class="comment">// prepare info</span>
00378     <span class="keyword">const</span> <span class="keywordtype">int</span>          nColorNum = 1 &lt;&lt; <a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>(),
00379                        nPalBytes = ((<a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() &lt;= 8) ? (4*nColorNum) : 0) ;
00380     BITMAPINFOHEADER   * pBmfh = (BITMAPINFOHEADER*) <span class="keyword">new</span> BYTE[16 + <span class="keyword">sizeof</span>(BITMAPINFOHEADER) + nPalBytes] ;
00381     *pBmfh = m_DibInfo ;
00382 
00383     <span class="comment">// append palette(&lt;=8bit) or bit-fields(16bit)</span>
00384     <span class="keywordflow">if</span> (<a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() &lt;= 8)
00385         <a class="code" href="class_f_c_obj_image.html#z33_0">GetColorTable</a> (0, nColorNum, (RGBQUAD*)(pBmfh + 1)) ;
00386     <span class="keywordflow">else</span>
00387         memcpy (pBmfh + 1, m_dwBitFields, 12) ;
00388     <span class="keywordflow">return</span> pBmfh ;
00389 }
00390 <span class="comment">//-----------------------------------------------------------------------------</span>
<a name="l00391"></a><a class="code" href="class_f_c_obj_image.html#z29_11">00391</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="class_f_c_obj_image.html#z29_11">FCObjImage::BoundRect</a> (RECT&amp; rc)<span class="keyword"> const</span>
00392 <span class="keyword"></span>{
00393     RECT   rcImg = {0, 0, <a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>(), <a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>()} ;
00394     ::IntersectRect (&amp;rc, &amp;rcImg, &amp;rc) ;
00395 }
00396 <span class="comment">//-----------------------------------------------------------------------------</span>
<a name="l00397"></a><a class="code" href="class_f_c_obj_image.html#z31_1">00397</a> <span class="keyword">inline</span> DWORD <a class="code" href="class_f_c_obj_image.html#z31_1">FCObjImage::GetPixelData</a> (<span class="keywordtype">int</span> x, <span class="keywordtype">int</span> y)<span class="keyword"> const</span>
00398 <span class="keyword"></span>{
00399     <span class="keywordflow">if</span> (!<a class="code" href="class_f_c_obj_image.html#z31_0">IsInside</a>(x, y))
00400         {assert(<span class="keyword">false</span>); <span class="keywordflow">return</span> 0;}
00401 
00402     <span class="keyword">const</span> BYTE   * pPixel = <a class="code" href="class_f_c_obj_image.html#z29_1">GetBits</a> (x,y) ;
00403     <span class="keywordflow">switch</span> (<a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>())
00404     {
00405         <span class="keywordflow">case</span>  1 : <span class="keywordflow">return</span> 0x01 &amp; (*pPixel &gt;&gt; (7 - (x &amp; 7))) ;
00406         <span class="keywordflow">case</span>  4 : <span class="keywordflow">return</span> 0x0F &amp; (*pPixel &gt;&gt; (x &amp; 1 ? 0 : 4)) ;
00407         <span class="keywordflow">case</span>  8 : <span class="keywordflow">return</span> *(BYTE*)pPixel ;
00408         <span class="keywordflow">case</span> 16 : <span class="keywordflow">return</span> *(WORD*)pPixel ;
00409         <span class="keywordflow">case</span> 24 :
00410             {
00411                 DWORD     dwrgb = 0 ;
00412                 <a class="code" href="class_f_c_color.html#e3">FCColor::CopyPixel</a> (&amp;dwrgb, pPixel, 3) ;
00413                 <span class="keywordflow">return</span> dwrgb ;
00414             }
00415         <span class="keywordflow">case</span> 32 : <span class="keywordflow">return</span> *(DWORD*)pPixel ;
00416         <span class="keywordflow">default</span> : assert(<span class="keyword">false</span>) ;
00417     }
00418     <span class="keywordflow">return</span> 0 ;
00419 }
00420 <span class="comment">//-----------------------------------------------------------------------------</span>
<a name="l00421"></a><a class="code" href="class_f_c_obj_image.html#z31_2">00421</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="class_f_c_obj_image.html#z31_2">FCObjImage::SetPixelData</a> (<span class="keywordtype">int</span> x, <span class="keywordtype">int</span> y, DWORD dwPixel)
00422 {
00423     <span class="keywordflow">if</span> (!<a class="code" href="class_f_c_obj_image.html#z31_0">IsInside</a>(x, y))
00424         {assert(<span class="keyword">false</span>); <span class="keywordflow">return</span>;}
00425 
00426     BYTE   * pPixel = <a class="code" href="class_f_c_obj_image.html#z29_1">GetBits</a> (x,y) ;
00427     <span class="keywordflow">switch</span> (<a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>())
00428     {
00429         <span class="keywordflow">case</span>  1 : *pPixel &amp;= ~(1     &lt;&lt; (7 - (x &amp; 7))) ;
00430                   *pPixel |= dwPixel &lt;&lt; (7 - (x &amp; 7)) ;
00431                   break ;
00432         <span class="keywordflow">case</span>  4 : *pPixel &amp;= 0x0F    &lt;&lt; (x &amp; 1 ? 4 : 0) ;
00433                   *pPixel |= dwPixel &lt;&lt; (x &amp; 1 ? 0 : 4) ;
00434                   break ;
00435         <span class="keywordflow">case</span>  8 :
00436         <span class="keywordflow">case</span> 16 :
00437         <span class="keywordflow">case</span> 24 :
00438         <span class="keywordflow">case</span> 32 : <a class="code" href="class_f_c_color.html#e3">FCColor::CopyPixel</a> (pPixel, &amp;dwPixel, <a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() / 8) ;
00439             break ;
00440         <span class="keywordflow">default</span> : assert(<span class="keyword">false</span>) ;
00441     }
00442 }
00443 <span class="comment">//-----------------------------------------------------------------------------</span>
<a name="l00444"></a><a class="code" href="class_f_c_obj_image.html#z33_0">00444</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="class_f_c_obj_image.html#z33_0">FCObjImage::GetColorTable</a> (<span class="keywordtype">int</span> iFirstIndex, <span class="keywordtype">int</span> iNumber, RGBQUAD* pColors)<span class="keyword"> const</span>
00445 <span class="keyword"></span>{
00446     <span class="keywordflow">if</span> (!<a class="code" href="class_f_c_obj_image.html#z29_0">IsValidImage</a>() || (<a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() &gt; 8) || (iFirstIndex &lt; 0) || !pColors || !m_pPalette)
00447         {assert(<span class="keyword">false</span>); <span class="keywordflow">return</span> <span class="keyword">false</span>;}
00448 
00449     <span class="keyword">const</span> <span class="keywordtype">int</span>   nColorNum = 1 &lt;&lt; <a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() ;
00450     <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0 ; i &lt; iNumber ; i++)
00451     {
00452         <span class="keywordtype">int</span>     nIndex = iFirstIndex + i ;
00453         <span class="keywordflow">if</span> (nIndex &lt; nColorNum)
00454             pColors[i] = m_pPalette[nIndex] ;
00455     }
00456     <span class="keywordflow">return</span> true ;
00457 }
00458 <span class="comment">//-----------------------------------------------------------------------------</span>
<a name="l00459"></a><a class="code" href="class_f_c_obj_image.html#z33_1">00459</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="class_f_c_obj_image.html#z33_1">FCObjImage::SetColorTable</a> (<span class="keywordtype">int</span> iFirstIndex, <span class="keywordtype">int</span> iNumber, RGBQUAD* pColors)
00460 {
00461     <span class="keywordflow">if</span> (!<a class="code" href="class_f_c_obj_image.html#z29_0">IsValidImage</a>() || (<a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() &gt; 8) || (iFirstIndex &lt; 0) || !pColors || !m_pPalette)
00462         {assert(<span class="keyword">false</span>); <span class="keywordflow">return</span> <span class="keyword">false</span>;}
00463 
00464     <span class="keyword">const</span> <span class="keywordtype">int</span>   nColorNum = 1 &lt;&lt; <a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() ;
00465     <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0 ; i &lt; iNumber ; i++)
00466     {
00467         <span class="keywordtype">int</span>     nIndex = iFirstIndex + i ;
00468         <span class="keywordflow">if</span> (nIndex &lt; nColorNum)
00469             m_pPalette[nIndex] = pColors[i] ;
00470     }
00471     <span class="keywordflow">return</span> true ;
00472 }
00473 <span class="comment">//-----------------------------------------------------------------------------</span>
<a name="l00474"></a><a class="code" href="class_f_c_obj_image.html#z33_2">00474</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="class_f_c_obj_image.html#z33_2">FCObjImage::CopyPalette</a> (<span class="keyword">const</span> <a class="code" href="class_f_c_obj_image.html">FCObjImage</a>&amp; imgSrc)
00475 {
00476     <span class="keywordflow">if</span> (!<a class="code" href="class_f_c_obj_image.html#z29_0">IsValidImage</a>() || (<a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() &gt; 8) || (<a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() != imgSrc.ColorBits()))
00477         {assert(<span class="keyword">false</span>); <span class="keywordflow">return</span>;}
00478 
00479     RGBQUAD   pPal[256] ;
00480     <span class="keywordtype">int</span>       nNum = 1 &lt;&lt; imgSrc.ColorBits() ;
00481     imgSrc.GetColorTable (0, nNum, pPal) ;
00482     <a class="code" href="class_f_c_obj_image.html#z33_1">SetColorTable</a> (0, nNum, pPal) ;
00483 }
00484 <span class="comment">//-----------------------------------------------------------------------------</span>
00485 <span class="keyword">inline</span> <span class="keywordtype">void</span> FCObjImage::__SetGrayPalette()
00486 {
00487     <span class="keywordflow">if</span> (!<a class="code" href="class_f_c_obj_image.html#z29_0">IsValidImage</a>() || (<a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() &gt; 8))
00488         {assert(<span class="keyword">false</span>); <span class="keywordflow">return</span>;}
00489 
00490     <span class="comment">// calculate palette</span>
00491     RGBQUAD     pPal[256] ;
00492     <span class="keyword">const</span> <span class="keywordtype">int</span>   nNum = 1 &lt;&lt; <a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>(),
00493                 nSpan = 255 / (nNum - 1) ;
00494     <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0 ; i &lt; nNum ; i++)
00495     {
00496         PCL_R(&amp;pPal[i]) = PCL_G(&amp;pPal[i]) = PCL_B(&amp;pPal[i]) = i * nSpan ;
00497     }
00498     <a class="code" href="class_f_c_obj_image.html#z33_1">SetColorTable</a> (0, nNum, pPal) ;
00499 }
00500 <span class="comment">//-----------------------------------------------------------------------------</span>
00501 <span class="keyword">inline</span> RGBQUAD FCObjImage::__Split16Bit_565 (WORD wPixel)
00502 {
00503     RGBQUAD     rgb ;
00504     PCL_R(&amp;rgb) = (MASK16_RED_565 &amp; wPixel) &gt;&gt; 8 ;
00505     PCL_G(&amp;rgb) = (MASK16_GREEN_565 &amp; wPixel) &gt;&gt; 3 ;
00506     PCL_B(&amp;rgb) = (MASK16_BLUE_565 &amp; wPixel) &lt;&lt; 3 ;
00507     <span class="keywordflow">return</span> rgb ;
00508 }
00509 <span class="keyword">inline</span> RGBQUAD FCObjImage::__Split16Bit_555 (WORD wPixel)
00510 {
00511     RGBQUAD     rgb ;
00512     PCL_R(&amp;rgb) = (MASK16_RED_555 &amp; wPixel) &gt;&gt; 7 ;
00513     PCL_G(&amp;rgb) = (MASK16_GREEN_555 &amp; wPixel) &gt;&gt; 2 ;
00514     PCL_B(&amp;rgb) = (MASK16_BLUE_555 &amp; wPixel) &lt;&lt; 3 ;
00515     <span class="keywordflow">return</span> rgb ;
00516 }
00517 <span class="comment">//-----------------------------------------------------------------------------</span>
00518 <span class="keyword">inline</span> <span class="keywordtype">void</span> FCObjImage::__ConvertToTrueColor (<span class="keywordtype">int</span> iColor)
00519 {
00520     <span class="keywordflow">if</span> (!<a class="code" href="class_f_c_obj_image.html#z29_0">IsValidImage</a>() || (<a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() == iColor))
00521         return ;
00522     if ((iColor != 24) &amp;&amp; (iColor != 32))
00523         {assert(<span class="keyword">false</span>); <span class="keywordflow">return</span>;}
00524 
00525     <span class="comment">// backup image</span>
00526     <span class="keyword">const</span> <a class="code" href="class_f_c_obj_image.html">FCObjImage</a>     OldPic (*<span class="keyword">this</span>) ;
00527     <span class="keywordflow">if</span> (!Create (OldPic.Width(), OldPic.Height(), iColor))
00528         return ;
00529 
00530     <span class="comment">// get palette</span>
00531     RGBQUAD     pPal[256] ;
00532     <span class="keywordflow">if</span> (OldPic.ColorBits() &lt;= 8)
00533         OldPic.GetColorTable (0, 1 &lt;&lt; OldPic.ColorBits(), pPal) ;
00534 
00535     <span class="comment">// start color convert</span>
00536     <span class="keyword">const</span> <span class="keywordtype">int</span>   nNewSpan = this-&gt;<a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() / 8, <span class="comment">// 3 or 4</span>
00537                 nOldSpan = OldPic.ColorBits() / 8 ;
00538     <span class="keywordflow">for</span> (<span class="keywordtype">int</span> y=0 ; y &lt; <a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>() ; y++)
00539     {
00540         <span class="keyword">const</span> BYTE   * pOld = OldPic.GetBits (y) ;
00541               BYTE   * pNew = this-&gt;<a class="code" href="class_f_c_obj_image.html#z29_1">GetBits</a> (y) ;
00542         <span class="keywordflow">for</span> (<span class="keywordtype">int</span> x=0 ; x &lt; <a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>() ; x++, pNew+=nNewSpan, pOld+=nOldSpan)
00543         {
00544             <span class="keywordflow">switch</span> (OldPic.ColorBits())
00545             {
00546                 <span class="keywordflow">case</span> 1 :
00547                 <span class="keywordflow">case</span> 4 :
00548                 <span class="keywordflow">case</span> 8 : <span class="comment">// 1,4,8 ==&gt; 24,32</span>
00549                     <a class="code" href="class_f_c_color.html#e3">FCColor::CopyPixel</a> (pNew, &amp;pPal[OldPic.GetPixelData(x,y)], 3) ;
00550                     break ;
00551                 <span class="keywordflow">case</span> 16 : <span class="comment">// 16 ==&gt; 24,32</span>
00552                     {
00553                         RGBQUAD     crTrans ;
00554                         <span class="keywordflow">if</span> (OldPic.m_dwBitFields[1] == MASK16_GREEN_555)
00555                             crTrans = __Split16Bit_555 (*(WORD*)pOld) ;
00556                         else if (OldPic.m_dwBitFields[1] == MASK16_GREEN_565)
00557                             crTrans = __Split16Bit_565 (*(WORD*)pOld) ;
00558                         <a class="code" href="class_f_c_color.html">FCColor</a>::CopyPixel (pNew, &amp;crTrans, 3) ;
00559                     }
00560                     break ;
00561                 case 24 :
00562                 case 32 : <span class="comment">// 24,32 ==&gt; 32,24</span>
00563                     <a class="code" href="class_f_c_color.html">FCColor</a>::CopyPixel (pNew, pOld, 3) ;
00564                     break ;
00565             }
00566         }
00567     }
00568     if (iColor == 32)
00569         SetAlphaChannelValue (0xFF) ; <span class="comment">// set alpha to 0xFF</span>
00570 }
00571 <span class="comment">//-----------------------------------------------------------------------------</span>
<a name="l00572"></a><a class="code" href="class_f_c_obj_image.html#z37_0">00572</a> inline <span class="keywordtype">void</span> <a class="code" href="class_f_c_obj_image.html">FCObjImage</a>::GetAlphaChannel (<a class="code" href="class_f_c_obj_image.html">FCObjImage</a>* imgAlpha)<span class="keyword"> const</span>
00573 <span class="keyword"></span>{
00574     <span class="comment">// create alpha-channel image, it's a 8-bit color image</span>
00575     <span class="keywordflow">if</span> (!imgAlpha || !<a class="code" href="class_f_c_obj_image.html#z29_0">IsValidImage</a>() || (<a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() != 32) || (imgAlpha == <span class="keyword">this</span>)
00576         || !imgAlpha-&gt;Create (<a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>(), <a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>(), 8))
00577     {
00578         assert(<span class="keyword">false</span>) ; return ;
00579     }
00580 
00581     <span class="comment">// get alpha channel</span>
00582     <span class="keywordflow">for</span> (<span class="keywordtype">int</span> y=0 ; y &lt; <a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>() ; y++)
00583         <span class="keywordflow">for</span> (<span class="keywordtype">int</span> x=0 ; x &lt; <a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>() ; x++)
00584             *imgAlpha-&gt;GetBits(x,y) = PCL_A(<a class="code" href="class_f_c_obj_image.html#z29_1">GetBits</a>(x,y)) ;
00585 }
00586 <span class="comment">//-----------------------------------------------------------------------------</span>
<a name="l00587"></a><a class="code" href="class_f_c_obj_image.html#z37_1">00587</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="class_f_c_obj_image.html#z37_1">FCObjImage::AppendAlphaChannel</a> (<span class="keyword">const</span> <a class="code" href="class_f_c_obj_image.html">FCObjImage</a>&amp; alpha)
00588 {
00589     <span class="keywordflow">if</span> (!<a class="code" href="class_f_c_obj_image.html#z29_0">IsValidImage</a>() || !alpha.IsValidImage() || (<a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() != 32) || (alpha.ColorBits() != 8) ||
00590         (<a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>() != alpha.Width()) || (<a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>() != alpha.Height()))
00591     {
00592         assert(<span class="keyword">false</span>) ; return ;
00593     }
00594 
00595     <span class="comment">// append alpha channel</span>
00596     <span class="keywordflow">for</span> (<span class="keywordtype">int</span> y=0 ; y &lt; <a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>() ; y++)
00597         <span class="keywordflow">for</span> (<span class="keywordtype">int</span> x=0 ; x &lt; <a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>() ; x++)
00598             PCL_A(<a class="code" href="class_f_c_obj_image.html#z29_1">GetBits</a>(x,y)) = *alpha.GetBits(x,y) ;
00599 }
00600 <span class="comment">//-----------------------------------------------------------------------------</span>
<a name="l00601"></a><a class="code" href="class_f_c_obj_image.html#z37_2">00601</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="class_f_c_obj_image.html#z37_2">FCObjImage::SetAlphaChannelValue</a> (<span class="keywordtype">int</span> nValue)
00602 {
00603     <span class="keywordflow">if</span> (!<a class="code" href="class_f_c_obj_image.html#z29_0">IsValidImage</a>() || (<a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() != 32))
00604     {
00605         assert(<span class="keyword">false</span>) ; return ;
00606     }
00607 
00608     <span class="keywordflow">for</span> (<span class="keywordtype">int</span> y=0 ; y &lt; <a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>() ; y++)
00609         <span class="keywordflow">for</span> (<span class="keywordtype">int</span> x=0 ; x &lt; <a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>() ; x++)
00610             PCL_A(<a class="code" href="class_f_c_obj_image.html#z29_1">GetBits</a>(x,y)) = nValue ;
00611 }
00612 <span class="comment">//-----------------------------------------------------------------------------</span>
00613 <span class="keyword">inline</span> <a class="code" href="class_f_c_obj_image.html">FCObjImage</a>&amp; FCObjImage::operator= (<span class="keyword">const</span> <a class="code" href="class_f_c_obj_image.html">FCObjImage</a>&amp; img)
00614 {
00615     <span class="keywordflow">if</span> (!img.IsValidImage() || (&amp;img == <span class="keyword">this</span>))
00616     {
00617         assert(<span class="keyword">false</span>); <span class="keywordflow">return</span> *<span class="keyword">this</span>;
00618     }
00619 
00620     <a class="code" href="class_p_c_l__array.html">PCL_array&lt;BITMAPINFOHEADER&gt;</a>   bmfh (img.NewImgInfoWithPalette()) ;
00621     <span class="keywordflow">if</span> (Create (bmfh.get()))
00622     {
00623         <span class="comment">// copy the pixels</span>
00624         memcpy (<a class="code" href="class_f_c_obj_image.html#z29_3">GetMemStart</a>(), img.GetMemStart(), img.GetPitch()*img.Height()) ;
00625         <span class="comment">// copy the palette</span>
00626         <span class="keywordflow">if</span> (img.ColorBits() &lt;= 8)
00627             <a class="code" href="class_f_c_obj_image.html#z33_2">CopyPalette</a> (img) ;
00628 
00629         <span class="comment">// copy extended property</span>
00630         m_nNextFrameDelay = img.m_nNextFrameDelay ;
00631 
00632         <span class="comment">// copy position</span>
00633         FCObjGraph::operator=(img) ;
00634     }
00635     <span class="keywordflow">return</span> *this ;
00636 }
00637 <span class="comment">//-----------------------------------------------------------------------------</span>
<a name="l00638"></a><a class="code" href="class_f_c_obj_image.html#z39_0">00638</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="class_f_c_obj_image.html#z39_0">FCObjImage::GetSubBlock</a> (<a class="code" href="class_f_c_obj_image.html">FCObjImage</a>* SubImg, RECT rcBlock)<span class="keyword"> const</span>
00639 <span class="keyword"></span>{
00640     <span class="keywordflow">if</span> (!<a class="code" href="class_f_c_obj_image.html#z29_0">IsValidImage</a>() || !SubImg || (SubImg == <span class="keyword">this</span>) || (<a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() &lt; 8))
00641     {
00642         assert(<span class="keyword">false</span>); <span class="keywordflow">return</span> <span class="keyword">false</span>;
00643     }
00644 
00645     <span class="keyword">const</span> RECT   rcImage = {0, 0, <a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>(), <a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>()} ;
00646           RECT   rcD ;
00647     assert (IsRectInRect (rcImage, rcBlock)) ;
00648     <span class="keywordflow">if</span> (::IntersectRect (&amp;rcD, &amp;rcImage, &amp;rcBlock) == 0)
00649     {
00650         assert(<span class="keyword">false</span>); <span class="keywordflow">return</span> <span class="keyword">false</span>; <span class="comment">// rect of destination is empty</span>
00651     }
00652 
00653     <span class="keywordflow">if</span> (!SubImg-&gt;Create (RECTWIDTH(rcD), RECTHEIGHT(rcD), <a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>()))
00654         <span class="keywordflow">return</span> false ;
00655 
00656     <span class="comment">// copy pixel</span>
00657     <span class="keyword">const</span> <span class="keywordtype">int</span>     nSubPitch = SubImg-&gt;Width() * <a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() / 8 ;
00658     <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0 ; i &lt; SubImg-&gt;<a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>() ; i++)
00659         memcpy (SubImg-&gt;GetBits(i), <a class="code" href="class_f_c_obj_image.html#z29_1">GetBits</a>(rcD.left, rcD.top + i), nSubPitch) ;
00660 
00661     <span class="comment">// copy palette</span>
00662     <span class="keywordflow">if</span> (<a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() &lt;= 8)
00663         SubImg-&gt;CopyPalette (*<span class="keyword">this</span>) ;
00664 
00665     <span class="comment">// set relative position</span>
00666     SubImg-&gt;<a class="code" href="class_f_c_obj_graph.html#z21_0">SetGraphObjPos</a> (rcD.left, rcD.top) ;
00667     <span class="keywordflow">return</span> true ;
00668 }
00669 <span class="comment">//-----------------------------------------------------------------------------</span>
<a name="l00670"></a><a class="code" href="class_f_c_obj_image.html#z39_1">00670</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="class_f_c_obj_image.html#z39_1">FCObjImage::CoverBlock</a> (<span class="keyword">const</span> <a class="code" href="class_f_c_obj_image.html">FCObjImage</a>&amp; Img, <span class="keywordtype">int</span> x, <span class="keywordtype">int</span> y)
00671 {
00672     <span class="keywordflow">if</span> (!<a class="code" href="class_f_c_obj_image.html#z29_0">IsValidImage</a>() || !Img.IsValidImage() || (<a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() != Img.ColorBits()) || (<a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() &lt; 8))
00673     {
00674         assert(<span class="keyword">false</span>); <span class="keywordflow">return</span> <span class="keyword">false</span>;
00675     }
00676 
00677     <span class="comment">// calculate covered RECT</span>
00678     <span class="keyword">const</span> RECT   rcImage = {0, 0, <a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>(), <a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>()},
00679                  rcCover = {x, y, x+Img.Width(), y+Img.Height()} ;
00680     RECT         rcD ;
00681     <span class="keywordflow">if</span> (::IntersectRect (&amp;rcD, &amp;rcImage, &amp;rcCover) == 0)
00682         <span class="keywordflow">return</span> false ; <span class="comment">// rect of destination is empty</span>
00683 
00684     <span class="comment">// copy pixel</span>
00685     <span class="keyword">const</span> <span class="keywordtype">int</span>     nSubPitch = RECTWIDTH(rcD) * Img.ColorBits() / 8 ;
00686     <span class="keywordflow">for</span> (<span class="keywordtype">int</span> cy=rcD.top ; cy &lt; rcD.bottom ; cy++) <span class="comment">// copy</span>
00687     {
00688         <span class="keyword">const</span> BYTE   * pS = Img.GetBits (rcD.left-x, cy-y) ; <span class="comment">// calculate edge</span>
00689               BYTE   * pD = this-&gt;<a class="code" href="class_f_c_obj_image.html#z29_1">GetBits</a> (rcD.left, cy) ;
00690         memcpy (pD, pS, nSubPitch) ;
00691     }
00692     <span class="keywordflow">return</span> true ;
00693 }
00694 <span class="comment">//-----------------------------------------------------------------------------</span>
00695 <span class="keyword">inline</span> <span class="keywordtype">void</span> FCObjImage::TileBlock (<span class="keyword">const</span> <a class="code" href="class_f_c_obj_image.html">FCObjImage</a> &amp; Img, <span class="keywordtype">int</span> x, <span class="keywordtype">int</span> y)
00696 {
00697     <span class="keywordtype">int</span>   nYStart = y ;
00698     <span class="keywordflow">while</span> (nYStart &lt; <a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>())
00699     {
00700         <span class="keywordtype">int</span>    nXStart = x ;
00701         <span class="keywordflow">while</span> (nXStart &lt; <a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>())
00702         {
00703             <a class="code" href="class_f_c_obj_image.html#z39_1">CoverBlock</a> (Img, nXStart, nYStart) ; <span class="comment">// security ensured by CoverBlock</span>
00704             nXStart += Img.Width() ;
00705         }
00706         nYStart += Img.Height() ;
00707     }
00708 }
00709 <span class="comment">//-----------------------------------------------------------------------------</span>
<a name="l00710"></a><a class="code" href="class_f_c_obj_image.html#z39_4">00710</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="class_f_c_obj_image.html#z39_4">FCObjImage::CombineImage</a> (<span class="keyword">const</span> <a class="code" href="class_f_c_obj_image.html">FCObjImage</a>&amp; Img32, <span class="keywordtype">int</span> x, <span class="keywordtype">int</span> y, <span class="keywordtype">int</span> nAlphaPercent)
00711 {
00712     RECT   rcD ;
00713     {
00714         RECT   rcImg = {0, 0, <a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>(), <a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>()},
00715                rcMask = {x, y, x+Img32.Width(), y+Img32.Height()} ;
00716         ::IntersectRect (&amp;rcD, &amp;rcImg, &amp;rcMask) ;
00717     }
00718     <span class="keywordflow">if</span> ((Img32.ColorBits() != 32) || (<a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() != 32) || IsRectEmpty(&amp;rcD))
00719     {
00720         assert(<span class="keyword">false</span>); <span class="keywordflow">return</span>;
00721     }
00722 
00723     nAlphaPercent = FClamp (nAlphaPercent, 0, 100) ;
00724     <span class="keywordflow">for</span> (<span class="keywordtype">int</span> cy=rcD.top ; cy &lt; rcD.bottom ; cy++)
00725     {
00726         RGBQUAD   * pDest = (RGBQUAD*)this-&gt;<a class="code" href="class_f_c_obj_image.html#z29_1">GetBits</a> (rcD.left, cy),
00727                   * pSrc = (RGBQUAD*)Img32.GetBits (rcD.left-x, cy-y) ; <span class="comment">// calculate edge</span>
00728         <span class="keywordflow">for</span> (<span class="keywordtype">int</span> cx=rcD.left ; cx &lt; rcD.right ; cx++, pDest++, pSrc++)
00729             <a class="code" href="class_f_c_color.html#e0">FCColor::CombineAlphaPixel</a>(pDest, *pDest, *pSrc,
00730                                        (nAlphaPercent == 100) ? PCL_A(pSrc)
00731                                                               : (PCL_A(pSrc)*nAlphaPercent/100)) ;
00732     }
00733 }
00734 <span class="comment">//-----------------------------------------------------------------------------</span>
00735 <span class="comment">// alpha�����ͼ��������࣬����Ч�ʺͰ�ȫ�Թ�ϵ���������</span>
00736 <span class="comment">// ����Ҳ���ô�鷳�Ĵ���֮</span>
00737 <span class="comment">// rcSrcһ��Ҫ��MaskImg32�ڲ���rcDest�����ཻ</span>
<a name="l00738"></a><a class="code" href="class_f_c_obj_image.html#z39_3">00738</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="class_f_c_obj_image.html#z39_3">FCObjImage::AlphaBlend</a> (<span class="keyword">const</span> <a class="code" href="class_f_c_obj_image.html">FCObjImage</a>&amp; Img32, <span class="keyword">const</span> RECT&amp; rcDest, <span class="keyword">const</span> RECT&amp; rcSrc, <span class="keywordtype">int</span> nAlphaPercent)
00739 {
00740     <span class="keywordflow">if</span> (nAlphaPercent == 0)
00741         return ;
00742 
00743     <span class="comment">// parameter check, rcSrcһ��Ҫ��MaskImg32�ڲ�</span>
00744     <span class="keyword">const</span> RECT   rcMask = {0, 0, Img32.Width(), Img32.Height()},
00745                  rcImg = {0, 0, <a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>(), <a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>()} ;
00746     RECT         rcT ;
00747     IntersectRect(&amp;rcT, &amp;rcDest, &amp;rcImg) ;
00748     <span class="keywordflow">if</span> (!<a class="code" href="class_f_c_obj_image.html#z29_0">IsValidImage</a>() || (<a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() &lt; 24) || !Img32.IsValidImage() || (Img32.ColorBits() != 32) ||
00749         !IsRectInRect (rcMask, rcSrc) || IsRectEmpty(&amp;rcT))
00750     {
00751         assert(<span class="keyword">false</span>); <span class="keywordflow">return</span>;
00752     }
00753 
00754     nAlphaPercent = FClamp (nAlphaPercent, 0, 100) ;
00755     <span class="keyword">const</span> <span class="keywordtype">int</span>   nSpan = <a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() / 8 ; <span class="comment">// 3 or 4</span>
00756     <span class="keywordflow">if</span> ((RECTWIDTH(rcDest) == RECTWIDTH(rcSrc)) &amp;&amp; (RECTHEIGHT(rcDest) == RECTHEIGHT(rcSrc)))
00757     {
00758         <span class="keyword">const</span> <span class="keywordtype">int</span>   nSrcX = rcT.left - rcDest.left + rcSrc.left ;
00759         <span class="keywordflow">for</span> (<span class="keywordtype">int</span> y=rcT.top ; y &lt; rcT.bottom ; y++)
00760         {
00761             <span class="keyword">const</span> BYTE  * pSrc = Img32.GetBits (nSrcX, y-rcDest.top+rcSrc.top) ; <span class="comment">// calculate edge</span>
00762             BYTE        * pDest = this-&gt;<a class="code" href="class_f_c_obj_image.html#z29_1">GetBits</a> (rcT.left, y) ;
00763             <span class="keywordflow">for</span> (<span class="keywordtype">int</span> x=rcT.left ; x &lt; rcT.right ; x++, pDest+=nSpan, pSrc+=4)
00764                 <a class="code" href="class_f_c_color.html#e1">FCColor::AlphaBlendPixel</a> (pDest, pSrc, (nAlphaPercent==100) ? PCL_A(pSrc)
00765                                                                             : PCL_A(pSrc)*nAlphaPercent/100) ;
00766         }
00767     }
00768     <span class="keywordflow">else</span>
00769     {
00770         <a class="code" href="class_p_c_l__array.html">PCL_array&lt;int&gt;</a>   pX (RECTWIDTH(rcT)),
00771                          pY (RECTHEIGHT(rcT)) ;
00772         <span class="keywordtype">int</span>              x, y ;
00773 
00774         <span class="keywordflow">for</span> (y=rcT.top ; y &lt; rcT.bottom ; y++)
00775             pY[y-rcT.top] = rcSrc.top+(y-rcDest.top)*RECTHEIGHT(rcSrc)/RECTHEIGHT(rcDest) ;
00776         <span class="keywordflow">for</span> (x=rcT.left ; x &lt; rcT.right ; x++)
00777             pX[x-rcT.left] = rcSrc.left+(x-rcDest.left)*RECTWIDTH(rcSrc)/RECTWIDTH(rcDest) ;
00778 
00779         <span class="keywordflow">for</span> (y=rcT.top ; y &lt; rcT.bottom ; y++)
00780         {
00781             BYTE   * pDest = this-&gt;<a class="code" href="class_f_c_obj_image.html#z29_1">GetBits</a> (rcT.left, y) ;
00782             <span class="keywordflow">for</span> (x=rcT.left ; x &lt; rcT.right ; x++, pDest+=nSpan)
00783             {
00784                 <span class="keyword">const</span> BYTE   * pSrc = Img32.GetBits (pX[x-rcT.left], pY[y-rcT.top]) ;
00785                 <a class="code" href="class_f_c_color.html#e1">FCColor::AlphaBlendPixel</a> (pDest, pSrc, (nAlphaPercent==100) ? PCL_A(pSrc)
00786                                                                             : PCL_A(pSrc)*nAlphaPercent/100) ;
00787             }
00788         }
00789     }
00790 }
00791 <span class="comment">//-----------------------------------------------------------------------------</span>
00792 <span class="keyword">inline</span> <span class="keywordtype">void</span> FCObjImage::LogicalBlend (<span class="keyword">const</span> <a class="code" href="class_f_c_obj_image.html">FCObjImage</a> &amp; MaskImg, LOGICAL_OP LogOP, <span class="keywordtype">int</span> x, <span class="keywordtype">int</span> y)
00793 {
00794     <span class="keywordflow">if</span> (!<a class="code" href="class_f_c_obj_image.html#z29_0">IsValidImage</a>() || !MaskImg.IsValidImage() || (<a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() != MaskImg.ColorBits()) || (<span class="keyword">this</span> == &amp;MaskImg))
00795     {
00796         assert(<span class="keyword">false</span>) ; return ;
00797     }
00798     assert (<a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() == 8) ;
00799 
00800     <span class="keyword">const</span> RECT   rcSrc1 = {0, 0, <a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>(), <a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>()},
00801                  rcSrc2 = {x, y, x+MaskImg.Width(), y+MaskImg.Height()} ;
00802     RECT         rcDest ;
00803     <span class="keywordflow">if</span> (::IntersectRect (&amp;rcDest, &amp;rcSrc1, &amp;rcSrc2) == 0)
00804         return ; <span class="comment">// no intersected rect</span>
00805 
00806     const <span class="keywordtype">int</span>   nSpan = ColorBits() / 8; <span class="comment">// 1,2,3,4</span>
00807     for (<span class="keywordtype">int</span> cy=rcDest.top ; cy &lt; rcDest.bottom ; cy++)
00808     {
00809         <span class="keyword">const</span> BYTE   * pSrc = MaskImg.GetBits (rcDest.left-x, cy-y) ; <span class="comment">// calculate edge</span>
00810               BYTE   * pDest = this-&gt;<a class="code" href="class_f_c_obj_image.html#z29_1">GetBits</a> (rcDest.left, cy) ;
00811         <span class="keywordflow">for</span> (<span class="keywordtype">int</span> cx=rcDest.left ; cx &lt; rcDest.right ; cx++, pDest+=nSpan, pSrc+=nSpan)
00812             switch (LogOP)
00813             {
00814                 <span class="keywordflow">case</span> LOGI_OR  : *pDest |= *pSrc ; break ;
00815                 <span class="keywordflow">case</span> LOGI_AND : *pDest &amp;= *pSrc ; break ;
00816                 <span class="keywordflow">case</span> LOGI_XOR : *pDest ^= *pSrc ; break ;
00817                 <span class="keywordflow">case</span> LOGI_SEL_ADD :
00818                     <span class="keywordflow">if</span> (*pSrc == 0xFF)
00819                         *pDest = 0xFF ;
00820                     break ;
00821                 <span class="keywordflow">case</span> LOGI_SEL_SUB :
00822                     <span class="keywordflow">if</span> (*pSrc == 0xFF)
00823                         *pDest = 0 ;
00824                     break ;
00825                 <span class="keywordflow">default</span> : assert(<span class="keyword">false</span>);
00826             }
00827     }
00828 }
00829 <span class="comment">//-----------------------------------------------------------------------------</span>
<a name="l00830"></a><a class="code" href="class_f_c_obj_image.html#a0">00830</a> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="class_f_c_obj_image.html#a0">FCObjImage::Serialize</a> (<span class="keywordtype">bool</span> bSave, BYTE* pSave)
00831 {
00832     <span class="keyword">const</span> BYTE   * pBak = pSave ;
00833     <span class="keywordflow">if</span> (bSave) <span class="comment">// save</span>
00834     {
00835         assert (<a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() &gt; 8) ; <span class="comment">// must true color image</span>
00836         memcpy (pSave, &amp;m_DibInfo, <span class="keyword">sizeof</span>(m_DibInfo)) ; pSave += <span class="keyword">sizeof</span>(m_DibInfo) ;
00837         memcpy (pSave, m_dwBitFields, 12) ; pSave += 12 ;
00838 
00839         <span class="keywordtype">int</span>     nWrite = <a class="code" href="class_f_c_obj_image.html#z29_7">GetPitch</a>() * <a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>() ;
00840         memcpy (pSave, <a class="code" href="class_f_c_obj_image.html#z29_3">GetMemStart</a>(), nWrite) ; pSave += nWrite ;
00841     }
00842     <span class="keywordflow">else</span> <span class="comment">// load</span>
00843     {
00844         <a class="code" href="class_f_c_obj_image.html#z27_0">Create</a> ((BITMAPINFOHEADER*)pSave) ;
00845         pSave += <span class="keyword">sizeof</span>(m_DibInfo) + 12 ;
00846 
00847         <span class="keywordtype">int</span>     nWrite = <a class="code" href="class_f_c_obj_image.html#z29_7">GetPitch</a>() * <a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>() ;
00848         memcpy (<a class="code" href="class_f_c_obj_image.html#z29_3">GetMemStart</a>(), pSave, nWrite) ;
00849         pSave += nWrite ;
00850     }
00851     pSave += <a class="code" href="class_f_c_obj_graph.html#a2">FCObjGraph::Serialize</a> (bSave, pSave) ;
00852     <span class="keywordflow">return</span> (<span class="keywordtype">int</span>)(pSave - pBak) ;
00853 }
00854 <span class="comment">//-----------------------------------------------------------------------------</span>
<a name="l00855"></a><a class="code" href="class_f_c_obj_image.html#z41_0">00855</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="class_f_c_obj_image.html#z41_0">FCObjImage::Load</a> (<a class="code" href="class_f_c_image_handle_base.html">FCImageHandleBase</a>* pHandler)
00856 {
00857     std::deque&lt;FCObjImage*&gt;   imgList ;
00858     <span class="keywordflow">if</span> (pHandler)
00859         imgList = pHandler-&gt;GetLoadImage(<span class="keyword">false</span>) ;
00860     <span class="keywordflow">if</span> (imgList.empty())
00861         <span class="keywordflow">return</span> false ;
00862 
00863     *<span class="keyword">this</span> = *imgList[0] ;
00864     <span class="keywordflow">return</span> true ;
00865 }
00866 <span class="comment">//-----------------------------------------------------------------------------</span>
<a name="l00867"></a><a class="code" href="class_f_c_obj_image.html#z41_1">00867</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="class_f_c_obj_image.html#z41_0">FCObjImage::Load</a> (<span class="keyword">const</span> <span class="keywordtype">char</span>* szFileName)
00868 {
00869     IMAGE_TYPE     imgType = <a class="code" href="class_f_c_o_x_o_helper.html#e1">FCOXOHelper::GetImageTypeFromName</a>(szFileName) ;
00870     std::auto_ptr&lt;FCImageHandleBase&gt;  pHandler (<a class="code" href="class_f_c_obj_image.html#z41_6">GetImageHandleFactory</a>()-&gt;CreateImageHandle(imgType)) ;
00871     <span class="keywordflow">if</span> (!pHandler.get())
00872         <span class="keywordflow">return</span> false ;
00873 
00874     <span class="keywordtype">bool</span>     bRet = pHandler-&gt;LoadImageFile (szFileName) ;
00875     <span class="keywordflow">if</span> (bRet)
00876         bRet = this-&gt;<a class="code" href="class_f_c_obj_image.html#z41_0">Load</a> (pHandler.get()) ;
00877     assert (bRet) ;
00878     <span class="keywordflow">return</span> bRet ;
00879 }
00880 <span class="comment">//-----------------------------------------------------------------------------</span>
<a name="l00881"></a><a class="code" href="class_f_c_obj_image.html#z41_2">00881</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="class_f_c_obj_image.html#z41_0">FCObjImage::Load</a> (BYTE* pStart, <span class="keywordtype">int</span> iFileSize, IMAGE_TYPE imgType)
00882 {
00883     std::auto_ptr&lt;FCImageHandleBase&gt;  pHandler (<a class="code" href="class_f_c_obj_image.html#z41_6">GetImageHandleFactory</a>()-&gt;CreateImageHandle(imgType)) ;
00884     <span class="keywordflow">if</span> (!pHandler.get())
00885         <span class="keywordflow">return</span> false ;
00886 
00887     <span class="keywordtype">bool</span>     bRet = pHandler-&gt;LoadImageMemory (pStart, iFileSize) ;
00888     <span class="keywordflow">if</span> (bRet)
00889         bRet = this-&gt;<a class="code" href="class_f_c_obj_image.html#z41_0">Load</a> (pHandler.get()) ;
00890     assert (bRet) ;
00891     <span class="keywordflow">return</span> bRet ;
00892 }
00893 <span class="comment">//-----------------------------------------------------------------------------</span>
<a name="l00894"></a><a class="code" href="class_f_c_obj_image.html#z41_3">00894</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="class_f_c_obj_image.html#z41_3">FCObjImage::Save</a> (<a class="code" href="class_f_c_image_handle_base.html">FCImageHandleBase</a>* pHandler, <span class="keyword">const</span> <span class="keywordtype">char</span>* szFileName, <span class="keywordtype">int</span> nFlag)<span class="keyword"> const</span>
00895 <span class="keyword"></span>{
00896     <span class="keywordflow">if</span> (!<a class="code" href="class_f_c_obj_image.html#z29_0">IsValidImage</a>() || !pHandler || !szFileName)
00897         <span class="keywordflow">return</span> false ;
00898 
00899     <span class="comment">// push current image to save list</span>
00900     pHandler-&gt;PushSaveList(<span class="keyword">this</span>) ;
00901     <span class="keywordtype">bool</span>   bRet = pHandler-&gt;SaveImage (szFileName, nFlag) ;
00902     assert(bRet) ;
00903     <span class="keywordflow">return</span> bRet ;
00904 }
00905 <span class="comment">//-----------------------------------------------------------------------------</span>
<a name="l00906"></a><a class="code" href="class_f_c_obj_image.html#z41_4">00906</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="class_f_c_obj_image.html#z41_3">FCObjImage::Save</a> (<span class="keyword">const</span> <span class="keywordtype">char</span>* szFileName, <span class="keywordtype">int</span> nFlag)<span class="keyword"> const</span>
00907 <span class="keyword"></span>{
00908     <span class="keywordflow">if</span> (!<a class="code" href="class_f_c_obj_image.html#z29_0">IsValidImage</a>() || !szFileName)
00909         <span class="keywordflow">return</span> false ;
00910 
00911     IMAGE_TYPE     imgType = <a class="code" href="class_f_c_o_x_o_helper.html#e1">FCOXOHelper::GetImageTypeFromName</a>(szFileName) ;
00912     std::auto_ptr&lt;FCImageHandleBase&gt;  pHandler (<a class="code" href="class_f_c_obj_image.html#z41_6">GetImageHandleFactory</a>()-&gt;CreateImageHandle(imgType)) ;
00913     <span class="keywordflow">if</span> (!pHandler.get())
00914         <span class="keywordflow">return</span> false ;
00915 
00916     <span class="keywordflow">return</span> this-&gt;<a class="code" href="class_f_c_obj_image.html#z41_3">Save</a> (pHandler.get(), szFileName, nFlag) ;
00917 }
00918 <span class="comment">//-----------------------------------------------------------------------------</span>
00919 <span class="keyword">inline</span> <span class="keywordtype">void</span> FCObjImage::__FillImageRect (<span class="keyword">const</span> <a class="code" href="class_f_c_obj_image.html">FCObjImage</a>&amp; img, <span class="keyword">const</span> RECT&amp; rcBlock, <span class="keyword">const</span> <span class="keywordtype">void</span>* pSrc)
00920 {
00921     RECT     rc = {0, 0, img.Width(), img.Height()} ;
00922     IntersectRect (&amp;rc, &amp;rc, &amp;rcBlock) ;
00923     <span class="keywordflow">if</span> (IsRectEmpty(&amp;rc))
00924         return  ;
00925 
00926     const <span class="keywordtype">int</span>   nSpan = img.ColorBits() / 8 ; <span class="comment">// 1, 2, 3, 4</span>
00927     for (<span class="keywordtype">int</span> y=rc.top ; y &lt; rc.bottom ; y++)
00928     {
00929         BYTE   * pPixel = img.GetBits (rc.left, y) ;
00930         <span class="keywordflow">for</span> (<span class="keywordtype">int</span> x=rc.left ; x &lt; rc.right ; x++, pPixel += nSpan)
00931             <a class="code" href="class_f_c_color.html">FCColor</a>::CopyPixel (pPixel, pSrc, nSpan) ;
00932     }
00933 }
00934 <span class="comment">// add frame</span>
00935 <span class="comment">// bCopyEdge: duplicate edge during copying</span>
<a name="l00936"></a><a class="code" href="class_f_c_obj_image.html#z39_6">00936</a> inline <span class="keywordtype">void</span> <a class="code" href="class_f_c_obj_image.html">FCObjImage</a>::ExpandFrame (<span class="keywordtype">bool</span> bCopyEdge, <span class="keywordtype">int</span> iLeft, <span class="keywordtype">int</span> iTop, <span class="keywordtype">int</span> iRight, <span class="keywordtype">int</span> iBottom)
00937 {
00938     <span class="keywordflow">if</span> ((<a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() &lt; 8) || (iLeft &lt; 0) || (iTop &lt; 0) || (iRight &lt; 0) || (iBottom &lt; 0))
00939     {
00940         assert(<span class="keyword">false</span>) ; return ;
00941     }
00942     <span class="keywordflow">if</span> ((iLeft == 0) &amp;&amp; (iTop == 0) &amp;&amp; (iRight == 0) &amp;&amp; (iBottom == 0))
00943         return ;
00944 
00945     <span class="comment">// backup image then create expanded image</span>
00946     <span class="keyword">const</span> <a class="code" href="class_f_c_obj_image.html">FCObjImage</a>     imgOld(*<span class="keyword">this</span>) ;
00947     <span class="keywordflow">if</span> (!<a class="code" href="class_f_c_obj_image.html#z27_0">Create</a> (imgOld.<a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>()+iLeft+iRight, imgOld.<a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>()+iTop+iBottom, imgOld.<a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>()))
00948     {
00949         assert(<span class="keyword">false</span>) ; return ;
00950     }
00951 
00952     <span class="comment">// adjust image's position</span>
00953     <a class="code" href="class_f_c_obj_graph.html#z21_0">SetGraphObjPos</a> (imgOld.<a class="code" href="class_f_c_obj_graph.html#z21_2">GetGraphObjPos</a>().x - iLeft, imgOld.<a class="code" href="class_f_c_obj_graph.html#z21_2">GetGraphObjPos</a>().y - iTop) ;
00954 
00955     <span class="comment">// duplicate source image</span>
00956     <a class="code" href="class_f_c_obj_image.html#z39_1">CoverBlock</a> (imgOld, iLeft, iTop) ;
00957 
00958     <span class="comment">// edge disposal</span>
00959     <span class="keywordflow">if</span> (!bCopyEdge)
00960         return ;
00961 
00962     <span class="comment">// duplicate corner</span>
00963     <span class="keyword">const</span> RECT   rcUL = {0, 0, iTop, iLeft},
00964                  rcUR = {<a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>()-iRight, 0, <a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>(), iTop},
00965                  rcDL = {0, <a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>()-iBottom, iLeft, <a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>()},
00966                  rcDR = {<a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>()-iRight, <a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>()-iBottom, <a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>(), <a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>()} ;
00967     __FillImageRect (*<span class="keyword">this</span>, rcUL, imgOld.<a class="code" href="class_f_c_obj_image.html#z29_1">GetBits</a> (0, 0)) ;
00968     __FillImageRect (*<span class="keyword">this</span>, rcUR, imgOld.<a class="code" href="class_f_c_obj_image.html#z29_1">GetBits</a> (imgOld.<a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>()-1, 0)) ;
00969     __FillImageRect (*<span class="keyword">this</span>, rcDL, imgOld.<a class="code" href="class_f_c_obj_image.html#z29_1">GetBits</a> (0, imgOld.<a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>()-1)) ;
00970     __FillImageRect (*<span class="keyword">this</span>, rcDR, imgOld.<a class="code" href="class_f_c_obj_image.html#z29_1">GetBits</a> (imgOld.<a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>()-1, imgOld.<a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>()-1)) ;
00971 
00972     <span class="comment">// duplicate four-edge</span>
00973     <span class="keyword">const</span> <span class="keywordtype">int</span>   dwPitch = <a class="code" href="class_f_c_obj_image.html#z29_7">GetPitch</a>(),
00974                 nSpan = <a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() / 8,
00975                 nOldLineBytes = imgOld.<a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>() * nSpan ;
00976     <span class="keywordtype">int</span>         m ;
00977     BYTE        * pSrc, * pDest ;
00978 
00979     <span class="comment">// up</span>
00980     pSrc = <a class="code" href="class_f_c_obj_image.html#z29_1">GetBits</a> (iLeft, iTop) ;
00981     pDest = pSrc + dwPitch ;
00982     <span class="keywordflow">for</span> (m=0 ; m &lt; iTop ; m++, pDest += dwPitch)
00983         memcpy (pDest, pSrc, nOldLineBytes) ;
00984     <span class="comment">// bottom</span>
00985     pSrc = <a class="code" href="class_f_c_obj_image.html#z29_1">GetBits</a> (iLeft, imgOld.<a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>() + iTop - 1) ;
00986     pDest = pSrc - dwPitch ;
00987     <span class="keywordflow">for</span> (m=0 ; m &lt; iBottom ; m++, pDest -= dwPitch)
00988         memcpy (pDest, pSrc, nOldLineBytes) ;
00989 
00990     <span class="comment">// left</span>
00991     pSrc = <a class="code" href="class_f_c_obj_image.html#z29_1">GetBits</a> (iLeft, iTop) ;
00992     pDest = <a class="code" href="class_f_c_obj_image.html#z29_1">GetBits</a> (0, iTop) ;
00993     <span class="keywordflow">for</span> (m=0 ; m &lt; imgOld.<a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>() ; m++, pDest -= dwPitch, pSrc -= dwPitch)
00994     {
00995         BYTE     * pTemp = pDest ;
00996         <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0 ; i &lt; iLeft ; i++, pTemp += nSpan)
00997             <a class="code" href="class_f_c_color.html#e3">FCColor::CopyPixel</a> (pTemp, pSrc, nSpan) ;
00998     }
00999     <span class="comment">// right</span>
01000     pSrc = <a class="code" href="class_f_c_obj_image.html#z29_1">GetBits</a> (iLeft + imgOld.<a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>() - 1, iTop) ;
01001     pDest = pSrc + nSpan ;
01002     <span class="keywordflow">for</span> (m=0 ; m &lt; imgOld.<a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>() ; m++, pDest -= dwPitch, pSrc -= dwPitch)
01003     {
01004         BYTE     * pTemp = pDest ;
01005         <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0 ; i &lt; iRight ; i++, pTemp += nSpan)
01006             <a class="code" href="class_f_c_color.html#e3">FCColor::CopyPixel</a> (pTemp, pSrc, nSpan) ;
01007     }
01008 }
01009 <span class="comment">//-----------------------------------------------------------------------------</span>
01010 <span class="comment">// stretch (&gt;=8 bit)</span>
<a name="l01011"></a><a class="code" href="class_f_c_obj_image.html#z39_7">01011</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="class_f_c_obj_image.html#z39_7">FCObjImage::Stretch</a> (<span class="keywordtype">int</span> nNewWidth, <span class="keywordtype">int</span> nNewHeight)
01012 {
01013     <span class="comment">// parameter check</span>
01014     <span class="keywordflow">if</span> (!<a class="code" href="class_f_c_obj_image.html#z29_0">IsValidImage</a>() || (nNewWidth &lt;= 0) || (nNewHeight &lt;= 0) || (<a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() &lt; 8))
01015     {
01016         assert(<span class="keyword">false</span>) ; return ;
01017     }
01018     <span class="keywordflow">if</span> ((nNewWidth == <a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>()) &amp;&amp; (nNewHeight == <a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>()))
01019         return ;
01020 
01021     <span class="comment">// first backup image</span>
01022     <span class="keyword">const</span> <a class="code" href="class_f_c_obj_image.html">FCObjImage</a>     imgOld(*<span class="keyword">this</span>) ;
01023     <span class="keywordflow">if</span> (!<a class="code" href="class_f_c_obj_image.html#z27_0">Create</a> (nNewWidth, nNewHeight, imgOld.<a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>()))
01024     {
01025         assert(<span class="keyword">false</span>) ; return ;
01026     }
01027 
01028     <span class="comment">// duplicate palette</span>
01029     <span class="keywordflow">if</span> (<a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() &lt;= 8)
01030         <a class="code" href="class_f_c_obj_image.html#z33_2">CopyPalette</a> (imgOld) ;
01031 
01032     <span class="comment">// initialize index table</span>
01033     <span class="keyword">const</span> <span class="keywordtype">int</span>        nSpan = <a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() / 8 ;
01034     <a class="code" href="class_p_c_l__array.html">PCL_array&lt;int&gt;</a>   pTabX (<a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>()) ;
01035     <span class="keywordflow">for</span> (<span class="keywordtype">int</span> xx=0 ; xx &lt; <a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>() ; xx++)
01036     {
01037         pTabX[xx] = xx * imgOld.<a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>() / <a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>() ; <span class="comment">// force to omit float</span>
01038         assert (pTabX[xx] &lt; imgOld.<a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>()) ;
01039     }
01040     <span class="keywordflow">for</span> (<span class="keywordtype">int</span> mm=0 ; mm &lt; (<a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>() - 1) ; mm++)
01041         pTabX[mm] = (pTabX[mm+1] - pTabX[mm]) * nSpan ;
01042     <span class="comment">// pTabX�����ڴ��X�������ֽڲ�</span>
01043 
01044     <span class="keywordflow">for</span> (<span class="keywordtype">int</span> y=0 ; y &lt; <a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>() ; y++)
01045     {
01046         <span class="keyword">const</span> BYTE   * pOld = imgOld.<a class="code" href="class_f_c_obj_image.html#z29_1">GetBits</a> (y * imgOld.<a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>() / <a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>()) ;
01047               BYTE   * pPixel = <a class="code" href="class_f_c_obj_image.html#z29_1">GetBits</a> (y) ;
01048         <span class="keywordflow">for</span> (<span class="keywordtype">int</span> x=0 ; x &lt; <a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>() ; x++)
01049         {
01050             <a class="code" href="class_f_c_color.html#e3">FCColor::CopyPixel</a> (pPixel, pOld, nSpan) ;
01051             pOld += pTabX[x] ;
01052             pPixel += nSpan ;
01053         }
01054     }
01055 }
01056 <span class="comment">//-----------------------------------------------------------------------------</span>
01057 <span class="comment">// stretch (&gt;=24 bit)</span>
<a name="l01058"></a><a class="code" href="class_f_c_obj_image.html#z39_8">01058</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="class_f_c_obj_image.html#z39_8">FCObjImage::Stretch_Smooth</a> (<span class="keywordtype">int</span> nNewWidth, <span class="keywordtype">int</span> nNewHeight, <a class="code" href="class_f_c_obj_progress.html">FCObjProgress</a> * progress)
01059 {
01060     <span class="comment">// parameter check</span>
01061     <span class="keywordflow">if</span> (!<a class="code" href="class_f_c_obj_image.html#z29_0">IsValidImage</a>() || (nNewWidth &lt;= 0) || (nNewHeight &lt;= 0) || (<a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() &lt; 24))
01062     {
01063         assert(<span class="keyword">false</span>) ; return ;
01064     }
01065     <span class="keywordflow">if</span> ((nNewWidth == <a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>()) &amp;&amp; (nNewHeight == <a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>()))
01066         return ;
01067 
01068     <span class="comment">// in order to bilinear, the source image's W/H must larger than 2</span>
01069     <span class="keywordflow">if</span> ((<a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>() == 1) || (<a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>() == 1))
01070     {
01071         <a class="code" href="class_f_c_obj_image.html#z39_6">ExpandFrame</a> (<span class="keyword">true</span>, 0, 0, (<a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>()==1) ? 1 : 0, (<a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>()==1) ? 1 : 0) ;
01072     }
01073 
01074     <span class="comment">// first backup image</span>
01075     <span class="keyword">const</span> <a class="code" href="class_f_c_obj_image.html">FCObjImage</a>     imgOld(*<span class="keyword">this</span>) ;
01076     <span class="keywordflow">if</span> (!<a class="code" href="class_f_c_obj_image.html#z27_0">Create</a> (nNewWidth, nNewHeight, imgOld.<a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>()))
01077     {
01078         assert(<span class="keyword">false</span>) ; return ;
01079     }
01080 
01081     <span class="comment">// initialize index table, to accelerate</span>
01082     <a class="code" href="class_p_c_l__array.html">PCL_array&lt;int&gt;</a>   pTabX (<a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>()),
01083                      pXMod (<a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>()) ;
01084     <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0 ; i &lt; <a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>() ; i++)
01085     {
01086         pTabX[i] = i * imgOld.<a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>() / <a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>() ;
01087         pXMod[i] = (i * imgOld.<a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>()) % <a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>() ;
01088 
01089         <span class="comment">// approximate to last col</span>
01090         <span class="keywordflow">if</span> (pTabX[i] &gt;= imgOld.<a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>()-1)
01091         {
01092             pTabX[i] = imgOld.<a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>() - 2 ;
01093             pXMod[i] = <a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>() - 1 ;
01094         }
01095     }
01096 
01097     <span class="comment">// stretch pixel</span>
01098     <span class="keyword">const</span> <span class="keywordtype">int</span>   nSpan = <a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() / 8,
01099                 nPitch = imgOld.<a class="code" href="class_f_c_obj_image.html#z29_7">GetPitch</a>() ;
01100     <span class="keywordflow">if</span> (progress)
01101         progress-&gt;ResetProgress() ; <span class="comment">// reset to 0</span>
01102     <span class="keywordflow">for</span> (<span class="keywordtype">int</span> y=0 ; y &lt; <a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>() ; y++)
01103     {
01104         <span class="keywordtype">int</span>     nSrcY = y * imgOld.<a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>() / <a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>(),
01105                 nYMod = (y * imgOld.<a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>()) % <a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>() ;
01106         <span class="keywordflow">if</span> (nSrcY &gt;= imgOld.<a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>()-1) <span class="comment">// approximate to last row</span>
01107         {
01108             nSrcY = imgOld.<a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>() - 2 ;
01109             nYMod = <a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>() - 1 ;
01110         }
01111 
01112         <span class="keyword">const</span> <span class="keywordtype">double</span>   un_y = nYMod / (double)<a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>() ;
01113         BYTE           * pWrite = <a class="code" href="class_f_c_obj_image.html#z29_1">GetBits</a>(y) ;
01114         <span class="keywordflow">for</span> (<span class="keywordtype">int</span> x=0 ; x &lt; <a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>() ; x++, pWrite += nSpan)
01115         {
01116             <span class="comment">// ����ԭͼ��Ӧ��</span>
01117             <span class="keyword">const</span> <span class="keywordtype">int</span>    nSrcX = pTabX[x],
01118                          nXMod = pXMod[x] ;
01119 
01120             <span class="keyword">const</span> BYTE   * pOldPix = imgOld.<a class="code" href="class_f_c_obj_image.html#z29_1">GetBits</a> (nSrcX, nSrcY) ;
01121             <span class="keywordflow">if</span> ((nXMod == 0) &amp;&amp; (nYMod == 0))
01122             {
01123                 <a class="code" href="class_f_c_color.html#e3">FCColor::CopyPixel</a> (pWrite, pOldPix, nSpan) ;
01124             }
01125             <span class="keywordflow">else</span>
01126             {
01127                 <span class="keyword">const</span> BYTE  * pcrPixel[4] =
01128                 {
01129                     pOldPix, pOldPix + nSpan,
01130                     pOldPix - nPitch, pOldPix - nPitch + nSpan
01131                 } ;
01132 
01133                 RGBQUAD   crRet = <a class="code" href="class_f_c_color.html#e4">FCColor::Get_Bilinear_Pixel</a> (nXMod/(<span class="keywordtype">double</span>)<a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>(), un_y, <a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() == 32, pcrPixel) ;
01134                 <a class="code" href="class_f_c_color.html#e3">FCColor::CopyPixel</a> (pWrite, &amp;crRet, nSpan) ;
01135             }
01136         }
01137         <span class="keywordflow">if</span> (progress)
01138             progress-&gt;SetProgress (y * 100 / <a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>()) ;
01139     }
01140 }
01141 <span class="comment">//-----------------------------------------------------------------------------</span>
<a name="l01142"></a><a class="code" href="class_f_c_obj_image.html#z39_9">01142</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="class_f_c_obj_image.html#z39_9">FCObjImage::SinglePixelProcessProc</a> (<a class="code" href="class_f_c_interface___pixel_process.html">FCInterface_PixelProcess</a>&amp; rProcessor, <a class="code" href="class_f_c_obj_progress.html">FCObjProgress</a>* pProgress)
01143 {
01144     <span class="keywordflow">if</span> (!rProcessor.ValidateColorBits (<span class="keyword">this</span>))
01145         {assert(<span class="keyword">false</span>); <span class="keywordflow">return</span>;}
01146 
01147     <span class="comment">// before</span>
01148     rProcessor.OnEnterProcess (<span class="keyword">this</span>) ;
01149     <span class="keywordflow">if</span> (pProgress)
01150         pProgress-&gt;ResetProgress() ; <span class="comment">// reset to 0</span>
01151 
01152     <span class="keywordflow">for</span> (<span class="keywordtype">int</span> y=0 ; y &lt; <a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>() ; y++)
01153     {
01154         <span class="keywordflow">for</span> (<span class="keywordtype">int</span> x=0 ; x &lt; <a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>() ; x++)
01155         {
01156             rProcessor.ProcessPixel (<span class="keyword">this</span>, x, y, <a class="code" href="class_f_c_obj_image.html#z29_1">GetBits</a>(x,y)) ;
01157         }
01158         <span class="keywordflow">if</span> (pProgress)
01159             pProgress-&gt;SetProgress ((y+1) * 100 / <a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>()) ;
01160     }
01161 
01162     <span class="comment">// after</span>
01163     rProcessor.OnLeaveProcess (<span class="keyword">this</span>) ;
01164 }
01165 
01166 <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&nbsp;
<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>

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The zlib/libpng License


Written By
Team Leader PhoXo
China China
graduate from University of Science and Technology of China at 2002.

Now I work at www.phoxo.com.

Comments and Discussions