Начальная реализация поддержки шрифтов PSF

This commit is contained in:
Евгений Титаренко 2024-04-10 15:39:45 +03:00
parent 63b0d22340
commit 9af7778b77
5 changed files with 193 additions and 11 deletions

View file

@ -1,5 +1,6 @@
#include <iostream>
#include "bmpimage.h"
#include "psf.h"
const std::string FILENAME = "../elef.bmp";
const std::string FILENAME_OUT = "../elef_out.bmp";
@ -22,6 +23,7 @@ void lab01() {
og_image.appendRight(lighterImg).appendRight(darkenImg).appendRight(invert_img).appendRight(grayscale_img).save(
"../lab01/elef1.bmp");
}
//
void lab02_01() {
auto img = readBMPImage("../tea.bmp");
@ -47,6 +49,7 @@ void lab02_01() {
// img.appendRight(img_from_512)->appendRight(img_from_256)->appendRight(img_from_128)->save("../lab02/tea_upscale.bmp");
//// newImg2->save("../lab02/tea_upscale.bmp");
}
//
void lab02_02() {
auto img = readBMPImage("../tea.bmp");
@ -57,21 +60,21 @@ void lab02_02() {
auto height = gsImg.height();
for (int i = 0; i < height; ++i) {
for (int j = 0; j < width; ++j) {
gsPixels(i,j) = (gsPixels(i,j) / 2) * 2;
gsPixels(i, j) = (gsPixels(i, j) / 2) * 2;
}
}
auto gsImg128 = BMPImage(gsPixels);
gsPixels = gsImg.pixels_copy();
for (int i = 0; i < height; ++i) {
for (int j = 0; j < width; ++j) {
gsPixels(i,j) = (gsPixels(i,j) / 4) * 4;
gsPixels(i, j) = (gsPixels(i, j) / 4) * 4;
}
}
auto gsImg64 = BMPImage(gsPixels);
gsPixels = gsImg.pixels_copy();
for (int i = 0; i < height; ++i) {
for (int j = 0; j < width; ++j) {
gsPixels(i,j) = (gsPixels(i,j) / 8) * 8;
gsPixels(i, j) = (gsPixels(i, j) / 8) * 8;
}
}
auto gsImg32 = BMPImage(gsPixels);
@ -80,8 +83,9 @@ void lab02_02() {
gsImg32.save("../lab02/tea_grayscale_32.bmp");
gsImg.appendRight(gsImg128).appendRight(gsImg64).appendRight(gsImg32).save("../lab02/tea_grayscale.bmp");
}
//
void lab02_03(){
void lab02_03() {
auto img = readBMPImage("../tea.bmp");
auto img_1_5 = upscale1_5x(img);
auto img_2 = upscale2x(img);
@ -89,7 +93,8 @@ void lab02_03(){
img_1_5.save("../lab02/lab02_03/tea_x1_5.bmp");
img_2.save("../lab02/lab02_03/tea_x2.bmp");
img_3.save("../lab02/lab02_03/tea_x3.bmp");
img.appendRight(img_1_5).appendRight(img_2).appendRight(img_3).save("../lab02/lab02_03/tea_upscale.bmp"); //.appendRight(img_3)
img.appendRight(img_1_5).appendRight(img_2).appendRight(img_3).save(
"../lab02/lab02_03/tea_upscale.bmp"); //.appendRight(img_3)
// img.appendRight(img_1_5).save("../lab02/lab02_03/tea_upscale.bmp");
}
@ -115,11 +120,43 @@ void test() {
test_scale.save("../test_scale.bmp");
}
void test2() {
auto background_color = Pixel{0, 0, 0};
auto font_color = Pixel{255, 255, 255};
auto font = readPSF("../fonts/ruscii_8x16_2.psf");
auto glyph = font._glyphs[u'б'];
auto w = glyph.width;
auto h = glyph.height;
int imgWidth = 16 * glyph.width;
int imgHeight = 16 * glyph.height;
PixelArray test(imgWidth, imgHeight);
std::u16string str = u"Hello, World! Привет, Мир!";
uint32_t k = 0;
for (auto it: font._glyphs) {
if (k == 256) continue;
// glyph = font._glyphs[u'☺'];
// glyph = font._glyphs[str[k % str.size()]];
glyph = it.second;
for (int i = 0; i < h; ++i) {
for (int j = 0; j < w; ++j) {
if (glyph.glyph[i][j])
test((k / 16) * h + i, (k % 16) * w + j) = font_color;
else
test((k / 16) * h + i, (k % 16) * w + j) = background_color;
}
}
k++;
}
BMPImage(test).save("test_font.bmp");
}
int main() {
// lab01();
// lab02_01();
lab02_02();
// lab02_02();
// lab02_03();
// test();
test2();
return 0;
}