Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

gfx: no image blit, no additive blend, no polygon/gradient, no font API — the 15-primitive surface caps every consumer at a 1982 look (Tidepool forcing-function)

Open
#1,216 0 comments 0 reactions 0 assignees View on GitHub

Maintainers usually reply within 1 day

Nobody has claimed this yet.

Assessment

Difficulty
5/5
Estimated time
Over a week
Newbie friendliness
35/100
Issue type
Feature
Clarity
Clearly specified
Activity status
Active
Tech stack
c

Research direction

Start in src/ext_gfx.c, focusing on the existing SDL loader, framebuffer texture path, and current gfx primitives. Review src/draw.eigs and the lib/ui consumers, then inspect how headless draw-list entries and gfx_read pixel tests are structured under xvfb. Done means the requested image, blend, geometry, alpha, and font capabilities are implemented with dependency-free loading and coverage for each builtin.

Written by the indexing model from the issue text.

Description

area:gfx enhancement found-by:consumer

Forcing-function report from Tidepool (maintainer's call, 2026-09-20: the gfx fleet "looks like it was from the early 80s — necessary to have started there, for the language, but not modern"). Measured against src/ext_gfx.c on main a22f8dd, the runtime's drawing surface is 15 builtins: gfx_open close title clear present poll delay ticks clip read fb point line rect rrect circle text text_width text_height. What a modern-looking 2D game needs and cannot get from that set:

Already there (so the ask is smaller than it looks): a global SDL_BLENDMODE_BLEND (line 486); gfx_rect/gfx_circle take an optional alpha (538–612); textures exist internally (SDL_CreateTexture/UpdateTexture/RenderCopy are loaded for gfx_fb); SDL2_ttf is probed for gfx_text; inflate/deflate builtins exist (make zlib).

Missing:

  1. No image path. Nothing loads a raster or blits one. Every consumer draws with circles and lines; a background plate, a sprite, a particle texture, a generated concept art (Tidepool docs/concept-2026-09-20.png, made in one minute) cannot reach the screen. Ask: gfx_image_load of path → handle (PNG decode in C on top of the existing inflate — no SDL2_image dependency, which is not on the dev box anyway; RGBA with real alpha), gfx_image_draw of [img, x, y, w, h, alpha, angle_deg], gfx_image_size, and a framebuffer-backed gfx_image_from_fb so procedural art can be cached once and blitted many times.
  2. No additive blend. Glow is BLENDMODE_ADD; a bioluminescent look is impossible with alpha-blend only. Ask: gfx_blend of mode ("blend" | "add" | "none"), state held per subsequent draw.
  3. gfx_line/gfx_point have no alpha (rect/circle do). Ask: same optional trailing alpha on all four.
  4. No filled polygon / gradient / soft circle. A cell body is a smooth blob, a water background is a gradient, a glow is a radial falloff. Ask: gfx_polygon of [[x,y]…, r, g, b, a] (SDL_RenderGeometry, already in SDL2 ≥ 2.0.18) and gfx_circle_soft of [cx, cy, radius, r, g, b, a, feather] — or just gfx_polygon plus item 1 and let lib/ build the rest.
  5. Text is a bitmap font unless a system TTF happens to be found, with no size/weight API beyond scale. Ask: gfx_font of [path, size] → handle, gfx_text accepting a font handle.

Consumer evidence: Tidepool's renderer uses exactly gfx_circle/line/rect/rrect/point/text/clear/present (src/draw.eigs), DMG uses gfx_fb, DeslanStudio uses lib/ui on the same primitives. All three are capped by the same five gaps. The identity of the Tidepool look (translucent, glowing, dark pool) survives — it needs items 1, 2 and 4 to render the way the concept frame shows it.

Keep it dependency-free (EigenScript has none): PNG via inflate, geometry via SDL_RenderGeometry through the existing dlsym loader, nothing new to link. Each builtin lands with a headless draw-list entry (the renderer is headless-inspectable and consumers' tests assert on it) and a gfx_read pixel test under xvfb.

Dominant language
C
Stars
3
Forks
7
Avg merge
3h 56m
Merged PRs (30d)
102

Getting set up

Open in Codespaces

Starts the project's dev container in your browser, under your own GitHub account.

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from InauguralSystems/EigenScript

All issues in InauguralSystems/EigenScript

Similar issues

More C issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.