<!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 Page</a> | <a class="qindex" href="hierarchy.html">Class Hierarchy</a> | <a class="qindex" href="annotated.html">Class List</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="functions.html">Class Members</a></div>
<h1>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>& 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>& operator= (<span class="keyword">const</span> <a class="code" href="class_f_c_obj_image.html">FCObjImage</a>& 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& 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>=0) && (x<Width()) && (y>=0) && (y<<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>& 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>& 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>& 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>& 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>& img32, <span class="keyword">const</span> RECT& rcDest, <span class="keyword">const</span> RECT& 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>& 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> & 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>& 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>& img, <span class="keyword">const</span> RECT& 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 (&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>& 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->biHeight <= 0) || (pBmif->biWidth <= 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->biCompression == BI_RGB) || (pBmif->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->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 (&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->biWidth ;
00296 m_DibInfo.biHeight = pBmif->biHeight ;
00297 m_DibInfo.biPlanes = 1 ;
00298 m_DibInfo.biBitCount = pBmif->biBitCount ;
00299 m_DibInfo.biCompression = pBmif->biCompression ;
00300 m_DibInfo.biXPelsPerMeter = pBmif->biXPelsPerMeter ;
00301 m_DibInfo.biYPelsPerMeter = pBmif->biYPelsPerMeter ;
00302
00303 <span class="comment">// now flag BI_BITFIELDS is only valid in 16bit image</span>
00304 <span class="keywordflow">if</span> (pBmif->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->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 < <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>() <= 8)
00328 {
00329 m_pPalette = <span class="keyword">new</span> RGBQUAD[1 << <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 (&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-><a class="code" href="class_f_c_obj_image.html#z27_0">Create</a> (&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 << <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>() <= 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(<=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>() <= 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& 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 (&rc, &rcImg, &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 & (*pPixel >> (7 - (x & 7))) ;
00406 <span class="keywordflow">case</span> 4 : <span class="keywordflow">return</span> 0x0F & (*pPixel >> (x & 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> (&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 &= ~(1 << (7 - (x & 7))) ;
00430 *pPixel |= dwPixel << (7 - (x & 7)) ;
00431 break ;
00432 <span class="keywordflow">case</span> 4 : *pPixel &= 0x0F << (x & 1 ? 4 : 0) ;
00433 *pPixel |= dwPixel << (x & 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, &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>() > 8) || (iFirstIndex < 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 << <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 < iNumber ; i++)
00451 {
00452 <span class="keywordtype">int</span> nIndex = iFirstIndex + i ;
00453 <span class="keywordflow">if</span> (nIndex < 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>() > 8) || (iFirstIndex < 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 << <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 < iNumber ; i++)
00466 {
00467 <span class="keywordtype">int</span> nIndex = iFirstIndex + i ;
00468 <span class="keywordflow">if</span> (nIndex < 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>& 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>() > 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 << 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>() > 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 << <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 < nNum ; i++)
00495 {
00496 PCL_R(&pPal[i]) = PCL_G(&pPal[i]) = PCL_B(&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(&rgb) = (MASK16_RED_565 & wPixel) >> 8 ;
00505 PCL_G(&rgb) = (MASK16_GREEN_565 & wPixel) >> 3 ;
00506 PCL_B(&rgb) = (MASK16_BLUE_565 & wPixel) << 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(&rgb) = (MASK16_RED_555 & wPixel) >> 7 ;
00513 PCL_G(&rgb) = (MASK16_GREEN_555 & wPixel) >> 2 ;
00514 PCL_B(&rgb) = (MASK16_BLUE_555 & wPixel) << 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) && (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() <= 8)
00533 OldPic.GetColorTable (0, 1 << 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-><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 < <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-><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 < <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 ==> 24,32</span>
00549 <a class="code" href="class_f_c_color.html#e3">FCColor::CopyPixel</a> (pNew, &pPal[OldPic.GetPixelData(x,y)], 3) ;
00550 break ;
00551 <span class="keywordflow">case</span> 16 : <span class="comment">// 16 ==> 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, &crTrans, 3) ;
00559 }
00560 break ;
00561 case 24 :
00562 case 32 : <span class="comment">// 24,32 ==> 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->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 < <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 < <a class="code" href="class_f_c_obj_image.html#z29_4">Width</a>() ; x++)
00584 *imgAlpha->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>& 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 < <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 < <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 < <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 < <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>& FCObjImage::operator= (<span class="keyword">const</span> <a class="code" href="class_f_c_obj_image.html">FCObjImage</a>& img)
00614 {
00615 <span class="keywordflow">if</span> (!img.IsValidImage() || (&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<BITMAPINFOHEADER></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() <= 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>() < 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 (&rcD, &rcImage, &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->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->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 < SubImg-><a class="code" href="class_f_c_obj_image.html#z29_5">Height</a>() ; i++)
00659 memcpy (SubImg->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>() <= 8)
00663 SubImg->CopyPalette (*<span class="keyword">this</span>) ;
00664
00665 <span class="comment">// set relative position</span>
00666 SubImg-><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>& 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>() < 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 (&rcD, &rcImage, &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 < 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-><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> & 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 < <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 < <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>& 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 (&rcD, &rcImg, &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(&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 < rcD.bottom ; cy++)
00725 {
00726 RGBQUAD * pDest = (RGBQUAD*)this-><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 < 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>& Img32, <span class="keyword">const</span> RECT& rcDest, <span class="keyword">const</span> RECT& 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(&rcT, &rcDest, &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>() < 24) || !Img32.IsValidImage() || (Img32.ColorBits() != 32) ||
00749 !IsRectInRect (rcMask, rcSrc) || IsRectEmpty(&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)) && (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 < 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-><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 < 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<int></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 < 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 < 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 < rcT.bottom ; y++)
00780 {
00781 BYTE * pDest = this-><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 < 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> & 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> == &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 (&rcDest, &rcSrc1, &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 < 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-><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 < 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 &= *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>() > 8) ; <span class="comment">// must true color image</span>
00836 memcpy (pSave, &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<FCObjImage*> imgList ;
00858 <span class="keywordflow">if</span> (pHandler)
00859 imgList = pHandler->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<FCImageHandleBase> pHandler (<a class="code" href="class_f_c_obj_image.html#z41_6">GetImageHandleFactory</a>()->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->LoadImageFile (szFileName) ;
00875 <span class="keywordflow">if</span> (bRet)
00876 bRet = this-><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<FCImageHandleBase> pHandler (<a class="code" href="class_f_c_obj_image.html#z41_6">GetImageHandleFactory</a>()->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->LoadImageMemory (pStart, iFileSize) ;
00888 <span class="keywordflow">if</span> (bRet)
00889 bRet = this-><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->PushSaveList(<span class="keyword">this</span>) ;
00901 <span class="keywordtype">bool</span> bRet = pHandler->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<FCImageHandleBase> pHandler (<a class="code" href="class_f_c_obj_image.html#z41_6">GetImageHandleFactory</a>()->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-><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>& img, <span class="keyword">const</span> RECT& rcBlock, <span class="keyword">const</span> <span class="keywordtype">void</span>* pSrc)
00920 {
00921 RECT rc = {0, 0, img.Width(), img.Height()} ;
00922 IntersectRect (&rc, &rc, &rcBlock) ;
00923 <span class="keywordflow">if</span> (IsRectEmpty(&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 < 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 < 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>() < 8) || (iLeft < 0) || (iTop < 0) || (iRight < 0) || (iBottom < 0))
00939 {
00940 assert(<span class="keyword">false</span>) ; return ;
00941 }
00942 <span class="keywordflow">if</span> ((iLeft == 0) && (iTop == 0) && (iRight == 0) && (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 < 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 < 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 < 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 < 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 < 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 < 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 (>=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 <= 0) || (nNewHeight <= 0) || (<a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() < 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>()) && (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>() <= 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<int></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 < <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] < 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 < (<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 < <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 < <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 (>=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 <= 0) || (nNewHeight <= 0) || (<a class="code" href="class_f_c_obj_image.html#z29_6">ColorBits</a>() < 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>()) && (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<int></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 < <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] >= 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->ResetProgress() ; <span class="comment">// reset to 0</span>
01102 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> y=0 ; y < <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 >= 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 < <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) && (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, &crRet, nSpan) ;
01135 }
01136 }
01137 <span class="keywordflow">if</span> (progress)
01138 progress->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>& 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->ResetProgress() ; <span class="comment">// reset to 0</span>
01151
01152 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> y=0 ; y < <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 < <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->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
<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>