68 lines
1.5 KiB
C
68 lines
1.5 KiB
C
|
#ifndef _GRADIENT_H
|
||
|
#define _GRADIENT_H
|
||
|
|
||
|
#include <bfc/wasabi_std.h>
|
||
|
#include <bfc/string/StringW.h>
|
||
|
#include <tataki/color/filteredcolor.h>
|
||
|
|
||
|
class GradientPoint
|
||
|
{
|
||
|
public:
|
||
|
GradientPoint(float p, ARGB32 c, const wchar_t *group=L"") : pos(p), dist(0), color(c, group), x(0), y(0) { }
|
||
|
float pos;
|
||
|
double dist;
|
||
|
FilteredColor color;
|
||
|
float x, y;
|
||
|
static int compareItem(GradientPoint *p1, GradientPoint* p2) {
|
||
|
int r = CMP3(p1->pos, p2->pos);
|
||
|
if (r == 0) return CMP3(p1, p2);
|
||
|
else return r;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
class Gradient
|
||
|
{
|
||
|
public:
|
||
|
Gradient();
|
||
|
virtual ~Gradient();
|
||
|
|
||
|
void setX1(float x1);
|
||
|
void setY1(float y1);
|
||
|
void setX2(float x2);
|
||
|
void setY2(float y2);
|
||
|
|
||
|
void clearPoints();
|
||
|
void addPoint(float pos, ARGB32 color);
|
||
|
|
||
|
// "pos=color;pos=color" "0.25=34,45,111"
|
||
|
void setPoints(const wchar_t *str);
|
||
|
|
||
|
void setReverseColors(int c);
|
||
|
|
||
|
void setAntialias(int c);
|
||
|
|
||
|
void setMode(const wchar_t *mode);
|
||
|
|
||
|
void setGammaGroup(const wchar_t *group);
|
||
|
|
||
|
// note: this will automatically premultiply against alpha
|
||
|
void renderGradient(ARGB32 *bits, int width, int height, int pitch=0);
|
||
|
|
||
|
protected:
|
||
|
virtual void onParamChange() { }
|
||
|
|
||
|
ARGB32 getPixelCirc(double x, double y);
|
||
|
|
||
|
private:
|
||
|
float gradient_x1, gradient_y1, gradient_x2, gradient_y2;
|
||
|
class GradientList : public PtrListQuickSorted<GradientPoint, GradientPoint> { };
|
||
|
GradientList list;
|
||
|
void renderGrad(ARGB32 *bits, int len, int *positions);
|
||
|
int reverse_colors;
|
||
|
int antialias;
|
||
|
StringW mode, gammagroup;
|
||
|
};
|
||
|
|
||
|
#endif
|