ximaiter.h
上传用户:gnaf34
上传日期:2022-04-22
资源大小:1657k
文件大小:6k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * File: ImaIter.h
  3.  * Purpose: Declaration of the Platform Independent Image Base Class
  4.  * Author: Alejandro Aguilar Sierra
  5.  * Created: 1995
  6.  * Copyright: (c) 1995, Alejandro Aguilar Sierra <asierra@servidor.unam.mx>
  7.  *
  8.  * 07/08/2001 <ing.davide.pizzolato@libero.it>
  9.  * - removed slow loops
  10.  * - added safe checks
  11.  *
  12.  * Permission is given by the author to freely redistribute and include
  13.  * this code in any program as long as this credit is given where due.
  14.  *
  15.  * COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY
  16.  * OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
  17.  * THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE
  18.  * OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED
  19.  * CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT
  20.  * THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY
  21.  * SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL
  22.  * PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER
  23.  * THIS DISCLAIMER.
  24.  *
  25.  * Use at your own risk!
  26.  * ==========================================================
  27.  */
  28. #if !defined(__ImaIter_h)
  29. #define __ImaIter_h
  30. #include "ximage.h"
  31. #include "ximadefs.h"
  32. class CImageIterator
  33. {
  34. friend CxImage;
  35. protected:
  36. int Itx, Ity; // Counters
  37. int Stepx, Stepy;
  38. BYTE* IterImage; //  Image pointer
  39. CxImage *ima;
  40. public:
  41. // Constructors
  42. CImageIterator ( void );
  43. CImageIterator ( CxImage *image );
  44. operator CxImage* ();
  45. // Iterators
  46. BOOL ItOK ();
  47. void Reset ();
  48. void Upset ();
  49. void SetRow(BYTE *buf, int n);
  50. void GetRow(BYTE *buf, int n);
  51. BYTE GetByte( ) { return IterImage[Itx]; }
  52. void SetByte(BYTE b) { IterImage[Itx] = b; }
  53. BYTE* GetRow(void);
  54. BYTE* GetRow(int n);
  55. BOOL NextRow();
  56. BOOL PrevRow();
  57. BOOL NextByte();
  58. BOOL PrevByte();
  59. void SetSteps(int x, int y=0) {  Stepx = x; Stepy = y; }
  60. void GetSteps(int *x, int *y) {  *x = Stepx; *y = Stepy; }
  61. BOOL NextStep();
  62. BOOL PrevStep();
  63. void SetY(int y); /* AD - for interlace */
  64. int  GetY() {return Ity;}
  65. };
  66. /////////////////////////////////////////////////////////////////////
  67. inline
  68. CImageIterator::CImageIterator(void)
  69. {
  70. ima = 0;
  71. IterImage = 0;
  72. Itx = Ity = 0;
  73. Stepx = Stepy = 0;
  74. }
  75. /////////////////////////////////////////////////////////////////////
  76. inline
  77. CImageIterator::CImageIterator(CxImage *imageImpl): ima(imageImpl)
  78. {
  79. if (ima) IterImage = ima->GetBits();
  80. Itx = Ity = 0;
  81. Stepx = Stepy = 0;
  82. }
  83. /////////////////////////////////////////////////////////////////////
  84. inline
  85. CImageIterator::operator CxImage* ()
  86. {
  87. return ima;
  88. }
  89. /////////////////////////////////////////////////////////////////////
  90. inline BOOL CImageIterator::ItOK ()
  91. {
  92. if (ima) return ima->IsInside(Itx, Ity);
  93. else  return FALSE;
  94. }
  95. /////////////////////////////////////////////////////////////////////
  96. inline void CImageIterator::Reset()
  97. {
  98. if (ima) IterImage = ima->GetBits();
  99. else  IterImage=0;
  100. Itx = Ity = 0;
  101. }
  102. /////////////////////////////////////////////////////////////////////
  103. inline void CImageIterator::Upset()
  104. {
  105. Itx = 0;
  106. Ity = ima->GetHeight()-1;
  107. IterImage = ima->GetBits() + ima->GetEffWidth()*(ima->GetHeight()-1);
  108. }
  109. /////////////////////////////////////////////////////////////////////
  110. inline BOOL CImageIterator::NextRow()
  111. {
  112. if (++Ity >= (int)ima->GetHeight()) return 0;
  113. IterImage += ima->GetEffWidth();
  114. return 1;
  115. }
  116. /////////////////////////////////////////////////////////////////////
  117. inline BOOL CImageIterator::PrevRow()
  118. {
  119. if (--Ity < 0) return 0;
  120. IterImage -= ima->GetEffWidth();
  121. return 1;
  122. }
  123. /* AD - for interlace */
  124. inline void CImageIterator::SetY(int y)
  125. {
  126. if ((y < 0) || (y > (int)ima->GetHeight())) return;
  127. Ity = y;
  128. IterImage = ima->GetBits() + ima->GetEffWidth()*y;
  129. }
  130. /////////////////////////////////////////////////////////////////////
  131. inline void CImageIterator::SetRow(BYTE *buf, int n)
  132. {
  133. if (n<0) n = (int)ima->GetEffWidth();
  134. else n = min(n,(int)ima->GetEffWidth());
  135. if (IterImage) memcpy(IterImage,buf,n);
  136. }
  137. /////////////////////////////////////////////////////////////////////
  138. inline void CImageIterator::GetRow(BYTE *buf, int n)
  139. {
  140. if ((buf!=NULL)&&(n>0)) memcpy(buf,IterImage,n);
  141. }
  142. /////////////////////////////////////////////////////////////////////
  143. inline BYTE* CImageIterator::GetRow()
  144. {
  145. return IterImage;
  146. }
  147. /////////////////////////////////////////////////////////////////////
  148. inline BYTE* CImageIterator::GetRow(int n)
  149. {
  150. SetY(n);
  151. return IterImage;
  152. }
  153. /////////////////////////////////////////////////////////////////////
  154. inline BOOL CImageIterator::NextByte()
  155. {
  156. if (++Itx < (int)ima->GetEffWidth()) return 1;
  157. else
  158. if (++Ity < (int)ima->GetHeight()){
  159. IterImage += ima->GetEffWidth();
  160. Itx = 0;
  161. return 1;
  162. } else
  163. return 0;
  164. }
  165. /////////////////////////////////////////////////////////////////////
  166. inline BOOL CImageIterator::PrevByte()
  167. {
  168.   if (--Itx >= 0) return 1;
  169.   else
  170.   if (--Ity >= 0){
  171.   IterImage -= ima->GetEffWidth();
  172.   Itx = 0;
  173.   return 1;
  174.   } else
  175.   return 0;
  176. }
  177. /////////////////////////////////////////////////////////////////////
  178. inline BOOL CImageIterator::NextStep()
  179. {
  180. Itx += Stepx;
  181. if (Itx < (int)ima->GetEffWidth()) return 1;
  182. else {
  183. Ity += Stepy;
  184. if (Ity < (int)ima->GetHeight()){
  185. IterImage += ima->GetEffWidth();
  186. Itx = 0;
  187. return 1;
  188. } else
  189. return 0;
  190. }
  191. }
  192. /////////////////////////////////////////////////////////////////////
  193. inline BOOL CImageIterator::PrevStep()
  194. {
  195. Itx -= Stepx;
  196. if (Itx >= 0) return 1;
  197. else {       
  198. Ity -= Stepy;
  199. if (Ity >= 0 && Ity < (int)ima->GetHeight()) {
  200. IterImage -= ima->GetEffWidth();
  201. Itx = 0;
  202. return 1;
  203. } else
  204. return 0;
  205. }
  206. }
  207. /////////////////////////////////////////////////////////////////////
  208. #endif