/*
......... 2015 Ivan Mahonin
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _SWRENDER_H_
#define _SWRENDER_H_
#include <cstring>
#include "polyspan.h"
class Color {
public:
typedef float type;
union {
struct { type r, g, b, a; };
struct { type channels[4]; };
};
Color(): r(), g(), b(), a() { }
Color(type r, type g, type b, type a): r(r), g(g), b(b), a(a) { }
Color(const Color &color, type a): r(color.r), g(color.g), b(color.b), a(color.a*a) { }
};
class Surface {
public:
const int width, height;
Color * const data;
Surface(int width, int height):
width(width), height(height), data(new Color[width*height])
{ clear(); }
~Surface()
{ delete[] data; }
void clear() { memset(data, 0, count()*sizeof(Color)); }
int count() const { return width*height; }
int data_size() const { return count()*sizeof(Color); }
Color* operator[] (int row) { return data + row*width; }
const Color* operator[] (int row) const { return data + row*width; }
};
class SwRender {
public:
static void fill(
Surface &target,
const Color &color );
static void fill(
Surface &target,
const Color &color,
int left,
int top,
int width,
int height );
static void row(
Surface &target,
const Color &color,
int left,
int top,
int length );
static void row_alpha(
Surface &target,
const Color &color,
Color::type alpha,
int left,
int top,
int length );
static void polyspan(
Surface &target,
const Polyspan &polyspan,
const Color &color,
bool evenodd,
bool invert );
};
#endif