desmume/src/softrender.h

210 lines
7.2 KiB
C++

/// The VERGE 3 Project is originally by Ben Eirich and is made available via
/// the BSD License.
///
/// Please see LICENSE in the project's root directory for the text of the
/// licensing agreement. The CREDITS file in the same directory enumerates the
/// folks involved in this public build.
///
/// If you have altered this source file, please log your name, date, and what
/// changes you made below this line.
#ifndef SOFTRENDER_H
#define SOFTRENDER_H
#include "softrender_config.h"
namespace softrender {
class image
{
public:
int width, height, pitch;
int cx1, cy1, cx2, cy2;
int bpp, shell;
void *data;
image();
image(int xres, int yres);
~image();
void delete_data();
void SetClip(int x1, int y1, int x2, int y2);
void GetClip(int &x1, int &y1, int &x2, int &y2);
};
extern int vid_bpp, vid_xres, vid_yres, vid_bytesperpixel, transColor;
extern bool vid_window;
extern image *screen;
extern int alpha, ialpha;
extern int skewlines[];
int SetLucent(int percent);
//void run2xSAI(image *src, image *dest);
class renderbase {
private:
void Oval(int x, int y, int xe, int ye, int color, int Fill, image *dest);
public:
//render methods that do not depend on the pixel format
void Line(int x, int y, int xe, int ye, int color, image *dest);
void Box(int x, int y, int xe, int ye, int color, image *dest);
void Rect(int x, int y, int xe, int ye, int color, image *dest);
void Sphere(int x, int y, int xradius, int yradius, int color, image *dest);
void Circle(int x, int y, int xradius, int yradius, int color, image *dest);
void RectVGrad(int x, int y, int xe, int ye, int color, int color2, image *dest);
void RectHGrad(int x, int y, int xe, int ye, int color, int color2, image *dest);
void RectRGrad(int x1, int y1, int x2, int y2, int color1, int color2, image *dest);
void Rect4Grad(int x1, int y1, int x2, int y2, int color1, int color2, int color3, int color4, image *dest);
//things that werent originally even blitter-specific
void GrabRegion(int sx1, int sy1, int sx2, int sy2, int dx, int dy, image *s, image *d);
private:
template<typename FONT>
void print_char(int scale, int x, int y, int color, char c, image *dest)
{
int height = FONT::height();
int width = FONT::width(c);
for (int yc=0; yc<height; yc++)
for (int xc=0; xc<width; xc++)
{
if(FONT::pixel(c,xc,yc)) {
for(int xi=0;xi<scale;xi++)
for(int yi=0;yi<scale;yi++)
PutPixel((xc*scale+x)+xi,(yc*scale+y)+ yi,color, dest);
}
}
}
public:
template<typename FONT>
void PrintString(int scale, int x, int y, int color, char *str, image *dest)
{
int xc = x;
int yc = y;
int height = FONT::height();
int x1 = x; // Remember where x where the line should start. -- Overkill 2005-12-28.
for (; *str; ++str)
{
// New lines -- Overkill 2005-12-28.
if (*str == '\n' || *str == '\r')
{
if (*str == '\r')
{
// Checks for \r\n so they aren't parsed as two seperate line breaks.
if (!*++str) return;
if (*str != '\n')
{
*--str;
}
}
xc = x1;
yc += height*scale + scale;
} else {
print_char<FONT>(scale, xc, yc, color, *str, dest);
xc += FONT::width(*str)*scale + scale;
}
}
}
public:
virtual int MakeColor(int r, int g, int b)=0;
virtual bool GetColor(int c, int &r, int &g, int &b)=0;
virtual void Clear(int color, image *dest)=0;
virtual int ReadPixel(int x, int y, image *dest)=0;
virtual void PutPixel(int x, int y, int color, image *dest)=0;
virtual void VLine(int x, int y, int ye, int color, image *dest)=0;
virtual void HLine(int x, int y, int xe, int color, image *dest)=0;
virtual void Blit(int x, int y, image *src, image *dest)=0;
virtual void TBlit(int x, int y, image *src, image *dest)=0;
//virtual void AlphaBlit(int x, int y, image *src, image *alpha, image *dest);
//virtual void AdditiveBlit(int x, int y, image *src, image *dest);
//virtual void TAdditiveBlit(int x, int y, image *src, image *dest);
//virtual void SubtractiveBlit(int x, int y, image *src, image *dest);
//virtual void TSubtractiveBlit(int x, int y, image *src, image *dest);
//virtual void BlitTile(int x, int y, char *src, image *dest);
//virtual void TBlitTile(int x, int y, char *src, image *dest);
//virtual void ScaleBlit(int x, int y, int dw, int dh, image *src, image *dest);
//virtual void TScaleBlit(int x, int y, int dw, int dh, image *src, image *dest);
//virtual void WrapBlit(int x, int y, image *src, image *dst);
//virtual void TWrapBlit(int x, int y, image *src, image *dst);
//virtual void Silhouette(int x, int y, int c, image *src, image *dst);
//virtual void RotScale(int x, int y, float angle, float scale, image *src, image *dest);
//virtual void Mosaic(int xf, int yf, image *src);
//virtual void Timeless(int x, int y1, int y, image *src, image *dest);
//virtual void BlitWrap(int x, int y, image *src, image *dest);
//virtual void ColorFilter(int filter, image *img);
//virtual void Triangle(int x1, int y1, int x2, int y2, int x3, int y3, int c, image *dest);
//virtual void FlipBlit(int x, int y, int fx, int fy, image *src, image *dest);
//virtual image* ImageFrom8bpp(byte *src, int width, int height, byte *pal);
//virtual image* ImageFrom24bpp(byte *src, int width, int height);
//virtual image* ImageFrom32bpp(byte *src, int width, int height);
//// Overkill (2007-05-04)
//virtual int HSVtoColor(int h, int s, int v);
//// Overkill (2007-05-04)
//virtual void GetHSV(int color, int &h, int &s, int &v);
//// Overkill (2007-05-04)
//virtual void HueReplace(int hue_find, int hue_tolerance, int hue_replace, image *img);
//// Overkill (2007-05-04)
//virtual void ColorReplace(int color_find, int color_replace, image *img);
};
class Trender16: public renderbase
{
public:
virtual int MakeColor(int r, int g, int b);
virtual bool GetColor(int c, int &r, int &g, int &b);
virtual void Clear(int color, image *dest);
virtual int ReadPixel(int x, int y, image *dest);
virtual void PutPixel(int x, int y, int color, image *dest);
virtual void VLine(int x, int y, int ye, int color, image *dest);
virtual void HLine(int x, int y, int xe, int color, image *dest);
virtual void Blit(int x, int y, image *src, image *dest);
virtual void TBlit(int x, int y, image *src, image *dest);
};
class Trender32: public renderbase
{
public:
virtual int MakeColor(int r, int g, int b);
virtual bool GetColor(int c, int &r, int &g, int &b);
virtual void Clear(int color, image *dest);
virtual int ReadPixel(int x, int y, image *dest);
virtual void PutPixel(int x, int y, int color, image *dest);
virtual void VLine(int x, int y, int ye, int color, image *dest);
virtual void HLine(int x, int y, int xe, int color, image *dest);
virtual void Blit(int x, int y, image *src, image *dest);
virtual void TBlit(int x, int y, image *src, image *dest);
};
class Trender15 : public Trender16
{
public:
virtual int MakeColor(int r, int g, int b);
virtual bool GetColor(int c, int &r, int &g, int &b);
};
class Trender51 : public Trender16
{
public:
virtual int MakeColor(int r, int g, int b);
virtual bool GetColor(int c, int &r, int &g, int &b);
};
extern Trender32 render32;
extern Trender16 render16;
extern Trender15 render15;
extern Trender51 render51;
} //end namespace
#endif