EasyBMP Cross-Platform Windows Bitmap Library: Change Log 

Library Author(s): Paul Macklin 
  Library License: BSD (revised). See the BSD_(revised)_license.txt 
                   file for further information.
        Copyright: 2005-6 by the EasyBMP Project 
            Email: macklin01@users.sourceforge.net
          Support: http://easybmp.sourceforge.net

All changes by Paul Macklin unless otherwise noted.

*--------------------------------------------------------------------*

Version: 0.50
   Date: 1-31-2005

    None! (first release)

*--------------------------------------------------------------------*

Version: 0.51
   Date: 2-14-2005    

    Added full 32-bit BMP file support  

    Took out annoying "colors: " message from BMP8 initialization 
    from scratch  

    Added more license and copyright info to each file  

    Added change log to library  
    
    To do next:
    Should update the error messages for the initializations  
    Should simplify the reading and writing code  

*--------------------------------------------------------------------*
    
Version: 0.52
   Date: 2-19-2005

    Fixed a minor bug in the MakeGreyscalePalette function where the 
    0 color turned out to be (255,255,255), rather than (0,0,0)  

    Updated standard colors for 4-bit, 8-bit, and 24-bit      
    
*--------------------------------------------------------------------*

Version: 0.53
   Date: 2-27-2005

   Fixed unsigned / signed problem that VS.net shows          
                                                 
                                                              
   Tried fix of line 186 in EasyBMP_BMP4.h file. If it works, 
   I'll apply it consistently. I think that VS.net wants us   
   to clear char* blah, then char = new blah [size], just     
   like the old days for g++.                    
                                                              
   Removed EasyBMP_StandardColors.h from standard package     
                                                              
*--------------------------------------------------------------------*

Version: 0.54
   Date: 2-27-2005

   The fix of line 186 in EasyBMP_BMP4.h file appears to have 
   worked. I applied it through the remainder of the code.    
   Hopefully, this should ensure Visual Studio.Net compati-   
   bility.                                       
                                                              
   Fixed some typos in the comment lines         
                                                              
*--------------------------------------------------------------------*

Version: 0.55
   Date: 5-2-2005

   Introduced RGBApixel struct.  
   
   Introduced BMFH, BMIH, and BMP classes.  
   
   Deprecated all old code to *_legacy.h.  
   
   Rewrote EasyBMP_VariousBMPutilities.h to use the new 
   BMP class.  
   
*--------------------------------------------------------------------*

Version: 0.56
   Date: 5-4-2005

   Made Width, Height, and BitDepth private members and added 
   functions for accessing them.                 
                                                              
   Made a new function, SetBitDepth, as the only means to     
   change the bit depth. It will create/resize a palette as   
   necessary. This simplifies the WriteToFile code, as well as
   any palette altering algorithms. (All algorithms can now   
   assume that a properly-sized palette exists.) This will    
   help improve code stability greatly.          
                                                              
   Made a new function, SetSize, as the only way to change the
   width and height of the image.                 
                                                              
   Eliminated useless HasPalette and NumberOfColors members,  
   and added TellNumberOfColors() function.      
                                                              
   Updated EasyBMP_VariousBMPutilities.h to respect privacy   
   of data members.                              

*--------------------------------------------------------------------*

Version: 0.57
   Date: 5-8-2005

   Removed fclose(fp) lines from EasyBMP_BMP.h and 
   EasyBMP_VariousBMPutilities.h whenever ( !fp ) occurs, 
   to avoid a crash when trying to close a non-existant file. 
    
   
   Added a line to set bmfh.bfType = 0; to getBMFH() routine 
   in the case where ( !fp ) occurs, so that a nonexistant file
   doesn't falsely show up as a bitmap file.  
   
   Made error messages in BMP::ReadFromFile(char*) more meaningful, 
   since Argh! doesn't help much. :-)  
   
   Made ReadFromFile operations safer: can deal more effectively 
   with corrupted and/or truncated files by adding the new 
   SafeFread() wrapper function.  
   
   Moved all change-log entries to the change log to make the source
   file tidier.  
   
   Removed all references to Palettes; renamed them to ColorTables. 
   
*--------------------------------------------------------------------*

