如何在不使用SDL2表面的情况下找出文本的宽度和高度?

问题描述 投票:2回答:1

我想创建一个单独的函数,我可以发送一个字符串,它将适当地呈现文本,这样我就不需要复制粘贴相同的东西。我想出的功能如下。

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库中的曲面的情况下找出包含文本的曲面的高度和宽度?

sdl-2 sdl-ttf
1个回答
3
投票

您可以将字符串传递给TTF_SizeText()函数,该函数已定义:

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

这个函数的documentation说明:

计算使用font呈现的LATIN1编码文本的结果表面大小。没有进行实际渲染,但是要进行正确的字距调整以获得实际宽度。以h返回的高度与使用3.3.10 TTF_FontHeight时的高度相同。

然后,一旦获得了字符串的尺寸,就可以使用必要的信息调用渲染函数来对齐它。

还有TTF_SizeUTF8()TTF_SizeUNICODE()版本用于不同的编码。

© www.soinside.com 2019 - 2024. All rights reserved.