SDL2_ttf Субпиксельное сглаживание

Можно ли визуализировать текст с помощью библиотеки 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...

Я надеюсь, что кто-нибудь сможет помочь мне с этим...
Удачи.


person Michael    schedule 18.06.2019    source источник
comment
Я бы не стал изобретать велосипед. 1. Найдите библиотеку, которая поддерживает субпиксельный рендеринг, и если вам действительно нужно использовать изображения SDL2, то 2. Найдите способ конвертировать изображения SDL2 и изображения библиотеки X туда и обратно, что не должно быть слишком сложно. Отличный альбом между прочим.   -  person nada    schedule 18.06.2019
comment
@nada Спасибо за совет. Я приму это во внимание. Хотя основная причина, по которой я спросил, заключается в том, что SDL2_ttf использует библиотеку FreeType (которая, по-видимому, поддерживает субпиксельный рендеринг). Поэтому мне было интересно, есть ли какие-либо флаги или что-то, что я мог бы установить, чтобы включить это. И да, слухи - это круто :D   -  person Michael    schedule 18.06.2019


Ответы (1)


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

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

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

person genpfault    schedule 18.06.2019
comment
Спасибо за информацию. (Включая настройку подсказки, несмотря на то, что она несколько не имеет отношения к моему вопросу.) Как вы думаете, возможно ли изменить исходный код SDL2_ttf, чтобы включить субпиксельное сглаживание FreeType? Или мне последовать совету @nada и найти дополнительную библиотеку? - person Michael; 19.06.2019
comment
Я пытаюсь скомпилировать репозиторий HG, на который вы ссылаетесь (из этой фиксации) Но я изо всех сил пытаюсь его скомпилировать. По ссылке, которую вы разместили, требуется версия SDL2 с установленным флагом SDL_MEMALIGNED, хотя я понятия не имею, где получить сборку с этим флагом. Я попытался собрать SDL2 из исходного кода, но нигде в коде не смог найти флаг. - person Michael; 24.06.2019
comment
@Michael: Похоже, флаг поверхности SDL_MEMALIGNED был добавлен в Добавить флаг SDL_MEMALIGNED для SDL_Surface с использованием выровненной памяти. и переименован в SDL_SIMD_ALIGNED через несколько дней в Переименуйте флаг памяти с выравниванием по поверхности в SDL_SIMD_ALIGNED. - person genpfault; 24.06.2019
comment
Итак, компиляция этой передовой версии SDL позволила мне использовать субпиксельные подсказки текста, что значительно улучшило четкость текста, так что спасибо за это. Однако до сих пор не нашел способа получить субпиксельное сглаживание... - person Michael; 25.06.2019