tiled icon indicating copy to clipboard operation
tiled copied to clipboard

tmxrasterizer as a git diff tool: override search path, and allow explicitly writing to stdout

Open eevee opened this issue 1 year ago • 2 comments
trafficstars

Two little features would make it much easier to plug tmxrasterizer into git as a map differ:

  1. An argument for overriding the initial search path. The problem is, when git diffs two versions of the same file, it has to put at least one of them in a temporary file, and now it doesn't know where to find any of its tilesets. I know the original full path, but I have no way to provide it.

  2. Writing the image to stdout. This isn't strictly necessary since tempfiles are always an option, but it did surprise me a little that giving - as the outfile path literally created a file named - :)

With both, I believe you could diff a map against its committed version with a oneliner (in zsh, anyway):

compare -metric PHASH =(tmxrasterizer -s 0.25 -p $(dirname $1) $2 -) =(tmxrasterizer -s 0.25 -p $(dirname $1) $5 -) png:- | display -title "$1" -

eevee avatar Jan 08 '24 23:01 eevee

i fudged something similar by dumping the original file to a tempfile in the source directory (highly dubious), and i think this is a cool start:

scaled-down view of a map with some changed areas highlighted in red

eevee avatar Jan 10 '24 22:01 eevee

I quite like this idea! To implement this, the MapFormat interface would need to be extended with an option to read a map while using a custom search path:

https://github.com/mapeditor/tiled/blob/130b4f80a153bc928537ba8f5a045445ddb15ded/src/libtiled/mapformat.h#L73

The TMX format already has a function that can be used to implement such an interface:

https://github.com/mapeditor/tiled/blob/130b4f80a153bc928537ba8f5a045445ddb15ded/src/libtiled/mapreader.h#L68

The JsonMapFormat can also be quite trivially extended with such an overload. For other formats, I guess providing a default implementation that ignores the custom search path would be fine for now, so we don't need to change all the implementations.

Finally, we would add a Tiled::readMap overload that takes this search path, and we can use it in TmxRasterizer.

And I don't think it'll be an issue to get - to output a PNG to standard out, either. :-)

bjorn avatar Jan 11 '24 12:01 bjorn