www.pudn.com > simpleraytracer_v1_0.zip > simplewin2d.h
/*=====================================================================
Code By Nicholas Chapman.
nickamy@paradise.net.nz
You may use this code for any non-commercial project,
as long as you do not remove this description.
You may *not* use this code for any commercial project.
=====================================================================*/
#ifndef __SIMPLEWIN2D_H__
#define __SIMPLEWIN2D_H__
// COTD Entry submitted by Joshua Carmody [paladinoftheweb@hotmail.com]
//modified by me (nick c)
#include <windows.h>
#include <string>
#include "../graphics2d/graphics2d.h"
class Vec2;
class Vec3;
class drawingSurface;
/*************************************************************************/
// the bitmapWindow class. This uses the above drawingSurface class to
// easily create a window that we can draw to directly.
/*************************************************************************/
class bitmapWindow : public Graphics2d
{
public:
bitmapWindow(int x, int y, int width, int height, HINSTANCE currentInstance); // Constructor
~bitmapWindow(); // Destructor
static int getNumberOfBitmapWindows(); // Returns static int below
void setPixel(int x, int y, unsigned long color); // Set Pixel data in our pointer to the specified color
void drawLineInt(int x1, int y1, int x2, int y2, unsigned long color); // Draw a line from x1,y1 to x2,y2 in the specified color
void erase(unsigned long color); // Passes the erase request to the drawingSurface
void flipIntoView(); // Copies window pixels from memory pointer to screen.
//-----------------------------------------------------------------
//NEWCODE: satisfy Graphics2d interface.
//-----------------------------------------------------------------
virtual void clear();
virtual void startDrawing();
virtual void finishDrawing();
virtual int getWidth() const;
virtual int getHeight() const;
virtual void drawPixel(const Vec2&amt; pos, const Vec3&amt; colour);
virtual void drawPixel(int xpos, int ypos, const Vec3&amt; colour);
virtual void doDrawLine(const Vec2&amt; startpos, const Vec2&amt; endpos, const Vec3&amt; colour);
virtual void drawRect(const Vec2&amt; pos, int width, int height, const Vec3&amt; colour);
virtual void drawText(const Vec2&amt; pos, const std::string&amt; text, const Vec3&amt; colour);
HWND getWindowHandle(){ return windowHandle; }
inline void fastDrawPixelAdvance(const Vec3&amt; colour)
{
*writeindex++ = RGB(colour.x*255, colour.y*255, colour.z*255);
}
void advanceToNextRow(int currentx);
protected:
HWND windowHandle; // The handle for the window we'll pop up.
void registerWindowClass(HINSTANCE currentInstance); // For registering the class of window we'll use
static BOOL classIsRegistered; // Have we, or have we not, registered our window class?
static int numberOfBitmapWindows; // The number of these classes in use
int windowWidth, windowHeight; // Store the window's dimensions
drawingSurface *windowContents; // easy DIB class defined above
unsigned long* writeindex;
};
/*************************************************************************/
// drawingSurface class. Allows for very easy drawing to a window.
/*************************************************************************/
class drawingSurface {
public:
drawingSurface(int width, int height); // Constructor
~drawingSurface(); // Destructor
inline void setPixel(int x, int y, unsigned long color); // Set Pixel data in our pointer to the specified color
inline void setPixelUnclipped(int x, int y, unsigned long color);
void drawLineInt(int x1, int y1, int x2, int y2, unsigned long color); // Draw a line from x1,y1 to x2,y2 in the specified color
void display(int x, int y, HWND windowHandle); // Copies window pixels from memory pointer to screen.
void erase(unsigned long color); // Completely fills the bitmap with the specified color
int getWidth(); // Return the bitmap's width.
int getHeight(); // Return the bitmap's height.
void drawRect(const Vec2&amt; pos, int width, int height, const Vec3&amt; colour);
HBITMAP getBitmap(){ return scratchPadBitmap; }
unsigned long* getSurface(){ return windowContents; }
protected:
HBITMAP scratchPadBitmap; // Temporary Bitmap
unsigned long *windowContents; // Pointer to pixel data to display in the window
int windowWidth, windowHeight; // Store the window's dimensions
};
/*************************************************************************/
// setPixel, sets the pixel at x, y to color inside the DIB
/*************************************************************************/
inline void drawingSurface::setPixel(int x, int y, unsigned long color)
{
//NEWCODE: clip out pixels off screen
if(x < 0 || x >= windowWidth || y < 0 || y >= windowHeight)
return;
*(windowContents + (x + (y * windowWidth))) = color;
}
inline void drawingSurface::setPixelUnclipped(int x, int y, unsigned long color)
{
*(windowContents + (x + (y * windowWidth))) = color;
}
#endif //__SIMPLEWIN2D_H__