Download | Plain Text | Line Numbers


/**
 * @module CPixmap
 * @author Guenther Neuwirth (0626638), Manuel Mausz (0728348)
 * @brief  Implementation of CFile CBitmap handling XPM.
 * @date   27.04.2009
 */
 
#ifndef CPixmap_H
#define CPixmap_H
 
#include <stdint.h>
#include "cbitmap.h"
 
#define PIXMAP_IDENTIFIER "/* XPM */"
#define PIXMAP_COLORCHARS ".#abcdefghijklmnopqrstuvwxyzABCD" \
                          "EFGHIJKLMNOPQRSTUVWXYZ0123456789"
 
/**
 * @class CPixmap
 * @brief Implementation of CFile handling Pixmap file format.
 *
 * In order to support operations on pixmaps in color mode an 
 * implementations of CPixelFormat is used. These classe are
 * allowed to modify the pixmap header, pixelbuffer and color table directly.
 *
 * On error CFile::FileError is thrown.
 */
class CPixmap : public CBitmap
{
  public:
    /**
     * @method CPixmap
     * @brief  Default ctor
     * @param  -
     * @return -
     * @globalvars none
     * @exception  none
     * @conditions none
     */
    CPixmap();
 
    /**
     * @method ~CPixmap
     * @brief  Default dtor
     * @param  -
     * @return -
     * @globalvars none
     * @exception  none
     * @conditions none
     */
    ~CPixmap()
      {}
 
    /**
     * @method read
     * @brief  Reads Pixmap from filestream.
     *         On error an exception is thrown.
     * @param  in filestream to read data from
     * @return -
     * @globalvars none
     * @exception CFile::FileError
     * @exception bad_alloc
     * @conditions none
     */
    void read(std::ifstream& in);
 
    /**
     * @method write
     * @brief  Writes Pixmap to filestream.
     * @param  out filestream to read data from
     * @return -
     * @globalvars none
     * @exception  FileError
     * @exception  bad_alloc
     * @conditions none
     */
    void write(std::ofstream& out);
 
#ifdef DEBUG
    /**
     * @method dump
     * @brief  Dumps the Pixmap file header and pixel data to ostream
     * @param  out output stream
     * @return -
     * @globalvars
     * @exception
     * @conditions
     */
    void dump(std::ostream& out);
#endif
 
    /**
     * @method getPixelDataSize
     * @brief  Return size of pixelbuffer
     * @param  -
     * @return size of pixelbuffer
     * @globalvars none
     * @exception  none
     * @conditions none
     */
    const uint32_t getPixelDataSize()
    {
      return m_fileheader.width * m_fileheader.height * sizeof(uint32_t);
    }
 
    /**
     * @method getHeight
     * @brief  Return height of bitmap in pixel
     * @param  -
     * @return height of bitmap in pixel
     * @globalvars none
     * @exception  none
     * @conditions none
     */
    const uint32_t getHeight()
    {
      return m_fileheader.height;
    }
 
    /**
     * @method getWidth
     * @brief  Return width of bitmap in pixel
     * @param  -
     * @return width of bitmap in pixel
     * @globalvars none
     * @exception  none
     * @conditions none
     */
    const uint32_t getWidth()
    {
      return m_fileheader.width;
    }
 
    /**
     * @method hasColorTable
     * @brief  Check if bitmap has a colortable
     *         (we don't support this yet for windows bitmaps)
     * @param  -
     * @return true if bitmap has a colortable. false otherwise
     * @globalvars none
     * @exception  none
     * @conditions none
     */
    const bool hasColorTable()
    {
      return true;
    }
 
    /**
     * @method isMirrored
     * @brief  Windows Bitmaps can be stored upside down
     * @param  -
     * @return true if bitmap is stored upside down. false otherwise
     * @globalvars none
     * @exception  none
     * @conditions none
     */
    const bool isMirrored()
    {
      /* pixmap is never mirrored */
      return false;
    }
 
  protected:
    /**
     * @method getLine
     * @brief  read trimmed line (terminated by \n) from filestream
     * @param  in              filestream to read data from
     * @param  ignore_comments true: ignore c-like comments
     * @return return trimmed line from filestream
     * @globalvars none
     * @exception  none
     * @conditions none
     */
    std::string getLine(std::ifstream& in, bool ignore_comments = true);
 
    /**
     * @method getArrayLine
     * @brief  read trimmed c-arrayline from filestream
     * @param  in filestream to read data from
     * @return return trimmed c-arrayline from filestream
     * @globalvars none
     * @exception  FileError
     * @conditions none
     */
    std::string getCArrayLine(std::ifstream& in);
 
    /**
     * @method getXPMColorID
     * @brief  get xpm color identifier, generated using an index
     * @param  index  index used to generate the xpm color identifier
     * @param  length length of xpm color identifier
     * @return return xpm color identifier, generated using index
     * @globalvars none
     * @exception  FileError
     * @conditions none
     */
    const std::string getXPMColorID(unsigned int index, unsigned int length);
 
    /**
     * @brief Pixmap Header structure
     */
    typedef struct
    {
      /** the xpm width in pixels (signed integer) */
      uint32_t width;
      /** the xpm height in pixels (signed integer) */
      uint32_t height;
      /** the number of colors (signed integer) */
      uint32_t nColor;
      /** the number of characters per pixel (signed integer) */
      uint32_t nChar;
      /** X-Position Hotspots */
      uint32_t xHotspot;
      /** Y-Position Hotspots */
      uint32_t yHotspot;
      /** is hotspot set */
      bool _HOTSPOT;
      /** XPMEXT extension tag found*/
      bool _XPMEXT;
      /** unchanged extension */
      std::string extension;
    } PIXMAP_FILEHEADER;
 
    /* members */
    /** fileheader */
    PIXMAP_FILEHEADER m_fileheader;
    /** name of image/c-array */
    std::string m_imagename;
};
 
#endif
 
/* vim: set et sw=2 ts=2: */