diff --git a/src/modm/ui/graphic/accessor_image.hpp b/src/modm/ui/graphic/accessor_image.hpp index 9189ae2ba7..995fde55a6 100644 --- a/src/modm/ui/graphic/accessor_image.hpp +++ b/src/modm/ui/graphic/accessor_image.hpp @@ -31,7 +31,7 @@ class Image : public Accessor // DMA2D may be implemented here - modm::shape::Point size; + const modm::shape::Point size; }; } // namespace modm::graphic diff --git a/src/modm/ui/graphic/accessor_image_bool.hpp b/src/modm/ui/graphic/accessor_image_bool.hpp index 65e0063ec1..f66b0c859c 100644 --- a/src/modm/ui/graphic/accessor_image_bool.hpp +++ b/src/modm/ui/graphic/accessor_image_bool.hpp @@ -20,58 +20,53 @@ class Image : public Accessor : Accessor(buffer->getBuffer()), size(buffer->getSize()) {} - modm::shape::Point size; - -private: - // Optimized Reader for monochrome image-data - - T* addr_top; - T bitmask_top; - - // State - T* head; - size_t x, i; - T byte; - T bitmask; + const modm::shape::Point size; public: -#define MODM_LOG_DEBUG_VAR(var) MODM_LOG_DEBUG << #var << ":\t" << var << modm::endl + // Optimized Reader for monochrome image-data void initializeReader(const modm::shape::Point origin) { - x = origin.x < 0 ? -origin.x : 0; - int16_t y = origin.y < 0 ? -origin.y : 0; - addr_top = (uint8_t*)(this->address) + (y / 8) * size.x; - bitmask_top = std::rotl(Bit0, y % 8); - - // Prepare first read - head = addr_top + x; - byte = FlashReader::read(head); - bitmask = bitmask_top; + const Point topLeft = { + origin.x < 0 ? -origin.x : 0, + origin.y < 0 ? -origin.y : 0 + }; + addr_top = this->getPointer() + (topLeft.y / 8) * size.x + topLeft.x; + bitmask_top = std::rotl(Bit0, topLeft.y % 8 - 1); + nextRow(); } inline bool nextPixel() { - const bool ret = byte & bitmask; - // Increment y bitmask = std::rotl(bitmask, 1); if (bitmask == Bit0) { - head += size.x; - byte = FlashReader::read(head); + Accessor::operator+=(size.x); + byte = Accessor::operator *(); } - return ret; + return byte & bitmask; } inline void nextRow() { - x++; - head = addr_top + x; - byte = FlashReader::read(head); bitmask = bitmask_top; + if(bitmask == Bit7) { + Accessor::operator=(addr_top++ - size.x); + } else { + Accessor::operator=(addr_top++); + byte = Accessor::operator *(); + } } +private: + // config + const T* addr_top; + T bitmask_top; + + // cache + T byte; + T bitmask; }; } // namespace modm::graphic \ No newline at end of file diff --git a/src/modm/ui/graphic/buffer.hpp b/src/modm/ui/graphic/buffer.hpp index 7ab9daa1d9..9cf1f773d4 100644 --- a/src/modm/ui/graphic/buffer.hpp +++ b/src/modm/ui/graphic/buffer.hpp @@ -53,24 +53,30 @@ class Buffer : public BufferInterface, public Painter, public TextPainter : BufferInterface(other.color) { std::copy(other.buffer[0], other.buffer[0] + sizeof(other.buffer) / sizeof(C), buffer[0]); } - // Construct from colored buffer of same size + // Construct from colored buffer with same size template constexpr Buffer(const Buffer &other) : BufferInterface(other.color) { std::copy(other.buffer[0], other.buffer[0] + sizeof(other.buffer) / sizeof(C), buffer[0]); } - // Construct from colored buffer of different size + // Construct from colored buffer with different size template constexpr Buffer(const Buffer &other) : BufferInterface(other.color) { writeImage(accessor::Image(&other)); } - // Construct from monochrome Buffer of same size - template + // Construct from monochrome Buffer with same size + template constexpr Buffer(const Buffer &other) : BufferInterface(html::White) { writeImage(accessor::Image(&other)); } + // Construct from monochrome Buffer with different size + template + constexpr Buffer(const Buffer &other) + : BufferInterface(html::White) + { writeImage(accessor::Image(&other)); } + Buffer & operator=(const Buffer &other) { @@ -97,6 +103,9 @@ class Buffer : public BufferInterface, public Painter, public TextPainter Point getSize() const final { return R::asPoint(); } + const uint8_t* getBuffer() const final + { return (uint8_t*)(buffer); } + // API Fasade: Write BufferInterface template void @@ -117,9 +126,6 @@ class Buffer : public BufferInterface, public Painter, public TextPainter protected: C buffer[R::W][R::H]; - uint8_t* getBuffer() const final - { return (uint8_t*)(buffer); } - /** * Write colored Image * diff --git a/src/modm/ui/graphic/buffer_bool.hpp b/src/modm/ui/graphic/buffer_bool.hpp index b074d93070..cf22a60ca6 100644 --- a/src/modm/ui/graphic/buffer_bool.hpp +++ b/src/modm/ui/graphic/buffer_bool.hpp @@ -44,6 +44,11 @@ class Buffer : public BufferInterface, public Painter, p constexpr Buffer(const Buffer &other) { std::copy(other.buffer[0], other.buffer[0] + sizeof(other.buffer), buffer[0]); } + // Construct from colored Buffer with same size + template + constexpr Buffer(const Buffer &other) + { /*std::copy(other.buffer[0], other.buffer[0] + sizeof(other.buffer), buffer[0]);*/ } + // Assign monochrome Buffer with same size Buffer & operator=(const Buffer &other) @@ -89,6 +94,9 @@ class Buffer : public BufferInterface, public Painter, p Point getSize() const final { return R::asPoint(); } + const uint8_t* getBuffer() const final + { return (uint8_t*)(buffer); } + // ################################## // # Experimental Features // ################################## @@ -109,9 +117,6 @@ class Buffer : public BufferInterface, public Painter, p protected: uint8_t buffer[HB][R::W]; - uint8_t* getBuffer() const final - { return (uint8_t*)(buffer); } - /** * Write colored Image * diff --git a/src/modm/ui/graphic/buffer_interface.hpp b/src/modm/ui/graphic/buffer_interface.hpp index fb7f341331..7cc3920f19 100644 --- a/src/modm/ui/graphic/buffer_interface.hpp +++ b/src/modm/ui/graphic/buffer_interface.hpp @@ -19,8 +19,7 @@ class BufferInterface virtual shape::Point getSize() const = 0; - // TODO friend class accessor::Image and protect access - virtual uint8_t* + virtual const uint8_t* getBuffer() const = 0; virtual C