Version: 0.58
   Date: 5-13-2005

   Rewrote ReadFromFile() to fix program crashes on reading 4-bit 
   files. (*grumble* I can't believe there was such a bug in such 
   a late version! */grumble*)  

   Added support to ReadFromFile() for reading 1-bit files. 

   Rewrote ReadFromFile() to avoid trying to read bitmap files of 
   depths other than 1, 4, 8, 24, and 32 bits.     
   
   Tested reading 4-bit files of width 0,1,2, and 3 (modulo 4),  
   and 1-bit files of width 0,1,2,3,4,5,6, and 7 (modulo 8)   

*--------------------------------------------------------------------*

Version: 0.59
   Date: 5-15-2005

   Made ReadFromFile() more robust. Evidently, reading to the 
   same temp variable all the time made it unstable when reading 
   many files. I would never have guessed. I instead declare BMIH 
   and BMFH objects and read directly to their members. This appears 
   to be more stable when dealing with many ReadFromFile() calls.

   On a related note, made sure to not call SetSize( Width,Height), 
   which is a bit recursive, as well as SetBitDepth( BitDepth ). 
   This appears to help stability, since these two functions were 
   create precisely for the purpose of setting those variables 
   values safely.  

   Made use of the boolean return value in SafeFread() to detect 
   when files are obviously corrupted. Used this to have an early 
   catch in ReadFromFile() and set it to a 1x1 1-bit image and 
   exit.  
   
   Made ReadFromFile() stricter, in that it only reads recognized 
   bit depths (1,4,8,24,32). Any other bit depth will prompt the 
   routine to terminate and set it to a 1x1 1-bit file.  

   Added write support for 1-bit files.  
   
   Rewrote WriteToFile() for 4,8-bit files to match methods used 
   for reading them.  
   
   Revised CreateStandardColorTable() and 
   CreateGreyscaleColorTable() to add support for 1-bit files.  
   
   Rewrote WriteToFile() to be stricter in only writing known bit 
   depths (1,4,8,24,32) and ignoring all others.  

*--------------------------------------------------------------------*

Version: 0.60
   Date: 5-21-2005

   Deprecated *_legacy.h files.  

   Tested library extensivey in linux with good results.  

   Made CreateGreyscaleColorTable() stricter, in that it exits 
   if supplied a bit depth other than 1, 4, or 8.  

   Made cosmetic changes in EasyBMP_DataStructures.h to 
   improve readability.  

   Made SetBitDepth() stricter, in that it will never allow a bitmap 
   to be set to an unsupported bit depth. Only bit depths of 1, 4, 
   8, 24, or 32 are accepted.  

   Made SetSize() stricter, in that it will not allow negative 
   widths or heights.  

   Made cosmetic changes in EasyBMP_BMP.h to improve readability. 

   Added a check in ReadFromFile() to see if the requested width or 
   height is negative, a good sign of file corruption. In such a 
   case, the file is set to a blank 1x1 1-bit file.  
   
   Added code to ReadFromFile() to set size to 1x1 and bit depth to 
   1-bit if the file was not found.  
   
*--------------------------------------------------------------------*

Version: 0.61
   Date: 5-22-2005

   Fixed awIndex typo in WriteToFile().  
   
   Replaced double BestDistance comparisons in WriteToFile() 
   with int BestDistances (so as to do integer operations, 
   rather than double operations). This gave a roughly 100% 
   speedup in 8-bit, 4-bit, and 1-bit write operations on 
   unoptimized (no compiler flags) code and a 30% speedup 
   on optimized code.     

   Removed checks like if( BestDistance < 1 ){ k=256; } .. from 
   WriteToFile(), as they give more overhead than savings in my 
   testing. For 8-bit files, there was a slight gain by putting 
   it back in with another method: 
   while( k < 256 && BestDistance > 0 ). 

   Redefined StepSize in CreateGreyscaleColorTable() to give a 
   better range of greys in 4-bit mode. As it was, white was not 
   in the color table. (Colors were spaced by 256/16 = 16). Now, 
   colors are spaced by (255-1)/(16-1) = 17, which gives the full 
   range.  

*--------------------------------------------------------------------*

