summaryrefslogtreecommitdiff
path: root/plugingui/pixelbuffer.cc
diff options
context:
space:
mode:
authorBent Bisballe Nyeng <deva@aasimon.org>2015-11-09 21:26:57 +0100
committerBent Bisballe Nyeng <deva@aasimon.org>2015-11-09 21:26:57 +0100
commitc18090169d6bb49e877956701e77e8af338ed675 (patch)
tree7a18b46d809fc839acc56c4b0fd2e1938614513c /plugingui/pixelbuffer.cc
parent74ab9aea168bb5706e9c36aa6252f366926f5b41 (diff)
Refactor PixelBuffer, and remove unnecessary calls to setPixel and addPixel.
Diffstat (limited to 'plugingui/pixelbuffer.cc')
-rw-r--r--plugingui/pixelbuffer.cc199
1 files changed, 92 insertions, 107 deletions
diff --git a/plugingui/pixelbuffer.cc b/plugingui/pixelbuffer.cc
index 2a6bf6f..962091e 100644
--- a/plugingui/pixelbuffer.cc
+++ b/plugingui/pixelbuffer.cc
@@ -26,155 +26,140 @@
*/
#include "pixelbuffer.h"
-#include <stdio.h>
+#include <cassert>
-GUI::PixelBuffer::PixelBuffer(size_t width, size_t height)
+namespace GUI {
+
+PixelBuffer::PixelBuffer(size_t width, size_t height)
+ : buf(nullptr)
{
- buf = NULL;
- realloc(width, height);
+ realloc(width, height);
}
-GUI::PixelBuffer::~PixelBuffer()
+PixelBuffer::~PixelBuffer()
{
- if(buf) free(buf);
+ free(buf);
}
-void GUI::PixelBuffer::realloc(size_t width, size_t height)
+void PixelBuffer::realloc(size_t width, size_t height)
{
- if(buf) free(buf);
- buf = (unsigned char *)calloc(width * height, 3);
- this->width = width;
- this->height = height;
+ free(buf);
+ buf = (unsigned char *)calloc(width * height, 3);
+ this->width = width;
+ this->height = height;
}
-#define PX(k) (x + y * width) * 3 + k
-void GUI::PixelBuffer::setPixel(size_t x, size_t y,
- unsigned char red,
- unsigned char green,
- unsigned char blue,
- unsigned char alpha)
+#define PX(k) ((x + y * width) * 3 + k)
+void PixelBuffer::setPixel(size_t x, size_t y,
+ unsigned char red,
+ unsigned char green,
+ unsigned char blue,
+ unsigned char alpha)
{
- if(x >= width || y >= height) return;
- /*
- float a,b;
- getAlpha(alpha, 255, a, b);
-
- buf[PX(0)] = (unsigned char)((float)red * a + (float)buf[PX(0)] * b);
- buf[PX(0)] /= (a + b);
- buf[PX(1)] = (unsigned char)((float)green * a + (float)buf[PX(1)] * b);
- buf[PX(1)] /= (a + b);
- buf[PX(2)] = (unsigned char)((float)blue * a + (float)buf[PX(2)] * b);
- buf[PX(2)] /= (a + b);
- */
- unsigned int a = alpha;
- unsigned int b = 255 - alpha;
-
- buf[PX(0)] = (unsigned char)(((int)red * a + (int)buf[PX(0)] * b) / 255);
- buf[PX(1)] = (unsigned char)(((int)green * a + (int)buf[PX(1)] * b) / 255);
- buf[PX(2)] = (unsigned char)(((int)blue * a + (int)buf[PX(2)] * b) / 255);
+ assert(x < width);
+ assert(y < height);
+
+ unsigned int a = alpha;
+ unsigned int b = 255 - alpha;
+
+ buf[PX(0)] = (unsigned char)(((int)red * a + (int)buf[PX(0)] * b) / 255);
+ buf[PX(1)] = (unsigned char)(((int)green * a + (int)buf[PX(1)] * b) / 255);
+ buf[PX(2)] = (unsigned char)(((int)blue * a + (int)buf[PX(2)] * b) / 255);
}
-static int idx = 0;
-GUI::PixelBufferAlpha::PixelBufferAlpha(size_t width, size_t height)
+PixelBufferAlpha::PixelBufferAlpha(size_t width, size_t height)
+ : buf(nullptr)
+ , x(0)
+ , y(0)
{
- this->idx = ::idx++;
- buf = NULL;
- x = y = 10;
- realloc(width, height);
+ realloc(width, height);
}
-GUI::PixelBufferAlpha::~PixelBufferAlpha()
+PixelBufferAlpha::~PixelBufferAlpha()
{
- if(buf) free(buf);
+ free(buf);
}
-void GUI::PixelBufferAlpha::realloc(size_t width, size_t height)
+void PixelBufferAlpha::realloc(size_t width, size_t height)
{
- if(buf) free(buf);
- buf = (unsigned char *)calloc(width * height, 4);
- this->width = width;
- this->height = height;
+ free(buf);
+ buf = (unsigned char *)calloc(width * height, 4);
+ this->width = width;
+ this->height = height;
}
#undef PX
-#define PX(k) (x + y * width) * 4 + k
-void GUI::PixelBufferAlpha::setPixel(size_t x, size_t y,
- unsigned char red,
- unsigned char green,
- unsigned char blue,
- unsigned char alpha)
+#define PX(k) ((x + y * width) * 4 + k)
+void PixelBufferAlpha::setPixel(size_t x, size_t y,
+ unsigned char red,
+ unsigned char green,
+ unsigned char blue,
+ unsigned char alpha)
{
- if(x >= width || y >= height) return;
+ assert(x < width);
+ assert(y < height);
- buf[PX(0)] = red;
- buf[PX(1)] = green;
- buf[PX(2)] = blue;
- buf[PX(3)] = alpha;
+ buf[PX(0)] = red;
+ buf[PX(1)] = green;
+ buf[PX(2)] = blue;
+ buf[PX(3)] = alpha;
}
// http://en.wikipedia.org/wiki/Alpha_compositing
-static void getAlpha(unsigned char _a, unsigned char _b, float &a, float &b)
+static inline void getAlpha(unsigned char _a, unsigned char _b,
+ float &a, float &b)
{
- a = _a / 255.0;
- b = _b / 255.0;
- b *= (1-a);
+ a = _a / 255.0;
+ b = _b / 255.0;
+ b *= (1 - a);
}
-void GUI::PixelBufferAlpha::addPixel(size_t x, size_t y,
- unsigned char red,
- unsigned char green,
- unsigned char blue,
- unsigned char alpha)
+void PixelBufferAlpha::addPixel(size_t x, size_t y,
+ unsigned char red,
+ unsigned char green,
+ unsigned char blue,
+ unsigned char alpha)
{
- if(x >= width || y >= height) return;
+ assert(x < width);
+ assert(y < height);
- if(alpha == 0) return;
+ if(alpha == 0)
+ {
+ return;
+ }
- float a,b;
- getAlpha(alpha, buf[PX(3)], a, b);
+ float a, b;
+ getAlpha(alpha, buf[PX(3)], a, b);
- buf[PX(0)] = (unsigned char)((float)red * a + (float)buf[PX(0)] * b);
- buf[PX(0)] /= (a + b);
- buf[PX(1)] = (unsigned char)((float)green * a + (float)buf[PX(1)] * b);
- buf[PX(1)] /= (a + b);
- buf[PX(2)] = (unsigned char)((float)blue * a + (float)buf[PX(2)] * b);
- buf[PX(2)] /= (a + b);
+ buf[PX(0)] = (unsigned char)((float)red * a + (float)buf[PX(0)] * b);
+ buf[PX(0)] /= (a + b);
+ buf[PX(1)] = (unsigned char)((float)green * a + (float)buf[PX(1)] * b);
+ buf[PX(1)] /= (a + b);
+ buf[PX(2)] = (unsigned char)((float)blue * a + (float)buf[PX(2)] * b);
+ buf[PX(2)] /= (a + b);
- buf[PX(3)] = (a + b) * 255;
+ buf[PX(3)] = (a + b) * 255;
}
-void GUI::PixelBufferAlpha::addPixel(size_t x, size_t y, GUI::Colour c)
+void PixelBufferAlpha::addPixel(size_t x, size_t y, Colour c)
{
- addPixel(x, y, c.red * 255, c.green * 255, c.blue * 255, c.alpha * 255);
+ addPixel(x, y, c.red * 255, c.green * 255, c.blue * 255, c.alpha * 255);
}
-void GUI::PixelBufferAlpha::pixel(size_t x, size_t y,
- unsigned char *red,
- unsigned char *green,
- unsigned char *blue,
- unsigned char *alpha)
+void PixelBufferAlpha::pixel(size_t x, size_t y,
+ unsigned char* red,
+ unsigned char* green,
+ unsigned char* blue,
+ unsigned char* alpha)
{
- if(x >= width || y >= height) return;
- *red = buf[PX(0)];
- *green = buf[PX(1)];
- *blue = buf[PX(2)];
- *alpha = buf[PX(3)];
-}
-
-#ifdef TEST_PIXELBUFFER
-//Additional dependency files
-//deps:
-//Required cflags (autoconf vars may be used)
-//cflags:
-//Required link options (autoconf vars may be used)
-//libs:
-#include "test.h"
-
-TEST_BEGIN;
+ assert(x < width);
+ assert(y < height);
-// TODO: Put some testcode here (see test.h for usable macros).
-
-TEST_END;
+ *red = buf[PX(0)];
+ *green = buf[PX(1)];
+ *blue = buf[PX(2)];
+ *alpha = buf[PX(3)];
+}
-#endif/*TEST_PIXELBUFFER*/
+} // GUI::