2008-10-15 01:27:42 +04:00
|
|
|
/*
|
2009-02-15 18:15:49 +03:00
|
|
|
* Copyright 2006-2009, Haiku.
|
2008-10-15 01:27:42 +04:00
|
|
|
* Distributed under the terms of the MIT License.
|
|
|
|
*
|
|
|
|
* Authors:
|
|
|
|
* Stephan Aßmus <superstippi@gmx.de>
|
|
|
|
* Artur Wyszynski <harakash@gmail.com>
|
|
|
|
*/
|
|
|
|
|
2008-11-08 14:58:54 +03:00
|
|
|
#ifndef _GRADIENT_H
|
|
|
|
#define _GRADIENT_H
|
2008-10-15 01:27:42 +04:00
|
|
|
|
|
|
|
#include <Archivable.h>
|
|
|
|
#include <GraphicsDefs.h>
|
|
|
|
#include <List.h>
|
|
|
|
|
|
|
|
|
|
|
|
class BMessage;
|
|
|
|
class BRect;
|
|
|
|
|
|
|
|
|
|
|
|
class BGradient : public BArchivable {
|
2008-11-08 17:56:56 +03:00
|
|
|
public:
|
2009-02-15 18:15:49 +03:00
|
|
|
enum Type {
|
2008-11-08 17:56:56 +03:00
|
|
|
TYPE_LINEAR = 0,
|
|
|
|
TYPE_RADIAL,
|
|
|
|
TYPE_RADIAL_FOCUS,
|
|
|
|
TYPE_DIAMOND,
|
|
|
|
TYPE_CONIC,
|
|
|
|
TYPE_NONE
|
|
|
|
};
|
|
|
|
|
2009-02-15 18:15:49 +03:00
|
|
|
struct ColorStop {
|
|
|
|
ColorStop(const rgb_color c, float o);
|
|
|
|
ColorStop(uint8 r, uint8 g, uint8 b, uint8 a, float o);
|
|
|
|
ColorStop(const ColorStop& other);
|
|
|
|
ColorStop();
|
2008-11-08 17:56:56 +03:00
|
|
|
|
2009-02-15 18:15:49 +03:00
|
|
|
bool operator!=(const ColorStop& other) const;
|
2008-11-08 17:56:56 +03:00
|
|
|
|
|
|
|
rgb_color color;
|
|
|
|
float offset;
|
|
|
|
};
|
|
|
|
|
2008-10-15 01:27:42 +04:00
|
|
|
public:
|
|
|
|
BGradient();
|
|
|
|
BGradient(BMessage* archive);
|
|
|
|
virtual ~BGradient();
|
|
|
|
|
|
|
|
status_t Archive(BMessage* into, bool deep = true) const;
|
|
|
|
|
|
|
|
BGradient& operator=(const BGradient& other);
|
|
|
|
|
|
|
|
bool operator==(const BGradient& other) const;
|
|
|
|
bool operator!=(const BGradient& other) const;
|
2009-02-15 18:15:49 +03:00
|
|
|
bool ColorStopsAreEqual(const BGradient& other) const;
|
2008-10-15 01:27:42 +04:00
|
|
|
|
2009-02-15 18:15:49 +03:00
|
|
|
void SetColorStops(const BGradient& other);
|
2008-10-15 01:27:42 +04:00
|
|
|
|
|
|
|
int32 AddColor(const rgb_color& color, float offset);
|
2009-02-15 18:15:49 +03:00
|
|
|
bool AddColorStop(const ColorStop& colorStop, int32 index);
|
2008-10-15 01:27:42 +04:00
|
|
|
|
|
|
|
bool RemoveColor(int32 index);
|
|
|
|
|
2009-02-15 18:15:49 +03:00
|
|
|
bool SetColorStop(int32 index, const ColorStop& colorStop);
|
2008-10-15 01:27:42 +04:00
|
|
|
bool SetColor(int32 index, const rgb_color& color);
|
|
|
|
bool SetOffset(int32 index, float offset);
|
|
|
|
|
2009-02-15 18:15:49 +03:00
|
|
|
int32 CountColorStops() const;
|
|
|
|
ColorStop* ColorStopAt(int32 index) const;
|
|
|
|
ColorStop* ColorStopAtFast(int32 index) const;
|
|
|
|
ColorStop* ColorStops() const;
|
|
|
|
void SortColorStopsByOffset();
|
2008-10-15 01:27:42 +04:00
|
|
|
|
2009-02-15 18:15:49 +03:00
|
|
|
Type GetType() const
|
2008-10-15 01:27:42 +04:00
|
|
|
{ return fType; }
|
|
|
|
|
|
|
|
void MakeEmpty();
|
|
|
|
|
|
|
|
private:
|
|
|
|
friend class BGradientLinear;
|
|
|
|
friend class BGradientRadial;
|
|
|
|
friend class BGradientRadialFocus;
|
|
|
|
friend class BGradientDiamond;
|
|
|
|
friend class BGradientConic;
|
|
|
|
|
|
|
|
union {
|
|
|
|
struct {
|
|
|
|
float x1, y1, x2, y2;
|
|
|
|
} linear;
|
|
|
|
struct {
|
|
|
|
float cx, cy, radius;
|
|
|
|
} radial;
|
|
|
|
struct {
|
|
|
|
float cx, cy, fx, fy, radius;
|
|
|
|
} radial_focus;
|
|
|
|
struct {
|
|
|
|
float cx, cy;
|
|
|
|
} diamond;
|
|
|
|
struct {
|
|
|
|
float cx, cy, angle;
|
|
|
|
} conic;
|
|
|
|
} fData;
|
|
|
|
|
2009-02-15 18:15:49 +03:00
|
|
|
BList fColorStops;
|
|
|
|
Type fType;
|
2008-10-15 01:27:42 +04:00
|
|
|
};
|
|
|
|
|
2008-11-08 14:58:54 +03:00
|
|
|
#endif // _GRADIENT_H
|