Version: 0.62
   Date: 5-25-2005

   Added endianess check function IsBigEndian() to 
   EasyBMP_DataStructures.h file.  
   
   Added functions to swap bytes in WORD and DWORD multibyte 
   variables to EasyBMP_DataStructures.h file for future big-endian 
   support.  
   
   Added functions to switch endianess to BMFH and BMIH objects 
   to EasyBMP_DataStructures.h file.  
   
   Added endianess checks to ReadFromFile() and WriteToFile() 
   functions in EasyBMP_BMP.h file, along with endianess conversions 
   where necessary.   
   
   Added endianess checks and conversions to GetBMFH() and GetBMIH() 
   functions in EasyBMP_VariousBMPutilities.h file.  
   
   Rewrote GetBitmapInfo() function to use GetBMFH() and GetBMIH() 
   functions instead. (In EasyBMP_VariousBMPutilities.h.) This 
   cuts down on the redundancy in the code.  

   Renamed GetBitmapInfo() to DisplayBitmapInfo() in the 
   EasyBMP_VariousBMPutilities.h file.  
   
   With these changes, big-endian architectures should be supported, 
   including IBM PowerPC, Sun Sparc, Motorola 86k, etc., and 
   including Mac OSX.  
   
*--------------------------------------------------------------------*

Version: 0.63
   Date: 7-20-2005

   Added IntPow(int,int) function to help compiling with std
   namespace. Besides, integer operations are faster and more 
   accurate. 
   
   Moved Square(double), IntSquare(int), and IntPow(int,int) to 
   EasyBMP_DataStructures.h  
   
   Simplified and cleaned up code in 
   Create4bitColorTable( RGBApixel**).
   
   Changed safety check in BMP.ReadFromFile(char*) to set size to 
   1 x 1 if width or height is non-positive, rather than simply 
   negative. 
   
   Added bounds checking to BMP.operator()(int,int) to automatically 
   truncate requested pixel if out of bounds. Also added a warning
   to cue the user in. :-)

   Made error messages more consistent in format.  
   
   Simplified and cleaned up code in 
   Create4bitColorTable( RGBApixel**).
   
   Added #include <iostream.h> to EasyBMP.h, since EasyBMP uses 
   cout, etc.  

   Simplified and cleaned up code in 
   Create1bitColorTable( RGBApixel**).
     
   Changed BMP.SetSize(int,int) to disallow non-positive widths and 
   heights, rather than simply negative widths and heights. Such 
   function calls are now ignored.  

*--------------------------------------------------------------------*

Version: 0.64
   Date: 8-2-2005

   Changed "include <iostream.h>" to "include <iostream>" for
   ANSI-C++ compliance, as well as for better compatibility with the
   std namespace and VC++. (Thanks, Tommy Li!)  

   Added some #ifndef pragmas to each header so that it should be
   fine to incluce EasyBMP.h in multiple files in larger projects. 

   Added "using namespace std" inside any function that used C++ 
   math or I/O operations. I avoided putting "using namespace std"
   anywhere with global scope for maximum compatibility with C++
   software in the wild.  

   Added includes for <cmath> and <cstdio> to EasyBMP.h  

   Removed unused temporary variables (TempWORD and TempDWORD) from 
   EasyBMP_BMP.h for cleaner compiling. If I see any more such 
   unused variables, I'll remove them, too.  

*--------------------------------------------------------------------*

Version: 0.65
   Date: 8-13-2005

   Moved implementations of BMP::BMP(), BMP::~BMP(), and 
   BMP::operator()(int,int) outside of the class. This should help 
   for eventually moving everything into a separate cpp file. 
   
   Made RGBApixel** Pixels a private data member of the class 
   BMP.  
   
   Added function void BMP::SetColor(int,RGBApixel) to BMP class 
   to allow safe method of changing a color in the color table. 
   
   Added function RGBApixel BMP::GetColor(int) to BMP class 
   to allow safe method of retrieving a color in the color 
   table.  
   
   Cleaned up error messages in EasyBMP_BMP.h  
   
   Cleaned up error messages in EasyBMP_VariousBMPutilities.h 

*--------------------------------------------------------------------*

Version: 0.66
   Date: 8-18-2005

   EasyBMP_StandardColorTables.h was removed from the library. 
   
   CreateStandardColorTable(RGBApixel**,int) was changed to 
   CreateStandardColorTable() and made a member function of BMP.
   All other CreateStandardColorTable functions are now unnecessary 
   and have been removed.  
   
   CreateGreyscaleColorTable(RGBApixel**,int) was changed to 
   CreateStandardColorTable( BMP& ) and moved to 
   EasyBMP_VariousBMPutilities.h.  
   
   RGBApixel* Colors was made a private data member of the BMP 
   class.  

   CreateGreyscaleColorTable( BMP& ) was renamed to 
   CreateGrayscaleColorTable( BMP& ).  
   
