mkxp/src/etc.h

222 lines
5.0 KiB
C

/*
** etc.h
**
** This file is part of mkxp.
**
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
**
** mkxp 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 2 of the License, or
** (at your option) any later version.
**
** mkxp 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 mkxp. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef ETC_H
#define ETC_H
#include <sigc++/signal.h>
#include "serializable.h"
#include "etc-internal.h"
struct SDL_Color;
enum BlendType
{
BlendKeepDestAlpha = -1,
BlendNormal = 0,
BlendAddition = 1,
BlendSubstraction = 2
};
struct Color : public Serializable
{
Color()
: red(0), green(0), blue(0), alpha(0)
{}
Color(double red, double green, double blue, double alpha = 255);
Color(const Vec4 &norm);
Color(const Color &o);
virtual ~Color() {}
bool operator==(const Color &o) const;
void updateInternal();
void updateExternal();
void set(double red, double green, double blue, double alpha);
void set(const Color &other);
void setRed(double value);
void setGreen(double value);
void setBlue(double value);
void setAlpha(double value);
double getRed() const { return red; }
double getGreen() const { return green; }
double getBlue() const { return blue; }
double getAlpha() const { return alpha; }
bool hasEffect() const
{
return (alpha != 0);
}
void toSDLColor(SDL_Color &c) const;
/* Serializable */
int serialSize() const;
void serialize(char *buffer) const;
static Color *deserialize(const char *data, int len);
/* Range (0.0 ~ 255.0) */
double red;
double green;
double blue;
double alpha;
/* Normalized (0.0 ~ 1.0) */
Vec4 norm;
};
struct Tone : public Serializable
{
Tone()
: red(0), green(0), blue(0), gray(0)
{}
Tone(double red, double green, double blue, double gray = 0);
Tone(const Tone &o);
virtual ~Tone() {}
bool operator==(const Tone &o) const;
void updateInternal();
void set(double red, double green, double blue, double gray);
void set(const Tone &other);
void setRed(double value);
void setGreen(double value);
void setBlue(double value);
void setGray(double value);
double getRed() const { return red; }
double getGreen() const { return green; }
double getBlue() const { return blue; }
double getGray() const { return gray; }
bool hasEffect() const
{
return ((int)red != 0 ||
(int)green != 0 ||
(int)blue != 0 ||
(int)gray != 0);
}
/* Serializable */
int serialSize() const;
void serialize(char *buffer) const;
static Tone *deserialize(const char *data, int len);
/* Range (-255.0 ~ 255.0) */
double red;
double green;
double blue;
/* Range (0.0 ~ 255.0) */
double gray;
/* Normalized (-1.0 ~ 1.0) */
Vec4 norm;
sigc::signal<void> valueChanged;
};
struct Rect : public Serializable
{
Rect()
: x(0), y(0), width(0), height(0)
{}
virtual ~Rect() {}
Rect(int x, int y, int width, int height);
Rect(const Rect &o);
Rect(const IntRect &r);
bool operator==(const Rect &o) const;
void operator=(const IntRect &rect);
void set(int x, int y, int w, int h);
void set(const Rect &other);
FloatRect toFloatRect() const
{
return FloatRect(x, y, width, height);
}
IntRect toIntRect()
{
return IntRect(x, y, width, height);
}
void empty();
bool isEmpty() const;
void setX(int value);
void setY(int value);
void setWidth(int value);
void setHeight(int value);
int getX() const { return x; }
int getY() const { return y; }
int getWidth() const { return width; }
int getHeight() const { return height; }
int serialSize() const;
void serialize(char *buffer) const;
static Rect *deserialize(const char *data, int len);
int x;
int y;
int width;
int height;
sigc::signal<void> valueChanged;
};
/* For internal use.
* All drawable classes have properties of one or more of the above
* types, which in an interpreted environment act as independent
* objects, and rely on the GC to clean them up. When a drawable
* class is constructed, these properties must have default objects
* that are constructed with the class. C++ however has no GC, so
* there is no way to clean them up when used directly with it.
* Therefore the default objects are first created embedded in the
* drawable class (so they get destroyed automatically from within
* C++ if no pointers were changed), and the binding then takes
* care of properly allocating new, independent objects and replacing
* the defaults. Thus both C++ and the interpreted API can be used
* without memory leakage.
* This can be removed at a later point when no testing directly
* from C++ is needed anymore. */
struct EtcTemps
{
Color color;
Tone tone;
Rect rect;
};
#endif // ETC_H