SDL2_ttf Субпиксельное сглаживание - PullRequest
0 голосов
/ 18 июня 2019

Можно ли визуализировать текст с помощью библиотеки SDL2, используя метод субпиксельной визуализации , чтобы повысить качество на ЖК-экранах?(Желательно со стандартным SDL2_ttf.)

Следующее изображение демонстрирует именно то, к чему я стремлюсь, где изображение в крайнем левом углу - это фактический результат, который будет виден при увеличении:

subpixel rendering example

Если это невозможно «из коробки», но вы считаете, что возможно реализовать в 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);

до

/* 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...

Я надеюсь, что кто-то может помочь мне в этом ...
Приветствия.

1 Ответ

0 голосов
/ 18 июня 2019

Лучшее, что может сделать SDL2_ttf - это сглаживание в оттенках серого в режимах Shaded и Blended .

Чтобы получить субпиксельный рендеринг, вам нужно будет вернуться к FreeType.

Новая настройка хинтера TTF_HINTING_LIGHT_SUBPIXEL, введенная в недавний коммит HG , выглядит так, как будто он даст вам субпиксельное позиционирование в оттенках серого (оно преобразуется в FreeType's FT_LOAD_TARGET_LIGHT).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...