*--------------------------------------------------------------------*

Version: 0.67
   Date: 9-14-2005

   Made the EasyBMP custom math functions in 
   EasyBMP_DataStructures.h inline. (Square,IntSquare,IntPow). 
   This should make those function calls faster while improving 
   compatibility with compiling DLL's. 
   
   Separated the code from SafeFread() in EasyBMP_BMP.h to 
   improve compatibility with compiling DLL's.  

   Removed #define _WINGDI_H from EasyBMP_DataStructures.h to 
   improve compatibility with win32 applications. Instead, 
   there's an extra #ifndef _SELF_DEFINED_BMP_DATA_TYPES 
   conditional added.  
   
   _SELF_DEFINED_BMP_DATA_TYPES renamed to _SELF_DEFINED_WINGDI  
   in EasyBMP_DataStructures.h.  
   
   All bit-flipping functions (IsBigEndian, FlipWORD, 
   FlipDWORD) in EasyBMP_DataStructures.h were made inline 
   to improve execution speed and improve compatibility with 
   compiling DLL's.  
   
   All code was separated from function declarations in 
   EasyBMP_VariousBMPutilities.h to improve compatibility 
   with compiling DLL's.  

   Updated and cleaned up layout of EasyBMP_ChangeLog.txt.

   Updated contact and support information in library files. 

   Corrected the LGPL license version. 

*--------------------------------------------------------------------*

Version: 0.68
   Date: 10-9-2005

   Changed references to FILE to std::FILE in the SafeFread function 
   in EasyBMP_BMP.h to improve compatibility with Borland's compiler. 
   
   Removed a few assignments in EasyBMP_BMP.h that weren't used to 
   improve efficiency and reduce Borland warnings. 
   
   Changed calls like NotCorrupted = SafeFread() to 
   NotCorrupted &= SafeFread() in BMP::ReadFromFile() in EasyBMP_BMP.h
   to improve robustness. Now, if the NotCorrupted bit is ever set 
   to false, it stays false, meaning that the function won't "forget" 
   that it encountered file corruption.
   
*--------------------------------------------------------------------*

Version: 0.69
   Date: 10-19-2005

   Changed BMP::WriteToFile( char* ) to BMP::WriteToFile(const char*)
   in EasyBMP_BMP.h to respond to a feature request. 

   Changed BMP::ReadFromFile( char* ) to BMP::ReadToFile(const char*)
   in EasyBMP_BMP.h to respond to a feature request. 

   Made BMP::ReadFromFile() and BMP::WriteToFile() in EasyBMP_BMP.h 
   return true/false to indicate success/failure in the operations. 
   These functions previously returned void.

   Made BMP::SetSize() and BMP::SetBitDepth() in EasyBMP_BMP.h 
   return true/false to indicate success/failure in the operations.    
   These functions previously returned void.

   Made BMP::SetColor() and BMP::CreateStandardColorTable() in 
   EasyBMP_BMP.h return true/false to indicate success/failure in the 
   operations. These functions previously returned void.  

   Made CreateGrayscaleColorTable() in EasyBMP_VariousBMPutilities.h 
   return true/false to indicate success/failure in the operations. 
   This function previously returned void.
  
   Changed the char* argument GetBMFH( char* ), GetBMIH( char* ), 
   DisplayBitmapInfo( char* ), and GetBitmapColorDepth( char* ) in 
   EasyBMP_VariousBMPutilities.h to const char* for cleaner, safer 
   programming. 

*--------------------------------------------------------------------*

Version: 0.70
   Date: 10-19-2005

   Found and fixed error in BMP::ReadFromFile() in the check for only 
   reading support bit depths.

   Changed license from LGPL to BSD (revised/modified) to simplify 
   licensing issues and resolve any lingering licensing questions.

   Fixed compiler error when using MSVC++. 
 
   Improved fix to allow compiling with Borland without breaking 
   Borland support. 

   Added a few lines to EasyBMP.h to make it easier to tailor code 
   to specific compilers. (For future use as needed.)

   Added a few lines to EasyBMP_BMP.h (in BMP::ReadFromFile(), 
   BMP::WriteToFile(), and BMP::SetBitDepth()) to eventually add 
   support for 16-bit files.

