Compare commits
No commits in common. "23d74e35a1ed3cce7b301960c8260f435de6edbd" and "42561d5ace9f45478ef3aae3a94e1c714ed07cc1" have entirely different histories.
23d74e35a1
...
42561d5ace
|
|
@ -5,15 +5,15 @@ RUN apk update && \
|
||||||
apk add --no-cache \
|
apk add --no-cache \
|
||||||
autoconf \
|
autoconf \
|
||||||
bash \
|
bash \
|
||||||
|
boost-build \
|
||||||
build-base \
|
build-base \
|
||||||
cmake \
|
cmake \
|
||||||
clang \
|
|
||||||
clang-extra-tools \
|
|
||||||
gdb \
|
gdb \
|
||||||
git \
|
git \
|
||||||
libstdc++ \
|
libstdc++ \
|
||||||
libtool \
|
libtool \
|
||||||
linux-headers \
|
linux-headers \
|
||||||
|
ninja \
|
||||||
m4 \
|
m4 \
|
||||||
perl \
|
perl \
|
||||||
python3 \
|
python3 \
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
"build": {
|
"build": {
|
||||||
"dockerfile": "Dockerfile"
|
"dockerfile": "Dockerfile"
|
||||||
},
|
},
|
||||||
|
|
||||||
// Configure tool-specific properties.
|
// Configure tool-specific properties.
|
||||||
"customizations": {
|
"customizations": {
|
||||||
"vscode": {
|
"vscode": {
|
||||||
|
|
|
||||||
|
|
@ -7,20 +7,21 @@
|
||||||
//
|
//
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
#include <functional>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
#include <boost/gil/image.hpp>
|
#include <boost/gil/image.hpp>
|
||||||
#include <ft2build.h>
|
#include <ft2build.h>
|
||||||
#include <functional>
|
|
||||||
#include <memory>
|
|
||||||
#include <string>
|
|
||||||
#include FT_FREETYPE_H
|
#include FT_FREETYPE_H
|
||||||
#include FT_BITMAP_H
|
#include FT_BITMAP_H
|
||||||
|
|
||||||
namespace bmrshared
|
namespace bmrshared
|
||||||
{
|
{
|
||||||
class freetype_lib;
|
class freetype_lib;
|
||||||
|
|
||||||
class freetype_face final : public std::enable_shared_from_this<freetype_face>
|
class freetype_face final : public std::enable_shared_from_this<freetype_face>
|
||||||
{
|
{
|
||||||
using character_index = FT_ULong;
|
using character_index = FT_ULong;
|
||||||
using pixel_size = FT_UInt;
|
using pixel_size = FT_UInt;
|
||||||
|
|
||||||
|
|
@ -29,16 +30,22 @@ class freetype_face final : public std::enable_shared_from_this<freetype_face>
|
||||||
const std::string& font_path,
|
const std::string& font_path,
|
||||||
pixel_size pixel_width,
|
pixel_size pixel_width,
|
||||||
pixel_size pixel_height,
|
pixel_size pixel_height,
|
||||||
bool render_monochrome);
|
bool render_monochrome
|
||||||
|
);
|
||||||
|
|
||||||
~freetype_face();
|
~freetype_face();
|
||||||
|
|
||||||
FT_BBox get_boundbox() const;
|
FT_BBox get_boundbox() const;
|
||||||
FT_Glyph_Metrics get_dimensions(character_index character_index) const;
|
FT_Glyph_Metrics get_dimensions(character_index character_index) const;
|
||||||
|
|
||||||
void render(character_index character_index, std::function<void(int x, int y, const uint8_t level)> painter);
|
void render(
|
||||||
|
character_index character_index,
|
||||||
|
std::function<void(int x,
|
||||||
|
int y,
|
||||||
|
const uint8_t level
|
||||||
|
)> painter);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
FT_Int32 get_load_flags() const;
|
FT_Int32 get_load_flags() const;
|
||||||
FT_Render_Mode get_render_mode() const;
|
FT_Render_Mode get_render_mode() const;
|
||||||
|
|
||||||
|
|
@ -46,5 +53,5 @@ class freetype_face final : public std::enable_shared_from_this<freetype_face>
|
||||||
std::shared_ptr<freetype_lib> m_lib;
|
std::shared_ptr<freetype_lib> m_lib;
|
||||||
FT_Face m_face;
|
FT_Face m_face;
|
||||||
bool m_renderMonochrome;
|
bool m_renderMonochrome;
|
||||||
};
|
};
|
||||||
} // namespace bmrshared
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,14 +6,14 @@
|
||||||
// the Free Software Foundation.
|
// the Free Software Foundation.
|
||||||
//
|
//
|
||||||
#pragma once
|
#pragma once
|
||||||
#include <ft2build.h>
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <ft2build.h>
|
||||||
#include FT_FREETYPE_H
|
#include FT_FREETYPE_H
|
||||||
|
|
||||||
namespace bmrshared
|
namespace bmrshared
|
||||||
{
|
{
|
||||||
class freetype_lib final : public std::enable_shared_from_this<freetype_lib>
|
class freetype_lib final : public std::enable_shared_from_this<freetype_lib>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
freetype_lib();
|
freetype_lib();
|
||||||
~freetype_lib();
|
~freetype_lib();
|
||||||
|
|
@ -22,5 +22,5 @@ class freetype_lib final : public std::enable_shared_from_this<freetype_lib>
|
||||||
|
|
||||||
private:
|
private:
|
||||||
FT_Library m_library;
|
FT_Library m_library;
|
||||||
};
|
};
|
||||||
} // namespace bmrshared
|
}
|
||||||
|
|
|
||||||
|
|
@ -11,15 +11,13 @@
|
||||||
|
|
||||||
namespace bmrshared
|
namespace bmrshared
|
||||||
{
|
{
|
||||||
struct dimensions final
|
struct dimensions final
|
||||||
{
|
{
|
||||||
FT_Pos width;
|
FT_Pos width;
|
||||||
FT_Pos height;
|
FT_Pos height;
|
||||||
FT_Pos vertOriginOffsetY;
|
FT_Pos vertOriginOffsetY;
|
||||||
};
|
};
|
||||||
|
|
||||||
dimensions freetype_calculate_dimensions(freetype_face& face, std::string_view text);
|
dimensions freetype_calculate_dimensions(freetype_face& face, std::string_view text);
|
||||||
void freetype_paint(freetype_face& face,
|
void freetype_paint(freetype_face& face, std::string_view text, const std::function<void(int x, int y, uint8_t level)>& paintfn);
|
||||||
std::string_view text,
|
}
|
||||||
const std::function<void(int x, int y, uint8_t level)>& paintfn);
|
|
||||||
} // namespace bmrshared
|
|
||||||
|
|
@ -5,13 +5,14 @@
|
||||||
// under the terms of the GNU Lesser General Public License v3.0 as published by
|
// under the terms of the GNU Lesser General Public License v3.0 as published by
|
||||||
// the Free Software Foundation.
|
// the Free Software Foundation.
|
||||||
//
|
//
|
||||||
#include <algorithm>
|
|
||||||
#include <bmrshared/freetype_face.hpp>
|
#include <bmrshared/freetype_face.hpp>
|
||||||
#include <bmrshared/freetype_lib.hpp>
|
#include <bmrshared/freetype_lib.hpp>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
using namespace bmrshared;
|
using namespace bmrshared;
|
||||||
|
|
||||||
freetype_face::freetype_face(std::shared_ptr<freetype_lib> lib,
|
freetype_face::freetype_face(
|
||||||
|
std::shared_ptr<freetype_lib> lib,
|
||||||
const std::string& font_path,
|
const std::string& font_path,
|
||||||
pixel_size pixel_width,
|
pixel_size pixel_width,
|
||||||
pixel_size pixel_height,
|
pixel_size pixel_height,
|
||||||
|
|
@ -19,9 +20,16 @@ freetype_face::freetype_face(std::shared_ptr<freetype_lib> lib,
|
||||||
: m_lib(lib)
|
: m_lib(lib)
|
||||||
, m_renderMonochrome(render_monochrome)
|
, m_renderMonochrome(render_monochrome)
|
||||||
{
|
{
|
||||||
FT_New_Face(m_lib->get_ft_library(), font_path.c_str(), 0, &m_face);
|
FT_New_Face(
|
||||||
|
m_lib->get_ft_library(),
|
||||||
|
font_path.c_str(),
|
||||||
|
0,
|
||||||
|
&m_face);
|
||||||
|
|
||||||
FT_Set_Pixel_Sizes(m_face, pixel_width, pixel_height);
|
FT_Set_Pixel_Sizes(
|
||||||
|
m_face,
|
||||||
|
pixel_width,
|
||||||
|
pixel_height);
|
||||||
}
|
}
|
||||||
|
|
||||||
freetype_face::~freetype_face()
|
freetype_face::~freetype_face()
|
||||||
|
|
@ -34,7 +42,8 @@ FT_BBox freetype_face::get_boundbox() const
|
||||||
return m_face->bbox;
|
return m_face->bbox;
|
||||||
}
|
}
|
||||||
|
|
||||||
FT_Glyph_Metrics freetype_face::get_dimensions(character_index character_index) const
|
FT_Glyph_Metrics freetype_face::get_dimensions(
|
||||||
|
character_index character_index) const
|
||||||
{
|
{
|
||||||
// Load glyph and retrieve metrics.
|
// Load glyph and retrieve metrics.
|
||||||
const auto glyph_index = FT_Get_Char_Index(m_face, character_index);
|
const auto glyph_index = FT_Get_Char_Index(m_face, character_index);
|
||||||
|
|
@ -45,7 +54,12 @@ FT_Glyph_Metrics freetype_face::get_dimensions(character_index character_index)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void freetype_face::render(FT_ULong character_index, std::function<void(int x, int y, uint8_t level)> painter)
|
void freetype_face::render(
|
||||||
|
FT_ULong character_index,
|
||||||
|
std::function<void(int x,
|
||||||
|
int y,
|
||||||
|
uint8_t level
|
||||||
|
)> painter)
|
||||||
{
|
{
|
||||||
// Load glyph and retrieve metrics.
|
// Load glyph and retrieve metrics.
|
||||||
const auto glyph_index = FT_Get_Char_Index(m_face, character_index);
|
const auto glyph_index = FT_Get_Char_Index(m_face, character_index);
|
||||||
|
|
@ -60,12 +74,12 @@ void freetype_face::render(FT_ULong character_index, std::function<void(int x, i
|
||||||
FT_Bitmap_Init(&target);
|
FT_Bitmap_Init(&target);
|
||||||
FT_Bitmap_Convert(m_lib->get_ft_library(), &bitmap, &target, 1);
|
FT_Bitmap_Convert(m_lib->get_ft_library(), &bitmap, &target, 1);
|
||||||
|
|
||||||
for (unsigned int x = 0; x < target.width; ++x)
|
for(unsigned int x = 0; x < target.width; ++x)
|
||||||
{
|
{
|
||||||
for (unsigned int y = 0; y < target.rows; ++y)
|
for(unsigned int y = 0; y < target.rows; ++y)
|
||||||
{
|
{
|
||||||
const uint8_t& value = 0xff * target.buffer[x + target.width * y];
|
const uint8_t& value = 0xff * target.buffer[x + target.width * y];
|
||||||
painter(x, y, value);
|
painter(x,y,value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,8 +5,8 @@
|
||||||
// under the terms of the GNU Lesser General Public License v3.0 as published by
|
// under the terms of the GNU Lesser General Public License v3.0 as published by
|
||||||
// the Free Software Foundation.
|
// the Free Software Foundation.
|
||||||
//
|
//
|
||||||
#include <algorithm>
|
|
||||||
#include <bmrshared/freetype_utils.hpp>
|
#include <bmrshared/freetype_utils.hpp>
|
||||||
|
#include <algorithm>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
|
|
||||||
namespace bmrshared
|
namespace bmrshared
|
||||||
|
|
@ -29,14 +29,10 @@ dimensions freetype_calculate_dimensions(freetype_face& face, std::string_view t
|
||||||
line_above_origin = std::max(line_above_origin, char_above_origin);
|
line_above_origin = std::max(line_above_origin, char_above_origin);
|
||||||
line_below_origin = std::max(line_below_origin, char_below_origin);
|
line_below_origin = std::max(line_below_origin, char_below_origin);
|
||||||
}
|
}
|
||||||
return {.width = line_width,
|
return {.width = line_width, .height = (line_above_origin + line_below_origin), .vertOriginOffsetY = line_above_origin};
|
||||||
.height = (line_above_origin + line_below_origin),
|
|
||||||
.vertOriginOffsetY = line_above_origin};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void freetype_paint(freetype_face& face,
|
void freetype_paint(freetype_face& face, std::string_view text, const std::function<void(int x, int y, uint8_t level)>& paintfn)
|
||||||
std::string_view text,
|
|
||||||
const std::function<void(int x, int y, uint8_t level)>& paintfn)
|
|
||||||
{
|
{
|
||||||
FT_Pos line_x = 0;
|
FT_Pos line_x = 0;
|
||||||
FT_Pos char_offset_x = 0;
|
FT_Pos char_offset_x = 0;
|
||||||
|
|
@ -46,15 +42,15 @@ void freetype_paint(freetype_face& face,
|
||||||
paintfn((char_offset_x + x), (y - char_offset_y), level);
|
paintfn((char_offset_x + x), (y - char_offset_y), level);
|
||||||
};
|
};
|
||||||
|
|
||||||
for (const char& c : text)
|
for( const char& c : text)
|
||||||
{
|
{
|
||||||
const FT_Glyph_Metrics& dim = face.get_dimensions(c);
|
const FT_Glyph_Metrics& dim = face.get_dimensions(c);
|
||||||
char_offset_x = (line_x + (dim.horiAdvance - dim.width) / 2) / 64;
|
char_offset_x = (line_x + (dim.horiAdvance - dim.width)/2)/64;
|
||||||
char_offset_y = dim.horiBearingY / 64;
|
char_offset_y = dim.horiBearingY/64;
|
||||||
|
|
||||||
face.render(c, painter_char);
|
face.render(c, painter_char);
|
||||||
line_x += dim.horiAdvance;
|
line_x += dim.horiAdvance;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace bmrshared
|
}
|
||||||
|
|
@ -10,7 +10,7 @@
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
constexpr std::string_view magic_file_location = "/usr/local/bin/magic.mgc";
|
constexpr std::string_view magic_file_location = "/usr/local/bin/magic.mgc";
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(test_magic, no_throw_on_query)
|
TEST(test_magic, no_throw_on_query)
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ struct function_wrapper<T, TExtraArguments...>
|
||||||
using wrapper_type = std::function<flexible_value(const T&, const IDataSource&, TExtraArguments...)>;
|
using wrapper_type = std::function<flexible_value(const T&, const IDataSource&, TExtraArguments...)>;
|
||||||
|
|
||||||
template<typename M, typename... TSourceParams>
|
template<typename M, typename... TSourceParams>
|
||||||
static wrapper_type Wrap(M T::* callableFn, TSourceParams... paramNames)
|
static wrapper_type Wrap(M T::*callableFn, TSourceParams... paramNames)
|
||||||
{
|
{
|
||||||
std::array<std::string, sizeof...(TSourceParams)> names{paramNames...};
|
std::array<std::string, sizeof...(TSourceParams)> names{paramNames...};
|
||||||
return [callableFn, names](const T& obj, const IDataSource& source, TExtraArguments... args)
|
return [callableFn, names](const T& obj, const IDataSource& source, TExtraArguments... args)
|
||||||
|
|
@ -47,7 +47,7 @@ struct function_wrapper<T, TExtraArguments...>
|
||||||
using wrapper_type = std::function<flexible_value(T&, const IDataSource&, TExtraArguments...)>;
|
using wrapper_type = std::function<flexible_value(T&, const IDataSource&, TExtraArguments...)>;
|
||||||
|
|
||||||
template<typename M, typename... TSourceParams>
|
template<typename M, typename... TSourceParams>
|
||||||
static wrapper_type Wrap(M T::* callableFn, TSourceParams... paramNames)
|
static wrapper_type Wrap(M T::*callableFn, TSourceParams... paramNames)
|
||||||
{
|
{
|
||||||
std::array<std::string, sizeof...(TSourceParams)> names{paramNames...};
|
std::array<std::string, sizeof...(TSourceParams)> names{paramNames...};
|
||||||
return [callableFn, names](T& obj, const IDataSource& source, TExtraArguments... args)
|
return [callableFn, names](T& obj, const IDataSource& source, TExtraArguments... args)
|
||||||
|
|
|
||||||
|
|
@ -52,10 +52,10 @@ namespace detail
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
|
|
||||||
template<typename M, typename T, std::size_t TParameterCount, typename... TExtraArguments>
|
template<typename M, typename T, std::size_t TParameterCount, typename... TExtraArguments>
|
||||||
requires(function_info<M T::*>::is_const_member == false)
|
requires(function_info<M T::*>::is_const_member == false)
|
||||||
|
|
||||||
flexible_value invoke(T& callableObj,
|
flexible_value invoke(T& callableObj,
|
||||||
M T::* callableFn,
|
M T::*callableFn,
|
||||||
std::array<std::string, TParameterCount> names,
|
std::array<std::string, TParameterCount> names,
|
||||||
const IDataSource& source,
|
const IDataSource& source,
|
||||||
TExtraArguments&&... arguments)
|
TExtraArguments&&... arguments)
|
||||||
|
|
@ -72,10 +72,10 @@ flexible_value invoke(T& callableObj,
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename M, typename T, std::size_t TParameterCount, typename... TExtraArguments>
|
template<typename M, typename T, std::size_t TParameterCount, typename... TExtraArguments>
|
||||||
requires(function_info<M T::*>::is_const_member == true)
|
requires(function_info<M T::*>::is_const_member == true)
|
||||||
|
|
||||||
flexible_value invoke(const T& callableObj,
|
flexible_value invoke(const T& callableObj,
|
||||||
M T::* callableFn,
|
M T::*callableFn,
|
||||||
std::array<std::string, TParameterCount> names,
|
std::array<std::string, TParameterCount> names,
|
||||||
const IDataSource& source,
|
const IDataSource& source,
|
||||||
TExtraArguments&&... arguments)
|
TExtraArguments&&... arguments)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue