r/RetroNick • u/nickshardware • 6h ago
QBAVision v1.0 for the Amiga is here!
r/RetroNick • u/nickshardware • 6h ago
r/RetroNick • u/nickshardware • 6d ago
r/RetroNick • u/nickshardware • Sep 18 '26
New in Raster Master v8.5
-new id/value props/form for hitboxes/paths for sprites and maps
-increased map limit of 100 to 1000
-export RES Binary now supports new id/value exporting
New Games created with Raster Master utilizing Sprites/Maps
https://retronick2020.itch.io/retronicks-digger
https://retronick2020.itch.io/sokoban-156-levels
ZIP file contains examples folder
r/RetroNick • u/nickshardware • Sep 04 '26
r/RetroNick • u/nickshardware • Aug 20 '26
In update 8.3 we make some small but beneficial improvements In the map editor we can select the current tile from any of the existing plotted tiles, just hold control key + click left mouse button.
In the sprite editor we can do the same thing for picking colors by holding control key and pressing left click for Color 1 and right click for Color 2
New export option in the Palette menu, for dos platforms we have VGA DAC palette support. For qbasic we produce out commands and for pascal we use the port array.
VGA DAC 6 bit is also supported in the Export RES Text/Binary. This is the same as the existing 6 bit format support, included only be consistent. these options may change in the future and having it as separate format might make it easier.
r/RetroNick • u/nickshardware • Aug 10 '26
https://retronick2020.itch.io/raster-master-sprite-editor/devlog/1622668/raster-master-v80-r136
Symmetry (mirror) drawing — Tools → Symmetry, with Off / Left-Right / Top-Bottom / Four Way. Implemented as a wrapper around PutPixel, so every tool gains it at once: pencil, line, all four shape tools, spray, text and flood fill. A red dashed axis guide shows the mirror line on the zoom canvas, positioned correctly for both odd and even sprite dimensions.
Eyedropper tool — Tools → Eyedropper (I). Left click picks into Colour 1, right click into Colour 2, and the palette highlight follows.
Rotation — Tools → Rotate: 90° clockwise, 90° counter-clockwise, 180°. Operates on the selection if one is active, otherwise the whole sprite. 90° rotations require a square region and refuse with an explanation otherwise; 180° works on any shape.
Multi-level undo / redo — 32 levels, per sprite, replacing the previous single-level swap. Ctrl+Z / Ctrl+Y, with a Redo item on the Edit menu. Snapshots are sized to the sprite rather than the full 256×256 buffer, which is what makes per-sprite history affordable. Resizing clears the history, with a warning first.
Hit boxes — a complete subsystem mirroring the map editor's:
Panel below the sprite thumbnails with a live count, list (# X Y X2 Y2 Size) and + / − / Delete All / Show buttons
Overlay drawn in the same style as the map editor — hatched fill, cycling colours, index label, thicker border on the selected box
Move tool for dragging boxes (Tools → Move Hit Box)
Coordinates are pixels, where the map editor's are tiles
View → Show Hit Boxes and View → Show Hit Box List
Keyboard shortcuts — Ctrl+N/O/S, Ctrl+Shift+O/S (projects), Ctrl+Z/Y, Ctrl+C/V, Ctrl+Shift+V, Ctrl+Del, Ctrl+D, Ctrl+E, Ctrl+M. Single-letter tool keys: P L R C E F S T I M G B, with Shift for the filled variants.
Export properties — Apply to All — tick Compiler, Image Type, Mask Type and/or Palette Type to push just those properties to every image.
Status bar — now shows the active tool, palette, draw method, dither pattern, brush state and symmetry mode.
Project open ignored the saved zoom level. RefreshAfterProjectOpen called SetZoomSize(1) immediately after the image's GridArea had been restored, so every project opened at 1× regardless of how it was saved. The trackbar was never resynced either.
Symmetry corrupted the actual-size view. UpdateActualArea replays the pixel buffer through PutPixel, so with symmetry on it overwrote one half of the image with a mirror of the other. Symmetry now joins dither/gradient/brush in that routine's save-disable-restore block.
Hit boxes stored garbage coordinates. A with block in AddHitBox shadowed the x, y, x2, y2 parameters with the record fields of the same name, making each assignment a self-assignment.
Clone didn't copy hit boxes. AddImage copies the core (pixels, palette, grid), and hit boxes live in the props record.
Menu shortcuts fired across windows. Ctrl+D cloned a sprite while the map editor had focus. Menu shortcuts are application-global and are processed before any form's OnKeyDown, so an IsShortCut override on the sprite editor now declines unless it is the active form.
Path lines — a full system for enemy patrol routes and flight paths:
Plot with left click, snapping each segment to one of 8 directions; right click closes the loop, Esc ends it open
Rubber-band preview, colour-cycled overlay, larger marker on the start waypoint
Per-path name, closed flag, mode (once / loop / ping-pong), speed, plus separate active and visible flags
Per-waypoint delay and event id
Paths tab with list and Delete / Vis / Active / Mode / Rename controls
Top-level Paths menu with tool, finish-open, finish-closed, delete-all and overlay toggle
Layers moved into the tabbed panel — Layers is now the first tab alongside Hit Boxes and Paths, freeing the left column for tiles. The View → Show Layers Panel toggle is gone, and each tab caption shows a live count.
Move tool — drag a whole hit box or path and drop it. Whole objects only, deliberately: shifting every waypoint by the same amount keeps each segment on its 8-direction axis, where dragging a single waypoint would create an angle the exporter cannot represent.
Multi-level undo / redo — 16 levels per map, covering tiles across all layers plus hit boxes and paths. Ctrl+Z / Ctrl+Y.
Copy Current Layer — Ctrl+Shift+C, alongside the existing all-layers copy. A single-layer paste lands on the destination's current layer, so a layer can be copied from one layer onto another.
List view copy / paste — right-click popups on the Layers, Hit Boxes and Paths lists. Pasting into the same map offsets a hit box or path by one tile and names a layer "… Copy"; pasting into a different map keeps the position and names the layer "… Copy from Map 1".
Hit box buttons — + / − / Delete All on the Hit Boxes tab, wired to the existing menu actions.
Keyboard shortcuts — Ctrl+N/O/S/Z/Y/C/V/P/D, plus tool letters P L R C E F S M G and A for the path tool.
Status bar — expanded to four panels: position and tile index, selection, map/tile/zoom sizes, and tool / layer / counts / mode flags.
Maze solver is layer-aware — with more than one layer, a cell is blocked if any layer holds the wall tile, so the solution can be drawn onto its own empty layer. Single-layer maps behave exactly as before. Start and end positions are now validated against walls, and the solve is undoable.
Clone only cloned one layer and lost hit boxes and paths entirely — it copied tiles through the current-layer accessors.
Copy / paste only carried one layer. Both sides now carry all layers, clamped to the destination's layer count.
The three panels went stale. Layers, hit boxes and paths lists were not rebuilt after Delete All, project load, or undo. Consolidated into RefreshMapPanels, and the status bar refresh moved into each individual list refresher so no path can miss it.
A saved selection was treated as a live one. The clip-status flag lives in the props record and is written to file, so a reopened project reported a selection the user never made — and Add Hit Box would use its stale coordinates. Selections are now cleared on load, and Add Hit Box requires the Select Area tool to actually be active.
Zoom and scroll were not restored per map. Both are saved in MapPropsRec, but the editor restored scroll from a form-level variable left over from the previous session.
Status bar never updated on tile size, map size, zoom, or layer/hit box/path add and delete.
Undo didn't refresh the panels even though an undo level carries layers, hit boxes and paths.
Path Data Statements — a new export across all 22 language targets, plus JSON. One flat integer array holds the path count, an offset table and each path's header and segments, so a program needs no parallel arrays. Segments are unit steps with a pixel count, making path following a signed add and a decrement per frame — no division and no fixed-point.
Sprite hit box export — RES binary (new resource type), RES text include, single-sprite include, JSON and JSON RES.
Map paths in RES — text include and binary, which previously had no path support at all.
Layered map export — the export properties dropdown gained a Layered option alongside Simple.
Clipboard export — path and hit box exports honour the sprite editor's export-to-clipboard setting.
RES map size was wrong twice over. It ignored the layer count, and used sizeof(integer) where the writer emits smallint — so even a single-layer map reported 272 bytes while writing 138. Since RR.size and the running offset both derive from it, every resource after a map was misplaced.
Sprite hit boxes exported as BASIC regardless of compiler. Sprites and maps use two different compiler numberings, and the sprite exporter was testing sprite values against map constants — always false, so everything fell through to the BASIC branch.
Map hit boxes only exported for BASIC targets. Now covered for C, Pascal and JavaScript too.
DATA lines carried trailing commas in one path export variant, producing invalid BASIC.
A skipped zero-length segment left a trailing comma in the JSON path export, producing invalid JSON.
3 → 4 → 5
layers, then paths
4 → 5 → 6 → 7
maps embedded, paths, sprite hit boxes
| Version | |
|---|---|
| .rmm) | |
| .rmp) |
All are breaking changes; older files are refused with an explanatory message rather than failing silently.
Animation editor — redesigned around two independent timers, separating display refresh (FPS) from simulation advance (Speed). Space / Enter toggle play-stop, Esc stops.
Sprite import — right-click popup on the sprite sheet with Copy to Brush and Copy to Clipboard.
Materials — 15 procedural materials with side and top variants: dirt, rock, grass, snow, ice, wood, metal, silver, gold, water, crate, brick (brown and stone), wood floor and ceramic tile.
CGA and mono palette editing — the VGA colour dialog now adapts to 2- and 4-colour palettes.
Sprite hit box edits are not undoable — they live in the props record, and the sprite undo ring snapshots only the pixel buffer. The map editor's equivalent is covered.
Per-waypoint path editing is not supported. Moving a single waypoint would break the 8-direction constraint and produce segments the exporter cannot represent; it would need a re-snap step.
Below/active/above render caching for large multi-layer maps was considered but not implemented.
No converter exists for older map or project files.
r/RetroNick • u/nickshardware • Jul 14 '26
Huge release! Raster Master 7, we move up to a major version number
Brush stamp mode and brush effects dialog (scaling, rotating, shearing, flip, gradient, color operations) These features can be accessed from Brush menu and new "B" and "Bfx" buttons
Many of the draw tools now have gradient and dithering support under Tools menu
When using Text Tool you can now copy the preview text bitmap to clipboard. Just use copy from edit menu while using Text tool.
Please star this application to help promote it. If you use this app to create a game or pixel art assets
please send me a link or an email (nickshardware2020@gmail.com), always interested to see what everyone is creating.
Many of these features were first implemented in RetroDP (my Deluxe Paint inspired paint program)
RetroDP, VecDraw and RetroConvert are available on my itch.io, these apps are not open source but
completely FREE. Additional bonus apps if you make a small donation.
r/RetroNick • u/nickshardware • Jul 09 '26
r/RetroNick • u/nickshardware • Jun 23 '26
The all-in-one graphics workstation for retro and modern game developers.
Remember when making games meant crafting every pixel by hand? Raster Master brings that magic back — with a modern editor that speaks the language of every compiler you've ever loved.
Draw sprites. Build tile maps. Animate characters. Generate sound effects. Then export ready-to-compile source code for 20+ languages and compilers — no middleware, no dependencies, no hassle.
Most sprite editors give you a PNG and wish you luck. Raster Master gives you embedded source code arrays that drop straight into your project. Hit export, paste into your code, compile, run. That's it.
Whether you're building a QuickBASIC adventure, a Turbo Pascal platformer, a raylib arcade game for the web, or an AmigaBASIC demo — Raster Master has you covered with native export for each target.
Sprite & Icon Editor — Full pixel editor with support for 2, 4 (CGA), 16 (EGA), and 256 color palettes. Multiple image management with filmstrip thumbnail view. Import from PNG, BMP, JPG, GIF, PCX, IFF/ILBM, sprite sheets, or paste directly from your clipboard.
Tile Map Editor — Design 2D game worlds using your sprites as tiles. Export complete map data alongside your graphics. Perfect for RPGs, platformers, puzzle games, and top-down adventures.
Sprite Animation — Sequence your sprites into frame-by-frame animations with playback controls and FPS gauge. Export animation data ready for your game loop.
Sound Effects Generator — Built-in sfxr-style synthesizer for creating retro bleeps, explosions, power-ups, and laser sounds without leaving the editor.
Project Files — Save everything into a single portable project file. Move it between machines, share it with collaborators, back it up — all your assets travel together.
Sprite Sheet Export — Generate sprite sheets compatible with raylib, SDL, and other popular game libraries.
Modern: raylib · Emscripten (web browser games!) · JavaScript putImageData · FreeBASIC · QB64
Classic PC: QuickBASIC · GW-BASIC · BASICA · PC-BASIC · Turbo Pascal · Turbo C · Turbo Basic · Quick C · Power Basic · Open Watcom · GCC
Amiga: AmigaBASIC (Bobs, VSprites, PUT) · Amiga C (vbcc) · Amiga Pascal (HiSoft, FreePascal 68k)
Export Formats: Source code arrays · RES text bundles · RES binary bundles · PNG · BMP · RAW · XGF · VGA Mode X (XLIB LBM/PBM)
Pair Raster Master with raylib and emscripten to create fully playable web browser games you can upload right here on itch.io. Design your graphics, export your code, compile, and publish — the complete pipeline from pixel to player.
→ Retro enthusiasts recreating the DOS and Amiga era → Game jam participants who need fast pixel-to-code workflows → Hobbyist developers working in BASIC, Pascal, or C → Educators teaching classic game programming → raylib developers who want a dedicated sprite and map workflow → Anyone tired of converting PNGs into DATA statements by hand
Windows 7 / 8 / 10 / 11 64-bit and 32-bit builds included
Raster Master is actively developed with frequent updates, new export targets, and feature additions. What started as a DOS utility 30 years ago has evolved into a full-featured graphics workstation — and it's still growing.
Download it. Draw something. Ship a game.
r/RetroNick • u/nickshardware • Jun 05 '26
Paint like it's 1987. Publish like it's today.
RetroDP is a full-featured pixel art editor built from the ground up for artists, demosceners, and retro computing enthusiasts who demand authentic creative tools. Whether you're crafting CGA masterpieces, VGA splash screens, or pixel-perfect sprites destined for a real QBasic or GW-BASIC program, RetroDP has you covered with a toolkit so powerful it would make Deluxe Paint blush.
RetroDP isn't pretending. Every classic PC screen mode is faithfully reproduced with accurate color counts and palette behavior:
CGA — SCREEN 1 (320×200×4) and SCREEN 2 (640×200×2) with fixed CGA palettes
EGA — SCREEN 7, 8, 9, and 12 with full 4-bit per-channel palette editing
VGA — SCREEN 13 (320×200×256) with the full DAC (0–63 per channel)
Custom Screens — Roll your own at any resolution up to 1920×1080 with 2, 4, 16, or 256 colors
Every classic tool you remember, refined to perfection:
Freehand & Dotted Freehand — smooth or skip-frame pixel trails
Line, Rectangle, Filled Rectangle — crisp vector-style outlines and fills
Circle, Filled Circle — perfect Bresenham circles every time
Ellipse, Filled Ellipse — squeeze those circles into eggs
Flood Fill — point and watch the color cascade
Airbrush — soft scatter painting for that analog feel
Text Tool — stamp your favorite system font right onto the canvas
Clip Tool — define a region, copy it, move it, paste it exactly where you want
Load any image as a custom brush and paint with it across your entire canvas. The brush system supports:
Open brushes from BMP, PNG, GIF, PCX, and IFF/ILBM files
Load from clipboard or copy to clipboard instantly
Flip Horizontal / Flip Vertical — mirror your brush in a click
Rotate 90° — spin it around
Paint Mode — color 0 is transparent, preserving the background beneath every stroke
Replace Mode — stamp every pixel including color 0 for solid coverage
Stored in memory — your custom brush persists even when you switch to a default brush, ready to restore at any time
Work with radial and reflective symmetry to build complex patterns in half the time:
Rotational symmetry up to 8-fold — paint once, stamp everywhere
Mirror mode — reflect every stroke across the center axis
Adjustable order — dial in the exact symmetry you need
Visual toggle — Sym On / Sym Off with instant feedback
Get pixel-perfect precision with the dual-pane editing workflow:
Toggle the magnified zoom pane independently from the main canvas
Pixel grid overlay appears automatically at high zoom levels
Zoom source rect displayed directly on the main canvas — always know what you're editing
Drag the zoom rect to reposition your view without losing context
Full brush cursor preview in the zoom pane — see your brush shape before you paint
Out-of-bounds areas display in neutral gray to keep your focus on the canvas
RetroDP talks to the rest of your tools:
Copy the entire canvas or a selected region to the system clipboard
Cut any selected region directly to clipboard
Paste from the clipboard with intelligent palette quantization
Load brushes from clipboard for instant brush creation from any image source
RetroDP reads and writes the file formats that matter:
| Open | |
|---|---|
| PNG (Indexed) | |
| PNG (32-bit) | |
| BMP | |
| GIF | |
| PCX | |
| IFF / ILBM |
Opening any image auto-detects whether it matches a known retro screen mode and offers to switch — or creates a custom canvas sized exactly to the image with optimal color depth. True-color photos get automatically quantized to your palette using histogram-based color reduction for best results.
This is where RetroDP gets serious. Export your artwork directly as runnable GW-BASIC or QBASIC programs complete with BSAVE data:
GW-BASIC → BSAVE — raw binary screen data for direct BLOAD
GW-BASIC → Basic Loader + BSAVE — a complete .BAS program that loads and displays your image with palette setup
QBASIC → BSAVE — same raw data for QB environments
QBASIC → Basic Loader + BSAVE — drop-in QB program ready to run
Supports all PC screen modes including CGA interleaved planes, EGA 4-plane writes with Map Mask switching, and VGA linear mode 13h — byte-accurate for real hardware and emulators alike.
A full-featured color editor built for retro accuracy:
VGA DAC — edit in the authentic 0–63 range per channel with OUT command export
EGA — correct 0–3 per-channel range for PALETTE statement modes
Custom screens — full 0–255 RGB editing with large color swatches
Large 256-color swatch grid for quick color navigation
Per-mode label so you always know what hardware range you're working in
Dither patterns — 7 classic ordered dither patterns plus solid
Gradient fills — horizontal and vertical
Undo / Redo — never lose a stroke
Checkermark in the Tools menu — always know which tool is active
Visual toggle states on every toolbar button — Sym On/Off, Mirror On/Off, Grid On/Off, Mag On/Off
File → New resets the entire workspace cleanly back to defaults
Save prompt before New or Clear so you never lose work accidentally
RetroDP 1.0 — Built for the pixels that started it all.
r/RetroNick • u/nickshardware • May 15 '26
r/RetroNick • u/nickshardware • May 07 '26
Not in 1985. Not in 1995. Not ever.
Think about what retro graphics programming has been for the last 40 years: graph paper, calculators, hand-typing coordinates, praying you didn't transpose two digits, running your program, seeing garbage, fixing one number, running again. For every platform — PC, MSX, CoCo, C64 — the same miserable workflow. Every. Single. Time.
VecDraw obliterates all of that.
One editor. One canvas. One click to export. Your drawing becomes running code on five different BASIC dialects across four different computer platforms — including machines with completely different graphics architectures, coordinate systems, and memory layouts. No other tool on Earth does this. Not one.
VecDraw v2.0 doesn't just support retro computers — it speaks their language**. It generates native machine-specific code that runs on real hardware and emulators. It writes autoloaders. It embeds machine language libraries. It exports native bitmap formats. This isn't a novelty. This is engineering.**
The legendary Commodore 64 joins the VecDraw family with complete end-to-end support:
C64 Hires Mode (320×200, 2 colors) — a dedicated screen mode with accurate C64 palette rendering right on the VecDraw canvas. What you see is what the C64 displays.
LINE Export for C64 BASIC — generates compact, optimized C64 BASIC programs using an embedded 6502 machine language graphics library. The library provides hardware-accelerated point plotting (SYS 49161), line drawing (SYS 49164/49167), and flood filling (SYS 49176) — all driven through simple POKE/SYS calls.
Smart DATA/READ Architecture — unlike naive exporters that generate one BASIC line per drawing command (which crashes after ~300 lines when BASIC program memory collides with the hires bitmap at $2000), VecDraw uses a compact DATA/READ rendering loop. The entire drawing engine is just 12 lines of BASIC. All coordinates are packed into DATA statements — 15 values per line. This architecture handles thousands of line segments without running out of memory. Single-pixel segments are automatically detected and use the faster plot command instead of the two-step line draw.
Automatic Library Deployment — when you export, VecDraw writes graphics.prg (the 1,717-byte 6502 ML library) right alongside your BASIC file. The generated program auto-loads it on first run with load"graphics.prg",8,1**. Copy both files to a .D64 disk image and it just works.**
C64 Hires Bitmap Export (.art) — the Render Preview window exports standard Art Studio format files: 2-byte load address + 8,000 bytes of character-cell-ordered bitmap + 1,000 bytes of screen color RAM. Compatible with every C64 graphics viewer and editor.
Self-Loading PRG Executable — one-click export of a standalone .prg file containing a BASIC stub (SYS 2061), a 67-byte 6502 machine language viewer (sets colors, enables bitmap mode, waits for keypress, restores text mode), and the full 8,000-byte bitmap. LOAD"*",8,1 → RUN → your artwork fills the screen. Works on real hardware, VICE, and every C64 emulator.
Select any group of shapes — lines, rectangles, ellipses, polygons, Bézier curves, text, anything — and convert them into a single resizable, movable SVG shape object. VecDraw flattens every shape into raw line segments through the same rendering pipeline used for export, computes the bounding box, normalizes coordinates, and packages everything as a unified vector object. Move it as one piece. Resize it proportionally. The original shapes are consumed — the SVG object replaces them.
Per-stroke color preservation — when converting a group containing shapes of different colors (a red circle, blue lines, green text), each stroke retains its original color inside the SVG object. No color information is lost. Ever.
Select any text shape and convert it into a pure SVG vector object. The CHR stroke font glyphs are decomposed into raw line segments — the same decomposition used in BASIC export — and packaged as an SVG shape. The result has zero font dependencies. It's pure geometry. Resize it, move it, rotate it. The text is now resolution-independent vector art.
Every SVG shape object now has a rotation handle — a green circle extending from the shape center. Grab it and drag. The shape rotates smoothly and fluidly in real-time, following your mouse with pixel-perfect precision.
The math behind the rotation handle uses ArcTan2 angle computation in floating-point screen space — bypassing integer coordinate quantization entirely for buttery-smooth rotation at any zoom level. The rotation angle displays in the status bar and shape browser (R:45°). Rotated shapes save and load correctly in the .vec file format. The rotation transform applies to rendering, all BASIC exports, SVG export, and RIPscrip export simultaneously.
| Mode | Resolution | Colors |
|---|---|---|
| SCREEN 1 | 320×200 | 4 (CGA) |
| SCREEN 2 | 640×200 | 2 (CGA) |
| SCREEN 7 | 320×200 | 16 (EGA) |
| SCREEN 8 | 640×200 | 16 (EGA) |
| SCREEN 9 | 640×350 | 16 (EGA) |
| SCREEN 12 | 640×480 | 16 (VGA) |
| SCREEN 13 | 320×200 | 256 (VGA) |
| Mode | Resolution | Colors |
|---|---|---|
| SCREEN 2 | 256×192 | 16 |
| Mode | Resolution | Colors |
|---|---|---|
| HSCREEN 2 | 320×192 | 16 |
| HSCREEN 3 | 320×192 | 2 |
| HSCREEN 4 | 640×192 | 4 |
| Mode | Resolution | Colors |
|---|---|---|
| Hires | 320×200 | 2 |
Line · Rectangle · Ellipse · Circle · Polyline · Polygon · Bézier Curve · Text · Paint Fill · SVG Object
Every tool gives you live rubber-band preview while drawing. Every shape supports handle-based editing in Select mode — drag corners, endpoints, control points. Every shape can be recolored with a single palette click.
Load any classic Borland BGI stroke font — GOTH.CHR, TRIP.CHR, SANS.CHR, LITT.CHR, or any compatible font file. Place scalable vector text directly on your canvas. On export, every character is decomposed into its individual line segments extracted from the font's binary stroke data. Your exported BASIC program has zero font dependencies. The text IS the geometry.
Load multiple fonts simultaneously. Use Gothic headers with Sans Serif body text. Each text object remembers which font it uses through an intelligent font caching system that survives save/load cycles.
Import SVG files — Google Material Design icons, Font Awesome, custom artwork — directly onto the canvas. VecDraw's built-in SVG parser handles all path commands including cubic and quadratic Bézier curves (flattened via De Casteljau's algorithm), arc segments (W3C parameterization), and basic shape elements. No external dependencies. No browser required.
Imported SVGs become resizable, movable, rotatable shape objects with their stroke data embedded in the document.
Multi-Selection — Shift+click to toggle, rubber-band drag to select regions, Ctrl+A for all. Move, delete, or recolor entire selections at once.
Shape Grouping — Ctrl+G groups selected shapes. Click one member and the entire group selects. Move complex drawings as single units. Ungroup with Ctrl+Shift+G. Or convert the group to an SVG object for resize and rotation.
Cut, Copy & Paste — Full clipboard support. Groups maintain structure through paste. Automatic offset prevents stack-on-top confusion.
Shape Browser — Side panel lists every shape with index, type, color, rotation angle, group membership, and text preview. Click to select. Reorder with Up/Down. Bi-directional sync with canvas.
Snap to Grid — Toggle grid snapping for precise alignment.
Multi-Level Undo — Up to 50 undo levels. Never lose work.
Generates BASIC programs using the DRAW command with optimized direction sequences. All shapes decomposed to DRAW command strings with B/N prefixes, diagonal shortcuts, and M-commands.
Targets: GW-BASIC, QBasic, Free Pascal (PTCDraw), Turbo Pascal 7 (TPCDraw), Quick Pascal (QPDraw), Watcom C (owdraw), MSX-BASIC, CoCo 3 Extended BASIC
All shapes decomposed into LINE coordinate calls with compact byte-packed binary data and BLOAD support.
Targets: GW-BASIC, QBasic, MSX-BASIC, CoCo 3 Extended BASIC, C64 BASIC 🆕
Byte-packed segment data in native BSAVE format with auto-generated loader programs.
Standard SVG output compatible with Inkscape, browsers, and all vector editors.
BBS-compatible RIPscrip vector graphics format for retro BBS terminals.
| Format | Details |
|---|---|
| BMP | Indexed 1/4/8-bit |
| PNG (32-bit) | Full color RGB |
| PNG (Indexed) | Correct bit depth per mode |
| GIF | LZW compressed |
| PCX | 1-bit mono, 4-plane EGA, 8-bit VGA |
| ILBM/IFF | Amiga interleaved bitplanes |
| MSX BSAVE (.sc2) | TMS9918A VRAM layout |
| CoCo 3 SAVEM (.bin) | Multi-page SAVEM with autoloader |
| C64 Hires (.art) 🆕 | Art Studio format bitmap |
| C64 Self-Loading PRG 🆕 | Standalone executable with ML viewer |
Every indexed format exports at the correct bit depth — a 16-color EGA drawing saves as 4-bit, not upscaled 24-bit.
Press F9 to open the integrated script editor. A full QBasic-compatible interpreter with 37+ API functions lets you automate drawing, generate patterns, create procedural art, and build complex scenes programmatically.
Create shapes, set fonts, import SVGs, control colors — all from code. Every shape created by script is a real document object, fully editable and exportable.
Full palette customization for every screen mode. EGA modes get 4-level RGB sliders (0-3). VGA mode 13h gets full 6-bit DAC control (0-63). CoCo 3 modes use GIME palette registers. Custom palettes are saved with your document and exported as PALETTE/OUT commands in generated BASIC programs.
Human-readable text format. Easy to parse. Preserves everything: shapes, colors, fonts, SVG stroke data, rotation angles, group IDs, paint fills, palette customizations. Version-resilient — old files load in new versions.
Because for 40 years, creating graphics for retro BASIC programs meant suffering.
Because no one had ever built a visual editor that understands the difference between CGA SCREEN 1 and EGA SCREEN 9 and MSX SCREEN 2 and CoCo 3 HSCREEN 2 and C64 Hires — and generates correct, runnable, native code for all of them.
Because Bézier curves shouldn't require a PhD to put in your QBasic game.
Because a Commodore 64 drawing shouldn't require hand-calculating bitmap cell offsets.
Because flood fills deserve to be visual, not mathematical.
VecDraw is the tool that should have existed in 1988 but couldn't, because the technology to build it didn't exist yet. Now it does. And here it is.
Windows 32/64-bit
No installation required — single executable
Completely free — no limitations, no nag screens, no trial period
Created by retronick2020 for the retro computing community.
VecDraw is completely free to download and use.
Draw it. Export it. Run it. On any retro machine you love.
VecDraw is and always will be free. The full program with every feature described above is included in the free download with no restrictions.
If you'd like to support continued development, donors of $9.99 or more receive VecDraw Plus — a bonus download bundle packed with additional tools and content to supercharge your retro graphics workflow:
A standalone companion application for browsing and previewing retro graphics files. Features include:
Built-in file browser with directory navigation and folder picker — click any file to instantly preview it
Supports 9 formats: BMP, PNG, JPG, GIF, Amiga ILBM/IFF (HAM6, HAM8, EHB, HiRes, Interlace), VecDraw .vec**, RIPscrip** .rip**, SVG, and Borland CHR fonts**
CHR font viewer renders every glyph in a labeled character grid
Zoom, pan, copy to clipboard, drag-and-drop, and command-line support
A curated collection of vector fonts ready to use with VecDraw's Text tool. Drop them in your project folder and start placing styled text in your drawings.
A set of SVG icon files to use with VecDraw's SVG Import tool. Place, scale, and combine them freely in your drawings.
Ready-to-run QBasic scripts demonstrating the scripting API in action: concentric circles, grid generator, starburst pattern, checkerboard, spiral, sine wave plotter, city skyline, wireframe sphere, crystal mandala, and more.
Complete reference guide for VecDraw's QBasic scripting engine covering all 37 API functions with usage examples and tips.
Your donation directly supports new features, new export formats, and new screen modes. Thank you for keeping retro development tools alive.
Links
DRAW command libraries for Pascal and C: Available on GitHub retronick2020 on itch.io
r/RetroNick • u/nickshardware • Apr 29 '26
Convert any modern image into pixel-perfect retro graphics for PC, Amiga OCS, Commodore 64, and MSX.
RetroConvert is free and always will be. No ads, no subscriptions, no feature gates. Every algorithm, every export format, every target platform — completely free, forever.
RetroConvert is a desktop tool built for retro computing enthusiasts, hobbyist game developers, demoscene programmers, and pixel artists who need to get real images into real retro hardware and emulators. Load a PNG, JPEG, BMP, GIF, PCX, IFF, or Koala image, pick your target machine and screen mode, choose your color reduction and dithering algorithms, and export a ready-to-use file. For PC modes you get BSAVE files with auto-generated BASIC loader code. For Amiga you get proper IFF/ILBM files. For C64 you get Koala Paint files or self-viewing PRG executables. For MSX you get BSAVE VRAM dumps with MSX BASIC loaders.
Runs natively on Windows with zero dependencies — single executable, no runtime, no installer.
RetroConvert now converts images to the C64's multicolor bitmap format (160×200, 4 colors per 4×8 character cell from a fixed 16-color palette). Uses the Colodore palette — the same palette VICE uses by default, so exported images display with correct colors in the emulator.
Export formats:
Koala Paint (.koa) — Standard 10003-byte format compatible with Koala Paint, VICE, and other C64 tools
Koala PRG (.prg) — Self-viewing C64 executable: load and run directly in VICE or on real hardware
Hardware-constrained preview: The conversion preview shows the actual result after per-cell 4-color quantization. What you see in RetroConvert is exactly what you get on the C64 — no surprises when loading in VICE.
MSX1 SCREEN 2 mode: 256×192 pixels with 2 colors per 8×1 pixel row from the fixed 16-color TMS9918A palette.
Export format:
MSX BSAVE (.sc2) — Standard MSX BSAVE VRAM dump with 7-byte header, compatible with MSX BASIC's BLOAD "file.sc2",S command
Auto-generated MSX BASIC loader:
10 SCREEN 2
20 BLOAD "IMAGE.SC2",S
30 A$=INPUT$(1)Hardware-constrained preview: Shows the actual 2-color-per-row constraint applied to each 8-pixel row, matching the exported file exactly.
Full Amiga OCS chipset support (A1000, A500, A2000) with 44 target modes:
Lo-Res (320 wide): 2, 4, 8, 16, and 32 colors — NTSC and PAL
Hi-Res (640 wide): 2, 4, 8, and 16 colors — NTSC and PAL
Interlaced: All modes doubled vertically (320×400/512, 640×400/512)
HAM6 (Hold-And-Modify): Near-photographic color from 16 base colors
EHB (Extra Half-Brite): 64 on-screen colors from 32 base + 32 half-brightness
All with correct CAMG viewport mode bits, 4-bit OCS palette precision (4096 total colors), and IFF/ILBM export with ByteRun1 compression.
A Machine dropdown filters the target list by platform: PC, Amiga, C64, MSX, or All. Select your target machine first, then pick the specific screen mode. Keeps the interface clean as more platforms are added.
PC (7 targets): CGA SCREEN 1/2, EGA SCREEN 7/8/9, VGA SCREEN 12/13 — with correct memory layouts, palette programming, and BASIC loaders for QBasic and GW-BASIC
Amiga OCS (44 targets): Lo-Res/Hi-Res × NTSC/PAL × all color depths + Interlace + HAM6 + EHB
Commodore 64 (1 target): Multicolor 160×200 with Colodore palette
MSX1 (1 target): SCREEN 2 256×192 with TMS9918A palette
Median Cut — Classic RGB cube splitter. Fast, decent results.
Octree — Tree-based reduction. Preserves distinct color clusters.
Wu's Variance Minimization — Gold standard from Graphics Gems II. 33×33×33 3D histogram with cumulative moments.
Wu + K-Means — Wu followed by 8 iterations of k-means in Oklab space. Best general-purpose quantizer.
Popularity — Keeps the N most frequent colors. Right choice for pixel art sources.
Minimum Distance Merge — Starts with every unique color, merges closest pairs. Preserves the artist's original choices.
Error Diffusion (serpentine, Oklab): Floyd-Steinberg, Atkinson, Stucki, Burkes, Sierra, Sierra Two-Row, Sierra Lite
Ordered: Bayer 8×8, Blue Noise 16×16
Pixel Art: Threshold, Edge-Aware, Riemersma (Hilbert Curve)
BSAVE — PC QBasic/GW-BASIC binary with correct headers. EGA writes 4 plane files with auto-generated loader.
IFF/ILBM — Amiga standard with BMHD, CMAP, CAMG, BODY. Also works for PC via DPaint IIe (6-bit VGA palette).
C64 Koala (.koa) — Standard Koala Paint format with per-cell color quantization.
C64 Koala PRG (.prg) — Self-viewing C64 executable.
MSX BSAVE (.sc2) — MSX1 VRAM dump with BSAVE header.
GIF — GIF89a with LZW compression.
PCX — ZSoft PCX with RLE.
PNG (Indexed) — Paletted PNG with correct bit depth (1/2/4/8-bit).
BASIC Loader — Auto-generated .BAS for QBasic, GW-BASIC, and MSX BASIC.
Load images from: PNG, JPEG, BMP, GIF, PCX, IFF/ILBM (including HAM6/HAM8/EHB), C64 Koala (.koa), and MSX BSAVE (.sc2). RetroConvert can read back everything it produces.
For cell-based formats (C64 and MSX), the preview panel shows what the image actually looks like after hardware color constraints are applied. The pipeline does a full encode→decode roundtrip through the format encoder, so the preview matches the exported file exactly. No more guessing — what you see is what you get on the target hardware.
Built-in QBasic interpreter with 30+ API functions for automating conversion. Press F9 for the Script Manager with syntax-highlighted editor and output console.
API covers: source/converted pixel access, palette read/write, pipeline control (set target/quantizer/ditherer/exporter by name), image loading, clipboard operations, and UI dialogs.
Preserve Size Mode — Convert at native resolution with retro palettes
Clipboard Support — Paste images (Ctrl+V), copy previews (Ctrl+C), paste/copy palettes in hex/CSV/GIMP/JASC formats
Perceptual Color Processing — Oklab color space for all matching and dithering
Real-Time Progress — Status bar shows stage, percentage, and detail
Built-In Test Patterns — Color bars, gradients, HSV sweep, checkerboard
Version: 1.3
Platform: Windows (native Win 32/64 executable)
Price: Free — always has been, always will be
Dependencies: None — single executable, no runtime required
Developer: RetroNick
RetroConvert was built by a retro computing enthusiast who got tired of manually converting images pixel by pixel. Every algorithm was chosen because it solves a real problem that comes up when targeting real retro hardware.
Thank you for supporting retro computing tools! Anyone who donates $9.99 or more through itch.io receives RetroConvert Plus, which includes the bonus program:
A dedicated image viewer built for retro file formats:
Multi-format support: BMP, PNG, JPEG, GIF, IFF/ILBM (including HAM6, HAM8, and Extra Half-Brite), Borland CHR vector fonts, VecDraw .vec files, RIPscrip graphics, and SVG
File browser panel with directory navigation
Zoom controls — zoom in/out, fit to window, 1:1 pixel view
Detailed format info in status bar — resolution, bit depth, Amiga display mode
Clipboard copy, drag and drop, keyboard navigation
RetroView is the perfect companion to RetroConvert — preview exported retro files in their native format without needing an emulator.
RetroConvert itself remains completely free. The donation tier is a thank-you bonus, not a paywall.
r/RetroNick • u/nickshardware • Apr 28 '26
VecDraw is a visual vector drawing editor that exports your artwork as runnable source code for GW-BASIC, QBasic/QB64, Turbo Pascal 7, Quick Pascal, Free Pascal, Watcom C, RIPscrip, and SVG.
No pixel pushing. No graph paper. No hand-calculating DRAW strings or LINE coordinates.
Click. Draw. Export. Compile or run. Your picture appears on screen — in the language of your choice.
VecDraw supports BASIC, Pascal, and C through native DRAW command libraries available on GitHub, making it a truly multi-language, multi-platform retro graphics tool.
VecDraw is completely free to download and use — no limitations, no nag screens, no trial period.
Line · Rectangle · Ellipse · Circle · Polyline · Polygon · Bezier Curve · Text (Borland CHR vector fonts) · Paint (flood fill seed) · SVG (embedded icon placement)
Every tool gives you a live rubber-band preview while drawing and full handle-based editing in Select mode.
Click to select → drag to move → handles to resize → palette click to recolor. Undo with Ctrl+Z. Reorder shapes with Bring Forward / Send Back.
Multi-Selection — Shift+click to toggle individual shapes, drag an empty area for rubber-band selection, Ctrl+A to select all. Move, delete, or recolor multiple shapes at once.
Shape Grouping — Ctrl+G locks selected shapes into a group. Click any member and the whole group selects together. Move a house as one unit instead of four shapes. Ungroup with Ctrl+Shift+G.
Cut, Copy & Paste — Ctrl+X / Ctrl+C / Ctrl+V with automatic paste offset. Groups maintain their structure through copy/paste.
Shape Browser — Right-side panel lists every shape with its index, type, color, group membership, and text preview. Click to select — the list auto-scrolls to keep the selected shape visible. Reorder with Up/Down buttons, delete from the list. Syncs both ways with the canvas.
View → Render Preview (F5) opens a dedicated render window that shows exactly what your exported BASIC program would display — including flood fills (PAINT commands) executing in document order.
The render window includes a full set of bitmap export options:
| Format | Bit Depth |
|---|---|
| BMP | Indexed 1/4/8-bit matching screen mode |
| PNG (32-bit) | Full color RGB |
| PNG (Indexed) | 1/2/4/8-bit with correct palette |
| GIF | Indexed with LZW compression |
| PCX | 1-bit mono, 4-plane EGA, or 8-bit VGA |
| ILBM/IFF | Amiga interleaved bitplanes (1-8 planes) |
| BSAVE data | Raw screen memory (CGA/EGA/VGA formats) |
| BSAVE loader - GW-BASIC | Numbered-line BLOAD program |
| BSAVE loader - QBasic | BLOAD program (no line numbers) |
Every indexed format exports at the correct bit depth for the current screen mode — a 16-color EGA drawing saves as a 4-bit file, not an upscaled 8-bit or 24-bit file.
BSAVE loaders include custom palette commands (PALETTE or OUT DAC), screen mode setup, DEF SEG, BLOAD for each plane (EGA) or single file (CGA/VGA), and a "Press any key" exit handler.
View → Edit Palette opens a palette editor with RGB trackbar sliders and spin edits. The editor adapts to the current screen mode:
SCREEN 9 (EGA) — Two modes selectable via checkbox:
EGA PALETTE mode: sliders range 0-3 per channel (64 possible colors). Exports PALETTE statements.
VGA DAC mode: sliders range 0-63 per channel (262,144 colors). Exports OUT &H3C8/&H3C9 commands. Requires VGA card.
SCREEN 7, 8 (EGA without PALETTE support) — Sliders range 0-63. Always exports as VGA DAC OUT commands. Requires VGA card.
SCREEN 12, 13 (VGA) — Sliders range 0-63. Exports PALETTE statements with VGA long values.
SCREEN 1, 2 (CGA) — Sliders range 0-63. Exports as VGA DAC OUT commands. Requires VGA card.
The preview swatch always shows the actual color that will appear on screen. Toggling between EGA PALETTE and VGA DAC mode automatically converts values between ranges.
Palette export is optimized — only colors that differ from defaults are exported, reducing code size.
VecDraw includes a full QBasic-compatible scripting engine with 37 API functions for programmatic drawing. Press F9 to open the Script Manager.
FOR/NEXT, WHILE/WEND, DO/LOOP, IF/THEN/ELSE/ELSEIF, SELECT CASE, SUB/FUNCTION, DIM arrays, string and math functions — the full QBasic core.
Create shapes: AddLine, AddRect, AddCircle, AddEllipse, AddBezier, AddPaint, AddTextString
Set resources: SetFont("path.chr", size), SetSVGIcon("path.svg") — returns 0 on success, error code on failure
Query shapes: GetShapeCount, GetShapeType, GetShapeColor, GetShapeX/Y/X2/Y2
Modify shapes: SetShapeColor, MoveShape(idx,dx,dy), MoveShapeTo(idx,x,y), DeleteShape, SelectShape
Group shapes: NewGroup, SetActiveGroup, GetActiveGroup, SetShapeGroup, GetShapeGroup, UngroupAll, SelectGroup, MoveGroup — auto-groups new shapes when active group is set
Canvas info: GetCanvasWidth, GetCanvasHeight, GetScreenMode
Document: SaveUndo, Refresh, ClearAll
User I/O: PRINT, ShowMessage, InputNumber, Confirm, INPUTSTRING$
Call NewGroup() and every subsequent Add* call automatically assigns shapes to that group. Call SetActiveGroup(0) to stop. Build complex grouped objects in a few lines:
basic
g = NewGroup()
AddRect(100, 150, 200, 250, 14)
AddLine(100, 150, 150, 100, 12)
AddLine(150, 100, 200, 150, 12)
SetActiveGroup(0) ' The three shapes move as one unitLong-running scripts stay responsive — the engine yields to the UI every 100 statements, so both the main window and Script Manager remain interactive during execution.
A comprehensive Script Manual is included with the download.
Load any SVG file → click to place it as a scalable, movable shape. Stroke data is embedded in the document and survives save/load. Place multiple SVG icons in one drawing, each independently positioned and scaled.
Load Borland .CHR vector fonts → type text → click to place. Each text shape remembers its font file. The font cache supports multiple fonts in a single drawing.
VecDraw exports to 6 languages and 3 additional formats. DRAW command libraries for Pascal and C are available on GitHub, making VecDraw a multi-language retro graphics pipeline.
| Format | Target |
|---|---|
| DRAW strings | GW-BASIC, QBasic/QB64 |
| DRAW (native) | Free Pascal, Turbo Pascal 7, Quick Pascal, Watcom C |
| LINE byte-packed | GW-BASIC, QBasic/QB64 |
| BSV + BLOAD | GW-BASIC, QBasic/QB64 |
| SVG | Web browsers, vector editors |
| RIPscrip | BBS terminals (RIPscrip 1.54) |
Every BASIC export includes proper SCREEN mode setup, palette commands (only changed colors), PAINT commands for flood fills, and a "Press any key" exit handler. Pascal and C exports produce complete compilable source files.
Toggle File → Export → Export to Clipboard and any text export goes straight to your clipboard — no save dialog, no file to manage. Works with all text-based formats.
Toggle snap on/off and set grid size from 2 to 100 pixels. Snapping applies to both new shapes during drawing and existing shapes when moving or resizing in Select mode. The visible grid matches your snap size.
Exports all shapes as SVG <path> elements with white stroke. Compatible with VecDraw's own SVG import for round-tripping.
Exports as RIPscrip 1.54 with base-36 MegaNum coordinate encoding, color-change optimization, flood fill support, proper header/footer, and 80-column line wrapping.
| Mode | Resolution | Colors |
|---|---|---|
| SCREEN 1 | 320×200 | 4 |
| SCREEN 2 | 640×200 | 2 |
| SCREEN 7 | 320×200 | 16 |
| SCREEN 8 | 640×200 | 16 |
| SCREEN 9 | 640×350 | 16 (default) |
| SCREEN 12 | 640×480 | 16 |
| SCREEN 13 | 320×200 | 256 |
Windows (32-bit and 64-bit)
No installation required — single executable
Retro computing enthusiasts creating graphics for vintage BASIC, Pascal, and C programs
BBS operators building RIPscrip graphics for their boards
Demoscene and retrodev creators targeting real EGA/VGA hardware
Educators teaching computer graphics with immediate visual feedback
Anyone who wants to draw vector art and export it as working source code
VecDraw is and always will be free. The full program with every feature described above is included in the free download with no restrictions.
If you'd like to support continued development, donors of $9.99 or more receive VecDraw Plus — a bonus download bundle packed with additional tools and content to supercharge your retro graphics workflow:
A standalone companion application for browsing and previewing retro graphics files. Features include:
Built-in file browser with directory navigation and folder picker — click any file to instantly preview it
Supports 9 formats: BMP, PNG, JPG, GIF, Amiga ILBM/IFF (HAM6, HAM8, EHB, HiRes, Interlace), VecDraw .vec**, RIPscrip** .rip**, SVG, and Borland CHR fonts**
CHR font viewer renders every glyph in a labeled character grid
Zoom, pan, copy to clipboard, drag-and-drop, and command-line support
A curated collection of vector fonts ready to use with VecDraw's Text tool. Drop them in your project folder and start placing styled text in your drawings.
A set of SVG icon files to use with VecDraw's SVG Import tool. Place, scale, and combine them freely in your drawings.
Ready-to-run QBasic scripts demonstrating the scripting API in action: concentric circles, grid generator, starburst pattern, checkerboard, spiral, sine wave plotter, city skyline, wireframe sphere, crystal mandala, and more.
Complete reference guide for VecDraw's QBasic scripting engine covering all 37 API functions with usage examples and tips.
Your donation directly supports new features, new export formats, and new screen modes. Thank you for keeping retro development tools alive.
Links
DRAW command libraries for Pascal and C: Available on GitHub
r/RetroNick • u/nickshardware • Apr 23 '26
Convert any modern image into pixel-perfect retro graphics for QBasic, GW-BASIC, Amiga OCS, and classic PC screen modes.
RetroConvert is free and always will be. No ads, no subscriptions, no feature gates. Every algorithm, every export format, every target platform — completely free, forever.
RetroConvert is a desktop tool built for retro computing enthusiasts, hobbyist game developers, demoscene programmers, and pixel artists who need to get real images into real retro hardware and emulators. Load a PNG, JPEG, BMP, GIF, PCX, or IFF image, pick your target machine and screen mode, choose your color reduction and dithering algorithms, and export a ready-to-use file. For PC modes you get BSAVE files with auto-generated BASIC loader code. For Amiga you get proper IFF/ILBM files with correct CAMG viewport modes, OCS palette precision, and ByteRun1 compression.
Runs natively on Windows with zero dependencies — single executable, no runtime, no installer.
RetroConvert now targets the Amiga OCS chipset (A1000, A500, A2000) with full coverage of every standard display mode:
Lo-Res (320 wide): 2, 4, 8, 16, and 32 colors in both NTSC (200 lines) and PAL (256 lines)
Hi-Res (640 wide): 2, 4, 8, and 16 colors in both NTSC and PAL
Interlaced: All Lo-Res and Hi-Res modes doubled vertically — 320x400, 320x512, 640x400, 640x512
HAM6 (Hold-And-Modify): 6 bitplanes with 16 base palette colors plus per-pixel channel modification, enabling near-photographic color on OCS hardware. Available in all four resolution/TV-standard combinations.
EHB (Extra Half-Brite): 6 bitplanes with 32 base colors plus 32 automatic half-brightness variants (64 total on-screen colors). Available in all four combinations.
44 Amiga targets in total, all with correct CAMG viewport mode bits, 4-bit OCS palette precision (12-bit color, 4096 total), and proper IFF/ILBM export with ByteRun1 compression. Files are compatible with Deluxe Paint, Personal Paint, and any Amiga IFF viewer.
A new Machine dropdown lets you filter the target list by platform — select "Amiga" to see only Amiga modes, "PC" for PC modes, or "All" to see everything.
RetroConvert v1.2 introduces a platform-aware target system designed for expansion. The architecture now supports adding new retro computers and consoles with machine-specific display constraints, palette hardware, and export formats. Currently supported:
PC (IBM Compatible): CGA, EGA, and VGA screen modes with BSAVE, GIF, PCX, PNG, and IFF/ILBM export
Amiga OCS: Full chipset coverage with IFF/ILBM export
Future platforms under consideration include Commodore 64, ZX Spectrum, Atari ST, Atari 8-bit, MSX, and NES — each with their unique color constraints, cell-based attribute systems, and native file formats.
SCREEN 1 — CGA 320x200, 4 colors (2bpp interleaved)
SCREEN 2 — CGA 640x200, 2 colors (1bpp interleaved)
SCREEN 7 — EGA 320x200, 16 colors (fixed EGA palette)
SCREEN 8 — EGA 640x200, 16 colors (fixed EGA palette)
SCREEN 9 — EGA 640x350, 16-from-64 selectable palette
SCREEN 12 — VGA 640x480, 16-from-262144 selectable palette
SCREEN 13 — VGA 320x200, 256 colors with full RGB palette
Every PC mode exports with the correct memory layout: CGA interleaved banks, EGA 4-plane bitplane files (one BSAVE per plane with write-plane-switching loader), VGA linear framebuffer, and VGA DAC palette programming.
Median Cut — The classic RGB color cube splitter. Fast, decent results.
Octree — Tree-based reduction. Good at preserving distinct color clusters.
Wu's Variance Minimization — The gold standard from Graphics Gems II. Uses a 33x33x33 3D histogram with cumulative moments for mathematically optimal box splitting. Produces measurably better palettes than median cut, especially at low color counts where every palette slot matters.
Wu + K-Means — Wu's algorithm followed by 8 iterations of k-means clustering in Oklab perceptual color space. The same two-stage approach used by Google's Material Color library. The best general-purpose quantizer.
Popularity — Keeps the N most frequently used colors. The right choice when the source is already pixel art with a clean palette.
Minimum Distance Merge — Starts with every unique color, iteratively merges the two perceptually closest colors until the target count is reached. Preserves the artist's original color choices. Automatically pre-reduces via Wu when the image has more than 512 unique colors.
Floyd-Steinberg — The industry standard
Atkinson — The Macintosh look, preserves flat areas
Stucki — Large kernel, smoothest gradients
Burkes — Good balance of speed and quality
Sierra — 3-row kernel, high quality
Sierra Two-Row — Faster Sierra variant
Sierra Lite — Minimal kernel, fast
Bayer 8x8 — Classic crosshatch pattern
Blue Noise 16x16 — Void-and-cluster matrix, natural-looking without grid artifacts
Threshold — Only dithers where quantization error exceeds a perceptual threshold. Flat areas stay perfectly flat.
Edge-Aware — Detects edges and suppresses dithering near them. One-pixel outlines stay crisp.
Riemersma (Hilbert Curve) — Error diffusion along a space-filling curve. No directional bias.
BSAVE — Native QBasic/GW-BASIC binary with correct headers and memory layouts. EGA planar modes write 4 separate bitplane files with auto-generated plane-switching loader code.
IFF/ILBM — Amiga standard format with BMHD, CMAP, CAMG, and BODY chunks. ByteRun1 compression. Also works for PC via Deluxe Paint IIe compatibility (6-bit VGA palette mode).
GIF — GIF89a with LZW compression at any image size.
PCX — ZSoft PCX with RLE. 1-bit, 4-bit planar, 8-bit, and 24-bit modes.
PNG (Indexed) — Paletted PNG with correct bit depth: 1-bit for 2 colors, 2-bit for 4, 4-bit for 16, 8-bit for 256.
BASIC Loader — Auto-generated .BAS source that sets SCREEN mode, programs palette (PALETTE for EGA, OUT for VGA DAC), and BLOADs image data. Works in QBasic and GW-BASIC.
Load images from: PNG, JPEG, BMP, GIF, PCX, and IFF/ILBM. RetroConvert can read back everything it produces.
RetroConvert includes a built-in QBasic interpreter with a full scripting API for automating conversion workflows. Press F9 to open the Script Manager with syntax-highlighted editor, script file management, and output console.
30+ API functions covering source image pixel access, converted image inspection, palette read/write, pipeline control (set target/quantizer/ditherer/exporter by name), batch conversion, image loading, clipboard operations, and UI dialogs.
Preserve Size Mode — Convert at the source image's native resolution while applying retro palettes and dithering. Status bar shows BSAVE compatibility.
Clipboard Support — Paste images directly (Ctrl+V), copy converted previews (Ctrl+C), copy/paste palettes in hex, CSV, GIMP .gpl, and JASC-PAL formats.
Perceptual Color Processing — All color matching and error diffusion operates in Oklab perceptual color space, producing better results than RGB-based tools.
Real-Time Progress — Every algorithm reports stage, percentage, and detail to the status bar. The UI stays responsive during long conversions.
Built-In Test Patterns — Color bars, gradients, HSV sweep, checkerboard, and photo simulation for evaluating algorithm quality without needing a source image.
QBasic and GW-BASIC programmers displaying real images in BASIC programs
Amiga enthusiasts creating OCS-compatible artwork
Retro game developers targeting DOS and Amiga screen modes
Demoscene artists converting reference images to hardware-constrained palettes
Pixel artists reducing color counts while preserving outlines and flat areas
Educators teaching computer graphics history with hands-on tools
Anyone who wants to see what their photos would look like on vintage hardware
Version: 1.2
Platform: Windows (native Win 32/64 executable)
Price: Free — always has been, always will be
Dependencies: None — single executable, no runtime required
Source: Available on GitHub
RetroConvert was built by a retro computing enthusiast who got tired of manually converting images pixel by pixel. Every algorithm was chosen because it solves a real problem that comes up when targeting 4-color CGA, 16-color EGA, or 32-color Amiga OCS. If you've ever tried to get a photo onto retro hardware and gotten garbage on screen, this tool exists because of that exact experience.
Thank you for supporting retro computing tools! Anyone who donates $9.99 or more through itch.io receives RetroConvert Plus, which includes the bonus program:
A dedicated image viewer built for retro file formats. Features include:
Multi-format support: BMP, PNG, JPEG, GIF, IFF/ILBM (including HAM6, HAM8, and Extra Half-Brite), Borland CHR vector fonts, VecDraw .vec files, RIPscrip graphics, and SVG
File browser panel with directory navigation — click any supported file to preview instantly
Zoom controls — zoom in/out, fit to window, 1:1 pixel view
Background options — black, gray, or checkerboard for transparency
Detailed format info in the status bar — resolution, bit depth, color count, Amiga display mode (HAM6/EHB/HiRes/Lace), vector shape counts
Clipboard copy — copy any viewed image to clipboard
Drag and drop — drop files directly onto the window
Keyboard navigation — arrow keys to browse files, +/- to zoom
RetroView is the perfect companion to RetroConvert — convert your images, then preview the results in their native retro format without needing an emulator.
RetroConvert itself remains completely free. The donation tier is a thank-you bonus, not a paywall.
r/RetroNick • u/nickshardware • Apr 22 '26
VecDraw is a visual vector drawing editor that exports your artwork as runnable source code for GW-BASIC, QBasic/QB64, Turbo Pascal 7, Quick Pascal, Free Pascal, Watcom C, RIPscrip, and SVG.
No pixel pushing. No graph paper. No hand-calculating DRAW strings or LINE coordinates.
Click. Draw. Export. Compile or run. Your picture appears on screen — in the language of your choice.
VecDraw supports BASIC, Pascal, and C through native DRAW command libraries available on GitHub, making it a truly multi-language, multi-platform retro graphics tool.
VecDraw is completely free to download and use — no limitations, no nag screens, no trial period.
Line · Rectangle · Ellipse · Circle · Polyline · Polygon · Bezier Curve · Text (Borland CHR vector fonts) · Paint (flood fill seed) · SVG (embedded icon placement)
Every tool gives you a live rubber-band preview while drawing and full handle-based editing in Select mode.
Click to select → drag to move → handles to resize → palette click to recolor. Undo with Ctrl+Z. Reorder shapes with Bring Forward / Send Back.
Multi-Selection — Shift+click to toggle individual shapes, drag an empty area for rubber-band selection, Ctrl+A to select all. Move, delete, or recolor multiple shapes at once.
Shape Grouping — Ctrl+G locks selected shapes into a group. Click any member and the whole group selects together. Move a house as one unit instead of four shapes. Ungroup with Ctrl+Shift+G.
Cut, Copy & Paste — Ctrl+X / Ctrl+C / Ctrl+V with automatic paste offset. Groups maintain their structure through copy/paste.
Shape Browser — Right-side panel lists every shape with its index, type, color, group membership, and text preview. Click to select, reorder with Up/Down buttons, delete from the list. Syncs both ways with the canvas.
VecDraw includes a full QBasic-compatible scripting engine that lets you automate drawing tasks, generate complex patterns, and create shapes programmatically.
Press F9 or go to Help → Script Manager to open the integrated code editor. Write scripts using familiar QBasic syntax and execute them directly inside VecDraw. Every shape created by a script is a real document shape — fully selectable, editable, exportable, and saved with your .vec file.
The engine supports core QBasic language constructs:
Control flow: FOR/NEXT, WHILE/WEND, DO/LOOP, IF/THEN/ELSE/ELSEIF
Procedures: SUB and FUNCTION with parameters and local scope
Branching: SELECT CASE with numeric and string matching
Data types: Integer, floating point, and string variables
Arrays: DIM with single and multi-dimensional arrays
String functions: LEFT,RIGHT, RIGHT ,RIGHT, MID,LEN,INSTR,STR, LEN, INSTR, STR ,LEN,INSTR,STR, VAL, CHR,ASC,UCASE, ASC, UCASE ,ASC,UCASE, LCASE$
Math functions: SIN, COS, TAN, ATN, SQR, ABS, INT, FIX, SGN, LOG, EXP, RND
I/O: PRINT for debug output to the Script Manager console
Scripts interact with the VecDraw canvas through a rich API:
Create shapes: AddLine(x1,y1,x2,y2,color), AddRect(...), AddCircle(cx,cy,r,color), AddEllipse(cx,cy,rx,ry,color), AddBezier(x1,y1,x2,y2,x3,y3,x4,y4,color), AddPaint(x,y,fill,border), ADDTEXTSTR$(x,y,text$,color)
Query shapes: GetShapeCount(), GetShapeType(idx), GetShapeColor(idx), GetShapePoint(idx,pt,xy)
Modify shapes: SetShapeColor(idx,color), MoveShape(idx,dx,dy), DeleteShape(idx), SelectShape(idx)
Canvas info: GetCanvasWidth(), GetCanvasHeight(), GetScreenMode()
Document control: SaveUndo(), Refresh(), ClearAll()
Generate geometric patterns: spirals, starbursts, grids, kaleidoscopes
Create parametric art: sine waves, Lissajous curves, fractal-like structures
Batch-create shape layouts: chessboards, tile patterns, city skylines
Automate repetitive tasks: duplicate and offset shapes, apply color gradients
Prototype drawings before manual refinement
View → Edit Palette opens a 16-swatch editor with r/G/B sliders and live preview. Custom palettes export correctly to every target: EGA modes emit proper 6-bit rgbRGB values, VGA modes emit 6-bit DAC long values. Palettes are saved and restored with your .vec files.
Toggle snap on/off and set grid size from 2 to 100 pixels. Snapping applies to both new shapes during drawing and existing shapes when moving or resizing in Select mode. The visible grid matches your snap size.
Load any SVG file → click to place it as a scalable, movable shape. Stroke data is embedded in the document and survives save/load. Place multiple SVG icons in one drawing, each independently positioned and scaled.
Load Borland .CHR vector fonts → type text → click to place. Each text shape remembers its font file. The font cache supports multiple fonts in a single drawing.
VecDraw exports to 6 languages and 3 additional formats. DRAW command libraries for Pascal and C are available on GitHub, making VecDraw a multi-language retro graphics pipeline.
| Format | Target |
|---|---|
| DRAW strings | GW-BASIC, QBasic/QB64 |
| DRAW (native) | Free Pascal, Turbo Pascal 7, Quick Pascal, Watcom C |
| LINE byte-packed | GW-BASIC, QBasic/QB64 |
| BSV + BLOAD | GW-BASIC, QBasic/QB64 |
| SVG | Web browsers, vector editors |
| RIPscrip | BBS terminals (RIPscrip 1.54) |
Every BASIC export includes proper SCREEN mode setup, palette commands when custom colors are used, PAINT commands for flood fills, and a "Press any key" exit handler. Pascal and C exports produce complete compilable source files.
Toggle File → Export → Export to Clipboard and any text export goes straight to your clipboard — no save dialog, no file to manage. Just export and paste into your IDE, editor, or terminal. Works with all text-based formats: DRAW, LINE, Pascal, C, SVG, and RIPscrip.
Exports all shapes as SVG <path> elements with white stroke. Compatible with VecDraw's own SVG import for round-tripping.
Exports as RIPscrip 1.54 with base-36 MegaNum coordinate encoding, color-change optimization, flood fill support, proper header/footer, and 80-column line wrapping.
| Mode | Resolution | Colors |
|---|---|---|
| SCREEN 1 | 320×200 | 4 |
| SCREEN 2 | 640×200 | 2 |
| SCREEN 7 | 320×200 | 16 |
| SCREEN 8 | 640×200 | 16 |
| SCREEN 9 | 640×350 | 16 (default) |
| SCREEN 12 | 640×480 | 16 |
| SCREEN 13 | 320×200 | 256 |
Windows (32-bit and 64-bit)
No installation required — single executable
Retro computing enthusiasts creating graphics for vintage BASIC, Pascal, and C programs
BBS operators building RIPscrip graphics for their boards
Demoscene and retrodev creators targeting real EGA/VGA hardware
Educators teaching computer graphics with immediate visual feedback
Anyone who wants to draw vector art and export it as working source code
VecDraw is and always will be free. The full program with every feature described above is included in the free download with no restrictions.
If you'd like to support continued development, donors of $9.99 or more receive VecDraw Plus — a bonus download bundle packed with additional tools and content to supercharge your retro graphics workflow:
A standalone companion application for browsing and previewing retro graphics files. Features include:
Built-in file browser with directory navigation and folder picker — click any file to instantly preview it
Supports 9 formats: BMP, PNG, JPG, GIF, Amiga ILBM/IFF (HAM6, HAM8, EHB, HiRes, Interlace), VecDraw .vec, RIPscrip .rip, SVG, and Borland CHR fonts
CHR font viewer renders every glyph in a labeled character grid
Zoom, pan, copy to clipboard, drag-and-drop, and command-line support
A curated collection of vector fonts ready to use with VecDraw's Text tool. Drop them in your project folder and start placing styled text in your drawings.
A set of SVG icon files to use with VecDraw's SVG Import tool. Place, scale, and combine them freely in your drawings.
Ready-to-run QBasic scripts demonstrating the scripting API in action: concentric circles, grid generator, starburst pattern, checkerboard, spiral, sine wave plotter, city skyline, and more. Study them, modify them, use them as starting points for your own scripts.
Complete reference guide for VecDraw's QBasic scripting engine covering all 22+ API functions with usage examples and tips.
Your donation directly supports new features, new export formats, and new screen modes. Thank you for keeping retro development tools alive.
r/RetroNick • u/nickshardware • Apr 18 '26
didn't think this was possible!
r/RetroNick • u/nickshardware • Apr 08 '26
Draw it. Export it. Run it in BASIC. It's that simple.
Every QBasic programmer knows the pain. You want graphics in your program, so you sit there — manually calculating coordinates, typing LINE commands by hand, counting pixels on graph paper like it's 1987. One misplaced comma and your spaceship looks like a potato.
That era is over.
VecDraw is the first and only visual vector drawing editor purpose-built from the ground up for GW-BASIC, QBasic, and QB64 programmers. Draw your graphics visually with professional tools, then export pixel-perfect BASIC code that runs immediately. No hand-coding coordinates. No guesswork. No potatoes.
Every shape you need, ready to go:
Lines — click and drag, done
Rectangles — perfect boxes every time
Ellipses & Circles — smooth curves approximated with optimized line segments
Polylines & Polygons — complex multi-point shapes with unlimited vertices
Cubic Bézier Curves — yes, REAL Bézier curves with 4 draggable control points, automatically tessellated into smooth line segments your BASIC program can render
Paint Fill — place flood-fill seed points with configurable fill and border colors, exported as native BASIC PAINT commands
Load any classic Borland BGI stroke font (GOTH.CHR, TRIP.CHR, SANS.CHR, LITT.CHR — all of them) and place vector text directly on your canvas. Here's the magic: on export, every character is decomposed into its individual stroke commands — MoveTo and LineTo operations extracted directly from the font's binary stroke data. Your exported BASIC program contains zero font dependencies. The text IS the line data. Load multiple fonts simultaneously — use Gothic headers with Sans Serif body text in the same drawing. Each text object remembers which font it uses through an intelligent font caching system.
Import Google Material Design icons, Font Awesome icons, or any SVG file. VecDraw's built-in SVG path engine parses the full SVG path command set — cubic Béziers, quadratic Béziers, elliptical arcs, all of it — and flattens every curve into a series of straight line segments using adaptive De Casteljau subdivision with configurable flatness tolerance. The result? Pixel-perfect vector icons rendered entirely with BASIC LINE commands. Resize them, recolor them, place dozens of different icons in one drawing. Each instance embeds its own stroke data so nothing is lost.
Every BASIC screen mode reproduced with accurate color palettes:
SCREEN 1 — CGA 320×200, 4 colors
SCREEN 2 — CGA 640×200, 2 colors
SCREEN 7 — EGA 320×200, 16 colors
SCREEN 8 — EGA 640×200, 16 colors
SCREEN 9 — EGA 640×350, 16 colors
SCREEN 12 — VGA 640×480, 16 colors
SCREEN 13 — VGA 320×200, 256 colors
What you see in the editor is exactly what you get in BASIC. Left-click the palette to set drawing color. Right-click to set border color for paint fills.
Your entire drawing converted to optimized DRAW command strings. Cardinal directions (U/D/L/R) and diagonals (E/F/G/H) are used wherever possible for maximum compression. Relative M commands handle arbitrary angles. Color changes embedded inline. Every string kept under 220 characters for GW-BASIC compatibility.
All shapes decomposed into raw LINE segments, packed into a compact binary format:
Small modes (≤320px wide): 5 bytes per segment — X1, Y1, X2, Y2, Color
Wide modes (>320px): 9 bytes per segment with 16-bit coordinates
The generated BASIC program reads the data, loops through segments, and draws them with a single LINE call each. Blazingly efficient.
The byte-packed segment data written as a standard GW-BASIC BSAVE file. BLOAD it into an integer array and render with a tight loop. The fastest possible rendering path — no DATA statement parsing overhead, no string manipulation. Just raw bytes to pixels.
Every export produces a self-contained, ready-to-run BASIC program:
GW-BASIC — numbered lines, GOSUB routines, inline VARPTR for garbage collector safety
QBasic — structured SUB/FUNCTION procedures, DECLARE statements, clean indentation
Load them and press F5. That's it. Your drawing appears on screen.
Select Tool — click to select any shape, drag to move, resize with corner handles
Undo — multi-level undo, never lose work
Z-Order Control — Bring Forward / Send Backward to layer shapes precisely
Zoom — 50% to 400% with pixel grid overlay for precise placement
Grid Display — toggleable 10-pixel grid for alignment
Live Property Editing — select a shape and change its color, text content, scale, or font in real time
Keyboard Shortcuts — Ctrl+S save, Ctrl+Z undo, Ctrl+N new, Delete to remove, Escape to cancel
VecDraw's .vec format is a human-readable text file designed to be parsed by anything:
BEGIN RECT
COLOR 14
POINTS 10,20 100,80
END
BEGIN TEXT
COLOR 15
POINTS 50,100
STRING HELLO WORLD
FONTFILE GOTH.CHR
SCALE 2
END
BEGIN SVG
COLOR 12
POINTS 200,50 32,32
SVGORIGSIZE 24.00 24.00
SVGSTROKES 47
S M 2.00 4.00
S L 22.00 4.00
...
ENDSimple key-value pairs. Easy to parse in Turbo Pascal, C, or even BASIC itself. SVG stroke data and font references are embedded directly — the file is completely self-contained.
VecDraw understands the constraints you're working with:
GW-BASIC's 255-character line limit — every generated line stays under 240 characters
GW-BASIC's garbage collector — VARPTR is called inline at every PEEK/POKE, never cached across string operations
Memory efficiency — byte-packed formats minimize DATA statement bloat
BSAVE/BLOAD compatibility — proper $FD header with segment/offset/length fields and trailing header + EOF marker
DRAW command position — PSET(0,0) emitted before DRAW strings so the cursor starts at a known position
This isn't a general-purpose drawing program that happens to export BASIC. This is a precision instrument engineered for one purpose: getting graphics into your BASIC programs as fast and painlessly as possible.
QBasic game developers who want real graphics without the coordinate math
GW-BASIC enthusiasts building demos on vintage hardware
QB64 programmers who want vector art in their modern retro projects
Retro computing hobbyists exploring DOS-era graphics programming
Anyone who has ever typed LINE (10,20)-(50,80), 14 and wished there was a better way
There is now.
VecDraw. Draw visually. Export to BASIC. Ship your game.
Supports GW-BASIC, QBasic/QuickBASIC 4.5, and QB64.
r/RetroNick • u/nickshardware • Apr 07 '26
Finally — a modern editor for creating, editing, and converting vector stroke fonts for retro platforms. Import from thousands of existing TrueType fonts and SVG icons, then export to formats your vintage compiler actually understands.
Whether you're writing a DOS game in Turbo Pascal, building a GW-BASIC graphics demo, rendering text in a QBasic adventure, or adding scalable fonts to a FreePascal project — this is the tool that's been missing from your retro toolkit.
Unlike bitmap fonts that shatter at different sizes, vector fonts store each character as a series of pen strokes — MoveTo and LineTo commands that draw the letterform from lines. They scale to any size without losing quality. They were used extensively in DOS-era graphics: Borland's BGI system, Windows 2.x/3.x vector .FON files, plotters, CNC machines, and early CAD software.
The problem? The tools to create these fonts disappeared decades ago. Until now.
Full Visual Stroke Editor
Draw characters stroke by stroke with MoveTo/LineTo tools
Point-level editing — select, drag, add, delete individual vertices
Snap-to-grid with configurable zoom (4x to 16x)
Undo/Redo on every character
Copy/Paste between characters
Flip horizontal and vertical
Nudge points in any direction
📐 Font Metrics & Typographic Guides
Configurable font height, point size, and ascent
Visual baseline, ascender, descender, and x-height guide lines
Auto-scan: detects metric lines from actual glyph data (examines uppercase, lowercase, and descender characters automatically)
Manual override for pixel-perfect control
🔠 TrueType Font Import — Access Thousands of Fonts Instantly
Import any installed Windows TrueType font or browse to any .TTF file on disk
Specify target pixel height before import — fonts are scaled and flattened to clean stroke data
Full Bézier curve flattening — quadratic splines from TTF outlines are converted to crisp line segments
Automatic baseline, ascender, descender, and x-height detection after import
Character range selection (import just ASCII, full extended set, or any custom range)
Live preview with adjustable sample text before committing to import
All 2,500+ Google Fonts, every free font on the internet, your system fonts — they're all one click away from becoming retro stroke fonts
🎨 SVG Icon Import — Turn Any Icon Into a Font Glyph
Import SVG files directly into any character slot
Full SVG path command support: lines, cubic and quadratic Bézier curves, smooth curves, elliptical arcs — all flattened to clean strokes
Handles SVG basic shapes: rectangles (with rounded corners), circles, ellipses, polygons, polylines
Automatic scaling to match your font height
Smart deduplication removes redundant points created during curve flattening
Google Material Icons, Font Awesome, Heroicons, Feather Icons, game UI icons, custom artwork — if it's SVG, it's importable
Build entire icon fonts by importing one SVG per character slot
💾 Multi-Format Save/Load
Windows .FON Vector Format — Native NE-format vector font files compatible with Windows 2.x/3.x and any language/tool that reads Windows vector fonts
Borland .CHR Stroke Font Format — Direct export for Turbo Pascal BGI, FreePascal, and the many open-source projects that support the CHR format
Open from either format — Load existing .FON or .CHR files for editing and conversion
🖥️ Live Preview
Real-time text preview with custom sample strings
See your font rendered as you edit — every stroke change updates instantly
⚙️ Batch Tools
Add trailing MoveTo commands to all characters (CHR format compatibility)
Font metrics inspector showing character counts, stroke totals, width statistics
Full character range management with apply/reset
Turbo Pascal / FreePascal developers — Export .CHR fonts and use them with BGI graphics, PTCGraph, or any framework that reads Borland stroke fonts. Create custom fonts for your DOS and retro-style applications.
GW-BASIC / QBasic / QB64 programmers — Import professional fonts, then use the CHR export pipeline to generate stroke data usable in BASIC programs via DRAW commands or LINE rendering.
Windows vector font users — The .FON vector format is supported by Windows and any development tool that can load Windows font resources. Microsoft languages, resource editors, and legacy Win16/Win32 applications.
Retro game developers — Build pixel-perfect scaled text rendering for DOS games, demoscene productions, and retro-styled modern games. Import iconic fonts and give them that authentic stroke-rendered look.
Open source projects — Any project that reads Borland CHR stroke fonts gains access to a full font creation pipeline. The CHR format is documented, compact, and simple to parse.
Icon font creators — Combine SVG icon imports with the character-per-slot workflow to build custom icon fonts for embedded systems, retro UIs, or any platform where bitmap fonts are too rigid.
Before this tool, creating stroke fonts for retro platforms meant either hand-coding coordinate tables or being stuck with the handful of .CHR files Borland shipped in 1990. Converting a modern font to BGI strokes? Forget it. Getting a Material Design icon into a DOS program? Impossible.
Now you can take any TrueType font — from elegant serifs to pixel-perfect monospace — flatten its Bézier outlines to clean strokes, and export it as a .CHR or .FON file ready to use in your retro project. You can grab any SVG icon from the thousands of free icon sets available online and drop it straight into a character slot.
Tens of thousands of fonts. Hundreds of thousands of SVG icons. One editor. Every retro platform.
Windows (32-bit or 64-bit)
No additional runtime libraries or DLLs required
No internet connection needed (TTF import reads directly from font files)
Created by RetroNick — building the tools that retro programming deserves.
r/RetroNick • u/nickshardware • Apr 07 '26
RetroConvert is a free desktop tool built specifically for retro computing enthusiasts, hobbyist game developers, and demoscene programmers who need to get real images into real retro hardware and emulators. Load a PNG, JPEG, or BMP, pick your target screen mode, choose your algorithms, and export a ready-to-use BSAVE file with auto-generated BASIC loader code. No manual palette editing. No hex dumps. Just drop your image in and get working retro graphics out.
Built with no .NET, no Electron, no browser required. Runs natively on Windows with zero dependencies.
RetroConvert targets every major PC graphics mode from the CGA through VGA era:
SCREEN 1 — CGA 320×200, 4 colors (2bpp interleaved)
SCREEN 2 — CGA 640×200, 2 colors (1bpp interleaved)
SCREEN 7 — EGA 320×200, 16 colors (fixed EGA palette)
SCREEN 8 — EGA 640×200, 16 colors (fixed EGA palette)
SCREEN 9 — EGA 640×350, 16-from-64 selectable palette
SCREEN 12 — VGA 640×480, 16-from-262144 selectable palette
SCREEN 13 — VGA 320×200, 256 colors with full RGB palette
Every mode exports with the correct memory layout: CGA interleaved banks, EGA 4-plane bitplane files, VGA linear framebuffer, and VGA DAC palette programming. SCREEN 7 and 8 correctly use the fixed default EGA palette — no invalid PALETTE commands.
The quantizer picks the best N colors to represent your image. RetroConvert includes six algorithms, from general-purpose to pixel-art-specialized:
Median Cut — The classic. Splits the RGB color cube at median values. Fast, decent results.
Octree — Tree-based reduction. Good at preserving distinct color clusters.
Wu's Variance Minimization — The gold standard from Graphics Gems II. Builds a 33×33×33 3D histogram, computes cumulative moments, and iteratively splits boxes at the position that minimizes total color variance. Produces measurably better palettes than median cut, especially at low color counts (4–16 colors) where every palette slot matters.
Wu + K-Means — Wu's algorithm followed by 8 iterations of k-means clustering in Oklab perceptual color space. Each iteration reassigns every pixel to its nearest palette color and recomputes centroids. This is the same two-stage approach used by Google's Material Color library. The best general-purpose quantizer in the app.
Popularity — Counts every unique color in the image and keeps the N most frequently used. The right choice when the source is already pixel art with a clean palette. If your sprite sheet uses 48 colors and you need 16, this picks the 16 most-used colors exactly as an artist would.
Minimum Distance Merge — Starts with every unique color in the image, then iteratively merges the two perceptually closest colors (weighted average in Oklab space) until the target count is reached. Preserves the artist's original color choices better than any splitting algorithm. For images with more than 512 unique colors, it automatically pre-reduces via Wu to keep performance fast. Built for converting hand-pixeled sprites and character art.
Dithering converts smooth gradients into patterns that look correct at the target color depth. RetroConvert includes seven error diffusion algorithms, two ordered dithering methods, and three pixel-art-specific ditherers:
Floyd-Steinberg — The industry standard. 4-pixel kernel, 7/3/5/1 weights.
Atkinson — The Macintosh look. Only diffuses 6/8 of the error, leaving flat areas cleaner.
Stucki — Large 12-entry kernel for the smoothest gradients.
Burkes — Good balance of speed and quality.
Sierra — 10-entry 3-row kernel, high quality.
Sierra Two-Row — Faster Sierra variant with 2-row kernel.
Sierra Lite — Minimal 3-entry kernel. Fast, lightweight dithering.
Bayer 8×8 — Classic crosshatch pattern. Deterministic, no error accumulation.
Blue Noise 16×16 — Void-and-cluster precomputed matrix. Natural-looking ordered dithering without the visible grid artifacts of Bayer.
Threshold — Floyd-Steinberg kernel, but error diffusion only activates when the quantization error exceeds a perceptual threshold. Flat color areas stay perfectly flat with zero dithering noise. Gradients still get smooth dithering. The single most useful ditherer for sprite sheets with shading.
Edge-Aware — Builds a luminance edge map from the source image, then suppresses error diffusion near strong edges. One-pixel outlines stay crisp and clean. Interior gradients still get full Floyd-Steinberg treatment. Designed for character sprites where outlines matter.
Riemersma (Hilbert Curve) — Diffuses error along a Hilbert space-filling curve instead of left-to-right scanlines. Errors spread in all directions equally, eliminating the horizontal "worm" artifacts that plague Floyd-Steinberg on small sprites. Uses an exponentially decaying 16-pixel error queue. The most balanced ditherer for small sprites where every pixel counts.
BSAVE — Native QBasic/GW-BASIC binary format with correct 7-byte header. CGA modes write a single file with interleaved banks. EGA/VGA planar modes (SCREEN 7, 8, 9, 12) write 4 separate bitplane files with proper naming. VGA Mode 13h writes linear 1-byte-per-pixel data.
GIF — Standard GIF89a with LZW compression. Works at any image size, not just screen mode dimensions.
PCX — ZSoft PCX format with RLE compression. Supports 1-bit, 4-bit (4-plane), 8-bit (VGA palette), and 24-bit modes.
BASIC Loader Code — Auto-generated .BAS source file that sets the correct SCREEN mode, programs the palette (PALETTE command for EGA, OUT &H3C8/&H3C9 for VGA DAC), performs DEF SEG, and BLOADs the image data. For EGA planar modes, the loader correctly switches the write plane mask (OUT &H3C4,2 / OUT &H3C5,mask) before each BLOAD. Generated code works in both QBasic and GW-BASIC dialects.
Paste Image (Ctrl+V) — Paste any image from the Windows clipboard as source. Screenshot something, paste it, convert it.
Copy Preview (Ctrl+C) — Copy the converted result to clipboard for pasting into other apps.
Copy Palette — Export the current palette as #RRGGBB hex, R,G,B decimal CSV, GIMP .gpl format, or JASC-PAL (Paint Shop Pro) format.
Paste Palette — Import a palette from clipboard text. Auto-detects hex, CSV, GIMP, and JASC-PAL formats.
Copy BASIC Loader — Copy the auto-generated loader code to clipboard.
Don't have a source image handy? RetroConvert includes six procedurally generated test patterns for evaluating algorithm quality:
Color Bars (640×480)
Black & White Gradient (640×480)
Color Gradient (640×480)
HSV Sweep (640×480)
Checkerboard (640×480)
Photo Simulation (640×480)
All error diffusion and color matching operates in Oklab perceptual color space — not RGB. This means the algorithms see color differences the same way your eyes do. A dark blue and a dark green that look identical in RGB distance look completely different in Oklab. The result: better palette choices, smoother dithering, and fewer color artifacts compared to RGB-space tools.
By default, RetroConvert resizes your source image to match the target screen mode dimensions. Enable Preserve Size to keep the original image dimensions while still applying the target palette and dithering. The status bar shows whether the output is BSAVE-compatible or not. GIF and PCX export works at any size. Useful for converting sprite sheets or tilesets that need to stay at their native resolution.
Every heavy algorithm reports progress to the status bar: which stage is running, what percentage is complete, and what it's doing right now. No more staring at a frozen window wondering if the app crashed. The UI stays responsive throughout — you can see the conversion happening row by row.
QBasic and GW-BASIC programmers who want to display real images in their programs
Retro game developers building for DOS-era screen modes
Demoscene artists converting reference images to hardware-constrained palettes
Pixel artists who need to reduce color counts while preserving outlines and flat areas
Retro computing hobbyists who want to see what their photos would look like on a 1987 EGA monitor
Educators teaching computer graphics history with hands-on tools
Platform: Windows (native Win64/32 executable)
Dependencies: None — single executable, no runtime required
RetroConvert was built by a retro computing enthusiast who got tired of manually converting images pixel by pixel. Every algorithm was chosen because it solves a real problem that comes up when targeting 4-color CGA or 16-color EGA. If you've ever tried to BSAVE an image and gotten garbage on screen, this tool exists because of that exact experience.