summaryrefslogtreecommitdiff
path: root/libcore/imagecreator.c
diff options
context:
space:
mode:
Diffstat (limited to 'libcore/imagecreator.c')
-rw-r--r--libcore/imagecreator.c202
1 files changed, 202 insertions, 0 deletions
diff --git a/libcore/imagecreator.c b/libcore/imagecreator.c
new file mode 100644
index 0000000..65eea04
--- /dev/null
+++ b/libcore/imagecreator.c
@@ -0,0 +1,202 @@
+#include "imagecreator.h"
+
+cImageCreator::cImageCreator(void) {
+ surface = NULL;
+ cr = NULL;
+}
+
+cImageCreator::~cImageCreator() {
+ if (cr)
+ cairo_destroy (cr);
+ if (surface)
+ cairo_surface_destroy (surface);
+}
+
+bool cImageCreator::InitCairoImage(int width, int height) {
+ this->width = width;
+ this->height = height;
+ if (width < 1 || height < 1 || width > 1920 || height > 1080)
+ return false;
+ surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height);
+ cr = cairo_create(surface);
+ cairo_set_antialias(cr, CAIRO_ANTIALIAS_BEST);
+ return true;
+}
+
+/**********************************************************************************
+* Public Functions
+**********************************************************************************/
+
+///< 0 draws the entire ellipse
+///< 1..4 draws only the first, second, third or fourth quadrant, respectively
+///< 5..8 draws the right, top, left or bottom half, respectively
+///< -1..-4 draws the inverted part of the given quadrant
+///< If Quadrants is not 0, the coordinates are those of the actual area, not
+///< the full circle!
+void cImageCreator::DrawEllipse(tColor color, int quadrants) {
+ if (!cr || !surface)
+ return;
+ //center of the ellipse
+ double x, y;
+ //radius
+ double radius;
+ //start and stop angle (radian)
+ double arcStart, arcStop;
+ //scaling factors
+ double scaleX, scaleY;
+ //draw inverted ellipse
+ bool inverted;
+
+ scaleX = width;
+ scaleY = height;
+ inverted = false;
+
+ switch (quadrants) {
+ case 0:
+ x = 0.5;
+ y = 0.5;
+ radius = 0.5;
+ arcStart = 0.0;
+ arcStop = 2 * M_PI;
+ break;
+ case 1:
+ x = 0.0;
+ y = 1.0;
+ radius = 1.0;
+ arcStart = M_PI;
+ arcStop = 2 * M_PI;
+ break;
+ case 2:
+ x = 1.0;
+ y = 1.0;
+ radius = 1.0;
+ arcStart = M_PI;
+ arcStop = 2 * M_PI;
+ break;
+ case 3:
+ x = 1.0;
+ y = 0.0;
+ radius = 1.0;
+ arcStart = 0;
+ arcStop = M_PI;
+ break;
+ case 4:
+ x = 0.0;
+ y = 0.0;
+ radius = 1.0;
+ arcStart = 0;
+ arcStop = M_PI;
+ break;
+ case 5:
+ scaleX = 2 * width;
+ x = 0.0;
+ y = 0.5;
+ radius = 0.5;
+ arcStart = 0;
+ arcStop = 2* M_PI;
+ break;
+ case 6:
+ scaleY = 2 * height;
+ x = 0.5;
+ y = 0.5;
+ radius = 0.5;
+ arcStart = 0;
+ arcStop = 2* M_PI;
+ break;
+ case 7:
+ scaleX = 2 * width;
+ x = 0.5;
+ y = 0.5;
+ radius = 0.5;
+ arcStart = 0;
+ arcStop = 2* M_PI;
+ break;
+ case 8:
+ scaleY = 2 * height;
+ x = 0.5;
+ y = 0.0;
+ radius = 0.5;
+ arcStart = 0;
+ arcStop = 2* M_PI;
+ break;
+ case -1:
+ x = 0.0;
+ y = 1.0;
+ radius = 1.0;
+ arcStart = M_PI;
+ arcStop = 2* M_PI;
+ inverted = true;
+ break;
+ case -2:
+ x = 1.0;
+ y = 1.0;
+ radius = 1.0;
+ arcStart = M_PI;
+ arcStop = 2 * M_PI;
+ inverted = true;
+ break;
+ case -3:
+ x = 1.0;
+ y = 0.0;
+ radius = 1.0;
+ arcStart = 0;
+ arcStop = M_PI;
+ inverted = true;
+ break;
+ case -4:
+ x = 0.0;
+ y = 0.0;
+ radius = 1.0;
+ arcStart = 0;
+ arcStop = M_PI;
+ inverted = true;
+ break;
+ default:
+ x = 0.5;
+ y = 0.5;
+ radius = 0.5;
+ arcStart = 0.0;
+ arcStop = 2 * M_PI;
+ break;
+ }
+
+ SetColor(color);
+ //Draw Background for inverted ellipses
+ if (inverted) {
+ cairo_rectangle(cr, 0.0, 0.0, width, height);
+ cairo_fill (cr);
+ cairo_set_operator(cr, CAIRO_OPERATOR_CLEAR);
+ }
+ //Draw Ellipse
+ cairo_scale(cr, scaleX, scaleY);
+ cairo_arc(cr, x, y, radius, arcStart, arcStop);
+ cairo_fill(cr);
+}
+
+cImage *cImageCreator::GetImage(void) {
+ if (!cr || !surface)
+ NULL;
+ unsigned char *data = cairo_image_surface_get_data(surface);
+ cImage *image = new cImage(cSize(width, height), (tColor*)data);
+ return image;
+}
+
+/**********************************************************************************
+* Private Functions
+**********************************************************************************/
+
+void cImageCreator::SetColor(tColor color) {
+ if (!cr || !surface)
+ return;
+ tIndex tAlpha = (color & 0xFF000000) >> 24;
+ tIndex tRed = (color & 0x00FF0000) >> 16;
+ tIndex tGreen = (color & 0x0000FF00) >> 8;
+ tIndex tBlue = (color & 0x000000FF);
+
+ double a = (int)tAlpha / (double)255;
+ double r = (int)tRed / (double)255;
+ double g = (int)tGreen / (double)255;
+ double b = (int)tBlue / (double)255;
+
+ cairo_set_source_rgba(cr, r, g, b, a);
+}