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

kla*_*aus 7 sdl-ttf sdl-2

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

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);

}
Run Code Online (Sandbox Code Playgroud)

现在,有时我想将文本与窗口对齐,我需要知道包含文本的表面的高度和宽度,以便我可以使用类似(WINDOW_WIDTH - surfaceText->w) / 2或 的东西(WINDOW_HEIGHT - surfaceText->h) / 2。但是,如果不创建表面,则无法知道包含文本的表面的高度和宽度。如果我最终需要创建曲面,那么此功能的分离将无法实现其目标。

如何找出包含文本的表面的高度和宽度,而无需在 SDL2_ttf 库中实际创建表面?

Mar*_*eld 9

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

int TTF_SizeText(TTF_Font *font, const char *text, int *w, int *h)
Run Code Online (Sandbox Code Playgroud)

该函数的文档指出:

计算使用字体呈现的 LATIN1 编码文本的最终表面大小。不进行实际渲染,但会进行正确的字距调整以获得实际宽度。h 中返回的高度与使用 3.3.10 TTF_FontHeight 获得的高度相同。

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

还有针对不同编码的TTF_SizeUTF8()版本TTF_SizeUNICODE()