Text Performance, Fitting and Wrapping

Adjusting Text Kerning and Letter Spacing

How can I implement text kerning or letter-spacing adjustments with SDL_ttf?

3D art representing computer programming

Implementing text kerning or letter-spacing adjustments with SDL_ttf requires a bit of manual work, as SDL_ttf doesn't provide direct functions for these features. However, we can achieve these effects by rendering individual characters and positioning them manually.

Here's an approach to implement custom letter spacing:

#include <SDL.h>
#include <SDL_ttf.h>

#include <string>
#include <vector>

class KernedText : public Text {
public:
  KernedText(std::string Content, int FontSize,
             int LetterSpacing)
    : Text{FontSize},
      LetterSpacing{LetterSpacing} {
    CreateSurface(Content);
  }

private:
  void CreateSurface(
    const std::string& Content) {
    std::vector<SDL_Surface*> CharSurfaces;
    int TotalWidth{0};
    int MaxHeight{0};

    // Render each character separately
    for (char c : Content) {
      SDL_Surface* CharSurface =
        TTF_RenderGlyph_Blended(
          Font, c, {255, 255, 255, 255});
      if (CharSurface) {
        CharSurfaces.push_back(CharSurface);
        TotalWidth += CharSurface->w +
          LetterSpacing;
        MaxHeight = std::max(
          MaxHeight, CharSurface->h);
      }
    }

    // Create a surface to hold all characters
    TextSurface =
      SDL_CreateRGBSurface(0, TotalWidth,
                           MaxHeight, 32, 0, 0,
                           0, 0);

    // Blit each character onto the main surface
    int XPos{0};
    for (auto* CharSurface : CharSurfaces) {
      SDL_Rect DestRect{
        XPos, 0, CharSurface->w,
        CharSurface->h};
      SDL_BlitSurface(CharSurface, nullptr,
                      TextSurface, &DestRect);
      XPos += CharSurface->w + LetterSpacing;
      SDL_FreeSurface(CharSurface);
    }
  }

  int LetterSpacing;
};

int main() {
  SDL_Init(SDL_INIT_VIDEO);
  TTF_Init();

  KernedText MyText{"Hello World", 24, 5};

  // Rest of your SDL setup and rendering loop...

  TTF_Quit();
  SDL_Quit();
  return 0;
}

In this example, we create a KernedText class that extends our Text class. It renders each character separately and then combines them into a single surface, allowing us to control the spacing between letters.

To implement kerning, you'd need to use TTF_GetFontKerningSizeGlyphs() to get the kerning value between pairs of characters and adjust the positioning accordingly.

Remember that manually rendering characters like this can be less efficient than using SDL_ttf's built-in text rendering functions, so use this approach judiciously, especially for large amounts of text or when performance is critical.

This Question is from the Lesson:

Text Performance, Fitting and Wrapping

Explore advanced techniques for optimizing and controlling text rendering when using SDL_ttf

Answers to questions are automatically generated and may not have been reviewed.

This Question is from the Lesson:

Text Performance, Fitting and Wrapping

Explore advanced techniques for optimizing and controlling text rendering when using SDL_ttf

sdl2-promo.jpg
Part of the course:

Game Dev with SDL2

Learn C++ and SDL development by creating hands on, practical projects inspired by classic retro games

This course includes:

  • 128 Lessons
  • 92% Positive Reviews
  • Regularly Updated
  • Help and FAQs
Free, Unlimited Access

Professional C++

Comprehensive course covering advanced concepts, and how to use them on large-scale projects.

View Course
Screenshot from Warhammer: Total War
Screenshot from Tomb Raider
Screenshot from Jedi: Fallen Order
Contact|Privacy Policy|Terms of Use
Copyright © 2025 - All Rights Reserved