# resynth resynthesis is the process of taking a source texture and creating similar (oft tiling) textures based on it. resynth is a C rewrite of the original resynthesizer by [Paul Harrison.][pfh] it does not require GIMP to function; just feed it image paths and it will save copies. however, this program lacks the patching (masking) and texture transfer abilities of the original plugin. resynth produces [tiling images like those seen here.][examples] [pfh]: http://logarithmic.net/pfh/ [examples]: http://logarithmic.net/pfh/resynthesizer/more ## related projects * [the original resynthesizer GIMP plugin in C++][orig] and [the associated paper][paper] * [an updated resynthesizer GIMP plugin in C and C++][gimp] * [syntex: similar algorithms based on resynthesizer in C#][syntex] [orig]: http://logarithmic.net/pfh/resynthesizer [paper]: http://www.logarithmic.net/pfh-files/thesis/dissertation.pdf [gimp]: https://github.com/bootchk/resynthesizer/ [syntex]: https://github.com/mxgmn/SynTex/ ## help ``` usage: -a --autism sensitivity to outliers range: [0,256]; default: 32 -N --neighbors points to use when sampling range: [0,1024]; default: 29 -r --radius square neighborhood, always odd range: [0,32]; default: [n/a] -R --circle-radius circle neighborhood radius range: [1,128]; default: [n/a] -M --tries random points added to candidates range: [0,65536]; default: 192 -p --polish extra iterations range: [0,9]; default: 0 -m --magic magic constant, affects iterations range: [0,255]; default: 192 -s --scale output size multiplier; negative values set width and height range: [-8192,32]; default: 1 -S --seed initial RNG value default: 0 [time(0)] {files...} image files to open, resynthesize, and save as {filename}.resynth.png required default: [none] ``` the `radius` and `polish` parameters should probably be properly described or removed. ### neighborhood offsets are sorted in ascending distance from the center (the 0,0 point). the order of equal distances is undefined. this probably doesn't matter matter, considering the algorithm handles non-circular neighborhoods just fine — more on that later. consider the first 29 offsets, which is the default number of neighbors: * distance of 0: `{ 0, 0}` * distance of 1: `{ 0,-1}, {+1, 0}, {-1, 0}, { 0,+1}` * distance of sqrt(2): `{-1,-1}, {-1,+1}, {+1,+1}, {+1,-1}` * distance of 2: `{+2, 0}, {-2, 0}, { 0,+2}, { 0,-2}` * distance of sqrt(5): `{-1,-2}, {-2,+1}, {-2,-1}, {+1,+2}, {-1,+2}, {+2,-1}, {+1,-2}, {+2,+1}` * distance of sqrt(8): `{+2,-2}, {-2,-2}, {-2,+2}, {+2,+2}` * distance of 3: `{+3, 0}, { 0,-3}, {-3, 0}, { 0,+3}` the default neighborhood of 29 yields a (pixelated) circle, as in this crude ascii art: ``` X XXXXX XXXXX XXXXXXX XXXXX XXXXX X ``` resynth provides a portion of [the associated integer sequence A057961,][A057961] allowing the neighborhood to be specified as a radius-like size, with guaranteed symmetry about the X and Y axes. this is the `-R` flag, and the first few values are visualized here: ``` -R1 -R2 -R3 -R4 -R5 -R6 -R7 X X XXX XXXXX XXXXX X XXX XXX XXXXX XXXXX XXXXX X XXX XXX XXXXX XXXXX XXXXX XXXXXXX X XXX XXX XXXXX XXXXX XXXXX X XXX XXXXX XXXXX X equivalent to -N1 -N5 -N9 -N13 -N21 -N25 -N29 ``` [A057961]: http://oeis.org/A057961 ## notes includes header libraries from [nothings (stb)][stb] and [notwa (kyaa).][kyaa] [stb]: https://github.com/nothings/stb [kyaa]: https://gist.github.com/notwa/5d287d807ffe11bbb553462c9940445c#file-kyaa-md compile like ``` clang -std=gnu11 -lm -Ofast resynth.c -o resynth ``` extra flags that i use are ``` -Wall -Wextra -Werror=implicit-function-declaration -Winline -Wshadow -Wno-unused -Wno-padded -Wno-missing-field-initializers -Wno-misleading-indentation -Wno-disabled-macro-expansion -Wno-language-extension-token -Wno-unknown-warning-option ```