Add docmap struct
We want to have an array of docmaps, one for each file and be able to iterate through them. That way the layout can be done in a single function.
This commit is contained in:
parent
d3e47ee184
commit
aade06e600
136
src/main.zig
136
src/main.zig
@ -7,7 +7,27 @@ const c = @cImport({
|
|||||||
|
|
||||||
const assert = @import("std").debug.assert;
|
const assert = @import("std").debug.assert;
|
||||||
|
|
||||||
|
const DrawnText = struct {
|
||||||
|
surface: [*c]c.SDL_Surface,
|
||||||
|
texture: ?*c.SDL_Texture,
|
||||||
|
rect: c.SDL_Rect,
|
||||||
|
};
|
||||||
|
|
||||||
|
const FileDocMap = struct {
|
||||||
|
title_text: DrawnText,
|
||||||
|
contents: []u8,
|
||||||
|
};
|
||||||
|
|
||||||
pub fn main() !void {
|
pub fn main() !void {
|
||||||
|
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
|
||||||
|
defer {
|
||||||
|
if(gpa.deinit()) {
|
||||||
|
std.debug.print("Allocator leak\n", .{});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const allocator = gpa.allocator();
|
||||||
|
|
||||||
const window_width = 300;
|
const window_width = 300;
|
||||||
const window_height = 500;
|
const window_height = 500;
|
||||||
const column_width = 100;
|
const column_width = 100;
|
||||||
@ -31,12 +51,11 @@ pub fn main() !void {
|
|||||||
};
|
};
|
||||||
defer c.SDL_DestroyRenderer(renderer);
|
defer c.SDL_DestroyRenderer(renderer);
|
||||||
|
|
||||||
const source_code = @embedFile("GapProbeScan.cs");
|
// Turn on anti-aliasing
|
||||||
const file_name = "GapProbeScan.cs";
|
// :( doesn't seem to work
|
||||||
|
const aa_result = c.SDL_SetHint(c.SDL_HINT_RENDER_SCALE_QUALITY, "1");
|
||||||
const color_result: c_int = c.SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
|
if (aa_result != c.SDL_TRUE) {
|
||||||
if (color_result != 0) {
|
c.SDL_Log("Unable to set anti-aliasing: %d", c.SDL_GetError());
|
||||||
c.SDL_Log("Unable to set draw color: %d", color_result);
|
|
||||||
return error.SDLInitializationFailed;
|
return error.SDLInitializationFailed;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -56,33 +75,82 @@ pub fn main() !void {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// TODO: can we embed this file?
|
// TODO: can we embed this file?
|
||||||
const font: ?*c.TTF_Font = c.TTF_OpenFont("FreeSans.ttf", 24);
|
const font: ?*c.TTF_Font = c.TTF_OpenFont("FreeSans.ttf", 12);
|
||||||
if (font == null) {
|
if (font == null) {
|
||||||
const err = c.TTF_GetError();
|
const err = c.TTF_GetError();
|
||||||
c.SDL_Log("Unable to load font: %s", err);
|
c.SDL_Log("Unable to load font: %s", err);
|
||||||
return error.TTFFontLoadFailed;
|
return error.TTFFontLoadFailed;
|
||||||
}
|
}
|
||||||
|
|
||||||
const surface: [*c]c.SDL_Surface = c.TTF_RenderText_Solid(font, file_name, text_color);
|
var file_paths = std.ArrayList([]const u8).init(allocator);
|
||||||
if (surface == null) {
|
defer file_paths.deinit();
|
||||||
c.SDL_Log("Unable to render text");
|
try file_paths.append("GapProbeScan.cs");
|
||||||
return error.RenderTextFailed;
|
try file_paths.append("src/main.zig");
|
||||||
}
|
// const file_name = "GapProbeScan.cs";
|
||||||
defer c.SDL_FreeSurface(surface);
|
// const source_code = @embedFile(file_name);
|
||||||
|
|
||||||
const texture: ?*c.SDL_Texture = c.SDL_CreateTextureFromSurface(renderer, surface);
|
var file_docmaps = std.ArrayList(FileDocMap).init(allocator);
|
||||||
if (texture == null) {
|
defer file_docmaps.deinit();
|
||||||
c.SDL_Log("Unable to create texture from surface");
|
|
||||||
return error.CreateTextureFailed;
|
|
||||||
}
|
|
||||||
defer c.SDL_DestroyTexture(texture);
|
|
||||||
|
|
||||||
const rect = c.SDL_Rect {
|
for (file_paths.items) |path| {
|
||||||
.x = 0,
|
const surface: [*c]c.SDL_Surface = c.TTF_RenderText_Solid(font, @ptrCast([*c]const u8, path), text_color);
|
||||||
.y = 0,
|
if (surface == null) {
|
||||||
.w = surface.*.w,
|
c.SDL_Log("Unable to render text");
|
||||||
.h = surface.*.h,
|
return error.RenderTextFailed;
|
||||||
};
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
var rect = c.SDL_Rect {
|
||||||
|
.x = 0,
|
||||||
|
.y = 0,
|
||||||
|
.w = surface.*.w,
|
||||||
|
.h = surface.*.h,
|
||||||
|
};
|
||||||
|
|
||||||
|
const file = try std.fs.cwd().openFile(path, .{ });
|
||||||
|
defer file.close();
|
||||||
|
|
||||||
|
const stat = try file.stat();
|
||||||
|
var buffer = try allocator.alloc(u8, stat.size);
|
||||||
|
|
||||||
|
const bytes_read = try file.readAll(buffer);
|
||||||
|
if (bytes_read != stat.size) {
|
||||||
|
std.debug.print("bytes_read: {any}, stat.size: {any}\n", .{
|
||||||
|
bytes_read,
|
||||||
|
stat.size,
|
||||||
|
});
|
||||||
|
return error.FileReadError;
|
||||||
|
}
|
||||||
|
|
||||||
|
var docmap = FileDocMap {
|
||||||
|
.title_text = DrawnText {
|
||||||
|
.surface = surface,
|
||||||
|
.texture = texture,
|
||||||
|
.rect = rect,
|
||||||
|
},
|
||||||
|
.contents = buffer,
|
||||||
|
};
|
||||||
|
|
||||||
|
try file_docmaps.append(docmap);
|
||||||
|
}
|
||||||
|
defer {
|
||||||
|
for (file_docmaps.items) |docmap| {
|
||||||
|
c.SDL_FreeSurface(docmap.title_text.surface);
|
||||||
|
c.SDL_DestroyTexture(docmap.title_text.texture);
|
||||||
|
allocator.free(docmap.contents);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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 surface = c.SDL_GetWindowSurface(screen);
|
// const surface = c.SDL_GetWindowSurface(screen);
|
||||||
|
|
||||||
@ -119,11 +187,11 @@ pub fn main() !void {
|
|||||||
var i: usize = 0;
|
var i: usize = 0;
|
||||||
var column: c_int = 0;
|
var column: c_int = 0;
|
||||||
x = 0;
|
x = 0;
|
||||||
var y: c_int = surface.*.h;
|
var y: c_int = file_docmaps.items[0].title_text.rect.h;
|
||||||
// white: false, black: true
|
// white: false, black: true
|
||||||
var color: bool = false;
|
var color: bool = false;
|
||||||
while (i < source_code.len) : (i += 1) {
|
while (i < file_docmaps.items[0].contents.len) : (i += 1) {
|
||||||
if (source_code[i] == 10) {
|
if (file_docmaps.items[0].contents[i] == 10) {
|
||||||
y += 1;
|
y += 1;
|
||||||
if (y > window_height) {
|
if (y > window_height) {
|
||||||
y = 0;
|
y = 0;
|
||||||
@ -135,14 +203,14 @@ pub fn main() !void {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (source_code[i] == 32 and color) {
|
if (file_docmaps.items[0].contents[i] == 32 and color) {
|
||||||
color = false;
|
color = false;
|
||||||
const white_color_result = c.SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
|
const white_color_result = c.SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
|
||||||
if (white_color_result != 0) {
|
if (white_color_result != 0) {
|
||||||
c.SDL_Log("Unable to set draw color: %d", white_color_result);
|
c.SDL_Log("Unable to set draw color: %d", white_color_result);
|
||||||
return error.SDLInitializationFailed;
|
return error.SDLInitializationFailed;
|
||||||
}
|
}
|
||||||
} else if (source_code[i] != 32 and !color) {
|
} else if (file_docmaps.items[0].contents[i] != 32 and !color) {
|
||||||
color = true;
|
color = true;
|
||||||
const black_color_result = c.SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
|
const black_color_result = c.SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
|
||||||
if (black_color_result != 0) {
|
if (black_color_result != 0) {
|
||||||
@ -188,12 +256,10 @@ pub fn main() !void {
|
|||||||
x += 1;
|
x += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Display text
|
const text = file_docmaps.items[0].title_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) {
|
// Display text
|
||||||
|
if (c.SDL_RenderCopy(renderer, text.texture, null, &(text.rect)) != 0) {
|
||||||
c.SDL_Log("Unable to render copy");
|
c.SDL_Log("Unable to render copy");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user