Как узнать ширину и высоту текста без использования поверхности в SDL2? - PullRequest
2 голосов
/ 26 апреля 2019

Я хотел создать отдельную функцию, в которой я мог бы просто отправить строку, и она будет отображать текст соответствующим образом, чтобы мне не нужно было копировать и вставлять один и тот же материал.Функция, которую я придумал, заключается в следующем:

void renderText(SDL_Renderer* renderer, char* text,
                char* font_name, int font_size,
                SDL_Color color, SDL_Rect text_area)
{
    /* If TTF was not initialized initialize it */
    if (!TTF_WasInit()) {
        if (TTF_Init() < 0) {
            printf("Error initializing TTF: %s\n", SDL_GetError());
            return EXIT_FAILURE;
        }
    }

    TTF_Font* font = TTF_OpenFont(font_name, font_size);
    if (font == NULL) {
        printf("Error opening font: %s\n", SDL_GetError());
        return;
    }

    SDL_Surface* surface = TTF_RenderText_Blended(font, text, color);
    SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface);
    if (!texture) {
        printf("error creating texture: %s\n", SDL_GetError());
        TTF_CloseFont(font);
        return;
    }

    SDL_RenderCopy(renderer, message, NULL, &text_area);

    SDL_FreeSurface(surface);
    SDL_DestroyTexture(texture);
    TTF_CloseFont(font);

}

Теперь иногда я хочу выровнять текст по окну, для которого мне нужно знать высоту и ширину поверхности, содержащей текст, такчто я могу использовать что-то вроде (WINDOW_WIDTH - surfaceText->w) / 2 или (WINDOW_HEIGHT - surfaceText->h) / 2.Но нет способа узнать высоту и ширину поверхности, содержащей текст, без создания поверхности.И если мне в конечном итоге понадобится создать поверхность, то разделение этой функции не будет соответствовать ее цели.

Как узнать высоту и ширину поверхности, содержащей текст, без фактического созданияповерхность в библиотеке SDL2_ttf?

1 Ответ

3 голосов
/ 26 апреля 2019

Вы можете передать строку в функцию TTF_SizeText(), которая определена:

int TTF_SizeText(TTF_Font *font, const char *text, int *w, int *h)

Документация для этой функции указывает:

Вычислить результирующий размер поверхности текста, закодированного в LATIN1, с использованием шрифта.Фактический рендеринг не выполняется, однако правильный кернинг выполняется для получения фактической ширины.Высота, возвращаемая в h, такая же, как вы можете получить с помощью 3.3.10 TTF_FontHeight.

Затем, когда у вас есть размеры строки, вы можете вызвать функцию рендеринга с необходимой информацией для ее выравнивания.

Есть также TTF_SizeUTF8() и TTF_SizeUNICODE()версии для разных кодировок.

...