#include #include #define USING_MEMSET 1 class pixmap { // this section is, by default, private public: virtual void clear() = 0; virtual void set_pixel(unsigned int x, unsigned int y, int value) = 0; virtual int get_pixel(unsigned int x, unsigned int y) const = 0; virtual unsigned int get_width() const = 0; virtual unsigned int get_height() const = 0; virtual size_t get_memory_size() const = 0; virtual void print_name(std::ostream & output) const; pixmap(const char * n): name(n) {}; virtual ~pixmap() {}; protected: const char * name; }; void pixmap::print_name(std::ostream & output) const { output << name << std::endl; } class ascii_pixmap : public pixmap { // class ascii_pixmap extends pixmap public: ascii_pixmap(unsigned int width, unsigned int height); virtual ~ascii_pixmap(); virtual void clear(); virtual void set_pixel(unsigned int x, unsigned int y, int value); virtual int get_pixel(unsigned int x, unsigned int y) const; virtual unsigned int get_width() const; virtual unsigned int get_height() const; virtual size_t get_memory_size() const; void set_background(char c) { bg = c; } void set_foreground(char c) { fg = c; } char get_background() const { return bg; } char get_foreground() const { return fg; } private: unsigned int width; unsigned int height; char * data; char fg; char bg; }; ascii_pixmap::ascii_pixmap(unsigned int w, unsigned int h) : pixmap("ascii"), width(w), height(h), fg('*'), bg(' ') { data = new char[width*height]; // WARNING: check allocation std::cout << "ascii_pixmap::ascii_pixmap() called." << std::endl; } ascii_pixmap::~ascii_pixmap() { delete (data); std::cout << "ascii_pixmap::~ascii_pixmap() called." << std::endl; } void ascii_pixmap::clear() { #if USING_MEMSET memset(data, bg, width*height); #else for (int i = 0; i < width*height; ++i) data[i] = bg; #endif } void ascii_pixmap::set_pixel(unsigned int x, unsigned int y, int value) { data[x + y*width] = value; } int ascii_pixmap::get_pixel(unsigned int x, unsigned int y) const { return data[x + y*width]; } unsigned int ascii_pixmap::get_width() const { return width; } unsigned int ascii_pixmap::get_height() const { return height; } size_t ascii_pixmap::get_memory_size() const { return width*height; } ascii_pixmap & operator |= (ascii_pixmap & a, const ascii_pixmap & b) { int w = (a.get_width() < b.get_width()) ? a.get_width() : b.get_width(); int h = (a.get_height() < b.get_height()) ? a.get_height() : b.get_height(); for (int x = 0; x < w; ++x) for (int y = 0; y < h; ++y) if (b.get_pixel(x, y)) a.set_pixel(x,y,1); return a; } int main() { pixmap * p; ascii_pixmap * ap; ap = new ascii_pixmap(100, 200); p = ap; std::cout << "my name is: "; ap->print_name(std::cout); ascii_pixmap aa(200, 300); aa |= *ap; delete(p); return 0; }