IMAITER.H
上传用户:wep9318
上传日期:2007-01-07
资源大小:893k
文件大小:4k
源码类别:

图片显示

开发平台:

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. #if !defined(__ImaIter_h)
  9. #define __ImaIter_h
  10. #include "cimage.h"
  11. class CImageIterator
  12. {
  13. friend CImageImpl;
  14. friend CImage;
  15. protected:
  16.   int Itx, Ity; // Counters
  17.   int Stepx, Stepy;
  18.   ImagePointerType IterImage;   //  Image pointer
  19.   CImageImpl *ima;
  20. public:
  21. // Constructors
  22.   CImageIterator ( void );
  23.   CImageIterator ( CImage *image );
  24.   CImageIterator ( CImageImpl *imageImpl );
  25.   operator CImageImpl* ();
  26. // Iterators
  27.   BOOL ItOK ();
  28.   void Reset ();
  29.   void Upset ();
  30.   void SetRow(byte *buf, int n);
  31.   void GetRow(byte *buf, int n);
  32.   byte GetByte( ) { return IterImage[Itx]; }
  33.   void SetByte(byte b) { IterImage[Itx] = b; }
  34.   ImagePointerType GetRow(void);
  35.   BOOL NextRow();
  36.   BOOL PrevRow();
  37.   BOOL NextByte();
  38.   BOOL PrevByte();
  39.   void SetSteps(int x, int y=0) {  Stepx = x; Stepy = y; }
  40.   void GetSteps(int *x, int *y) {  *x = Stepx; *y = Stepy; }
  41.   BOOL NextStep();
  42.   BOOL PrevStep();
  43. ////////////////////////// AD - for interlace ///////////////////////////////
  44.   void SetY(int y);
  45. /////////////////////////////////////////////////////////////////////////////
  46. };
  47. inline
  48. CImageIterator::CImageIterator(void)
  49. {
  50.   ima = 0;
  51.   IterImage = 0;
  52.   Itx = Ity = 0;
  53.   Stepx = Stepy = 0;
  54. }
  55. inline
  56. CImageIterator::CImageIterator(CImage *image): ima(image->GetImplementation())
  57. {
  58.   if (ima)
  59.  IterImage = ima->GetRawImage();
  60.   Itx = Ity = 0;
  61.   Stepx = Stepy = 0;
  62. }
  63. inline
  64. CImageIterator::CImageIterator(CImageImpl *imageImpl): ima(imageImpl)
  65. {
  66.   if (ima)
  67.  IterImage = ima->GetRawImage();
  68.   Itx = Ity = 0;
  69.   Stepx = Stepy = 0;
  70. }
  71. inline
  72. CImageIterator::operator CImageImpl* ()
  73. {
  74.   return ima;
  75. }
  76. inline
  77. BOOL CImageIterator::ItOK ()
  78. {
  79.   if (ima)
  80.  return ima->Inside(Itx, Ity);
  81.   else
  82.  return FALSE;
  83. }
  84. inline void CImageIterator::Reset()
  85. {
  86.   IterImage = ima->GetRawImage();
  87.   Itx = Ity = 0;
  88. }
  89. inline void CImageIterator::Upset()
  90. {
  91.   Itx = 0;
  92.   Ity = ima->GetHeight()-1;
  93.   IterImage = ima->GetRawImage() + ima->GetEffWidth()*(ima->GetHeight()-1);
  94. }
  95. inline BOOL CImageIterator::NextRow()
  96. {
  97.   if (++Ity >= ima->GetHeight()) return 0;
  98.   IterImage += ima->GetEffWidth();
  99.   return 1;
  100. }
  101. inline BOOL CImageIterator::PrevRow()
  102. {
  103.   if (--Ity < 0) return 0;
  104.   IterImage -= ima->GetEffWidth();
  105.   return 1;
  106. }
  107. ////////////////////////// AD - for interlace ///////////////////////////////
  108. inline void CImageIterator::SetY(int y)
  109. {
  110.   if ((y < 0) || (y > ima->GetHeight())) return;
  111.   Ity = y;
  112.   IterImage = ima->GetRawImage() + ima->GetEffWidth()*y;
  113. }
  114. /////////////////////////////////////////////////////////////////////////////
  115. inline void CImageIterator::SetRow(byte *buf, int n)
  116. {
  117. // Here should be bcopy or memcpy
  118.   //_fmemcpy(IterImage, (void far *)buf, n);
  119.   if (n<0)
  120.  n = ima->GetWidth();
  121.   for (int i=0; i<n; i++) IterImage[i] = buf[i];
  122. }
  123. inline void CImageIterator::GetRow(byte *buf, int n)
  124. {
  125.   for (int i=0; i<n; i++) buf[i] = IterImage[i];
  126. }
  127. inline ImagePointerType CImageIterator::GetRow()
  128. {
  129.   return IterImage;
  130. }
  131. inline BOOL CImageIterator::NextByte()
  132. {
  133.   if (++Itx < ima->GetEffWidth())
  134.  return 1;
  135.   else
  136.  if (++Ity < ima->GetHeight())
  137.  {
  138. IterImage += ima->GetEffWidth();
  139. Itx = 0;
  140. return 1;
  141.  } else
  142. return 0;
  143. }
  144. inline BOOL CImageIterator::PrevByte()
  145. {
  146.   if (--Itx >= 0)
  147.  return 1;
  148.   else
  149.  if (--Ity >= 0)
  150.  {
  151. IterImage -= ima->GetEffWidth();
  152. Itx = 0;
  153. return 1;
  154.  } else
  155. return 0;
  156. }
  157. inline BOOL CImageIterator::NextStep()
  158. {
  159.   Itx += Stepx;
  160.   if (Itx < ima->GetEffWidth())
  161.  return 1;
  162.   else {
  163.  Ity += Stepy;
  164.  if (Ity < ima->GetHeight())
  165.  {
  166. IterImage += ima->GetEffWidth();
  167. Itx = 0;
  168. return 1;
  169.  } else
  170. return 0;
  171.   }
  172. }
  173. inline BOOL CImageIterator::PrevStep()
  174. {
  175.   Itx -= Stepx;
  176.   if (Itx >= 0)
  177.  return 1;
  178.   else {       
  179.  Ity -= Stepy;
  180.  if (Ity >= 0 && Ity < ima->GetHeight())
  181.  {
  182. IterImage -= ima->GetEffWidth();
  183. Itx = 0;
  184. return 1;
  185.  } else
  186. return 0;
  187.   }
  188. }
  189. #endif