@@ -10,8 +10,6 @@ | |||||
src/lol/algorithm/aabb_tree.h | src/lol/algorithm/aabb_tree.h | ||||
src/lol/algorithm/portal.h | src/lol/algorithm/portal.h | ||||
src/lol/base/avl_tree.h | src/lol/base/avl_tree.h | ||||
src/lol/image/pixel.h (but is it useful?) | |||||
src/lol/math/arraynd.h (but do we really want to keep it?) | |||||
src/lol/math/geometry.h | src/lol/math/geometry.h | ||||
src/lol/math/interp.h (but what is it?) | src/lol/math/interp.h (but what is it?) | ||||
@@ -41,3 +39,19 @@ | |||||
src/lol/base/enum.h (can’t see the point) | src/lol/base/enum.h (can’t see the point) | ||||
## Interesting libraries: | |||||
- magic enum https://github.com/Neargye/magic_enum | |||||
- event dispatcher https://github.com/wqking/eventpp | |||||
- random https://github.com/effolkronium/random | |||||
- neither (handle exceptions with the type system) https://github.com/LoopPerfect/neither | |||||
- lock-free queue https://github.com/rigtorp/SPSCQueue | |||||
- fixed point math https://github.com/MikeLankamp/fpm | |||||
## Other libraries | |||||
- coroutines (uses macros) https://github.com/jamboree/co2 | |||||
- SIMD https://awesomeopensource.com/project/ospray/tsimd | |||||
- deep neural networks https://github.com/yixuan/MiniDNN | |||||
- emoji https://github.com/99xt/emojicpp | |||||
@@ -0,0 +1,18 @@ | |||||
// | |||||
// Lol Engine | |||||
// | |||||
// Copyright © 2010—2020 Sam Hocevar <sam@hocevar.net> | |||||
// | |||||
// Lol Engine is free software. It comes without any warranty, to | |||||
// the extent permitted by applicable law. You can redistribute it | |||||
// and/or modify it under the terms of the Do What the Fuck You Want | |||||
// to Public License, Version 2, as published by the WTFPL Task Force. | |||||
// See http://www.wtfpl.net/ for more details. | |||||
// | |||||
#pragma once | |||||
#include "private/push_macros.h" | |||||
#include "private/image/image.h" | |||||
#include "private/pop_macros.h" | |||||
@@ -0,0 +1,161 @@ | |||||
// | |||||
// Lol Engine | |||||
// | |||||
// Copyright © 2010—2020 Sam Hocevar <sam@hocevar.net> | |||||
// | |||||
// Lol Engine is free software. It comes without any warranty, to | |||||
// the extent permitted by applicable law. You can redistribute it | |||||
// and/or modify it under the terms of the Do What the Fuck You Want | |||||
// to Public License, Version 2, as published by the WTFPL Task Force. | |||||
// See http://www.wtfpl.net/ for more details. | |||||
// | |||||
#pragma once | |||||
// | |||||
// The image class | |||||
// ——————————————— | |||||
// | |||||
#include "pixel.h" | |||||
#include <lol/narray> // lol::array2d | |||||
#include <lol/vector> // lol::ivec2 | |||||
#include <memory> // std::shared_ptr | |||||
#include <string> // std::string | |||||
#include <unordered_set> // std::unordered_set | |||||
namespace lol | |||||
{ | |||||
template<pixel::format T> class image_t; | |||||
using image = image_t<pixel::format::rgba_u8>; | |||||
class image_data | |||||
{ | |||||
virtual ~image_data() {} | |||||
}; | |||||
// Codec class for loading and saving images | |||||
class image_codec | |||||
{ | |||||
public: | |||||
virtual bool test(std::string const &path) = 0; | |||||
virtual bool load(std::string const &path, image &im) = 0; | |||||
virtual bool save(std::string const &path, image &im) = 0; | |||||
static void add(std::shared_ptr<image_codec> codec) | |||||
{ | |||||
codecs().insert(codec); | |||||
} | |||||
static std::unordered_set<std::shared_ptr<class image_codec>> codecs() | |||||
{ | |||||
static std::unordered_set<std::shared_ptr<image_codec>> instance; | |||||
return instance; | |||||
}; | |||||
}; | |||||
// The generic image class | |||||
template<pixel::format T> class image_t | |||||
{ | |||||
public: | |||||
using pixel_type = typename pixel::type<T>::value; | |||||
image_t<T>() = default; | |||||
image_t<T>(int width, int height) | |||||
: m_pixels(width, height) | |||||
{} | |||||
image_t<T>(ivec2 size) | |||||
: m_pixels(size) | |||||
{} | |||||
// Build from another image | |||||
template<pixel::format U> | |||||
image_t<T>(image_t<U> const &other) | |||||
: m_pixels(other.size) | |||||
{ | |||||
auto src = other.pixels(); | |||||
auto dst = pixels(); | |||||
for (size_t i = 0; i < src.size(); ++i) | |||||
dst[i] = pixel::convert<U, T>(src[i]); | |||||
} | |||||
// Load and save image | |||||
bool load(std::string const &path) | |||||
{ | |||||
for (auto &codec : image_codec::codecs()) | |||||
if (codec->load(path, *this)) | |||||
return true; | |||||
return false; | |||||
} | |||||
bool save(std::string const &path) | |||||
{ | |||||
for (auto &codec : image_codec::codecs()) | |||||
if (codec->save(path, *this)) | |||||
return true; | |||||
return false; | |||||
} | |||||
// Pixel array properties | |||||
ivec2 size() const { return m_pixels.sizes(); } | |||||
size_t bytes() const { return m_pixels.bytes(); } | |||||
// Direct access to pixels | |||||
span2d<pixel_type> pixels() | |||||
{ | |||||
return m_pixels.span(); | |||||
} | |||||
span2d<pixel_type const> pixels() const | |||||
{ | |||||
return m_pixels.span(); | |||||
} | |||||
private: | |||||
array2d<pixel_type> m_pixels; | |||||
std::shared_ptr<image_data> m_data; | |||||
}; | |||||
using image = image_t<pixel::format::rgba_u8>; | |||||
enum class WrapMode : uint8_t | |||||
{ | |||||
Clamp, | |||||
Repeat, | |||||
}; | |||||
enum class ScanMode : uint8_t | |||||
{ | |||||
Raster, | |||||
Serpentine, | |||||
}; | |||||
enum class ResampleAlgorithm : uint8_t | |||||
{ | |||||
Bicubic, | |||||
Bresenham, | |||||
}; | |||||
enum class EdiffAlgorithm : uint8_t | |||||
{ | |||||
FloydSteinberg, | |||||
JaJuNi, | |||||
Atkinson, | |||||
Fan, | |||||
ShiauFan, | |||||
ShiauFan2, | |||||
Stucki, | |||||
Burkes, | |||||
Sierra, | |||||
Sierra2, | |||||
Lite, | |||||
}; | |||||
} // namespace lol | |||||
@@ -0,0 +1,47 @@ | |||||
// | |||||
// Lol Engine | |||||
// | |||||
// Copyright © 2004—2020 Sam Hocevar <sam@hocevar.net> | |||||
// | |||||
// Lol Engine is free software. It comes without any warranty, to | |||||
// the extent permitted by applicable law. You can redistribute it | |||||
// and/or modify it under the terms of the Do What the Fuck You Want | |||||
// to Public License, Version 2, as published by the WTFPL Task Force. | |||||
// See http://www.wtfpl.net/ for more details. | |||||
// | |||||
#pragma once | |||||
// | |||||
// The Pixel-related classes | |||||
// ————————————————————————— | |||||
// | |||||
#include <lol/vector> | |||||
namespace lol::pixel | |||||
{ | |||||
// The pixel formats we know about | |||||
enum class format : uint8_t | |||||
{ | |||||
y_u8, rgb_u8, rgba_u8, y_f32, rgb_f32, rgba_f32, | |||||
}; | |||||
// Associated storage types for each pixel format | |||||
template<format T> struct type {}; | |||||
template<> struct type<format::y_u8> { typedef uint8_t value; }; | |||||
template<> struct type<format::rgb_u8> { typedef u8vec3 value; }; | |||||
template<> struct type<format::rgba_u8> { typedef u8vec4 value; }; | |||||
template<> struct type<format::y_f32> { typedef float value; }; | |||||
template<> struct type<format::rgb_f32> { typedef vec3 value; }; | |||||
template<> struct type<format::rgba_f32> { typedef vec4 value; }; | |||||
// Convert between pixel formats | |||||
template<format T, format U> | |||||
typename type<U>::value convert(typename type<T>::value const &p) | |||||
{ | |||||
return type<T>::value(); | |||||
} | |||||
} // namespace lol::pixel |