This commit is contained in:
Niklas Gollenstede
2025-10-31 22:37:36 +01:00
commit 174fe17e89
197 changed files with 79558 additions and 0 deletions

View File

@@ -0,0 +1 @@
exclude_files=font_.*\.h

View File

@@ -0,0 +1,44 @@
#include "font.h"
#include "../../types.h"
#include "../../utils/size.h"
#include "../../utils/string.h"
#include "font_10x18.h"
#include "font_6x10.h"
#include "font_6x11.h"
#include "font_7x14.h"
#include "font_8x16.h"
#include "font_8x8.h"
#include "font_acorn_8x8.h"
#include "font_mini_4x6.h"
#include "font_pearl_8x8.h"
#include "font_sun_12x22.h"
#include "font_sun_8x16.h"
#include "font_ter_16x32.h"
static Font fonts[] = {
Font("Standard", 6, 10, fontdata_6x10),
Font("Standard", 7, 14, fontdata_7x14),
Font("Standard", 8, 8, fontdata_8x8),
Font("Standard", 8, 16, fontdata_8x16),
Font("Standard", 10, 18, fontdata_10x18),
Font("Acorn", 8, 8, acorndata_8x8),
Font("Mini", 4, 6, fontdata_mini_4x6),
Font("Pearl", 8, 8, fontdata_pearl_8x8),
Font("Sun", 12, 22, fontdata_sun_12x22),
Font("Sun", 8, 16, fontdata_sun_8x16),
Font("Terminus", 16, 32, fontdata_ter16x32),
};
unsigned Font::number() { return ::size(fonts); }
Font* Font::get(const char* name, const unsigned width, const unsigned height) {
for (unsigned i = 0; i < number(); i++) {
if ((name == nullptr || strcmp(name, fonts[i].name) == 0) &&
(width == 0 || width == fonts[i].width) &&
(height == 0 || height == fonts[i].height)) {
return &fonts[i];
}
}
return nullptr;
}

View File

