Можно ли визуализировать текст с помощью библиотеки SDL2, используя технику субпиксельного рендеринга для повышения качества ЖК-экраны? (Желательно со стандартным SDL2_ttf.)
Следующее изображение демонстрирует именно то, к чему я стремлюсь, где изображение в крайнем левом углу — это фактический результат, который можно было бы увидеть при увеличении:
Если это невозможно "из коробки", но вы считаете, что это можно реализовать в SDL2_ttf с открытым исходным кодом; Я был бы признателен за некоторые идеи или указатели в правильном направлении относительно того, как это можно реализовать.
РЕДАКТИРОВАТЬ:
Я начал просматривать исходный код SDL2_ttf и пришел к выводу, что он Мне пришлось бы изменить его, чтобы добиться субпиксельного сглаживания ЖК-дисплеев.
Исходя из того, что я исследовал о FreeType, мне пришлось бы изменить следующие строки кода:
// (from SDL_ttf.c, approx. line 650)
/* Render the glyph */
error = FT_Render_Glyph(glyph, mono ? ft_render_mode_mono : ft_render_mode_normal);
To
/* Render the glyph, (ft_render_mode_mono is also deprecated) */
error = FT_Render_Glyph(glyph, mono ? FT_RENDER_MODE_MONO : FT_RENDER_MODE_LCD);
Кроме того, необходимо добавить некоторый код для записи в растровое изображение. Я совершенно не представляю, как это сделать, так как едва понимаю, что там уже есть, из-за отсутствия комментариев. Ниже приведен код «серого 2-битного» пиксельного режима:
// (from SDL_ttf.c, approx. line 800)
// ... other pixel modes handled above this...
else if (src->pixel_mode == FT_PIXEL_MODE_GRAY2) {
// srcp appears to be the source buffer,
// and dstp the destination buffer.
unsigned char *srcp = src->buffer + soffset;
unsigned char *dstp = dst->buffer + doffset;
unsigned char c;
unsigned int j, k;
// No idea how any of this works.
// I'd guess 'j' should increment by 1
// instead of 4, since LCD uses 8-bits.
for (j = 0; j < src->width; j += 4) {
c = *srcp++;
for (k = 0; k < 4; ++k)
{
// Literally no idea where they pulled these numbers out.
if ((c&0xA0) >> 6) {
*dstp++ = NUM_GRAYS * ((c&0xA0) >> 6) / 3 - 1;
}
else {
*dstp++ = 0x00;
}
}
c <<= 2;
}
}
// 4-bit grey is done down here...
Я надеюсь, что кто-нибудь сможет помочь мне с этим...
Удачи.