*--------------------------------------------------------------------*

Version: 0.71
   Date: 11-01-2005

   Cleaned up comments in BMP::ReadFromFile() in EasyBMP_BMP.h

   Added endian-safe read support for 16-bit files that are in the 
   standard 5-5-5 format (not specified in bit fields)

   Added endian-safe read support for 16-bit files that use bit 
   fields, including 5-6-5 files.

   Added endian-safe write support for 16-bit files. Uses the 5-6-5 
   encoding scheme to maximize the utility of the bits used. 

   Added a check for compression in BMP::ReadFromFile(). Because 
   file compression is beyond the scope of EasyBMP, such files are 
   not supported, and EasyBMP now properly detects these situations 
   and exits with an error. 

   Added a check for files that attempt to use bit fields but are not 
   16-bit files to BMP::ReadFromFile(). Such files are not supported. 

   Added a check to BMP::ReadFromFile() for files that use unknown 
   values of bmih.biCompression, such as old OS2 bitmaps. Such files 
   are not supported. 

   Removed "switching endianness" messages from EasyBMP_BMP.h 

   Added support for indexed (1, 4, and 8-bit) files that don't 
   specify all the colors. 

   Added support for reading files that include extra meta data before
   the pixels. This data is skipped. 
 
   Added enclosing #ifndef EasyBMP ... lines to EasyBMP.h as a 
   further safeguard when EasyBMP is included in multiple cpp 
   files. 

*--------------------------------------------------------------------*

Version: 1.00
   Date: 02-06-2006

   First Production/Stable release.

   Corrected typographical errors in the comment sections of all 
   files.

   Updated copyright on all files.

   Removed extraneous comment in BMIH::BMIH() function in 
   EasyBMP_DataStructures.h file.

   Replaced instances of \n with the more modern endl in 
   EasyBMP_DataStructures.h, EasyBMP_BMP.h, and 
   EasyBMP_VariousBMPutilities.h.

   Added placeholder MetaData1 and MetaData2 data members to the 
   BMP class for potential future use.

   Removed extraneous comments from EasyBMP_BMP.h.
   
   Removed warning messages for switching endianness from 
   EasyBMP_VariousBMPutilities.h.

   Updated copyright in EasyBMP_ChangeLog.txt file.

   Fixed formatting issues in EasyBMP_ChangeLog.txt file.

   Added DefaultXpelsPerMeter and DefaultYpelsPerMeter in 
   EasyBMP.h. These will default to 96 dpi.

   Changed BMP::WriteToFile() to use DefaultXpelsPerMeter and 
   DefaultYpelsPerMeter when writing the BMIH structure.

   Added XpelsPerMeter and YpelsPerMeter data members to BMP 
   class so that horizontal and vertical resolution are handled
   properly. Currently, upon reading a file, the stated resolutions 
   are preserved, and upon writing, if no resolutions are given, 
   the defaults (of 96 DPI) are used. 

   Added function void BMP::SetDPI(int,int) to set the horizontal 
   and vertical resolutions. 

   Removed some unnecessary code from GetBitmapColorDepth() in 
   EasyBMP_VariousBMPutilities.h.

   Fixed a bug in RangedPixelToPixelCopyTransparent() and 
   RangedPixelToPixelCopy() in EasyBMP_VariousBMPutilities.h which 
   caused copies to be truncated by an extra row or column in 
   certain circumstances.

   Fixed a bug in RangedPixelToPixelCopyTransparent() and 
   RangedPixelToPixelCopy() in EasyBMP_VariousBMPutilities.h which 
   checked the wrong variable (FromT instead of FromB) to see if 
   it was out of range. 

   Added extra checks to RangedPixelToPixelCopyTransparent() and 
   RangedPixelToPixelCopy() in EasyBMP_VariousBMPutilities.h to 
   prevent attempted access of out-of-range pixels.

*--------------------------------------------------------------------*

