/* This file is part of dvi2bitmap; see README for copyrights and licence */
#ifndef BITMAP_HEADER_READ
#define BITMAP_HEADER_READ 1
#include "Byte.h"
//#include "DviFile.h" /* needed by BitmapMark */
#include "DviFilePosition.h"
#include "DviError.h"
#include "verbosity.h"
class BitmapError : public DviError {
public:
BitmapError(string s) : DviError(s) { };
};
/**
* Represents an abstract bitmap.
* The bitmaps written to file are subclasses of the class {@link BitmapImage}.
*/
class Bitmap {
public:
Bitmap (const int width, const int height, const int bpp=1,
bool expandable=true,
const int maxwidth=-1, const int maxheight=-1)
throw (BitmapError);
~Bitmap();
// make sure Left..Bottom are 0..3 (I should use an iterator, I know...)
enum Margin { Left=0, Right=1, Top=2, Bottom=3, All};
void paint (const int x, const int y, const int w, const int h,
const Byte* b)
throw (BitmapError);
void rule (const int x, const int y, const int w, const int h)
throw (BitmapError);
void strut (const int x, const int y,
const int l, const int r,
const int t, const int b)
throw (BitmapError);
void write (const string filename, const string format)
throw (BitmapError);
void freeze ();
void crop ();
static void cropDefault (Margin spec, int pixels, bool absolute=false)
throw (BitmapError);
void crop (Margin spec, int pixels, bool absolute=false)
throw (BitmapError);
void blur ();
void clear();
/**
* Sets the current bitmap to be transparent, if possible.
* @param sw if true, the current bitmap is set to be transparent
*/
void setTransparent(const bool sw) { transparent_ = sw; }
typedef struct BitmapColour_s {
Byte red, green, blue;
} BitmapColour;
void setRGB (const bool fg, const BitmapColour*);
static void setDefaultRGB (const bool fg, const BitmapColour*);
void scaleDown (const int factor)
throw (BitmapError);
/**
* Is the bitmap empty? If nothing has (yet) been written to the
* bitmap, or if everything that was written was out of
* bounds, then the bitmap is empty.
*
* @return true if the bitmap is empty
*/
bool empty () const
{ return (bbL > W || bbR < 0 || bbT > H || bbB < 0); }
bool overlaps() const;
int* boundingBox();
/**
* Returns the total width of the bitmap. This may not the the
* initial size of the bitmap, if it has expanded since then.
* @return width of bitmap
*/
int getWidth() const { return W; }
/**
* Returns the total height of the bitmap. This may not the the
* initial size of the bitmap, if it has expanded since then.
* @return height of bitmap
*/
int getHeight() const { return H; }
/**
* Sets the verbosity of the current class.
* @param level the required verbosity
* @return the previous verbosity level
*/
static verbosities verbosity (const verbosities level) {
enum verbosities oldv = verbosity_;
verbosity_ = level;
return oldv;
}
/**
* Sets whether bitmap information is logged. If logging is
* enabled, then the details of the bitmaps are sent to the
* stdout
prefixed by the given string.
*
* @param prefix if non-null, then bitmap activity is logged on
* stdout with this prefix; if null, such logging is turned off
*/
static void logBitmapInfo (const char *prefix) {
logBitmapPrefix_ = prefix;
};
#if 0
/**
* Represents a location within the bitmap. Coordinates
* x
and y
are relative to the top-left
* corner of the bitmap, with the pixel in the top-left corner
* having coordinates (0,0).
*
*
See {@link #mark} and {@link #getMark}. */ class BitmapMark { private: double x, y; DviFile* dvif; public: BitmapMark(DviFile*, double x_sp, double y_sp); double getX(const DviFile::DviUnits u); double getY(const DviFile::DviUnits u); void shift(double dx, double dy, DviFile::DviUnits u); void scale(double factor); // make a static copy BitmapMark* copy(); }; void mark(DviFile*, const double x, const double y); BitmapMark* getMark(); #endif void mark(DviFilePosition*); DviFilePosition* getMark(); /** Iterator class */ class const_iterator { public: Byte* operator*() throw (DviError); const_iterator& operator++() throw (DviError); bool operator==(const const_iterator& it) const; bool operator!=(const const_iterator& it) const; ~const_iterator(); private: const_iterator(); void init(Byte* b, int startx, int starty, int width, int nrows); Byte* b_; int rowLength_; int rowNumber_; int startColumn_; int lastRow_; friend class Bitmap; }; const_iterator runningIterator_; static const_iterator endIterator_; const_iterator begin(); const_iterator end() const; private: void normalizeBB_(int& l, int& r, int& t, int& b); void usesBitmapArea_(const int ulx, const int uly, const int lrx, const int lry); /** pointer to bitmap. Pixel (x,y) is at B[y*W + x]; */ Byte *B; /** width and height of bitmap */ int W, H; /** Maximum height and width */ int maxW_, maxH_; /** is the bitmap to be expandable? */ bool isExpandable_; /** bounding box. bbL and bbT are the leftmost and topmost * blackened pixels, bbR and bbB are one more than the rightmost * and lowest blackened pixels. Until a call to freeze(), bb? may * go outside the canvas (ie, may be negative or greater than W or * H); afterwards they are bounded by 0..W and 0..H. These * remain the edges of the blackened pixels even after cropping, * and so it is the responsibiligy of the boundingBox() method to * take cropping into account. */ int bbL, bbR, bbT, bbB; /** holds return values for boundingBox() */ int BB[4]; /** Flag is set true when the bitmap is frozen */ bool frozen_; /** cropX is the value of bbX when the crop() method was called */ int cropL, cropR, cropT, cropB; /** Flag is set true when the bitmap is frozen */ bool cropped_; /** Flag is set true when the bitmap is scaled */ bool scaled_; /** Location of mark */ DviFilePosition* mark_; /** When cropping, set margins. Indexed by enumerator Bitmap::Margin. */ static int cropMarginDefault[4]; int cropMargin[4]; static bool cropMarginAbsDefault[4]; bool cropMarginAbs[4]; /** If true, make background transparent if possible */ bool transparent_; BitmapColour fg_, bg_; /** If true, custom colours have been set */ bool customRGB_; /** Default background colours */ static BitmapColour def_fg_, def_bg_; static bool def_customRGB_; /** bits-per-pixel */ int bpp_; /** Maximum colour index (must fit into a Byte) */ Byte max_colour_; /** The reporting verbosity level */ static verbosities verbosity_; /** The prefix when reporting bitmap information. Set to zero to suppress */ static const char* logBitmapPrefix_; }; #endif //#ifndef BITMAP_HEADER_READ