summaryrefslogtreecommitdiff
path: root/libraries/daguerre/include
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/daguerre/include')
-rw-r--r--libraries/daguerre/include/daguerre.hpp131
-rw-r--r--libraries/daguerre/include/daguerre/image.hpp155
2 files changed, 131 insertions, 155 deletions
diff --git a/libraries/daguerre/include/daguerre.hpp b/libraries/daguerre/include/daguerre.hpp
new file mode 100644
index 0000000..274e257
--- /dev/null
+++ b/libraries/daguerre/include/daguerre.hpp
@@ -0,0 +1,131 @@
+#pragma once
+
+#include <stdint.h>
+#include <cstdio>
+
+namespace daguerre {
+
+ typedef uint32_t hilbert_color;
+
+ struct rgb24 {
+ uint8_t r;
+ uint8_t g;
+ uint8_t b;
+ };
+
+ template <class to_type, class from_type>
+ to_type convert_color(const from_type &from);
+
+ template <>
+ inline hilbert_color convert_color<hilbert_color, rgb24>(const rgb24 &from) {
+ return __euler_encode_color(from.r, from.g, from.b);
+ }
+
+ template <class color_t>
+ class image {
+
+ public:
+ bool delete_buffer_on_destruct;
+ color_t *buffer;
+ unsigned width;
+ unsigned height;
+ unsigned pitch;//in sizeof(color_t)
+
+ image()
+ : delete_buffer_on_destruct(false), buffer(0), width(0), height(0),
+ pitch(0) {}
+
+ image(unsigned width, unsigned height)
+ : delete_buffer_on_destruct(true), buffer(new color_t[width * height]),
+ width(width), height(height), pitch(width) {}
+
+ image(
+ color_t *buffer, unsigned width, unsigned height, unsigned pitch,
+ bool delete_buffer_on_destruct)
+ : delete_buffer_on_destruct(delete_buffer_on_destruct), buffer(buffer),
+ width(width), height(height), pitch(pitch) {}
+
+ ~image() {
+ if (delete_buffer_on_destruct && buffer)
+ delete[] buffer;
+ }
+
+ image(const image<color_t> &other) = delete;
+
+ image(image<color_t> &&other)
+ : delete_buffer_on_destruct(other.delete_buffer_on_destruct),
+ buffer(other.buffer), width(other.width), height(other.height),
+ pitch(other.pitch) {
+ other.buffer = 0;
+ }
+
+ image<color_t> &operator =(const image<color_t> &other) = delete;
+
+ image<color_t> &operator =(image<color_t> &&other) {
+ if (delete_buffer_on_destruct && buffer)
+ delete[] buffer;
+ delete_buffer_on_destruct = other.delete_buffer_on_destruct;
+ buffer = other.buffer;
+ width = other.width;
+ height = other.height;
+ pitch = other.pitch;
+ other.buffer = 0;
+ return *this;
+ }
+
+ color_t get(unsigned x, unsigned y) const {
+ return buffer[y * pitch + x];
+ }
+
+ void set(unsigned x, unsigned y, const color_t &c) {
+ buffer[y * pitch + x] = c;
+ }
+
+ };
+
+ //it is assumed that the regions do not overlap in memory.
+ //copies into [to_x, to_x + width) x [to_y, to_y + height)
+ //from [from_x, from_x + width) x [from_y, from_y + height).
+ template <class color_t>
+ void copy_region(
+ image<color_t> &to, const image<color_t> &from, unsigned from_x,
+ unsigned from_y, unsigned to_x, unsigned to_y, unsigned width,
+ unsigned height) {
+
+ color_t *to_start = to.buffer + to.pitch * to_y + to_x;
+ const color_t *from_start = from.buffer + from.pitch * from_y + from_x;
+
+ for (unsigned y = 0; y < height; ++y)
+ memcpy(
+ to_start + to.pitch * y, from_start + from.pitch * y,
+ width * sizeof(color_t));
+
+ }
+
+ //it is assumed that the regions do not overlap in memory.
+ //copies into [to_x, to_x + width) x [to_y, to_y + height)
+ //from [from_x, from_x + width) x [from_y, from_y + height).
+ template <
+ class to_color_t, class from_color_t,
+ to_color_t converter(const from_color_t &) =
+ convert_color<to_color_t, from_color_t>>
+ void copy_region(
+ image<to_color_t> &to, const image<from_color_t> &from, unsigned from_x,
+ unsigned from_y, unsigned to_x, unsigned to_y, unsigned width,
+ unsigned height) {
+
+ to_color_t *to_start = to.buffer + to.pitch * to_y + to_x;
+ const from_color_t *from_start =
+ from.buffer + from.pitch * from_y + from_x;
+
+ for (unsigned y = 0; y < height; ++y)
+ for (unsigned x = 0; x < width; ++x)
+ to_start[to.pitch * y + x] = converter(from_start[from.pitch * y + x]);
+
+ }
+
+ image<hilbert_color> get_hilbert_framebuffer();
+
+ bool try_load_ppm(std::FILE *input, image<rgb24> &into);
+
+}
diff --git a/libraries/daguerre/include/daguerre/image.hpp b/libraries/daguerre/include/daguerre/image.hpp
deleted file mode 100644
index 6129306..0000000
--- a/libraries/daguerre/include/daguerre/image.hpp
+++ /dev/null
@@ -1,155 +0,0 @@
-#pragma once
-
-#include <euler/syscall.hpp>
-#include <cassert>
-#include <cstdint>
-#include <cstdio>
-
-namespace daguerre {
-
- struct color24 {
- uint8_t r;
- uint8_t g;
- uint8_t b;
- };
-
- using hilbert_color = euler::syscall::encoded_color;
-
- static inline hilbert_color to_hilbert_color(const color24 &c) {
- return _syscall_encode_color(c.r, c.g, c.b);
- }
-
- template <class pixel_type = color24>
- class image {
-
- pixel_type *buffer;
- unsigned width;
- unsigned height;
- unsigned pitch; //in pixels
-
- bool buffer_owned;
-
- public:
- image() : buffer(0) {}
-
- image(pixel_type *buffer, unsigned width,
- unsigned height, unsigned pitch, bool buffer_owned
- ) : buffer(buffer), width(width), height(height),
- pitch(pitch), buffer_owned(buffer_owned) {}
-
- image(unsigned width, unsigned height)
- : buffer(new pixel_type[width * height]), width(width),
- height(height), pitch(width), buffer_owned(true) {}
-
- image(const image<pixel_type> &other) = delete;
-
- image(image<pixel_type> &&other)
- : buffer(other.buffer), width(other.width), height(other.height),
- pitch(other.pitch), buffer_owned(other.buffer_owned) {
- other.buffer = 0;
- }
-
- ~image() {
- if (buffer && buffer_owned)
- delete[] buffer;
- }
-
- image &operator =(const image<pixel_type> &other) = delete;
-
- image &operator =(image<pixel_type> &&other) {
- if (buffer && buffer_owned)
- delete[] buffer;
- buffer = other.buffer;
- width = other.width;
- height = other.height;
- pitch = other.pitch;
- buffer_owned = other.buffer_owned;
- other.buffer = 0;
- return *this;
- }
-
- pixel_type &get(unsigned x, unsigned y) {
- return buffer[y * pitch + x];
- }
-
- const pixel_type &get(unsigned x, unsigned y) const {
- return buffer[y * pitch + x];
- }
-
- pixel_type *get_buffer() {
- return buffer;
- }
-
- const pixel_type *get_buffer() const {
- return buffer;
- }
-
- unsigned get_width() const {
- return width;
- }
-
- unsigned get_height() const {
- return height;
- }
-
- unsigned get_pitch() const {
- return pitch;
- }
-
- };
-
- template <class pixel_type>
- void default_converter(const pixel_type &i, pixel_type &o) {
- o = i;
- }
-
- static inline void default_converter(const color24 &i, hilbert_color &o) {
- o = to_hilbert_color(i);
- }
-
- //copies a rectangle of size width x height from source to destination. the
- //rectangle starts in source at (source_x, source_y), and in destination at
- //(destination_x, destination_y). every pixel is passed through the converter
- //template argument.
- template <
- class source_pixel_type, class destination_pixel_type,
- void (*converter)(const source_pixel_type &, destination_pixel_type &) =
- &default_converter>
- void copy_image(const image<source_pixel_type> &source,
- image<destination_pixel_type> &destination, unsigned source_x,
- unsigned source_y, unsigned destination_x, unsigned destination_y,
- unsigned width, unsigned height
- ) {
-
- assert(source_x + width <= source.get_width());
- assert(source_y + height <= source.get_height());
- assert(destination_x + width <= destination.get_width());
- assert(destination_y + height <= destination.get_height());
-
- unsigned source_pitch = source.get_pitch();
- unsigned destination_pitch = destination.get_pitch();
-
- const source_pixel_type *source_buffer =
- &source.get_buffer()[source_y * source_pitch + source_x];
- destination_pixel_type *destination_buffer = &destination.get_buffer()[
- destination_y * destination_pitch + destination_x];
-
- for (unsigned y = 0; y < height; ++y)
- for (unsigned x = 0; x < width; ++x)
- converter(source_buffer[y * source_pitch + x],
- destination_buffer[y * destination_pitch + x]);
-
- }
-
- static inline image<hilbert_color> get_hilbert_framebuffer() {
- hilbert_color *ptr;
- uint32_t width;
- uint32_t height;
- uint32_t pitch;
- _syscall_get_framebuffer(ptr, width, height, pitch);
- return image<hilbert_color>(ptr, width, height, pitch, false);
- }
-
- bool try_load_ppm(std::FILE *from, image<color24> &into);
-
-}