#include "cairoshape.hh"
#include <SFML/Graphics/RenderTarget.hpp>
#include <GL/glew.h>
#include <iostream>
#include <iomanip>
using namespace std;
#ifndef max
#define max(a, b) (a > b ? a : b)
#endif
namespace sf
{
void DefaultDrawFunc(cairo_t *cr, float Width, float Height)
{
// First row
cairo_rectangle(cr, 0.00, 0.00, 0.33, 0.33);
cairo_set_source_rgba(cr, 1.0, 0.0, 0.0, 1.0);
cairo_fill(cr);
cairo_rectangle(cr, 0.33, 0.00, 0.66, 0.33);
cairo_set_source_rgba(cr, 0.0, 1.0, 0.0, 1.0);
cairo_fill(cr);
cairo_rectangle(cr, 0.66, 0.00, 1.00, 0.33);
cairo_set_source_rgba(cr, 0.0, 0.0, 1.0, 1.0);
cairo_fill(cr);
// Second row
cairo_rectangle(cr, 0.00, 0.33, 0.33, 0.66);
cairo_set_source_rgba(cr, 1.0, 0.0, 0.0, 1.0);
cairo_fill(cr);
cairo_rectangle(cr, 0.33, 0.33, 0.66, 0.66);
cairo_set_source_rgba(cr, 0.0, 1.0, 0.0, 1.0);
cairo_fill(cr);
cairo_rectangle(cr, 0.66, 0.33, 1.00, 0.66);
cairo_set_source_rgba(cr, 0.0, 0.0, 1.0, 1.0);
cairo_fill(cr);
// Third row
cairo_rectangle(cr, 0.00, 0.66, 0.33, 1.00);
cairo_set_source_rgba(cr, 1.0, 0.0, 0.0, 1.0);
cairo_fill(cr);
cairo_rectangle(cr, 0.33, 0.66, 0.66, 1.00);
cairo_set_source_rgba(cr, 0.0, 1.0, 0.0, 1.0);
cairo_fill(cr);
cairo_rectangle(cr, 0.66, 0.66, 1.00, 1.00);
cairo_set_source_rgba(cr, 0.0, 0.0, 1.0, 1.0);
cairo_fill(cr);
// Random rectangle
cairo_rectangle(cr, 0.1, 0.1, 0.8, 0.8);
cairo_set_source_rgba(cr, (rand()%255)/255.0,(rand()%255)/255.0,(rand()%255)/255.0,0.75);
cairo_set_line_width(cr, 0.05);
cairo_stroke(cr);
}
CairoImage::CairoImage()
: Image()
{
}
CairoImage::CairoImage(const CairoImage &Copy)
: Image()
{
}
CairoImage::CairoImage(unsigned int Width, unsigned int Height, draw_func func)
: Image(Width, Height, Color(255,255,255,255)), fDraw(func)
{
Create(Width, Height, func);
}
CairoImage::~CairoImage()
{
}
bool CairoImage::LoadFromFile(const std::string &Filename)
{
return Image::LoadFromFile(Filename);
}
bool CairoImage::SaveToFile(const std::string& Filename) const
{
return Image::SaveToFile(Filename);
}
bool CairoImage::Create(unsigned int Width, unsigned int Height, draw_func *func)
{
Image::Create(Width, Height, Color(0,0,0,255));
if (func) fDraw = func;
RenderCairoContent();
return true;
}
void CairoImage::Redraw(draw_func *func, void *func_data)
{
if (func) fDraw = func;
RenderCairoContent(func_data);
}
bool CairoImage::RenderCairoContent(void *func_data)
{
cairo_surface_t *surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, GetWidth(), GetHeight());
if (cairo_surface_status(surface) == CAIRO_STATUS_SUCCESS)
{
cairo_t *cr = cairo_create(surface);
if (cairo_status(cr) == CAIRO_STATUS_SUCCESS)
{
cairo_scale(cr, GetWidth(), GetHeight());
if (fDraw)
{
fDraw(cr, GetWidth(), GetHeight(), func_data);
}
cairo_destroy(cr);
Uint8 *data = cairo_image_surface_get_data(surface);
if (data)
{
unsigned int size = GetWidth()*GetHeight()*4;
for (unsigned int i = 0 ; i < size ; i += 4)
{
Uint8 tmp = data[i];
data[i] = data[i+2];
data[i+2] = tmp;
}
LoadFromPixels(GetWidth(), GetHeight(), data);
}
}
else
{
cairo_surface_destroy(surface);
return false;
}
cairo_surface_destroy(surface);
}
else return false;
return true;
}
}