@@ -10,8 +10,6 @@ | |||
src/lol/algorithm/aabb_tree.h | |||
src/lol/algorithm/portal.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/interp.h (but what is it?) | |||
@@ -41,3 +39,19 @@ | |||
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 |