Version: 1.01
   Date: 03-31-2006

   Made only the short functions Square, IntSquare, IsBigEndian, 
   FlipWORD, and FlipDWORD inline functions in 
   EasyBMP_DataStructures.h.
   
   Moved all code (other than inline functions) to EasyBMP.cpp.

   Changed DefaultXPelsPerMeter and DefaultYPelsPerMeter to #define 
   lines in EasyBMP.h to make the library compatible with 
   with the header-code split. 
   
   Removed memory hole in ~BMP() where "delete Colors;" was used 
   instead of "delete [] Colors;". Likewise with MetaData1 and 
   MetaData2.
   
   Fixed memory leak in BMP::SetBitDepth() by changing to 
   delete [] Colors;
   
   Removed potential memory leak in BMP::WriteToFile() in 24- and 
   32-bit writing where szTemp wasn't delete at the end of a row.
   
   Fixed bug where XPelsPerMeter and YPelsPerMeter weren't 
   properly initialized in the BMP::BMP() constructor, leading 
   to strange horizontal and vertical resolutions. 
   
   Fixed memory leak in BMP::ReadFromFile() where TempSkipBYTE 
   wasn't deleted.
      
   Fixed memory leak in BMP::ReadFromFile() where szTemp wasn't 
   deleted.
   
   Added BMP::TellVerticalDPI() and BMP::TellHorizontalDPI() 
   functions to give this information. If those values have 
   not yet been set, then they are first set to the EasyBMP 
   defaults of 96 dpi. 
   
   Set uninitialized RGBApixel values to white (255,255,255,0) 
   in a few functions for the BMP class.

   Added a sample cpp application and makefile.
   
*--------------------------------------------------------------------*

Version: 1.02
   Date: 05-29-2006

   Inserted a line into EasyBMP.h to suppress the Visual Studio 
   warnings. We'll keep using the C++ standard fopen for now 
   until fopen_s becomes a real standard. 
   
   Moved the code sample and makefile to a subdirectory, so that 
   unzipping EasyBMP#_##.zip into a project directory doesn't 
   overwrite any crucial makefiles. 
   
   Improved SafeFread() to check if the proper amount of data 
   could be read. 
   
   Dramatically cleaned up ReadFromFile() code for 1 and 4 
   bpp files.
   
   Fixed a typo (draw.o) in the sample makefile.
   
   Modified ReadFromFile() to use buffering when reading the pixel 
   data. This should substantially improve disk access performance.
   Only 16 bpp files are read in the old, slower way. 
   
   Changed DWORD from unsigned long to unsigned int. This should 
   fix the issue where 64-bit machines see DWORD as an 8-byte 
   data type, rather than 4 bytes. (Thank you to Bas Wegh!)
   
   Renamed BYTE, WORD, and DWORD data types to ebmpBYTE, ebmpWORD, 
   and ebmpDWORD to eliminate the possibility of conflict with 
   windows applications, particularly with 64-bit windows, which 
   likely uses 8 byte DWORDS. 
   
   Modified WriteToFile() to use buffering when reading the pixel 
   data. This should substantially improve disk access performance.
   Only 16 bpp files are read in the old, slower way. 
   
   Added new function, EasyBMPcheckDataSize(), to check that 
   the ebmpBYTE, ebmpWORD, and ebmpDWORD types have the correct 
   type. 
   
   Added some new macros of the EasyBMP version number for easier 
   version checking. New versions include _EasyBMP_Version_ 
   (a double), _EasyBMP_Version_String_ (a char* version), and 
   _EasyBMP_Version_Integer_ (an integer version, e.g., 102).

*--------------------------------------------------------------------*

Version: 1.03
   Date: 06-20-2006

   Inserted a line into EasyBMP.h to suppress the Visual Studio 
   
   Added a check to BMP.SetColor() to ensure that the color table 
   is defined before attempting to set a color entry. 

   Added a check to BMP.GetColor() to ensure that the color table 
   is defined before attempting to retrieve a color entry. 
   
   Simplified the conditional in BMP.WriteToFile() from  
   if( BitDepth == 1 || BitDepth == 4 || ... ) to the simpler 
   if( BitDepth != 16 ).
   
   Removed the old, unused code for writing 1- and 4-bit files 
   from BMP.WriteToFile().
   
   Removed the line Colors = new RGBApixel [NumberOfColors]; in 
   BMP.ReadFromFile(). This operation is already covered by the 
   earlier SetBitDepth() call, and may contribute to a memory 
   leak. Furthermore, for files that had fewer than expected 
   number of colors (e.g., an 8-bit file with 236 colors), it 
   lead to memory access errors in BMP.GetColor() and BMP.SetColor(). 
   (In fact, this is the main motivation for release 1.03.) 
   
   Added a warning when BMP.ReadFromFile() encounters an under-
   specified color table, and code to pad the table with white 
   entries. 
   
   Added screen output on EasyBMP version and project website to 
   the code sample.
   
