]> Creatis software - clitk.git/blobdiff - utilities/CxImage/ximaiter.h
cosmetic
[clitk.git] / utilities / CxImage / ximaiter.h
index 3e5bff9ba831f129eee8cd30c2778e7309a549d5..9788919b8f6d63ee9247fd7f1686ea250e1ca82e 100644 (file)
-/*\r
- * File:       ImaIter.h\r
- * Purpose:    Declaration of the Platform Independent Image Base Class\r
- * Author:     Alejandro Aguilar Sierra\r
- * Created:    1995\r
- * Copyright:  (c) 1995, Alejandro Aguilar Sierra <asierra(at)servidor(dot)unam(dot)mx>\r
- *\r
- * 07/08/2001 Davide Pizzolato - www.xdp.it\r
- * - removed slow loops\r
- * - added safe checks\r
- *\r
- * Permission is given by the author to freely redistribute and include\r
- * this code in any program as long as this credit is given where due.\r
- *\r
- * COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY\r
- * OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES\r
- * THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE\r
- * OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED\r
- * CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT\r
- * THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY\r
- * SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL\r
- * PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER\r
- * THIS DISCLAIMER.\r
- *\r
- * Use at your own risk!\r
- * ==========================================================\r
- */\r
-\r
-#if !defined(__ImaIter_h)\r
-#define __ImaIter_h\r
-\r
-#include "ximage.h"\r
-#include "ximadef.h"\r
-\r
-class CImageIterator\r
-{\r
-friend class CxImage;\r
-protected:\r
-       int Itx, Ity;           // Counters\r
-       int Stepx, Stepy;\r
-       BYTE* IterImage;        //  Image pointer\r
-       CxImage *ima;\r
-public:\r
-       // Constructors\r
-       CImageIterator ( void );\r
-       CImageIterator ( CxImage *image );\r
-       operator CxImage* ();\r
-\r
-       // Iterators\r
-       BOOL ItOK ();\r
-       void Reset ();\r
-       void Upset ();\r
-       void SetRow(BYTE *buf, int n);\r
-       void GetRow(BYTE *buf, int n);\r
-       BYTE GetByte( ) { return IterImage[Itx]; }\r
-       void SetByte(BYTE b) { IterImage[Itx] = b; }\r
-       BYTE* GetRow(void);\r
-       BYTE* GetRow(int n);\r
-       BOOL NextRow();\r
-       BOOL PrevRow();\r
-       BOOL NextByte();\r
-       BOOL PrevByte();\r
-\r
-       void SetSteps(int x, int y=0) {  Stepx = x; Stepy = y; }\r
-       void GetSteps(int *x, int *y) {  *x = Stepx; *y = Stepy; }\r
-       BOOL NextStep();\r
-       BOOL PrevStep();\r
-\r
-       void SetY(int y);       /* AD - for interlace */\r
-       int  GetY() {return Ity;}\r
-       BOOL GetCol(BYTE* pCol, DWORD x);\r
-       BOOL SetCol(BYTE* pCol, DWORD x);\r
-};\r
-\r
-/////////////////////////////////////////////////////////////////////\r
-inline\r
-CImageIterator::CImageIterator(void)\r
-{\r
-       ima = 0;\r
-       IterImage = 0;\r
-       Itx = Ity = 0;\r
-       Stepx = Stepy = 0;\r
-}\r
-/////////////////////////////////////////////////////////////////////\r
-inline\r
-CImageIterator::CImageIterator(CxImage *imageImpl): ima(imageImpl)\r
-{\r
-       if (ima) IterImage = ima->GetBits();\r
-       Itx = Ity = 0;\r
-       Stepx = Stepy = 0;\r
-}\r
-/////////////////////////////////////////////////////////////////////\r
-inline\r
-CImageIterator::operator CxImage* ()\r
-{\r
-       return ima;\r
-}\r
-/////////////////////////////////////////////////////////////////////\r
-inline BOOL CImageIterator::ItOK ()\r
-{\r
-       if (ima) return ima->IsInside(Itx, Ity);\r
-       else     return FALSE;\r
-}\r
-/////////////////////////////////////////////////////////////////////\r
-inline void CImageIterator::Reset()\r
-{\r
-       if (ima) IterImage = ima->GetBits();\r
-       else     IterImage=0;\r
-       Itx = Ity = 0;\r
-}\r
-/////////////////////////////////////////////////////////////////////\r
-inline void CImageIterator::Upset()\r
-{\r
-       Itx = 0;\r
-       Ity = ima->GetHeight()-1;\r
-       IterImage = ima->GetBits() + ima->GetEffWidth()*(ima->GetHeight()-1);\r
-}\r
-/////////////////////////////////////////////////////////////////////\r
-inline BOOL CImageIterator::NextRow()\r
-{\r
-       if (++Ity >= (int)ima->GetHeight()) return 0;\r
-       IterImage += ima->GetEffWidth();\r
-       return 1;\r
-}\r
-/////////////////////////////////////////////////////////////////////\r
-inline BOOL CImageIterator::PrevRow()\r
-{\r
-       if (--Ity < 0) return 0;\r
-       IterImage -= ima->GetEffWidth();\r
-       return 1;\r
-}\r
-/* AD - for interlace */\r
-inline void CImageIterator::SetY(int y)\r
-{\r
-       if ((y < 0) || (y > (int)ima->GetHeight())) return;\r
-       Ity = y;\r
-       IterImage = ima->GetBits() + ima->GetEffWidth()*y;\r
-}\r
-/////////////////////////////////////////////////////////////////////\r
-inline void CImageIterator::SetRow(BYTE *buf, int n)\r
-{\r
-       if (n<0) n = (int)ima->GetEffWidth();\r
-       else n = min(n,(int)ima->GetEffWidth());\r
-\r
-       if ((IterImage!=NULL)&&(buf!=NULL)&&(n>0)) memcpy(IterImage,buf,n);\r
-}\r
-/////////////////////////////////////////////////////////////////////\r
-inline void CImageIterator::GetRow(BYTE *buf, int n)\r
-{\r
-       if ((IterImage!=NULL)&&(buf!=NULL)&&(n>0))\r
-               memcpy(buf,IterImage,min(n,(int)ima->GetEffWidth()));\r
-}\r
-/////////////////////////////////////////////////////////////////////\r
-inline BYTE* CImageIterator::GetRow()\r
-{\r
-       return IterImage;\r
-}\r
-/////////////////////////////////////////////////////////////////////\r
-inline BYTE* CImageIterator::GetRow(int n)\r
-{\r
-       SetY(n);\r
-       return IterImage;\r
-}\r
-/////////////////////////////////////////////////////////////////////\r
-inline BOOL CImageIterator::NextByte()\r
-{\r
-       if (++Itx < (int)ima->GetEffWidth()) return 1;\r
-       else\r
-               if (++Ity < (int)ima->GetHeight()){\r
-                       IterImage += ima->GetEffWidth();\r
-                       Itx = 0;\r
-                       return 1;\r
-               } else\r
-                       return 0;\r
-}\r
-/////////////////////////////////////////////////////////////////////\r
-inline BOOL CImageIterator::PrevByte()\r
-{\r
-  if (--Itx >= 0) return 1;\r
-  else\r
-         if (--Ity >= 0){\r
-                 IterImage -= ima->GetEffWidth();\r
-                 Itx = 0;\r
-                 return 1;\r
-         } else\r
-                 return 0;\r
-}\r
-/////////////////////////////////////////////////////////////////////\r
-inline BOOL CImageIterator::NextStep()\r
-{\r
-       Itx += Stepx;\r
-       if (Itx < (int)ima->GetEffWidth()) return 1;\r
-       else {\r
-               Ity += Stepy;\r
-               if (Ity < (int)ima->GetHeight()){\r
-                       IterImage += ima->GetEffWidth();\r
-                       Itx = 0;\r
-                       return 1;\r
-               } else\r
-                       return 0;\r
-       }\r
-}\r
-/////////////////////////////////////////////////////////////////////\r
-inline BOOL CImageIterator::PrevStep()\r
-{\r
-       Itx -= Stepx;\r
-       if (Itx >= 0) return 1;\r
-       else {       \r
-               Ity -= Stepy;\r
-               if (Ity >= 0 && Ity < (int)ima->GetHeight()) {\r
-                       IterImage -= ima->GetEffWidth();\r
-                       Itx = 0;\r
-                       return 1;\r
-               } else\r
-                       return 0;\r
-       }\r
-}\r
-/////////////////////////////////////////////////////////////////////\r
-inline BOOL CImageIterator::GetCol(BYTE* pCol, DWORD x)\r
-{\r
-       if ((pCol==0)||(ima->GetBpp()<8)||(x>=ima->GetWidth()))\r
-               return 0;\r
-       DWORD h = ima->GetHeight();\r
-       //DWORD line = ima->GetEffWidth();\r
-       BYTE bytes = (BYTE)(ima->GetBpp()>>3);\r
-       BYTE* pSrc;\r
-       for (DWORD y=0;y<h;y++){\r
-               pSrc = ima->GetBits(y) + x*bytes;\r
-               for (BYTE w=0;w<bytes;w++){\r
-                       *pCol++=*pSrc++;\r
-               }\r
-       }\r
-       return 1;\r
-}\r
-/////////////////////////////////////////////////////////////////////\r
-inline BOOL CImageIterator::SetCol(BYTE* pCol, DWORD x)\r
-{\r
-       if ((pCol==0)||(ima->GetBpp()<8)||(x>=ima->GetWidth()))\r
-               return 0;\r
-       DWORD h = ima->GetHeight();\r
-       //DWORD line = ima->GetEffWidth();\r
-       BYTE bytes = (BYTE)(ima->GetBpp()>>3);\r
-       BYTE* pSrc;\r
-       for (DWORD y=0;y<h;y++){\r
-               pSrc = ima->GetBits(y) + x*bytes;\r
-               for (BYTE w=0;w<bytes;w++){\r
-                       *pSrc++=*pCol++;\r
-               }\r
-       }\r
-       return 1;\r
-}\r
-/////////////////////////////////////////////////////////////////////\r
-#endif\r
+/*
+ * File:       ImaIter.h
+ * Purpose:    Declaration of the Platform Independent Image Base Class
+ * Author:     Alejandro Aguilar Sierra
+ * Created:    1995
+ * Copyright:  (c) 1995, Alejandro Aguilar Sierra <asierra(at)servidor(dot)unam(dot)mx>
+ *
+ * 07/08/2001 Davide Pizzolato - www.xdp.it
+ * - removed slow loops
+ * - added safe checks
+ *
+ * Permission is given by the author to freely redistribute and include
+ * this code in any program as long as this credit is given where due.
+ *
+ * COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY
+ * OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
+ * THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE
+ * OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED
+ * CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT
+ * THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY
+ * SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL
+ * PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER
+ * THIS DISCLAIMER.
+ *
+ * Use at your own risk!
+ * ==========================================================
+ */
+
+#if !defined(__ImaIter_h)
+#define __ImaIter_h
+
+#include "ximage.h"
+#include "ximadef.h"
+
+class CImageIterator
+{
+friend class CxImage;
+protected:
+       int Itx, Ity;           // Counters
+       int Stepx, Stepy;
+       BYTE* IterImage;        //  Image pointer
+       CxImage *ima;
+public:
+       // Constructors
+       CImageIterator ( void );
+       CImageIterator ( CxImage *image );
+       operator CxImage* ();
+
+       // Iterators
+       BOOL ItOK ();
+       void Reset ();
+       void Upset ();
+       void SetRow(BYTE *buf, int n);
+       void GetRow(BYTE *buf, int n);
+       BYTE GetByte( ) { return IterImage[Itx]; }
+       void SetByte(BYTE b) { IterImage[Itx] = b; }
+       BYTE* GetRow(void);
+       BYTE* GetRow(int n);
+       BOOL NextRow();
+       BOOL PrevRow();
+       BOOL NextByte();
+       BOOL PrevByte();
+
+       void SetSteps(int x, int y=0) {  Stepx = x; Stepy = y; }
+       void GetSteps(int *x, int *y) {  *x = Stepx; *y = Stepy; }
+       BOOL NextStep();
+       BOOL PrevStep();
+
+       void SetY(int y);       /* AD - for interlace */
+       int  GetY() {return Ity;}
+       BOOL GetCol(BYTE* pCol, DWORD x);
+       BOOL SetCol(BYTE* pCol, DWORD x);
+};
+
+/////////////////////////////////////////////////////////////////////
+inline
+CImageIterator::CImageIterator(void)
+{
+       ima = 0;
+       IterImage = 0;
+       Itx = Ity = 0;
+       Stepx = Stepy = 0;
+}
+/////////////////////////////////////////////////////////////////////
+inline
+CImageIterator::CImageIterator(CxImage *imageImpl): ima(imageImpl)
+{
+       if (ima) IterImage = ima->GetBits();
+       Itx = Ity = 0;
+       Stepx = Stepy = 0;
+}
+/////////////////////////////////////////////////////////////////////
+inline
+CImageIterator::operator CxImage* ()
+{
+       return ima;
+}
+/////////////////////////////////////////////////////////////////////
+inline BOOL CImageIterator::ItOK ()
+{
+       if (ima) return ima->IsInside(Itx, Ity);
+       else     return FALSE;
+}
+/////////////////////////////////////////////////////////////////////
+inline void CImageIterator::Reset()
+{
+       if (ima) IterImage = ima->GetBits();
+       else     IterImage=0;
+       Itx = Ity = 0;
+}
+/////////////////////////////////////////////////////////////////////
+inline void CImageIterator::Upset()
+{
+       Itx = 0;
+       Ity = ima->GetHeight()-1;
+       IterImage = ima->GetBits() + ima->GetEffWidth()*(ima->GetHeight()-1);
+}
+/////////////////////////////////////////////////////////////////////
+inline BOOL CImageIterator::NextRow()
+{
+       if (++Ity >= (int)ima->GetHeight()) return 0;
+       IterImage += ima->GetEffWidth();
+       return 1;
+}
+/////////////////////////////////////////////////////////////////////
+inline BOOL CImageIterator::PrevRow()
+{
+       if (--Ity < 0) return 0;
+       IterImage -= ima->GetEffWidth();
+       return 1;
+}
+/* AD - for interlace */
+inline void CImageIterator::SetY(int y)
+{
+       if ((y < 0) || (y > (int)ima->GetHeight())) return;
+       Ity = y;
+       IterImage = ima->GetBits() + ima->GetEffWidth()*y;
+}
+/////////////////////////////////////////////////////////////////////
+inline void CImageIterator::SetRow(BYTE *buf, int n)
+{
+       if (n<0) n = (int)ima->GetEffWidth();
+       else n = min(n,(int)ima->GetEffWidth());
+
+       if ((IterImage!=NULL)&&(buf!=NULL)&&(n>0)) memcpy(IterImage,buf,n);
+}
+/////////////////////////////////////////////////////////////////////
+inline void CImageIterator::GetRow(BYTE *buf, int n)
+{
+       if ((IterImage!=NULL)&&(buf!=NULL)&&(n>0))
+               memcpy(buf,IterImage,min(n,(int)ima->GetEffWidth()));
+}
+/////////////////////////////////////////////////////////////////////
+inline BYTE* CImageIterator::GetRow()
+{
+       return IterImage;
+}
+/////////////////////////////////////////////////////////////////////
+inline BYTE* CImageIterator::GetRow(int n)
+{
+       SetY(n);
+       return IterImage;
+}
+/////////////////////////////////////////////////////////////////////
+inline BOOL CImageIterator::NextByte()
+{
+       if (++Itx < (int)ima->GetEffWidth()) return 1;
+       else
+               if (++Ity < (int)ima->GetHeight()){
+                       IterImage += ima->GetEffWidth();
+                       Itx = 0;
+                       return 1;
+               } else
+                       return 0;
+}
+/////////////////////////////////////////////////////////////////////
+inline BOOL CImageIterator::PrevByte()
+{
+  if (--Itx >= 0) return 1;
+  else
+         if (--Ity >= 0){
+                 IterImage -= ima->GetEffWidth();
+                 Itx = 0;
+                 return 1;
+         } else
+                 return 0;
+}
+/////////////////////////////////////////////////////////////////////
+inline BOOL CImageIterator::NextStep()
+{
+       Itx += Stepx;
+       if (Itx < (int)ima->GetEffWidth()) return 1;
+       else {
+               Ity += Stepy;
+               if (Ity < (int)ima->GetHeight()){
+                       IterImage += ima->GetEffWidth();
+                       Itx = 0;
+                       return 1;
+               } else
+                       return 0;
+       }
+}
+/////////////////////////////////////////////////////////////////////
+inline BOOL CImageIterator::PrevStep()
+{
+       Itx -= Stepx;
+       if (Itx >= 0) return 1;
+       else {       
+               Ity -= Stepy;
+               if (Ity >= 0 && Ity < (int)ima->GetHeight()) {
+                       IterImage -= ima->GetEffWidth();
+                       Itx = 0;
+                       return 1;
+               } else
+                       return 0;
+       }
+}
+/////////////////////////////////////////////////////////////////////
+inline BOOL CImageIterator::GetCol(BYTE* pCol, DWORD x)
+{
+       if ((pCol==0)||(ima->GetBpp()<8)||(x>=ima->GetWidth()))
+               return 0;
+       DWORD h = ima->GetHeight();
+       //DWORD line = ima->GetEffWidth();
+       BYTE bytes = (BYTE)(ima->GetBpp()>>3);
+       BYTE* pSrc;
+       for (DWORD y=0;y<h;y++){
+               pSrc = ima->GetBits(y) + x*bytes;
+               for (BYTE w=0;w<bytes;w++){
+                       *pCol++=*pSrc++;
+               }
+       }
+       return 1;
+}
+/////////////////////////////////////////////////////////////////////
+inline BOOL CImageIterator::SetCol(BYTE* pCol, DWORD x)
+{
+       if ((pCol==0)||(ima->GetBpp()<8)||(x>=ima->GetWidth()))
+               return 0;
+       DWORD h = ima->GetHeight();
+       //DWORD line = ima->GetEffWidth();
+       BYTE bytes = (BYTE)(ima->GetBpp()>>3);
+       BYTE* pSrc;
+       for (DWORD y=0;y<h;y++){
+               pSrc = ima->GetBits(y) + x*bytes;
+               for (BYTE w=0;w<bytes;w++){
+                       *pSrc++=*pCol++;
+               }
+       }
+       return 1;
+}
+/////////////////////////////////////////////////////////////////////
+#endif