mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-01-18 16:27:34 +01:00
[kandinsky] Introduce a KDFont class
This commit is contained in:
committed by
LeaNumworks
parent
6221669a7e
commit
da4cc4356f
@@ -6,6 +6,8 @@ objs += $(addprefix kandinsky/src/,\
|
|||||||
context_pixel.o\
|
context_pixel.o\
|
||||||
context_rect.o\
|
context_rect.o\
|
||||||
context_text.o\
|
context_text.o\
|
||||||
|
font.o\
|
||||||
|
font_small.o\
|
||||||
framebuffer.o\
|
framebuffer.o\
|
||||||
framebuffer_context.o\
|
framebuffer_context.o\
|
||||||
ion_context.o\
|
ion_context.o\
|
||||||
|
|||||||
55
kandinsky/src/font.cpp
Normal file
55
kandinsky/src/font.cpp
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
#include "font.h"
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
void decompress(const uint8_t * source, int sourceLength, uint8_t * output, int outputLength);
|
||||||
|
|
||||||
|
void KDFont::fetchGreyscaleGlyphForChar(char c, uint8_t * greyscaleBuffer) const {
|
||||||
|
decompress(
|
||||||
|
compressedGlyphData(c),
|
||||||
|
compressedGlyphDataSize(c),
|
||||||
|
greyscaleBuffer,
|
||||||
|
m_glyphWidth*m_glyphHeight
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void KDFont::fetchGlyphForChar(char c, const KDFont::RenderPalette & renderPalette, KDColor * pixelBuffer) const {
|
||||||
|
/* Since a greyscale value is smaller than a color value (see assertion), we
|
||||||
|
* can store the temporary greyscale values in the output pixel buffer.
|
||||||
|
* What's great is that now, if we fill the pixel buffer right-to-left with
|
||||||
|
* colors derived from the temporary greyscale values, we will never overwrite
|
||||||
|
* the remaining grayscale values since those are smaller. So we can avoid a
|
||||||
|
* separate buffer for the temporary greyscale values. */
|
||||||
|
assert(k_bitsPerPixel < 8*sizeof(KDColor));
|
||||||
|
uint8_t * greyscaleBuffer = reinterpret_cast<uint8_t *>(pixelBuffer);
|
||||||
|
fetchGreyscaleGlyphForChar(c, greyscaleBuffer);
|
||||||
|
|
||||||
|
int numberOfPixels = m_glyphWidth*m_glyphHeight;
|
||||||
|
uint8_t mask = (0xFF >> (8-k_bitsPerPixel));
|
||||||
|
int pixelIndex = m_glyphWidth * m_glyphHeight;
|
||||||
|
int greyscaleByteIndex = pixelIndex / k_bitsPerPixel;
|
||||||
|
while (pixelIndex >= 0) {
|
||||||
|
uint8_t greyscaleByte = greyscaleBuffer[greyscaleByteIndex--];
|
||||||
|
assert(greyscaleByteIndex >= 0);
|
||||||
|
for (int j=0; j<8/k_bitsPerPixel; j++) {
|
||||||
|
uint8_t greyscale = greyscaleByte & mask;
|
||||||
|
greyscaleByte = greyscaleByte >> k_bitsPerPixel;
|
||||||
|
pixelBuffer[pixelIndex--] = renderPalette.colorAtIndex(greyscale);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr int glyphPixelCount = 12;
|
||||||
|
|
||||||
|
void drawString(const char * text, KDColor textColor, KDColor backgroundColor) {
|
||||||
|
const KDFont * font = KDFont::LargeFont;
|
||||||
|
KDFont::RenderPalette palette = font->renderPalette(textColor, backgroundColor);
|
||||||
|
|
||||||
|
assert(glyphPixelCount >= font->glyphWidth() * font->glyphHeight());
|
||||||
|
|
||||||
|
char c;
|
||||||
|
do {
|
||||||
|
char c = text[0];
|
||||||
|
KDColor glyph[glyphPixelCount];
|
||||||
|
font->fetchGlyphForChar(c, palette, glyph);
|
||||||
|
} while (c != 0);
|
||||||
|
}
|
||||||
22
kandinsky/src/font_small.cpp
Normal file
22
kandinsky/src/font_small.cpp
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
#include "font.h"
|
||||||
|
|
||||||
|
static constexpr KDCoordinate glyphWidth = 8;
|
||||||
|
|
||||||
|
static constexpr KDCoordinate glyphHeight = 8;
|
||||||
|
|
||||||
|
static constexpr uint16_t glyphDataOffset[] = {
|
||||||
|
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, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||||
|
};
|
||||||
|
|
||||||
|
static constexpr uint8_t glyphData[] = {
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00
|
||||||
|
};
|
||||||
|
|
||||||
|
constexpr KDFont font(glyphWidth, glyphHeight, glyphDataOffset, glyphData);
|
||||||
|
|
||||||
|
const KDFont * KDFont::SmallFont = &font;
|
||||||
24
kandinsky/src/palette.h
Normal file
24
kandinsky/src/palette.h
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
#ifndef KANDINSKY_PALETTE_H
|
||||||
|
#define KANDINSKY_PALETTE_H
|
||||||
|
|
||||||
|
#include <kandinsky/color.h>
|
||||||
|
|
||||||
|
template <int S>
|
||||||
|
class KDPalette {
|
||||||
|
public:
|
||||||
|
static KDPalette Gradient(KDColor fromColor, KDColor toColor) {
|
||||||
|
KDPalette p;
|
||||||
|
for (int i=0; i<S; i++) {
|
||||||
|
p.m_colors[i] = KDColor::blend(fromColor, toColor, (0xFF*i)/S);
|
||||||
|
}
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
KDColor colorAtIndex(int i) const {
|
||||||
|
return m_colors[i];
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
KDPalette() {}
|
||||||
|
KDColor m_colors[S];
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
Reference in New Issue
Block a user