#include "common.h"
#include "real.h"
+#include "bezier.h"
+#include "rect.h"
-#define C_RED Colour(1,0,0,1)
-#define C_GREEN Colour(0,1,0,1)
-#define C_BLUE Colour(0,0,1,1)
+#include "path.h"
namespace IPDF
{
inline Real Random(Real max=1, Real min=0)
{
- return min + (max-min) * (Real(rand() % (int)1e6) / Real(1e6));
+ return min + (max-min) * (Real(rand() % (int)100) / Real(100));
}
typedef unsigned ObjectID;
- typedef enum {RECT_FILLED, RECT_OUTLINE} ObjectType;
+ /** Type of object
+ * NOTE: Extra entry in the enum so we can use this as an array index
+ */
+ typedef enum
+ {
+ CIRCLE_FILLED = 0,
+ RECT_FILLED,
+ RECT_OUTLINE,
+ BEZIER,
+ PATH,
+ NUMBER_OF_OBJECT_TYPES
+ } ObjectType;
enum DocChunkTypes
{
CT_NUMOBJS,
CT_OBJTYPES,
- CT_OBJBOUNDS
- };
-
- struct Rect
- {
- Real x; Real y; Real w; Real h;
- Rect() = default; // Needed so we can fread/fwrite this struct
- Rect(Real _x, Real _y, Real _w, Real _h) : x(_x), y(_y), w(_w), h(_h) {}
- std::string Str() const
- {
- std::stringstream s;
- // float conversion needed because it is fucking impossible to get ostreams working with template classes
- s << "{" << Float(x) << ", " << Float(y) << ", " << Float(w) << ", " << Float(h) << "}";
- return s.str();
- }
- };
-
- struct Colour
- {
- float r; float g; float b; float a;
- Colour() = default;
- Colour(float _r, float _g, float _b, float _a) : r(_r), g(_g), b(_b), a(_a) {}
+ CT_OBJBOUNDS,
+ CT_OBJINDICES,
+ CT_OBJBEZIERS,
+ CT_OBJPATHS
};
struct Objects
{
- std::vector<ObjectType> types;
- std::vector<Rect> bounds;
+ /** Used by all objects **/
+ std::vector<ObjectType> types; // types of objects
+ std::vector<Rect> bounds; // rectangle bounds of objects
+ /** Used by BEZIER and GROUP to identify data position in relevant vector **/
+ std::vector<unsigned> data_indices;
+ /** Used by BEZIER only **/
+ std::vector<Bezier> beziers; // bezier curves - look up by data_indices
+ /** Used by PATH only **/
+ std::vector<Path> paths;
};
class View;