diff --git a/FreeSans.ttf b/FreeSans.ttf new file mode 100644 index 0000000..b550b90 Binary files /dev/null and b/FreeSans.ttf differ diff --git a/build.zig b/build.zig index c93b3fd..9b69db7 100644 --- a/build.zig +++ b/build.zig @@ -6,7 +6,7 @@ pub fn build(b: *Builder) void { exe.setBuildMode(mode); exe.linkSystemLibrary("SDL2"); - exe.linkSystemLibrary("SDL_TTF"); + exe.linkSystemLibrary("SDL2_TTF"); exe.linkSystemLibrary("c"); b.default_step.dependOn(&exe.step); diff --git a/src/main.zig b/src/main.zig index da166bf..77f0a9d 100644 --- a/src/main.zig +++ b/src/main.zig @@ -1,11 +1,8 @@ const std = @import("std"); const c = @cImport({ - @cInclude("SDL2/SDL.h"); -}); - -const t = @cImport({ - @cInclude("SDL/SDL_ttf.h"); + @cInclude("SDL.h"); + @cInclude("SDL_ttf.h"); }); const assert = @import("std").debug.assert; @@ -36,18 +33,55 @@ pub fn main() !void { const source_code = @embedFile("GapProbeScan.cs"); - const color_result = c.SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); + const color_result: c_int = c.SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); if (color_result != 0) { c.SDL_Log("Unable to set draw color: %d", color_result); return error.SDLInitializationFailed; } - const ttf_init_result = t.TTF_Init(); + // https://github.com/cirosantilli/cpp-cheat/blob/e52ed4b838e2697d8f44ab5bef3e7a170705d48e/sdl/ttf.c + const ttf_init_result: c_int = c.TTF_Init(); if (ttf_init_result != 0) { c.SDL_Log("Unable to init TTF: %d", ttf_init_result); return error.TTFInitializationFailed; } - defer t.TTF_Quit(); + defer c.TTF_Quit(); + + const text_color: c.SDL_Color = c.SDL_Color { + .r = 0, + .g = 0, + .b = 0, + .a = 255 + }; + + // TODO: can we embed this file? + const font: ?*c.TTF_Font = c.TTF_OpenFont("FreeSans.ttf", 24); + if (font == null) { + const err = c.TTF_GetError(); + c.SDL_Log("Unable to load font: %s", err); + return error.TTFFontLoadFailed; + } + + const surface: [*c]c.SDL_Surface = c.TTF_RenderText_Solid(font, "Hello, World!", text_color); + if (surface == null) { + c.SDL_Log("Unable to render text"); + return error.RenderTextFailed; + } + defer c.SDL_FreeSurface(surface); + + const texture: ?*c.SDL_Texture = c.SDL_CreateTextureFromSurface(renderer, surface); + if (texture == null) { + c.SDL_Log("Unable to create texture from surface"); + return error.CreateTextureFailed; + } + defer c.SDL_DestroyTexture(texture); + + const rect = c.SDL_Rect { + .x = 0, + .y = 0, + .w = surface.*.w, + .h = surface.*.h, + }; // const surface = c.SDL_GetWindowSurface(screen); @@ -153,6 +187,15 @@ pub fn main() !void { x += 1; } + // Display text + if (c.SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255) != 0) { + c.SDL_Log("Unable to set draw color"); + } + + if (c.SDL_RenderCopy(renderer, texture, null, &rect) != 0) { + c.SDL_Log("Unable to render copy"); + } + c.SDL_RenderPresent(renderer); c.SDL_Delay(17);