Abfahrtsanzeiger Display Basic Library
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
libmonoformat/cpp/clivis/main.cpp

91 lines
2.8 KiB

#include <monoformat_fontreader.hpp>
#include <monoformat_structured.hpp>
#include <iostream>
#include <sstream>
#include <vector>
using namespace monoformat;
constexpr static std::uint16_t const ScreenWidth = 120;
constexpr static std::uint16_t const ScreenHeight = 60;
int main() {
auto fontData = findEmbeddedFont("NokiaSmallPlain_tf");
if (!fontData.size()) {
std::cerr << "Error loading font!\n" << std::flush;
return 1;
}
auto fontData2 = findEmbeddedFont("5x7_mf");
if (!fontData2.size()) {
std::cerr << "Error loading font!\n" << std::flush;
return 1;
}
std::vector<std::byte> memory;
memory.resize((ScreenWidth * ScreenHeight + 7) / 8);
MemoryOneBitBuffer screen{memory, ScreenWidth, ScreenHeight};
auto renderer = FontRenderer{fontData}.withIgnoreUnknownChars(true);
auto ret = renderer.render("Hallo Welt! ggg äöüß é è ê", {0, renderer.lineHeight() - 1}, screen, true, false);
if (!ret) {
std::cerr << "Error rendering.\n" << std::flush;
return 2;
}
auto renderer2 = FontRenderer{fontData2}.withIgnoreUnknownChars(true);
ret = renderer2.render("Hallo2", {0, renderer2.lineHeight() - 1 + renderer.lineHeight()}, screen, true, false);
if (!ret) {
std::cerr << "Error rendering.\n" << std::flush;
return 2;
}
std::cerr << "Bbox height: " << ret->boundingBox->size.height << std::endl;
std::uint16_t const w = ScreenWidth;
std::uint16_t const h = ScreenHeight / 2;
std::ostringstream buf;
buf << "\xE2\x94\x8C";
for (std::uint16_t i = 0; i < w; ++i) {
buf << "\xE2\x94\x80";
}
buf << "\xE2\x94\x90\n";
for (std::uint16_t y = 0; y < h; ++y) {
buf << "\xE2\x94\x82";
for (std::uint16_t x = 0; x < w; ++x) {
bool const pxUpperSet = screen.isPixelSet(x, 2 * y + 0);
bool const pxLowerSet = screen.isPixelSet(x, 2 * y + 1);
if (pxUpperSet && pxLowerSet) {
buf << "\xE2\x96\x88";
} else if (pxUpperSet) {
buf << "\xF0\x9F\xAC\x8E";
} else if (pxLowerSet) {
buf << "\xE2\x96\x84";
} else {
buf << " ";
}
}
buf << "\xE2\x94\x82\n";
}
if (ScreenHeight % 1) {
buf << "\xE2\x94\x82";
for (std::uint16_t x = 0; x < w; ++x) {
bool const pxUpperSet = screen.isPixelSet(x, ScreenHeight - 1);
if (pxUpperSet) {
buf << "\xF0\x9F\xAC\x8E";
} else {
buf << " ";
}
}
buf << "\xE2\x94\x82\n";
}
buf << "\xE2\x94\x94";
for (std::uint16_t i = 0; i < w; ++i) {
buf << "\xE2\x94\x80";
}
buf << "\xE2\x94\x98\n";
std::cout << buf.str();
return 0;
}