From 58c52b155a782c50684e2cbcf971fd879e0fbdb6 Mon Sep 17 00:00:00 2001 From: Lenny Maiorani Date: Sun, 20 Dec 2020 09:59:18 -0700 Subject: [PATCH] LibGfx: Extraction of Streamer from P*MLoader Problem: - `Streamer` is the same in [PBM,PGM,PPM]Loader class implementations. Solution: - Extract it to its own header file to reduce maintenance burden. - Implement `read` in terms of `read_bytes` to make the class "DRY". - Decorate all functions with `constexpr`. --- Libraries/LibGfx/PBMLoader.cpp | 43 +------------------ Libraries/LibGfx/PGMLoader.cpp | 43 +------------------ Libraries/LibGfx/PPMLoader.cpp | 43 +------------------ Libraries/LibGfx/Streamer.h | 78 ++++++++++++++++++++++++++++++++++ 4 files changed, 81 insertions(+), 126 deletions(-) create mode 100644 Libraries/LibGfx/Streamer.h diff --git a/Libraries/LibGfx/PBMLoader.cpp b/Libraries/LibGfx/PBMLoader.cpp index 4fe1022c7a..7e5396808d 100644 --- a/Libraries/LibGfx/PBMLoader.cpp +++ b/Libraries/LibGfx/PBMLoader.cpp @@ -25,6 +25,7 @@ */ #include "PBMLoader.h" +#include "Streamer.h" #include #include #include @@ -59,48 +60,6 @@ struct PBMLoadingContext { RefPtr bitmap; }; -class Streamer { -public: - Streamer(const u8* data, size_t size) - : m_data_ptr(data) - , m_size_remaining(size) - { - } - - template - bool read(T& value) - { - if (m_size_remaining < sizeof(T)) - return false; - value = *((const NetworkOrdered*)m_data_ptr); - m_data_ptr += sizeof(T); - m_size_remaining -= sizeof(T); - return true; - } - - bool read_bytes(u8* buffer, size_t count) - { - if (m_size_remaining < count) - return false; - memcpy(buffer, m_data_ptr, count); - m_data_ptr += count; - m_size_remaining -= count; - return true; - } - - bool at_end() const { return !m_size_remaining; } - - void step_back() - { - m_data_ptr -= 1; - m_size_remaining += 1; - } - -private: - const u8* m_data_ptr { nullptr }; - size_t m_size_remaining { 0 }; -}; - static int read_number(Streamer& streamer) { u8 byte; diff --git a/Libraries/LibGfx/PGMLoader.cpp b/Libraries/LibGfx/PGMLoader.cpp index 3f814c7975..b83773c81d 100644 --- a/Libraries/LibGfx/PGMLoader.cpp +++ b/Libraries/LibGfx/PGMLoader.cpp @@ -25,6 +25,7 @@ */ #include "PGMLoader.h" +#include "Streamer.h" #include #include #include @@ -61,48 +62,6 @@ struct PGMLoadingContext { RefPtr bitmap; }; -class Streamer { -public: - Streamer(const u8* data, size_t size) - : m_data_ptr(data) - , m_size_remaining(size) - { - } - - template - bool read(T& value) - { - if (m_size_remaining < sizeof(T)) - return false; - value = *((const NetworkOrdered*)m_data_ptr); - m_data_ptr += sizeof(T); - m_size_remaining -= sizeof(T); - return true; - } - - bool read_bytes(u8* buffer, size_t count) - { - if (m_size_remaining < count) - return false; - memcpy(buffer, m_data_ptr, count); - m_data_ptr += count; - m_size_remaining -= count; - return true; - } - - bool at_end() const { return !m_size_remaining; } - - void step_back() - { - m_data_ptr -= 1; - m_size_remaining += 1; - } - -private: - const u8* m_data_ptr { nullptr }; - size_t m_size_remaining { 0 }; -}; - ALWAYS_INLINE static Color adjust_color(u16 max_val, Color& color) { color.set_red((color.red() * 255) / max_val); diff --git a/Libraries/LibGfx/PPMLoader.cpp b/Libraries/LibGfx/PPMLoader.cpp index cfafb090eb..a082054663 100644 --- a/Libraries/LibGfx/PPMLoader.cpp +++ b/Libraries/LibGfx/PPMLoader.cpp @@ -25,6 +25,7 @@ */ #include "PPMLoader.h" +#include "Streamer.h" #include #include #include @@ -64,48 +65,6 @@ struct PPMLoadingContext { RefPtr bitmap; }; -class Streamer { -public: - Streamer(const u8* data, size_t size) - : m_data_ptr(data) - , m_size_remaining(size) - { - } - - template - bool read(T& value) - { - if (m_size_remaining < sizeof(T)) - return false; - value = *((const NetworkOrdered*)m_data_ptr); - m_data_ptr += sizeof(T); - m_size_remaining -= sizeof(T); - return true; - } - - bool read_bytes(u8* buffer, size_t count) - { - if (m_size_remaining < count) - return false; - memcpy(buffer, m_data_ptr, count); - m_data_ptr += count; - m_size_remaining -= count; - return true; - } - - bool at_end() const { return !m_size_remaining; } - - void step_back() - { - m_data_ptr -= 1; - m_size_remaining += 1; - } - -private: - const u8* m_data_ptr { nullptr }; - size_t m_size_remaining { 0 }; -}; - ALWAYS_INLINE static Color adjust_color(u16 max_val, Color& color) { color.set_red((color.red() * 255) / max_val); diff --git a/Libraries/LibGfx/Streamer.h b/Libraries/LibGfx/Streamer.h new file mode 100644 index 0000000000..475726585b --- /dev/null +++ b/Libraries/LibGfx/Streamer.h @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2020, Hüseyin ASLITÜRK , the SerenityOS developers + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +#include +#include +#include +#include + +namespace Gfx { + +class Streamer { +public: + constexpr Streamer(const u8* data, size_t size) + : m_data_ptr(data) + , m_size_remaining(size) + { + } + + template + constexpr bool read(T& value) + { + AK::Array network_buffer {}; + auto network_value = new (network_buffer.data()) AK::NetworkOrdered {}; + auto res = read_bytes(network_buffer.data(), sizeof(T)); + value = T(*network_value); + return res; + } + + constexpr bool read_bytes(u8* buffer, size_t count) + { + if (m_size_remaining < count) { + return false; + } + memcpy(buffer, m_data_ptr, count); + m_data_ptr += count; + m_size_remaining -= count; + return true; + } + + constexpr bool at_end() const { return !m_size_remaining; } + + constexpr void step_back() + { + m_data_ptr -= 1; + m_size_remaining += 1; + } + +private: + const u8* m_data_ptr { nullptr }; + size_t m_size_remaining { 0 }; +}; + +}