Skip to content

Instantly share code, notes, and snippets.

@LingDong-
LingDong- / encode_anim_gif.js
Created September 15, 2023 00:27
minimal animated GIF encoder in 50 lines
// encode_anim_gif.js
// minimal code to make animated GIFs from arrays of pixels
// - no compression
// - supports 127 colors (127 shades of gray by default)
function encode_anim_gif(frames,w,h,delay=5){
let bytes = [];
bytes.push(0x47,0x49,0x46,0x38,0x39,0x61);
bytes.push(w&0xff);
bytes.push((w>>8)&0xff);
@LingDong-
LingDong- / bsl124.py
Created June 1, 2023 19:59
(minimal) TI MSP430 μC 1,2,4 Family BSL flasher (slau319af)
"""
bsl124.py
(minimal) TI MSP430 1,2,4 Family BSL flasher
using pyserial, works on windows, mac, and linux
- implementation of slau319af.pdf
- programming MSP430 chips via USB-TTL / FTDI / ...
- supports Intel HEX format
- supports F1xx, F2xx, F4xx, G2xx3 chips
@LingDong-
LingDong- / bpmrw.h
Created April 19, 2023 15:58
tiny .BMP image reader/writer in C99
/*
bmprw.h
tiny .BMP image reader/writer in C99
with no memory allocations
reader supports:
- 1, 4, 8, 24, 32 bit depth, palette / no palette
- RLE4 / RLE8 compression / no compression
@LingDong-
LingDong- / png_write1.js
Created October 10, 2022 20:05
a baseline somewhat-compressing PNG writer in 150 lines
// baseline somewhat-compressing PNG writer in 150 lines
//
// - supports gray, gray+A, RGB, RGBA, bit depth : 8
// - uses "fixed" huffman codes of DEFLATE spec
// - compresses well for graphics with large "flat" areas,
// basically pixel-wise run-length encoding translated to LZ77 style <len,dist>,
// always filtered with SUB filter
// - writes IHDR, IDAT, IEND -- optional chunks can be
// passed as function argument to be encoded (see example)
//
@LingDong-
LingDong- / png_read.js
Created October 10, 2022 15:05
a baseline PNG decoder in 400 lines
// baseline PNG decoder in 400 lines
//
// - supports all color types: RGBA, RGB, gray+A, gray, paletted
// - supports all bit depths: 1, 2, 4, 8, 16 bits (color type dependant, per spec)
// - allways return RGBA(0-255) format: other color+bit combinations will be scaled
// - downscaled 16-bit values retain floating point, e.g. 1000/65535 -> 3.89/255
// - support transparency palette / chroma-key
// - supports interlaced / non-interlaced
// - supports all zlib methods: non-compressed / fixed / dynamic huffman
// - supports all filters: none / sub / up / average / paeth
@LingDong-
LingDong- / png_write.js
Last active October 10, 2022 20:06
a bare minimum, non-compressing PNG writer in 80 lines
// a bare minimum, non-compressing PNG writer in 80 lines
//
// - supports gray, gray+A, RGB, RGBA, bit depth: 8 (0-255)
// - uses "non-compressed blocks" of DEFLATE spec
// - writes IHDR, IDAT, IEND -- optional chunks can be
// passed as function argument to be encoded (see example)
//
// reference:
// - https://en.wikipedia.org/wiki/Portable_Network_Graphics
// - https://datatracker.ietf.org/doc/html/rfc1951
@LingDong-
LingDong- / core_midi_synth.mm
Last active May 19, 2023 08:23
a barebones midi synthesizer calling mac's low level API (CoreMIDI and CoreAudio) directly
//
// core_midi_synth.mm
//
// a barebones midi synthesizer demo that calls
// mac's low level API (CoreMIDI and CoreAudio) directly
// (because I can't be bothered to compile other people's libraries)
//
// with code fragments adapted from
// - https://stackoverflow.com/a/7964300
// - https://github.com/thestk/rtmidi
@LingDong-
LingDong- / Wormhole.java
Created September 13, 2021 02:22
applet to create cursor "wormholes" connecting different displays
// Wormhole.java
// Lingdong Huang 2021, Public domain
// Simple app to create "wormholes" connecting different displays:
// When cursor enters a black patch, it comes out from the other
// Idea inspired by this mac app "Wormhole by Tod LLC": https://macdownload.informer.com/wormhole1/
// I implemented the idea in java to work on Windows
//
// Usage:
// javac Wormhole.java; java Wormhole <x0> <y0> <x1> <y1>
// (arguments being the positions of the two holes)
@LingDong-
LingDong- / triangulateMTX.ts
Created March 24, 2021 19:15
TypeScript implementation of Mei-Tipper-Xu algorithm for polygon triangulation
/* ===============================================================================
* triangulateMTX.ts
* TypeScript implementation of Mei-Tipper-Xu algorithm for polygon triangulation
* (c) Lingdong Huang 2020 (MIT License)
* =============================================================================== */
namespace triangulateMTX{
export function triangulate(
vertices : Array<[number,number]>,
params : {sliverThreshold? : number,
greedyHeuristic? : boolean,
@LingDong-
LingDong- / ln.c
Last active April 10, 2024 08:59
simple, fast, accurate natural log approximation without <math.h>
// ln.c
//
// simple, fast, accurate natural log approximation
// when without <math.h>
// featuring * floating point bit level hacking,
// * x=m*2^p => ln(x)=ln(m)+ln(2)p,
// * Remez algorithm
// by Lingdong Huang, 2020. Public domain.