*--------------------------------------------------------------------*

Version: 1.04
   Date: 07-22-2006

   Removed the assignment to the integer i in IntPow() to eliminate a 
   Borland compiler warning.    

   Removed the assignment to the integer i in the Read##bitRow() 
   functions to eliminate Borland compiler warnings.
   
   Removed the assignment to ZeroWORD in line 478 of EasyBMP.cpp in 
   BMP::WriteToFile() to eliminate Borland compiler warnings.
   
   Removed the assignment to ZeroWORD in line 825 of EasyBMP.cpp in 
   BMP::ReadFromFile() to eliminate Borland compiler warnings.   
   
   The Borland warnings about conditions always being false are 
   incorrect. (Lines 1587, 1594, and 1601.) Likewise, the Borland 
   warnings about unreachable code (lines 1589, 1596, and 1603) are 
   incorrect. This code serves as a protection on unexpected hardware 
   where the data types may not be of the correct size, and helps to 
   future-proof EasyBMP. The first time this type of error was 
   encountered was on 64-bit CPUs, where the size of the DWORD was 
   larger than assumed when writing EasyBMP. Therefore, we will not 
   "correct" these "errors" detected by Borland. If they bother you, 
   compile with the -w-8008 and -w-8066 options.
   
   Borland issues warnings about argc and argv being unused in the 
   sample project. These are silly warnings and will be ignored. If 
   this warning bothers you, compile with the -w-8057 option.
   
   Modified the sample makefile so that EasyBMP.o depends upon 
   EasyBMP.cpp and EasyBMP*.h in the current working directory, rather
   than the parent directory.
   
   Added a global EasyBMPwarnings boolean variable, and functions 
   SetEasyBMPwarningsOn() and SetEasyBMPwarningsOff() to enable and 
   disable EasyBMP warnings and errors. Note that this will not 
   disable error checking or any other EasyBMP behavior, other than 
   cout output of the warning and error messages.
   
   Added the function GetEasyBMPwarningState() to query the EasyBMP 
   warning state. (Either warnings are enabled or disabled.)

   Removed old commented code (Write1bitRow()) from EasyBMP.cpp. 

   Replaced the 24-bit EasyBMPbackground.bmp image in the code sample 
   with a dithered 8-bit version to reduce the download size of the 
   core library.
    
*--------------------------------------------------------------------*

Version: 1.05
   Date: 11-01-2006

   Renamed BytesRead to ItemsRead in the SafeFread() function in 
   EasyBMP.cpp for greater clarity.
   
   Added a copy constructor to the BMP class. However, note that 
   passing by value is not recommended practice. (Passing by refer-
   ence is much faster, and consumes less memory.) 
   
   Added a new function: 
       bool Rescale( BMP& InputImage, char mode, int NewDimension );
   to resize an image. The mode variables are as follows:
    'P': resizes the image to a new percentage of the old size, 
	     e.g., 42%, 13%, etc. 
         example: Rescale( SomeImage, 'p', 42 );
    'W': resizes the image such that the new width is as specified. 
         example: Rescale( SomeImage, 'W', 100 );
    'H': resizes the image such that the new height is as specified. 
         example: Rescale( SomeImage, 'H', 100 );
    'F': resizes the image to fit in a square of specified size. 
         example: Rescale( SomeImage, 'F', 100 ); // fits in 100x100
		                                          // box
   All rescaling is done with bilinear interpolation. 

*--------------------------------------------------------------------*

Version: 1.06
   Date: 12-01-2006

   Added includes for <cctype> and <cstring> to EasyBMP.h. These are
   used and should have been included all along. This should help 
   with Intel icc compiling. 
   
   Fixed the && bug in the copy constructor. (Thank you to user 
   fcnature!)
   
   Added image scaling to the supplied code sample.
   
   Added GetPixle() and SetPixel() functions for future use. These 
   will be added to enable more careful use of the const keyword.
   
*--------------------------------------------------------------------*