@@ -0,0 +1,73 @@
/*! \file
* \brief \ref Font "Monospaced fonts"
*/
#pragma once
#include "../../types.h"
/*! \brief Monospaced fonts
* \ingroup gfx
*
* Console fonts are extracted from the Linux kernel
* ([/lib/fonts/](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/lib/fonts)).
*/
class Font {
/*! \brief Pointer to bitmap font
*/
const unsigned char* data;
/*! \brief Size in memory of bitmap font
*/
const size_t size;
public:
/*! \brief Name of font
*/
const char* name;
/*! \brief Width of a character
*/
const unsigned width;
/*! \brief Height of a character
*/
const unsigned height;
/*! \brief Constructor for a font
*
* \param name Name of font
* \param width character width
* \param height character height
* \param data Pointer to bitmap font
*/
Font(const char* name, unsigned width, unsigned height,
const unsigned char* data)
: data(data),
size((((width + (8 >> 1)) / 8) * height)),
name(name),
width(width),
height(height) {}
/*! \brief Get bitmap address for a given character
*
* \param c character (ASCII)
* \return Pointer to bitmap of character
*/
const void* symbol(unsigned char c) const { return &data[size * c]; }
/*! \brief Find font
*
* \param name Name of font (or `nullptr` for any)
* \param width Width of a character (or `0` for any)
* \param height Height of a character (or `0` for any)
* \return Pointer to font or `nullptr` if no matching font was found
*/
static Font* get(const char* name = nullptr, unsigned width = 0,
unsigned height = 0);
/*! \brief Get the number of available fonts
* \return number of fonts
*/
static unsigned number();
};

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,260 @@
/* Acorn-like font definition, with PC graphics characters */
static const unsigned char acorndata_8x8[] = {
/* 00 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ^@ */
/* 01 */ 0x7e, 0x81, 0xa5, 0x81, 0xbd, 0x99, 0x81, 0x7e, /* ^A */
/* 02 */ 0x7e, 0xff, 0xbd, 0xff, 0xc3, 0xe7, 0xff, 0x7e, /* ^B */
/* 03 */ 0x6c, 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x10, 0x00, /* ^C */
/* 04 */ 0x10, 0x38, 0x7c, 0xfe, 0x7c, 0x38, 0x10, 0x00, /* ^D */
/* 05 */ 0x00, 0x18, 0x3c, 0xe7, 0xe7, 0x3c, 0x18, 0x00, /* ^E */
/* 06 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 07 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 08 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 09 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 0A */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 0B */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 0C */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 0D */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 0E */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 0F */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 10 */ 0x00, 0x60, 0x78, 0x7e, 0x7e, 0x78, 0x60, 0x00, /* |> */
/* 11 */ 0x00, 0x06, 0x1e, 0x7e, 0x7e, 0x1e, 0x06, 0x00, /* <| */
/* 12 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 13 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 14 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 15 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 16 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 17 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 18 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 19 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 1A */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 1B */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 1C */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 1D */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 1E */ 0x00, 0x18, 0x18, 0x3c, 0x3c, 0x7e, 0x7e, 0x00, /* /\ */
/* 1F */ 0x00, 0x7e, 0x7e, 0x3c, 0x3c, 0x18, 0x18, 0x00, /* \/ */
/* 20 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* */
/* 21 */ 0x18, 0x3c, 0x3c, 0x18, 0x18, 0x00, 0x18, 0x00, /* ! */
/* 22 */ 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, /* " */
/* 23 */ 0x36, 0x36, 0x7F, 0x36, 0x7F, 0x36, 0x36, 0x00, /* # */
/* 24 */ 0x0C, 0x3F, 0x68, 0x3E, 0x0B, 0x7E, 0x18, 0x00, /* $ */
/* 25 */ 0x60, 0x66, 0x0C, 0x18, 0x30, 0x66, 0x06, 0x00, /* % */
/* 26 */ 0x38, 0x6C, 0x6C, 0x38, 0x6D, 0x66, 0x3B, 0x00, /* & */
/* 27 */ 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, /* ' */
/* 28 */ 0x0C, 0x18, 0x30, 0x30, 0x30, 0x18, 0x0C, 0x00, /* ( */
/* 29 */ 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x18, 0x30, 0x00, /* ) */
/* 2A */ 0x00, 0x18, 0x7E, 0x3C, 0x7E, 0x18, 0x00, 0x00, /* * */
/* 2B */ 0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00, /* + */
/* 2C */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, /* , */
/* 2D */ 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, /* - */
/* 2E */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, /* . */
/* 2F */ 0x00, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x00, 0x00, /* / */
/* 30 */ 0x3C, 0x66, 0x6E, 0x7E, 0x76, 0x66, 0x3C, 0x00, /* 0 */
/* 31 */ 0x18, 0x38, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, /* 1 */
/* 32 */ 0x3C, 0x66, 0x06, 0x0C, 0x18, 0x30, 0x7E, 0x00, /* 2 */
/* 33 */ 0x3C, 0x66, 0x06, 0x1C, 0x06, 0x66, 0x3C, 0x00, /* 3 */
/* 34 */ 0x0C, 0x1C, 0x3C, 0x6C, 0x7E, 0x0C, 0x0C, 0x00, /* 4 */
/* 35 */ 0x7E, 0x60, 0x7C, 0x06, 0x06, 0x66, 0x3C, 0x00, /* 5 */
/* 36 */ 0x1C, 0x30, 0x60, 0x7C, 0x66, 0x66, 0x3C, 0x00, /* 6 */
/* 37 */ 0x7E, 0x06, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x00, /* 7 */
/* 38 */ 0x3C, 0x66, 0x66, 0x3C, 0x66, 0x66, 0x3C, 0x00, /* 8 */
/* 39 */ 0x3C, 0x66, 0x66, 0x3E, 0x06, 0x0C, 0x38, 0x00, /* 9 */
/* 3A */ 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, /* : */
/* 3B */ 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x30, /* ; */
/* 3C */ 0x0C, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0C, 0x00, /* < */
/* 3D */ 0x00, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x00, 0x00, /* = */
/* 3E */ 0x30, 0x18, 0x0C, 0x06, 0x0C, 0x18, 0x30, 0x00, /* > */
/* 3F */ 0x3C, 0x66, 0x0C, 0x18, 0x18, 0x00, 0x18, 0x00, /* ? */
/* 40 */ 0x3C, 0x66, 0x6E, 0x6A, 0x6E, 0x60, 0x3C, 0x00, /* @ */
/* 41 */ 0x3C, 0x66, 0x66, 0x7E, 0x66, 0x66, 0x66, 0x00, /* A */
/* 42 */ 0x7C, 0x66, 0x66, 0x7C, 0x66, 0x66, 0x7C, 0x00, /* B */
/* 43 */ 0x3C, 0x66, 0x60, 0x60, 0x60, 0x66, 0x3C, 0x00, /* C */
/* 44 */ 0x78, 0x6C, 0x66, 0x66, 0x66, 0x6C, 0x78, 0x00, /* D */
/* 45 */ 0x7E, 0x60, 0x60, 0x7C, 0x60, 0x60, 0x7E, 0x00, /* E */
/* 46 */ 0x7E, 0x60, 0x60, 0x7C, 0x60, 0x60, 0x60, 0x00, /* F */
/* 47 */ 0x3C, 0x66, 0x60, 0x6E, 0x66, 0x66, 0x3C, 0x00, /* G */
/* 48 */ 0x66, 0x66, 0x66, 0x7E, 0x66, 0x66, 0x66, 0x00, /* H */
/* 49 */ 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, /* I */
/* 4A */ 0x3E, 0x0C, 0x0C, 0x0C, 0x0C, 0x6C, 0x38, 0x00, /* J */
/* 4B */ 0x66, 0x6C, 0x78, 0x70, 0x78, 0x6C, 0x66, 0x00, /* K */
/* 4C */ 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x7E, 0x00, /* L */
/* 4D */ 0x63, 0x77, 0x7F, 0x6B, 0x6B, 0x63, 0x63, 0x00, /* M */
/* 4E */ 0x66, 0x66, 0x76, 0x7E, 0x6E, 0x66, 0x66, 0x00, /* N */
/* 4F */ 0x3C, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00, /* O */
/* 50 */ 0x7C, 0x66, 0x66, 0x7C, 0x60, 0x60, 0x60, 0x00, /* P */
/* 51 */ 0x3C, 0x66, 0x66, 0x66, 0x6A, 0x6C, 0x36, 0x00, /* Q */
/* 52 */ 0x7C, 0x66, 0x66, 0x7C, 0x6C, 0x66, 0x66, 0x00, /* R */
/* 53 */ 0x3C, 0x66, 0x60, 0x3C, 0x06, 0x66, 0x3C, 0x00, /* S */
/* 54 */ 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, /* T */
/* 55 */ 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00, /* U */
/* 56 */ 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x00, /* V */
/* 57 */ 0x63, 0x63, 0x6B, 0x6B, 0x7F, 0x77, 0x63, 0x00, /* W */
/* 58 */ 0x66, 0x66, 0x3C, 0x18, 0x3C, 0x66, 0x66, 0x00, /* X */
/* 59 */ 0x66, 0x66, 0x66, 0x3C, 0x18, 0x18, 0x18, 0x00, /* Y */
/* 5A */ 0x7E, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x7E, 0x00, /* Z */
/* 5B */ 0x7C, 0x60, 0x60, 0x60, 0x60, 0x60, 0x7C, 0x00, /* [ */
/* 5C */ 0x00, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x00, 0x00, /* \ */
/* 5D */ 0x3E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x3E, 0x00, /* ] */
/* 5E */ 0x3C, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ^ */
/* 5F */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, /* _ */
/* 60 */ 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* */
/* 61 */ 0x00, 0x00, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, /* a */
/* 62 */ 0x60, 0x60, 0x7C, 0x66, 0x66, 0x66, 0x7C, 0x00, /* b */
/* 63 */ 0x00, 0x00, 0x3C, 0x66, 0x60, 0x66, 0x3C, 0x00, /* c */
/* 64 */ 0x06, 0x06, 0x3E, 0x66, 0x66, 0x66, 0x3E, 0x00, /* d */
/* 65 */ 0x00, 0x00, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00, /* e */
/* 66 */ 0x1C, 0x30, 0x30, 0x7C, 0x30, 0x30, 0x30, 0x00, /* f */
/* 67 */ 0x00, 0x00, 0x3E, 0x66, 0x66, 0x3E, 0x06, 0x3C, /* g */
/* 68 */ 0x60, 0x60, 0x7C, 0x66, 0x66, 0x66, 0x66, 0x00, /* h */
/* 69 */ 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x3C, 0x00, /* i */
/* 6A */ 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x70, /* j */
/* 6B */ 0x60, 0x60, 0x66, 0x6C, 0x78, 0x6C, 0x66, 0x00, /* k */
/* 6C */ 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, /* l */
/* 6D */ 0x00, 0x00, 0x36, 0x7F, 0x6B, 0x6B, 0x63, 0x00, /* m */
/* 6E */ 0x00, 0x00, 0x7C, 0x66, 0x66, 0x66, 0x66, 0x00, /* n */
/* 6F */ 0x00, 0x00, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x00, /* o */
/* 70 */ 0x00, 0x00, 0x7C, 0x66, 0x66, 0x7C, 0x60, 0x60, /* p */
/* 71 */ 0x00, 0x00, 0x3E, 0x66, 0x66, 0x3E, 0x06, 0x07, /* q */
/* 72 */ 0x00, 0x00, 0x6C, 0x76, 0x60, 0x60, 0x60, 0x00, /* r */
/* 73 */ 0x00, 0x00, 0x3E, 0x60, 0x3C, 0x06, 0x7C, 0x00, /* s */
/* 74 */ 0x30, 0x30, 0x7C, 0x30, 0x30, 0x30, 0x1C, 0x00, /* t */
/* 75 */ 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x3E, 0x00, /* u */
/* 76 */ 0x00, 0x00, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x00, /* v */
/* 77 */ 0x00, 0x00, 0x63, 0x6B, 0x6B, 0x7F, 0x36, 0x00, /* w */
/* 78 */ 0x00, 0x00, 0x66, 0x3C, 0x18, 0x3C, 0x66, 0x00, /* x */
/* 79 */ 0x00, 0x00, 0x66, 0x66, 0x66, 0x3E, 0x06, 0x3C, /* y */
/* 7A */ 0x00, 0x00, 0x7E, 0x0C, 0x18, 0x30, 0x7E, 0x00, /* z */
/* 7B */ 0x0C, 0x18, 0x18, 0x70, 0x18, 0x18, 0x0C, 0x00, /* { */
/* 7C */ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, /* | */
/* 7D */ 0x30, 0x18, 0x18, 0x0E, 0x18, 0x18, 0x30, 0x00, /* } */
/* 7E */ 0x31, 0x6B, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, /* ~ */
/* 7F */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /*  */
/* 80 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 81 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 82 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 83 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 84 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 85 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 86 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 88 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 89 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 8A */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 8B */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 8C */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 8D */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 8E */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 8F */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 90 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 91 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 92 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 93 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 94 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 95 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 96 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 98 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 99 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 9A */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 9B */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 9C */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 9D */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 9E */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 9F */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* A0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* A1 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* A2 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* A3 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* A4 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* A5 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* A6 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* A7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* A8 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* A9 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* AA */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* AB */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* AC */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* AD */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* AE */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* AF */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* B0 */ 0x22, 0x88, 0x22, 0x88, 0x22, 0x88, 0x22, 0x88,
/* B1 */ 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa,
/* B2 */ 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77,
/* B3 */ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
/* B4 */ 0x18, 0x18, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18,
/* B5 */ 0x18, 0x18, 0xf8, 0x18, 0xf8, 0x18, 0x18, 0x18,
/* B6 */ 0x66, 0x66, 0x66, 0xe6, 0x66, 0x66, 0x66, 0x66,
/* B7 */ 0x00, 0x00, 0x00, 0xfe, 0x66, 0x66, 0x66, 0x66,
/* B8 */ 0x00, 0x00, 0xf8, 0x18, 0xf8, 0x18, 0x18, 0x18,
/* B9 */ 0x66, 0x66, 0xe6, 0x06, 0xe6, 0x66, 0x66, 0x66,
/* BA */ 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
/* BB */ 0x00, 0x00, 0xfe, 0x06, 0xe6, 0x66, 0x66, 0x66,
/* BC */ 0x66, 0x66, 0xe6, 0x06, 0xfe, 0x00, 0x00, 0x00,
/* BD */ 0x66, 0x66, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00,
/* BE */ 0x18, 0x18, 0xf8, 0x18, 0xf8, 0x00, 0x00, 0x00,
/* BF */ 0x00, 0x00, 0x00, 0xf8, 0x18, 0x18, 0x18, 0x18,
/* C0 */ 0x18, 0x18, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00,
/* C1 */ 0x18, 0x18, 0x18, 0xff, 0x00, 0x00, 0x00, 0x00,
/* C2 */ 0x00, 0x00, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18,
/* C3 */ 0x18, 0x18, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18,
/* C4 */ 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
/* C5 */ 0x18, 0x18, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18,
/* C6 */ 0x18, 0x18, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18,
/* C7 */ 0x66, 0x66, 0x66, 0x67, 0x66, 0x66, 0x66, 0x66,
/* C8 */ 0x66, 0x66, 0x67, 0x60, 0x7f, 0x00, 0x00, 0x00,
/* C9 */ 0x00, 0x00, 0x7f, 0x60, 0x67, 0x66, 0x66, 0x66,
/* CA */ 0x66, 0x66, 0xe7, 0x00, 0xff, 0x00, 0x00, 0x00,
/* CB */ 0x00, 0x00, 0xff, 0x00, 0xe7, 0x66, 0x66, 0x66,
/* CC */ 0x66, 0x66, 0x67, 0x60, 0x67, 0x66, 0x66, 0x66,
/* CD */ 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00,
/* CE */ 0x66, 0x66, 0xe7, 0x00, 0xe7, 0x66, 0x66, 0x66,
/* CF */ 0x18, 0x18, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00,
/* D0 */ 0x66, 0x66, 0x66, 0xff, 0x00, 0x00, 0x00, 0x00,
/* D1 */ 0x00, 0x00, 0xff, 0x00, 0xff, 0x18, 0x18, 0x18,
/* D2 */ 0x00, 0x00, 0x00, 0xff, 0x66, 0x66, 0x66, 0x66,
/* D3 */ 0x66, 0x66, 0x66, 0x7f, 0x00, 0x00, 0x00, 0x00,
/* D4 */ 0x18, 0x18, 0x1f, 0x18, 0x1f, 0x00, 0x00, 0x00,
/* D5 */ 0x00, 0x00, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18,
/* D6 */ 0x00, 0x00, 0x00, 0x7f, 0x66, 0x66, 0x66, 0x66,
/* D7 */ 0x66, 0x66, 0x66, 0xff, 0x66, 0x66, 0x66, 0x66,
/* D8 */ 0x18, 0x18, 0xff, 0x18, 0xff, 0x18, 0x18, 0x18,
/* D9 */ 0x18, 0x18, 0x18, 0xf8, 0x00, 0x00, 0x00, 0x00,
/* DA */ 0x00, 0x00, 0x00, 0x1f, 0x18, 0x18, 0x18, 0x18,
/* DB */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
/* DC */ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
/* DD */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0,
/* DE */ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,
/* DF */ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
/* E0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* E1 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* E2 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* E3 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* E4 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* E5 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* E6 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* E7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* E8 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* E9 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* EA */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* EB */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* EC */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* ED */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* EE */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* EF */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* F0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* F1 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* F2 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* F3 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* F4 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* F5 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* F6 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* F7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* F8 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* F9 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* FA */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* FB */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* FC */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* FD */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* FE */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* FF */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,517 @@
#define FONTDATAMAX_SUN8x16 4096
unsigned char fontdata_sun_8x16[FONTDATAMAX_SUN8x16] = {
/* */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x7e, 0x81, 0xa5, 0x81, 0x81, 0xbd,
0x99, 0x81, 0x81, 0x7e, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x7e, 0xff, 0xdb, 0xff, 0xff, 0xc3,
0xe7, 0xff, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x00, 0x6c, 0xfe, 0xfe, 0xfe,
0xfe, 0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7c, 0xfe,
0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x18, 0x3c, 0x3c, 0xe7, 0xe7,
0xe7, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff,
0x7e, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c,
0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xc3,
0xc3, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
/* */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x42,
0x42, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x99, 0xbd,
0xbd, 0x99, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff,
/* */ 0x00, 0x00, 0x1e, 0x0e, 0x1a, 0x32, 0x78, 0xcc,
0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x3c, 0x66, 0x66, 0x66, 0x66, 0x3c,
0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x3f, 0x33, 0x3f, 0x30, 0x30, 0x30,
0x30, 0x70, 0xf0, 0xe0, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x7f, 0x63, 0x7f, 0x63, 0x63, 0x63,
0x63, 0x67, 0xe7, 0xe6, 0xc0, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x18, 0x18, 0xdb, 0x3c, 0xe7,
0x3c, 0xdb, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfe, 0xf8,
0xf0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x02, 0x06, 0x0e, 0x1e, 0x3e, 0xfe, 0x3e,
0x1e, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18,
0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
0x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x7f, 0xdb, 0xdb, 0xdb, 0x7b, 0x1b,
0x1b, 0x1b, 0x1b, 0x1b, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x7c, 0xc6, 0x60, 0x38, 0x6c, 0xc6, 0xc6,
0x6c, 0x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xfe, 0xfe, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18,
0x7e, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0c, 0xfe,
0x0c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0xfe,
0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0,
0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x66, 0xff,
0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x7c,
0x7c, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x7c, 0x7c,
0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/*!*/ 0x00, 0x00, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x18,
0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
/*"*/ 0x00, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/*#*/ 0x00, 0x00, 0x00, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c,
0x6c, 0xfe, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00,
/*$*/ 0x18, 0x18, 0x7c, 0xc6, 0xc2, 0xc0, 0x7c, 0x06,
0x06, 0x86, 0xc6, 0x7c, 0x18, 0x18, 0x00, 0x00,
/*%*/ 0x00, 0x00, 0x00, 0x00, 0xc2, 0xc6, 0x0c, 0x18,
0x30, 0x60, 0xc6, 0x86, 0x00, 0x00, 0x00, 0x00,
/*&*/ 0x00, 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x76, 0xdc,
0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
/*'*/ 0x00, 0x30, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/*(*/ 0x00, 0x00, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30,
0x30, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00,
/*)*/ 0x00, 0x00, 0x30, 0x18, 0x0c, 0x0c, 0x0c, 0x0c,
0x0c, 0x0c, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
/***/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3c, 0xff,
0x3c, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/*+*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e,
0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/*,*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00,
/*-*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/*.*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0c, 0x18,
0x30, 0x60, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00,
/*0*/ 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xce, 0xde, 0xf6,
0xe6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
/*1*/ 0x00, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00,
/*2*/ 0x00, 0x00, 0x7c, 0xc6, 0x06, 0x0c, 0x18, 0x30,
0x60, 0xc0, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00,
/*3*/ 0x00, 0x00, 0x7c, 0xc6, 0x06, 0x06, 0x3c, 0x06,
0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
/*4*/ 0x00, 0x00, 0x0c, 0x1c, 0x3c, 0x6c, 0xcc, 0xfe,
0x0c, 0x0c, 0x0c, 0x1e, 0x00, 0x00, 0x00, 0x00,
/*5*/ 0x00, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xfc, 0x06,
0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
/*6*/ 0x00, 0x00, 0x38, 0x60, 0xc0, 0xc0, 0xfc, 0xc6,
0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
/*7*/ 0x00, 0x00, 0xfe, 0xc6, 0x06, 0x06, 0x0c, 0x18,
0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00,
/*8*/ 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7c, 0xc6,
0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
/*9*/ 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7e, 0x06,
0x06, 0x06, 0x0c, 0x78, 0x00, 0x00, 0x00, 0x00,
/*:*/ 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
/*;*/ 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
/*<*/ 0x00, 0x00, 0x00, 0x06, 0x0c, 0x18, 0x30, 0x60,
0x30, 0x18, 0x0c, 0x06, 0x00, 0x00, 0x00, 0x00,
/*=*/0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00,
0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/*>*/ 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0c, 0x06,
0x0c, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00,
/*?*/ 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x0c, 0x18, 0x18,
0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
/*@*/ 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xde, 0xde,
0xde, 0xdc, 0xc0, 0x7c, 0x00, 0x00, 0x00, 0x00,
/*A*/ 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe,
0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
/*B*/ 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x66,
0x66, 0x66, 0x66, 0xfc, 0x00, 0x00, 0x00, 0x00,
/*C*/ 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0,
0xc0, 0xc2, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00,
/*D*/ 0x00, 0x00, 0xf8, 0x6c, 0x66, 0x66, 0x66, 0x66,
0x66, 0x66, 0x6c, 0xf8, 0x00, 0x00, 0x00, 0x00,
/*E*/ 0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68,
0x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00,
/*F*/ 0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68,
0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00,
/*G*/ 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xde,
0xc6, 0xc6, 0x66, 0x3a, 0x00, 0x00, 0x00, 0x00,
/*H*/ 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6,
0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
/*I*/ 0x00, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
/*J*/ 0x00, 0x00, 0x1e, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00,
/*K*/ 0x00, 0x00, 0xe6, 0x66, 0x66, 0x6c, 0x78, 0x78,
0x6c, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,
/*L*/ 0x00, 0x00, 0xf0, 0x60, 0x60, 0x60, 0x60, 0x60,
0x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00,
/*M*/ 0x00, 0x00, 0xc3, 0xe7, 0xff, 0xff, 0xdb, 0xc3,
0xc3, 0xc3, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00,
/*N*/ 0x00, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce,
0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
/*O*/ 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
/*P*/ 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x60,
0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00,
/*Q*/ 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
0xc6, 0xd6, 0xde, 0x7c, 0x0c, 0x0e, 0x00, 0x00,
/*R*/ 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x6c,
0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,
/*S*/ 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x60, 0x38, 0x0c,
0x06, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
/*T*/ 0x00, 0x00, 0xff, 0xdb, 0x99, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
/*U*/ 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
/*V*/ 0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3,
0xc3, 0x66, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00,
/*W*/ 0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xdb,
0xdb, 0xff, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
/*X*/ 0x00, 0x00, 0xc3, 0xc3, 0x66, 0x3c, 0x18, 0x18,
0x3c, 0x66, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00,
/*Y*/ 0x00, 0x00, 0xc3, 0xc3, 0xc3, 0x66, 0x3c, 0x18,
0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
/*Z*/ 0x00, 0x00, 0xff, 0xc3, 0x86, 0x0c, 0x18, 0x30,
0x60, 0xc1, 0xc3, 0xff, 0x00, 0x00, 0x00, 0x00,
/*[*/ 0x00, 0x00, 0x3c, 0x30, 0x30, 0x30, 0x30, 0x30,
0x30, 0x30, 0x30, 0x3c, 0x00, 0x00, 0x00, 0x00,
/*\*/ 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0x70, 0x38,
0x1c, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,
/*]*/ 0x00, 0x00, 0x3c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
0x0c, 0x0c, 0x0c, 0x3c, 0x00, 0x00, 0x00, 0x00,
/*^*/ 0x10, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/*_*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
/* */ 0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/*a*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0c, 0x7c,
0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
/*b*/ 0x00, 0x00, 0xe0, 0x60, 0x60, 0x78, 0x6c, 0x66,
0x66, 0x66, 0x66, 0x7c, 0x00, 0x00, 0x00, 0x00,
/*c*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0,
0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
/*d*/ 0x00, 0x00, 0x1c, 0x0c, 0x0c, 0x3c, 0x6c, 0xcc,
0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
/*e*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xfe,
0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
/*f*/ 0x00, 0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60,
0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00,
/*g*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc,
0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0xcc, 0x78, 0x00,
/*h*/ 0x00, 0x00, 0xe0, 0x60, 0x60, 0x6c, 0x76, 0x66,
0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,
/*i*/ 0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18,
0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
/*j*/ 0x00, 0x00, 0x06, 0x06, 0x00, 0x0e, 0x06, 0x06,
0x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3c, 0x00,
/*k*/ 0x00, 0x00, 0xe0, 0x60, 0x60, 0x66, 0x6c, 0x78,
0x78, 0x6c, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,
/*l*/ 0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
/*m*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0xe6, 0xff, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0x00, 0x00, 0x00, 0x00,
/*n*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66,
0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
/*o*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6,
0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
/*p*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66,
0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0, 0x00,
/*q*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc,
0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0x0c, 0x1e, 0x00,
/*r*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x76, 0x66,
0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00,
/*s*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x60,
0x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
/*t*/ 0x00, 0x00, 0x10, 0x30, 0x30, 0xfc, 0x30, 0x30,
0x30, 0x30, 0x36, 0x1c, 0x00, 0x00, 0x00, 0x00,
/*u*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc,
0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
/*v*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3, 0xc3,
0xc3, 0x66, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00,
/*w*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3, 0xc3,
0xdb, 0xdb, 0xff, 0x66, 0x00, 0x00, 0x00, 0x00,
/*x*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x66, 0x3c,
0x18, 0x3c, 0x66, 0xc3, 0x00, 0x00, 0x00, 0x00,
/*y*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6,
0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0xf8, 0x00,
/*z*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xcc, 0x18,
0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00,
/*{*/ 0x00, 0x00, 0x0e, 0x18, 0x18, 0x18, 0x70, 0x18,
0x18, 0x18, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00,
/*|*/ 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18,
0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
/*}*/ 0x00, 0x00, 0x70, 0x18, 0x18, 0x18, 0x0e, 0x18,
0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00,
/*~*/ 0x00, 0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6,
0xc6, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0,
0xc2, 0x66, 0x3c, 0x0c, 0x06, 0x7c, 0x00, 0x00,
/* */ 0x00, 0x00, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0xcc,
0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x0c, 0x18, 0x30, 0x00, 0x7c, 0xc6, 0xfe,
0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x10, 0x38, 0x6c, 0x00, 0x78, 0x0c, 0x7c,
0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0xcc, 0x00, 0x00, 0x78, 0x0c, 0x7c,
0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x60, 0x30, 0x18, 0x00, 0x78, 0x0c, 0x7c,
0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x38, 0x6c, 0x38, 0x00, 0x78, 0x0c, 0x7c,
0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x60, 0x60,
0x66, 0x3c, 0x0c, 0x06, 0x3c, 0x00, 0x00, 0x00,
/* */ 0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xfe,
0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0xc6, 0x00, 0x00, 0x7c, 0xc6, 0xfe,
0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xfe,
0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x66, 0x00, 0x00, 0x38, 0x18, 0x18,
0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x18, 0x3c, 0x66, 0x00, 0x38, 0x18, 0x18,
0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x60, 0x30, 0x18, 0x00, 0x38, 0x18, 0x18,
0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0xc6, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6,
0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
/* */ 0x38, 0x6c, 0x38, 0x00, 0x38, 0x6c, 0xc6, 0xc6,
0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
/* */ 0x18, 0x30, 0x60, 0x00, 0xfe, 0x66, 0x60, 0x7c,
0x60, 0x60, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x3b, 0x1b,
0x7e, 0xd8, 0xdc, 0x77, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x3e, 0x6c, 0xcc, 0xcc, 0xfe, 0xcc,
0xcc, 0xcc, 0xcc, 0xce, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xc6,
0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0xc6, 0x00, 0x00, 0x7c, 0xc6, 0xc6,
0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xc6,
0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x30, 0x78, 0xcc, 0x00, 0xcc, 0xcc, 0xcc,
0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x60, 0x30, 0x18, 0x00, 0xcc, 0xcc, 0xcc,
0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0xc6, 0x00, 0x00, 0xc6, 0xc6, 0xc6,
0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0x78, 0x00,
/* */ 0x00, 0xc6, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6,
0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0xc6, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x18, 0x18, 0x7e, 0xc3, 0xc0, 0xc0, 0xc0,
0xc3, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60,
0x60, 0x60, 0xe6, 0xfc, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0xc3, 0x66, 0x3c, 0x18, 0xff, 0x18,
0xff, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0xfc, 0x66, 0x66, 0x7c, 0x62, 0x66, 0x6f,
0x66, 0x66, 0x66, 0xf3, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x0e, 0x1b, 0x18, 0x18, 0x18, 0x7e, 0x18,
0x18, 0x18, 0x18, 0x18, 0xd8, 0x70, 0x00, 0x00,
/* */ 0x00, 0x18, 0x30, 0x60, 0x00, 0x78, 0x0c, 0x7c,
0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x0c, 0x18, 0x30, 0x00, 0x38, 0x18, 0x18,
0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x18, 0x30, 0x60, 0x00, 0x7c, 0xc6, 0xc6,
0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x18, 0x30, 0x60, 0x00, 0xcc, 0xcc, 0xcc,
0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x76, 0xdc, 0x00, 0xdc, 0x66, 0x66,
0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
/* */ 0x76, 0xdc, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde,
0xce, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x3c, 0x6c, 0x6c, 0x3e, 0x00, 0x7e, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x7c, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x60,
0xc0, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0,
0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06,
0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30,
0x60, 0xce, 0x9b, 0x06, 0x0c, 0x1f, 0x00, 0x00,
/* */ 0x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30,
0x66, 0xce, 0x96, 0x3e, 0x06, 0x06, 0x00, 0x00,
/* */ 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18,
0x3c, 0x3c, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6c, 0xd8,
0x6c, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x6c, 0x36,
0x6c, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,
0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,
/* */ 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa,
0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa,
/* */ 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77,
0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77,
/* */ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
/* */ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
/* */ 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
/* */ 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf6,
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
/* */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe,
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
/* */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0xf8,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
/* */ 0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x06, 0xf6,
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
/* */ 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
/* */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0xf6,
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
/* */ 0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x06, 0xfe,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xfe,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
/* */ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
/* */ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
/* */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
/* */ 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
/* */ 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37,
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
/* */ 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x3f,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x30, 0x37,
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
/* */ 0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xff,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xf7,
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
/* */ 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37,
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
/* */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xf7,
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
/* */ 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0xff,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
/* */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
/* */ 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3f,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x1f,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
/* */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f,
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
/* */ 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff,
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
/* */ 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0xff,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
/* */ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
/* */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
/* */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
/* */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0,
0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0,
/* */ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,
0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,
/* */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0xd8,
0xd8, 0xd8, 0xdc, 0x76, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x78, 0xcc, 0xcc, 0xcc, 0xd8, 0xcc,
0xc6, 0xc6, 0xc6, 0xcc, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0xfe, 0xc6, 0xc6, 0xc0, 0xc0, 0xc0,
0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x00, 0xfe, 0x6c, 0x6c, 0x6c,
0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0xfe, 0xc6, 0x60, 0x30, 0x18,
0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xd8, 0xd8,
0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66,
0x66, 0x7c, 0x60, 0x60, 0xc0, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x7e, 0x18, 0x3c, 0x66, 0x66,
0x66, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xfe,
0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0x6c,
0x6c, 0x6c, 0x6c, 0xee, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x1e, 0x30, 0x18, 0x0c, 0x3e, 0x66,
0x66, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xdb, 0xdb,
0xdb, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x03, 0x06, 0x7e, 0xdb, 0xdb,
0xf3, 0x7e, 0x60, 0xc0, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x1c, 0x30, 0x60, 0x60, 0x7c, 0x60,
0x60, 0x60, 0x30, 0x1c, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6,
0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe,
0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18,
0x18, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x30, 0x18, 0x0c, 0x06, 0x0c,
0x18, 0x30, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x60, 0x30,
0x18, 0x0c, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x0e, 0x1b, 0x1b, 0x1b, 0x18, 0x18,
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
/* */ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x7e,
0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00,
0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xec,
0x6c, 0x6c, 0x3c, 0x1c, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0xd8, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x70, 0xd8, 0x30, 0x60, 0xc8, 0xf8, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x00, 0x7c, 0x7c, 0x7c, 0x7c,
0x7c, 0x7c, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00,
/* */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,317 @@
/*! \file
* \brief \ref Framebuffer implementing primitive graphic operations
*/
#pragma once
#include "../types.h"
#include "../utils/string.h"
#include "primitives.h"
/*! \brief Implementation of primitive operations on a memory area used as
* framebuffer.
* \ingroup gfx
*
* The implementation as template class allows the compiler to heavily optimize
* the bit operations depending on the video mode.
*
* \tparam COLORDEPTH color depth of video mode
* \tparam OFFSET_RED Bit position of red color mask in video mode
* \tparam OFFSET_GREEN Bit position of green color mask in video mode
* \tparam OFFSET_BLUE Bit position of blue color mask in video mode
* \tparam BITS_RED Size of red color mask in video mode
* \tparam BITS_GREEN Size of green color mask in video mode
* \tparam BITS_BLUE Size of blue color mask in video mode
*/
template <unsigned char COLORDEPTH, unsigned char OFFSET_RED,
unsigned char OFFSET_GREEN, unsigned char OFFSET_BLUE,
unsigned char BITS_RED, unsigned char BITS_GREEN,
unsigned char BITS_BLUE>
class Framebuffer {
/*! \brief Start address of the linear framebuffer
*/
uintptr_t framebuffer;
/*! \brief Internal width of the screen
*
* At least the visible width of the screen, depends on the hardware but
* required for calculating the rows
*/
unsigned pitch;
protected:
/*! \brief Visible width of the screen
*/
unsigned screen_width;
/*! \brief Visible height of the screen
*/
unsigned screen_height;
/*! \brief Initialize screen dimensions
*
* \param width visible width of graphics screen
* \param height visible height of graphics screen
* \param pitch width of graphics screen (including invisible part, has to
* be at least `width`)
*/
void init(const unsigned width, const unsigned height,
const unsigned pitch) {
this->screen_width = width;
this->screen_height = height;
this->pitch = pitch;
}
/*! \brief Set the video memory address
*
* \param lfb pointer to the linear framebuffer (lfb)
*/
void buffer(void *lfb) { framebuffer = reinterpret_cast<uintptr_t>(lfb); }
/*! \brief Clear all pixel of the current back buffer
* (set full screen to black)
*/
void clear() {
memset(reinterpret_cast<void *>(framebuffer), 0, screen_height * pitch);
}
/*! \brief Pixel component
*
* \tparam OFFSET Bit position of mask
* \tparam BITS Size of mask
*/
template <unsigned OFFSET, unsigned SIZE>
class PixelComponent {
unsigned : OFFSET; ///< Reserved space for offset
unsigned value : SIZE; ///< Value
public:
/*! \brief Constructor
*
* \param value Initial component value
*/
explicit PixelComponent(unsigned value) : value(value) {}
/*! \brief Assign component value
* (from a \ref SpritePixelComponent with different bit mask size)
*
* \tparam BITS Size of bit mask
* \param other new component value
*/
template <unsigned BITS>
void set(const struct SpritePixelComponent<BITS> &other) {
value = BITS > SIZE ? (other.value >> (BITS - SIZE))
: (other.value << (SIZE - BITS));
}
/*! \brief Assign component value
* (from a \ref SpritePixelComponent with same bit mask size)
*
* \param other new component value
*/
void set(const struct SpritePixelComponent<SIZE> &other) {
value = other.value;
}
/*! \brief Assign component value
* (from an integer)
*
* \param value new component value
*/
void set(unsigned value) {
value = 8 > SIZE ? (value >> (8 - SIZE)) : (value << (SIZE - 8));
}
/*! \brief Alpha blend component value
* (from a \ref SpritePixelComponent with different bit mask size)
*
* \tparam BITS Size of bit mask
* \param other component value to blend
* \param alpha transparency used for blending
*/
template <unsigned BITS>
void blend(const struct SpritePixelComponent<BITS> &other,
const struct SpritePixelComponent<BITS> &alpha) {
int other_value = BITS > SIZE ? (other.value >> (BITS - SIZE))
: (other.value << (SIZE - BITS));
int other_alpha = BITS > SIZE ? (alpha.value >> (BITS - SIZE))
: (alpha.value << (SIZE - BITS));
value +=
((other_value - static_cast<int>(value)) * other_alpha) >> SIZE;
}
/*! \brief Alpha blend component value
* (from a \ref SpritePixelComponent with same bit mask size)
*
* \param other component value to blend
* \param alpha transparency used for blending
*/
void blend(const struct SpritePixelComponent<SIZE> &other,
const struct SpritePixelComponent<SIZE> &alpha) {
value +=
((static_cast<int>(other.value) - static_cast<int>(value)) *
alpha.value) >>
SIZE;
}
} __attribute__((packed));
/*! \brief Pixel (colored)
*/
union Pixel {
/*! \brief Bits per pixel
*/
struct {
unsigned data : COLORDEPTH; ///< RGB value
} __attribute__((packed));
PixelComponent<OFFSET_RED, BITS_RED> red; ///< Red color component
PixelComponent<OFFSET_GREEN, BITS_GREEN>
green; ///< Green color component
PixelComponent<OFFSET_BLUE, BITS_BLUE> blue; ///< Blue color component
/*! \brief Constructor (using RGB value)
*
* \param data RGB value
*/
explicit Pixel(const unsigned data) : data(data) {}
/*! \brief Constructor (using explicit RGB components)
*
* Unused bits are zeroed.
*
* \param r Red color component
* \param g Green color component
* \param b Blue color component
*/
Pixel(const unsigned r, const unsigned g, const unsigned b) : data(0) {
red.set(r);
green.set(g);
blue.set(b);
}
/*! \brief Constructor (using \ref SpritePixel)
*
* \tparam ALPHA `true` if alpha channel
* \tparam BITS Size of mask
* \param other other
*/
template <bool ALPHA, unsigned BITS>
explicit Pixel(const struct SpritePixel<RGB, ALPHA, BITS> &other) {
red.set(other.red);
green.set(other.green);
blue.set(other.blue);
}
/*! \brief Get color of pixel
*
* \return color of pixel
*/
Color getColor() const { return Color(red, green, blue); }
/*! \brief Assign pixel (with colored \ref SpritePixel)
*
* \tparam BITS Size of other pixels mask
* \param other other pixel
*/
template <unsigned BITS>
Pixel &operator=(const struct SpritePixel<RGB, false, BITS> &other) {
red.set(other.red);
green.set(other.green);
blue.set(other.blue);
return *this;
}
/*! \brief Assign pixel (with greyscale \ref SpritePixel)
*
* \tparam BITS Size of other pixels mask
* \param other other pixel
*/
template <unsigned BITS>
Pixel &operator=(
const struct SpritePixel<GREYSCALE, false, BITS> &other) {
red.set(other.luminance);
green.set(other.luminance);
blue.set(other.luminance);
return *this;
}
/*! \brief Assign pixel (with greyscale \ref SpritePixel supporting
* transparency)
*
* \tparam BITS Size of other pixels mask
* \param other other pixel
*/
template <unsigned BITS>
Pixel &operator=(const struct SpritePixel<RGB, true, BITS> &other) {
red.blend(other.red, other.alpha);
green.blend(other.green, other.alpha);
blue.blend(other.blue, other.alpha);
return *this;
}
/*! \brief Assign pixel (with greyscale \ref SpritePixel supporting
* transparency)
*
* \tparam BITS Size of other pixels mask
* \param other other pixel
*/
template <unsigned BITS>
Pixel &operator=(
const struct SpritePixel<GREYSCALE, true, BITS> &other) {
red.blend(other.luminance, other.alpha);
green.blend(other.luminance, other.alpha);
blue.blend(other.luminance, other.alpha);
return *this;
}
} __attribute__((packed));
static_assert(OFFSET_RED + BITS_RED <= COLORDEPTH &&
OFFSET_GREEN + BITS_GREEN <= COLORDEPTH &&
OFFSET_BLUE + BITS_BLUE <= COLORDEPTH,
"color settings invalid!");
/*! \brief Get pixel at position
*
* \param x X position
* \param y Y position
* \return Pointer to pixel
*/
Pixel *get(const unsigned x, const unsigned y) const {
return reinterpret_cast<Pixel *>(framebuffer + y * pitch) + x;
}
/*! \brief Get pixel at position
*
* \param p Coordinate of position
* \return Pointer to pixel
*/
Pixel *get(const Point &p) const { return get(p.x, p.y); }
/*! \brief Assign color to a pixel at a given position
*
* \tparam COLOR color or greyscale?
* \tparam ALPHA with transparency?
* \tparam BITS Size of mask
* \param x X position
* \param y Y position
* \param color color to assign
*/
template <enum SpriteColorMode COLOR, bool ALPHA, unsigned BITS>
void set(const unsigned x, const unsigned y,
const SpritePixel<COLOR, ALPHA, BITS> &color) {
Pixel *pos = get(x, y);
*pos = color;
}
/*! \brief Assign color to a pixel at a given position
*
* \tparam COLOR color or greyscale?
* \tparam ALPHA with transparency?
* \tparam BITS Size of mask
* \param p Coordinate of position
* \param color color to assign
*/
template <enum SpriteColorMode COLOR, bool ALPHA, unsigned BITS>
void set(const Point &p, const SpritePixel<COLOR, ALPHA, BITS> &color) {
set(p.x, p.y, color);
}
};

View File

@@ -0,0 +1,168 @@
/*! \file
* \brief Graphics primitives like \ref Point
*/
#pragma once
/*! \brief Coordinate on the graphic screen
* \ingroup gfx
*/
struct Point {
/*! \brief X Position
*/
int x;
/*! \brief X Position
*/
int y;
/*! \brief Default Constructor
*
* Initializing the point to the initial position (0, 0)
*/
Point() : x(0), y(0) {}
/*! \brief Constructor
*
* \brief x X Position
* \brief y Y Position
*/
Point(int x, int y) : x(x), y(y) {}
/*! \brief Summation of two points
*/
Point operator+(const Point& that) const {
return Point(x + that.x, y + that.y);
}
/*! \brief Assignment summation of two points
*/
Point& operator+=(const Point& that) {
x += that.x;
y += that.y;
return *this;
}
/*! \brief Difference of two points
*/
Point operator-(const Point& that) const {
return Point(x - that.x, y - that.y);
}
/*! \brief Assignment difference of two points
*/
Point& operator-=(const Point& that) {
x -= that.x;
y -= that.y;
return *this;
}
};
/*! \brief Color modes
* \ingroup gfx
*/
enum SpriteColorMode {
RGB, ///< Additive color mode (red, green & blue)
GREYSCALE, ///< Greyscale
};
/*! \brief Sprite pixel component
* \ingroup gfx
*
* \tparam BITS mask size
*/
template <unsigned BITS>
struct __attribute__((packed)) SpritePixelComponent {
/*! \brief Sprite pixel component value
*/
unsigned int value : BITS;
/*! \brief Default constructor
* (sets initial value to zero)
*/
SpritePixelComponent() : value(0) {}
/*! \brief Constructor
*
* \param value Value for component
*/
explicit SpritePixelComponent(unsigned int value) : value(value) {}
};
template <enum SpriteColorMode COLOR, bool ALPHA, unsigned BITS>
struct __attribute__((packed)) SpritePixel;
/*! \brief Colored pixel with transparency
* \ingroup gfx
*
* \tparam BITS Size of mask
*/
template <unsigned BITS>
struct __attribute__((packed)) SpritePixel<RGB, true, BITS> {
SpritePixelComponent<BITS> red;
SpritePixelComponent<BITS> green;
SpritePixelComponent<BITS> blue;
SpritePixelComponent<BITS> alpha;
SpritePixel(unsigned red, unsigned green, unsigned blue, unsigned alpha)
: red(red), green(green), blue(blue), alpha(alpha) {}
SpritePixel() {}
};
/*! \brief Colored pixel without transparency
* \ingroup gfx
*
* \tparam BITS Size of mask
*/
template <unsigned BITS>
struct __attribute__((packed)) SpritePixel<RGB, false, BITS> {
SpritePixelComponent<BITS> red;
SpritePixelComponent<BITS> green;
SpritePixelComponent<BITS> blue;
SpritePixel(unsigned red, unsigned green, unsigned blue)
: red(red), green(green), blue(blue) {}
SpritePixel() {}
};
/*! \brief Greyscale pixel with transparency
* \ingroup gfx
*
* \tparam BITS Size of mask
*/
template <unsigned BITS>
struct __attribute__((packed)) SpritePixel<GREYSCALE, true, BITS> {
SpritePixelComponent<BITS> luminance;
SpritePixelComponent<BITS> alpha;
SpritePixel(unsigned luminance, unsigned alpha)
: luminance(luminance), alpha(alpha) {}
SpritePixel() {}
};
/*! \brief Greyscale pixel without transparency
* \ingroup gfx
*
* \tparam BITS Size of mask
*/
template <unsigned BITS>
struct __attribute__((packed)) SpritePixel<GREYSCALE, false, BITS> {
SpritePixelComponent<BITS> luminance;
explicit SpritePixel(unsigned luminance) : luminance(luminance) {}
SpritePixel() {}
};
typedef struct SpritePixel<RGB, false, 8> Color;
typedef struct SpritePixel<RGB, true, 8> ColorAlpha;
/*! \brief GIMP image
* \ingroup gfx
*
* Image exported as C-source (without `Glib` types!) in
* [GIMP](https://www.gimp.org/), supports alpha blending (transparency).
*/
struct GIMP {
unsigned int width;
unsigned int height;
unsigned int bytes_per_pixel;
unsigned char pixel_data[];
};

View File

@@ -0,0 +1,40 @@
#include "printer.h"
#include "../debug/output.h"
#include "../utils/size.h"
// Predefined video modes (should suit the most common ones)
static GraphicsPrinter<32, 16, 8, 0, 8, 8, 8> default_32bit;
static GraphicsPrinter<24, 16, 8, 0, 8, 8, 8> default_24bit;
static GraphicsPrinter<16, 11, 5, 0, 5, 6, 5> default_16bit;
static GraphicsPrinter<15, 10, 5, 0, 5, 5, 5> default_15bit;
static GraphicsPrinter<8, 5, 2, 0, 3, 3, 2> default_8bit;
AbstractGraphicsPrinter* supportedGraphicModes[] = {
&default_32bit, &default_24bit, &default_16bit,
&default_15bit, &default_8bit,
};
AbstractGraphicsPrinter* AbstractGraphicsPrinter::getMode(
uint8_t colordepth, uint8_t offset_red, uint8_t offset_green,
uint8_t offset_blue, uint8_t bits_red, uint8_t bits_green,
uint8_t bits_blue) {
for (unsigned m = 0; m < ::size(supportedGraphicModes); m++) {
if (supportedGraphicModes[m]->checkMode(
colordepth, offset_red, offset_green, offset_blue, bits_red,
bits_green, bits_blue)) {
return supportedGraphicModes[m];
}
}
// Show error message (DBG should be copied to serial as well for
// debugging!)
DBG_VERBOSE << "No GraphicsPrinter<" << static_cast<int>(colordepth) << ", "
<< static_cast<int>(offset_red) << ", "
<< static_cast<int>(offset_green) << ", "
<< static_cast<int>(offset_blue) << ", "
<< static_cast<int>(bits_red) << ", "
<< static_cast<int>(bits_green) << ", "
<< static_cast<int>(bits_blue)
<< "> instance available - please add!" << endl;
return nullptr;
}

688
kernel/graphics/printer.h Normal file
View File

@@ -0,0 +1,688 @@
/*! \file
* \brief \ref GraphicsPrinter and its \ref AbstractGraphicsPrinter
* "abstraction"
*/
#pragma once
#include "../utils/math.h"
#include "../utils/png.h"
#include "fonts/font.h"
#include "framebuffer.h"
#include "primitives.h"
/*! \brief Abstraction of basic graphics printing functions
* \ingroup gfx
*
* The actual implementation is placed in the inherited template class
* \ref GraphicsPrinter for performance reasons.
*/
class AbstractGraphicsPrinter {
protected:
/*! \brief Check if a printer is available for a video mode
*
* This is required since printers are defined during compile time for
* performance reasons.
*
* \tparam colordepth color depth of video mode
* \tparam offset_red Bit position of red color mask in video mode
* \tparam offset_green Bit position of green color mask in video mode
* \tparam offset_blue Bit position of blue color mask in video mode
* \tparam bits_red Size of red color mask in video mode
* \tparam bits_green Size of green color mask in video mode
* \tparam bits_blue Size of blue color mask in video mode
* \return `true` if a printer for the video mode is available
*/
virtual bool checkMode(uint8_t colordepth, uint8_t offset_red,
uint8_t offset_green, uint8_t offset_blue,
uint8_t bits_red, uint8_t bits_green,
uint8_t bits_blue) = 0;
public:
/*! \brief Initialize printer with actual screen dimensions
*
* \param width visible width of graphics screen
* \param height visible height of graphics screen
* \param pitch width of graphics screen (including invisible part, has to
* be at least `width`)
*/
virtual void init(unsigned width, unsigned height, unsigned pitch) = 0;
/*! \brief Set the video memory address
*
* \param lfb pointer to the linear framebuffer (lfb)
*/
virtual void buffer(void* lfb) = 0;
/*! \brief Clear all pixel of the current back buffer
* (set full screen to black)
*/
virtual void clear() = 0;
/*! \brief Check if a \ref Point can be displayed at the current resolution
*
* \param p Coordinates to check
* \return 'true' if can be displayed
*/
virtual bool valid(const Point& p) const = 0;
/*! \brief Number of vertical pixels in current resolution
*
* \return Height of the screen in current video mode
*/
virtual unsigned height() const = 0;
/*! \brief Number of horizontal pixels in current resolution
*
* \return Width of the screen in current video mode
*/
virtual unsigned width() const = 0;
/*! \brief Draw a pixel
*
* \param p Coordinates of the pixel
* \param color Color of the pixel
*/
virtual void pixel(const Point& p, const Color& color) = 0;
/// \copydoc AbstractGraphicsPrinter::pixel()
virtual void pixel(const Point& p, const ColorAlpha& color) = 0;
/*! \brief Draw a line
*
* \param start Coordinates of the begin of the line
* \param end Coordinates of the end of the line
* \param color Color of the line
*/
virtual void line(const Point& start, const Point& end,
const Color& color) = 0;
/// \copydoc AbstractGraphicsPrinter::line()
virtual void line(const Point& start, const Point& end,
const ColorAlpha& color) = 0;
/*! \brief Draw a rectangle on the current back buffer
*
* \param start Coordinate of the rectangles upper left corner
* \param end Coordinate of the rectangles lower right corner
* \param color Color of the rectangle
* \param filled If set, the rectangle will be filled with the same color.
* (otherwise only borders will be drawn)
*/
virtual void rectangle(const Point& start, const Point& end,
const Color& color, bool filled = true) = 0;
/// \copydoc AbstractGraphicsPrinter::rectangle()
virtual void rectangle(const Point& start, const Point& end,
const ColorAlpha& color, bool filled = true) = 0;
/*! \brief Change the current font for text output in video mode
*
* \param new_font Font to be used on subsequent calls to
* \ref AbstractGraphicsPrinter::text() (without explicit font parameter)
*/
virtual void font(const Font& new_font) = 0;
/*! \brief Print text (without automatic word wrap).
*
* \param p Upper left start position of the text
* \param string Pointer to char array containing the text to be displayed
* \param len Number of characters to be displayed
* \param color Color for the text characters
* \param font Explicit font -- or `nullptr` to use default font (set by
* \ref font method)
*/
virtual void text(const Point& p, const char* string, unsigned len,
const Color& color, const Font* font = nullptr) = 0;
/// \copydoc AbstractGraphicsPrinter::text()
virtual void text(const Point& p, const char* string, unsigned len,
const ColorAlpha& color, const Font* font = nullptr) = 0;
/*! \brief Draw a \ref PNG image (or detail)
*
* The image can has to be in a supported \ref PNG format.
* Alpha blending (transparency) is supported.
*
* \param p Coordinate of the images upper left corner
* \param image Source image to display
* \param width Width of the image detail (full image width of the source
* image if zero/default value)
* \param height Height of the image detail (full image height of the source
* if zero/default value)
* \param offset_x Right offset of the source image
* \param offset_y Top offset of the source image
*/
virtual void image(const Point& p, PNG& image, unsigned width = 0,
unsigned height = 0, unsigned offset_x = 0,
unsigned offset_y = 0) = 0;
/*! \brief Draw a GIMP image (or detail)
*
* The image has to be exported as C-source (without `Glib` types!) in
* [GIMP](https://www.gimp.org/), alpha blending (transparency) is
* supported.
*
* \param p Coordinate of the images upper left corner
* \param image Source image to display
* \param width Width of the image detail (full image width of the source
* image if zero/default value)
* \param height Height of the image detail (full image height of the source
* if zero/default value)
* \param offset_x Right offset of the source image
* \param offset_y Top offset of the source image
*/
virtual void image(const Point& p, const GIMP& image, unsigned width = 0,
unsigned height = 0, unsigned offset_x = 0,
unsigned offset_y = 0) = 0;
/*! \brief Draw a sprite.
*
* Each element in the source array will be displayed as a single pixel.
*
* \param p Coordinate of the sprites upper left corner
* \param image Source sprite to display
* \param width Width of the sprite detail
* \param height Height of the sprite detail
* \param offset_x Right offset of the source sprite
* \param offset_y Top offset of the source sprite
*/
virtual void image(const Point& p, const Color* image, unsigned width,
unsigned height, unsigned offset_x = 0,
unsigned offset_y = 0) = 0;
/*! \brief Draw a sprite with alpha blending (transparency).
*
* Each element in the source array will be displayed as a single pixel.
*
* \param p Coordinate of the sprites upper left corner
* \param image Source sprite to display
* \param width Width of the sprite detail
* \param height Height of the sprite detail
* \param offset_x Right offset of the source sprite
* \param offset_y Top offset of the source sprite
*/
virtual void image(const Point& p, const ColorAlpha* image, unsigned width,
unsigned height, unsigned offset_x = 0,
unsigned offset_y = 0) = 0;
static AbstractGraphicsPrinter* getMode(
uint8_t colordepth, uint8_t offset_red, uint8_t offset_green,
uint8_t offset_blue, uint8_t bits_red, uint8_t bits_green,
uint8_t bits_blue);
};
/*! \brief Actual implementation of basic graphics printing functions
* \ingroup gfx
*
* The implementation as template class requires the definition of the
* desired video mode during compile time (which is required anyways
* since the video mode is set in the \ref Multiboot headers).
* Hence, the compiler is able to optimize the (intensively used) code for the
* actual color bit masks, which results in high performance gain.
*
* \tparam COLORDEPTH color depth of video mode
* \tparam OFFSET_RED Bit position of red color mask in video mode
* \tparam OFFSET_GREEN Bit position of green color mask in video mode
* \tparam OFFSET_BLUE Bit position of blue color mask in video mode
* \tparam BITS_RED Size of red color mask in video mode
* \tparam BITS_GREEN Size of green color mask in video mode
* \tparam BITS_BLUE Size of blue color mask in video mode
*/
template <unsigned COLORDEPTH, uint8_t OFFSET_RED, uint8_t OFFSET_GREEN,
uint8_t OFFSET_BLUE, uint8_t BITS_RED, uint8_t BITS_GREEN,
uint8_t BITS_BLUE>
class GraphicsPrinter
: public Framebuffer<COLORDEPTH, OFFSET_RED, OFFSET_GREEN, OFFSET_BLUE,
BITS_RED, BITS_GREEN, BITS_BLUE>,
public AbstractGraphicsPrinter {
typedef Framebuffer<COLORDEPTH, OFFSET_RED, OFFSET_GREEN, OFFSET_BLUE,
BITS_RED, BITS_GREEN, BITS_BLUE>
FramebufferBase;
typedef typename FramebufferBase::Pixel Pixel;
/*! \brief currently active font
*/
Font const* active_font;
/*! \brief Generic helper function to draw a sprite image (or detail)
*
* \param p Coordinate of the images upper left corner
* \param image Source image to display
* \param width Width of the image detail
* \param height Height of the image detail
* image_width
* \param offset_x Right offset of the source image
* \param offset_y Top offset of the source image
*/
template <enum SpriteColorMode COLOR, bool ALPHA, unsigned BITDEPTH>
void sprite(Point p,
const struct SpritePixel<COLOR, ALPHA, BITDEPTH>* image,
unsigned width, unsigned height, unsigned image_width,
unsigned offset_x = 0, unsigned offset_y = 0) {
if (p.x < 0) {
offset_x -= p.x;
if (offset_x > width || static_cast<int>(width) + p.x < 0) {
return;
}
width += p.x;
p.x = 0;
}
if (p.y < 0) {
offset_y -= p.y;
if (offset_y > height || static_cast<int>(height) + p.y < 0) {
return;
}
height += p.y;
p.y = 0;
}
if (p.x >= static_cast<int>(this->screen_width) ||
p.y >= static_cast<int>(this->screen_height)) {
return;
}
if (p.x + width >= this->screen_width) {
width = this->screen_width - p.x;
}
if (p.y + height >= this->screen_height) {
height = this->screen_height - p.y;
}
for (unsigned y = offset_y; y < offset_y + height; ++y) {
Pixel* pos = this->get(p);
for (unsigned x = offset_x; x < offset_x + width; ++x) {
*pos = image[y * image_width + x];
pos++;
}
p.y += 1;
}
}
/// \copydoc AbstractGraphicsPrinter::pixel()
template <enum SpriteColorMode COLOR, bool ALPHA, unsigned BITS>
void pixel(const Point& p, const SpritePixel<COLOR, ALPHA, BITS>& color) {
if (valid(p)) {
this->set(p, color);
}
}
/// \copydoc AbstractGraphicsPrinter::line()
template <enum SpriteColorMode COLOR, bool ALPHA, unsigned BITS>
void line(const Point& start, const Point& end,
const SpritePixel<COLOR, ALPHA, BITS>& color) {
const int d_x = Math::abs(end.x - start.x);
const int d_y = Math::abs(end.y - start.y);
const int steps = d_x < d_y ? (d_y + 1) : (d_x + 1);
int D = 2 * (d_x < d_y ? (d_x - d_y) : (d_y - d_x));
const int DE = d_x < d_y ? (d_x << 1) : (d_y << 1);
const int DNE = (d_x < d_y ? (d_x - d_y) : (d_y - d_x)) << 1;
int x_i1 = d_x < d_y ? 0 : 1;
int x_i2 = 1;
int y_i1 = d_x < d_y ? 1 : 0;
int y_i2 = 1;
if (start.x > end.x) {
x_i1 = -x_i1;
x_i2 = -x_i2;
}
if (start.y > end.y) {
y_i1 = -y_i1;
y_i2 = -y_i2;
}
int x = start.x;
int y = start.y;
for (int i = 0; i < steps; i++) {
if (x >= 0 && y >= 0 && x < static_cast<int>(this->screen_width) &&
y < static_cast<int>(this->screen_height)) {
this->set(x, y, color);
}
if (D < 0) {
D += DE;
x += x_i1;
y += y_i1;
} else {
D += DNE;
x += x_i2;
y += y_i2;
}
}
}
/// \copydoc AbstractGraphicsPrinter::rectangle()
template <enum SpriteColorMode COLOR, bool ALPHA, unsigned BITS>
void rectangle(const Point& start, const Point& end,
const SpritePixel<COLOR, ALPHA, BITS>& color, bool filled) {
const int w = width();
const int h = height();
const int fromX = Math::max(0, Math::min(start.x, end.x));
const int fromY = Math::max(0, Math::min(start.y, end.y));
const int toX = Math::min(w - 1, Math::max(start.x, end.x));
const int toY = Math::min(h - 1, Math::max(start.y, end.y));
if (toX < 0 || toY < 0 || fromX >= w || fromY >= h) {
return;
}
if (filled) {
Point line_start(fromX, fromY);
for (int y = fromY; y < toY; ++y) {
Pixel* pos = this->get(line_start);
for (int x = fromX; x < toX; ++x) {
*pos = color;
pos++;
}
line_start.y++;
}
} else {
line(Point(fromX, fromY), Point(fromX, toY - 1), color);
line(Point(fromX + 1, fromY), Point(toX - 1, fromY), color);
line(Point(fromX, toY), Point(toX - 1, toY), color);
line(Point(toX, fromY), Point(toX, toY), color);
}
}
/*! \brief Helper function to draw a font pixel image detail
*
* \see \ref text
*
* \param p Coordinate of the images upper left corner
* \param bitmap Font character bitmap source to display
* \param width Width of the font
* \param height Height of the font
* \param color Color for the character
*/
template <enum SpriteColorMode COLOR, bool ALPHA, unsigned BITS>
void bitmap(const Point& p, const void* bitmap, const unsigned width,
const unsigned height,
const SpritePixel<COLOR, ALPHA, BITS>& color) {
unsigned short width_byte = width / 8 + ((width % 8 != 0) ? 1 : 0);
const char* sprite = reinterpret_cast<const char*>(bitmap);
for (unsigned y = 0; y < height; ++y) {
Pixel* pixel = this->get(p) + y * this->screen_width;
for (unsigned x = 0; x < width_byte; ++x) {
for (int src = 7; src >= 0; --src) {
if ((1 << src) & *sprite) {
*pixel = color;
}
pixel++;
}
sprite++;
}
}
}
/*! \brief Helper function to print text
*
* \param p Upper left start position of the text
* \param string Pointer to char array containing the text to be displayed
* \param len Number of characters to be displayed
* \param color Color for the text characters
* \param font Explicit font -- or `nullptr` to use default font (set by
* \ref font method)
*/
template <enum SpriteColorMode COLOR, bool ALPHA, unsigned BITS>
void text(const Point& p, const char* string, unsigned len,
const SpritePixel<COLOR, ALPHA, BITS>& color, const Font* font) {
if (font == nullptr) {
font = active_font;
}
if (font != nullptr) {
Point pos = p;
for (unsigned i = 0; i < len; ++i) {
this->bitmap(pos, font->symbol(string[i]), font->width,
font->height, color);
pos.x += font->width;
if (pos.x + font->width > this->screen_width) {
pos.x = 0;
pos.y += font->height;
}
}
}
}
/*! \brief Check if a \ref Point can be displayed at the current resolution
*
* \param x X position to check
* \param y Y position to check
* \return 'true' if can be displayed
*/
bool valid(const int x, const int y) const {
return x >= 0 && y >= 0 &&
static_cast<unsigned>(x) < this->screen_width &&
static_cast<unsigned>(y) < this->screen_height;
}
protected:
/// \copydoc AbstractGraphicsPrinter::checkMode()
bool checkMode(uint8_t required_COLORDEPTH, uint8_t required_red_offset,
uint8_t required_green_offset, uint8_t required_blue_offset,
uint8_t required_red_size, uint8_t required_green_size,
uint8_t required_blue_size) {
return COLORDEPTH == required_COLORDEPTH &&
OFFSET_RED == required_red_offset &&
OFFSET_GREEN == required_green_offset &&
OFFSET_BLUE == required_blue_offset &&
BITS_RED == required_red_size &&
BITS_GREEN == required_green_size &&
BITS_BLUE == required_blue_size;
}
public:
/*! \brief Constructor
*/
GraphicsPrinter() {}
/// \copydoc AbstractGraphicsPrinter::init()
void init(unsigned width, unsigned height, unsigned pitch) {
FramebufferBase::init(width, height, pitch);
active_font = Font::get("Sun", 12, 22);
}
/// \copydoc AbstractGraphicsPrinter::buffer()
void buffer(void* lfb) { FramebufferBase::buffer(lfb); }
/// \copydoc AbstractGraphicsPrinter::clear()
void clear() { FramebufferBase::clear(); }
/// \copydoc AbstractGraphicsPrinter::valid()
bool valid(const Point& p) const { return valid(p.x, p.y); }
/// \copydoc AbstractGraphicsPrinter::height()
unsigned height() const { return this->screen_height; }
/// \copydoc AbstractGraphicsPrinter::width()
unsigned width() const { return this->screen_width; }
/// \copydoc AbstractGraphicsPrinter::pixel()
void pixel(const Point& p, const Color& color) {
return pixel<RGB, false, 8>(p, color);
}
/// \copydoc AbstractGraphicsPrinter::pixel()
void pixel(const Point& p, const ColorAlpha& color) {
return pixel<RGB, true, 8>(p, color);
}
/// \copydoc AbstractGraphicsPrinter::line()
void line(const Point& start, const Point& end, const Color& color) {
return line<RGB, false, 8>(start, end, color);
}
/// \copydoc AbstractGraphicsPrinter::line()
void line(const Point& start, const Point& end, const ColorAlpha& color) {
return line<RGB, true, 8>(start, end, color);
}
/// \copydoc AbstractGraphicsPrinter::rectangle()
void rectangle(const Point& start, const Point& end, const Color& color,
bool filled) {
return rectangle<RGB, false, 8>(start, end, color, filled);
}
/// \copydoc AbstractGraphicsPrinter::rectangle()
void rectangle(const Point& start, const Point& end,
const ColorAlpha& color, bool filled) {
return rectangle<RGB, true, 8>(start, end, color, filled);
}
/// \copydoc AbstractGraphicsPrinter::font()
void font(const Font& new_font) { active_font = &new_font; }
/// \copydoc AbstractGraphicsPrinter::text()
void text(const Point& p, const char* string, unsigned len,
const Color& color, const Font* font) {
return text<RGB, false, 8>(p, string, len, color, font);
}
/// \copydoc AbstractGraphicsPrinter::text()
void text(const Point& p, const char* string, unsigned len,
const ColorAlpha& color, const Font* font) {
return text<RGB, true, 8>(p, string, len, color, font);
}
/// \copydoc AbstractGraphicsPrinter::image(const
/// Point&,PNG&,unsigned,unsigned,unsigned,unsigned)
void image(const Point& p, PNG& image, unsigned width = 0,
unsigned height = 0, unsigned offset_x = 0,
unsigned offset_y = 0) {
unsigned w = image.get_width();
unsigned h = image.get_height();
if (width == 0 || offset_x + width > w) {
if (offset_x > w) {
return;
} else {
width = w - offset_x;
}
}
if (height == 0 || offset_y + height > h) {
if (offset_y > h) {
return;
} else {
height = h - offset_y;
}
}
switch (image.get_format()) {
case PNG::RGB8:
sprite<RGB, false, 8>(
p,
reinterpret_cast<const struct SpritePixel<RGB, false, 8>*>(
image.get_buffer()),
width, height, w, offset_x, offset_y);
break;
case PNG::RGB16:
sprite<RGB, false, 16>(
p,
reinterpret_cast<const struct SpritePixel<RGB, false, 16>*>(
image.get_buffer()),
width, height, w, offset_x, offset_y);
break;
case PNG::RGBA8:
sprite<RGB, true, 8>(
p,
reinterpret_cast<const struct SpritePixel<RGB, true, 8>*>(
image.get_buffer()),
width, height, w, offset_x, offset_y);
break;
case PNG::RGBA16:
sprite<RGB, true, 16>(
p,
reinterpret_cast<const struct SpritePixel<RGB, true, 16>*>(
image.get_buffer()),
width, height, w, offset_x, offset_y);
break;
case PNG::LUMINANCE8:
sprite<GREYSCALE, false, 8>(
p,
reinterpret_cast<
const struct SpritePixel<GREYSCALE, false, 8>*>(
image.get_buffer()),
width, height, w, offset_x, offset_y);
break;
case PNG::LUMINANCE_ALPHA4:
sprite<GREYSCALE, true, 4>(
p,
reinterpret_cast<
const struct SpritePixel<GREYSCALE, true, 4>*>(
image.get_buffer()),
width, height, w, offset_x, offset_y);
break;
case PNG::LUMINANCE_ALPHA8:
sprite<GREYSCALE, true, 8>(
p,
reinterpret_cast<
const struct SpritePixel<GREYSCALE, true, 8>*>(
image.get_buffer()),
width, height, w, offset_x, offset_y);
break;
default:
// "Unsupported PNG format";
break;
}
}
/// \copydoc AbstractGraphicsPrinter::image(const Point&,const
/// GIMP&,unsigned,unsigned,unsigned,unsigned)
void image(const Point& p, const GIMP& image, unsigned width = 0,
unsigned height = 0, unsigned offset_x = 0,
unsigned offset_y = 0) {
unsigned w = image.width;
unsigned h = image.height;
if (width == 0 || offset_x + width > w) {
if (offset_x > w) {
return;
} else {
width = w - offset_x;
}
}
if (height == 0 || offset_y + height > h) {
if (offset_y > h) {
return;
} else {
height = h - offset_y;
}
}
switch (image.bytes_per_pixel) {
case 2: // RGB16
sprite<RGB, false, 16>(
p,
reinterpret_cast<const struct SpritePixel<RGB, false, 16>*>(
image.pixel_data),
width, height, w, offset_x, offset_y);
break;
case 3: // RGB
sprite<RGB, false, 8>(
p,
reinterpret_cast<const struct SpritePixel<RGB, false, 8>*>(
image.pixel_data),
width, height, w, offset_x, offset_y);
break;
case 4: // RGBA
sprite<RGB, true, 8>(
p,
reinterpret_cast<const struct SpritePixel<RGB, true, 8>*>(
image.pixel_data),
width, height, w, offset_x, offset_y);
break;
default:
// "Unsupported PNG format";
break;
}
}
/// \copydoc AbstractGraphicsPrinter::image(const Point&,const
/// Color*,unsigned,unsigned,unsigned,unsigned)
void image(const Point& p, const Color* image, unsigned width,
unsigned height, unsigned offset_x = 0, unsigned offset_y = 0) {
sprite<RGB, false, 8>(p, image, width, height, width, offset_x,
offset_y);
}
/// \copydoc AbstractGraphicsPrinter::image(const Point&,const
/// ColorAlpha*,unsigned,unsigned,unsigned,unsigned)
void image(const Point& p, const ColorAlpha* image, unsigned width,
unsigned height, unsigned offset_x = 0, unsigned offset_y = 0) {
sprite<RGB, true, 8>(p, image, width, height, width, offset_x,
offset_y);
}
};