Pimp My Diff

Mar 18, 2010 10:52

Все наверное знают, что в VCS хорошо хранить не только исходники, но и бинарные файлы, причем современные VCS умеют (с помощью xdelta etc) сжимать изменения между версиями и для бинарных файлов тоже [1].

Очевидное применение - хранить всякие картинки и текстурки в git, сэкономив десяток килобаксов на непокупке AlienBrain[2].
Дальше нам нужен diff тул, который умеет показывать изменения в картинках. Почти все графические дифферы умеют это делать, но только для попсовых форматов типа PNG-JPG и, насколько мне известно, никто из них не умеет диффать адобовский PSD.





Широко доступных способов читать PSD сейчас несколько: ImageMagick[3], FreeImage[4] и "PsdPlugin for PaintNet"[5]. Проще всего проблема решается, если вам не жалко денег на платный диффер: к Araxis[6] и BeyondCompare[7] штатными средствами прикручивается статически слинкованный convert от ImageMagick.

Но люди, в массе, любят бесплатное (а в Araxis еще и зума нет, и с моим cygwin-git он не дружит наотрез), что приводит нас к Preforce's p4merge[8].

Perforce написан на QT4 и расширяется плагинами, у них в блоге так и написано: "To add support for other image file types you can create a Qt Image Plugin." - и ссылка на пример.

Качаем QT Creator, ставим, компилируем пример, втыкаем - совершенно никакой реакции. Читаем первоисточники: грубо говоря у QT нет никакого ABI - мне нужны библиотеки как у Perforce, компилятор как у Perforce (no one's slick as Gaston, no one's quick as Gaston). У них QT 4.5.2 и VC++ 2005, dll-и называются типа QTCoreP44.dll. Скачал MSVS 2005 Express, но оказалось что во времена версии 4.5.2 LGPL сборки давали только под mingw - нашел у доброго человека на code.google версию 4.5.3. С помощью dumpbin сделал либы из их dll-ей. Собрал, воткнул - никакой реакции. Прицепил ресурсные файлы, добавил кучу дефайнов - no way.

Совсем уже отчаялся, но потом, погуляв, догадался посмотреть на их родные плагины в hex-редакторе. У всех нормальных людей "buildkey= Windows msvc release full-config", у них "Windows msvc release full-config no-stl"[9]. Откуда я об этом должен был догадаться? Тщательное обшаривание ftp сервера Perforce показало, что они приглашая писать плагины забыли приложить хотя бы заголовочные файлы от своей версии QT. Ну да ладно, пропатчил свою версию исходников - теперь все работает (писать сам плагин было совсем неинтересно).

Ta-da! FreeImage plugin [10] (read-only) для QT4, работающий с P4Merge/NTX86/2009.2/236331. Отважный читатель может собрать его под другие версии и платформы.

[1]: http://joshcarter.com/productivity/svn_hg_git_for_home_directory
[2]: http://www.alienbrain.com/pricing
[3]: http://www.imagemagick.org
[4]: http://freeimage.sourceforge.net/
[5]: http://psdplugin.codeplex.com/
[6]: http://www.araxis.com/merge/index.html
[7]: http://www.scootersoftware.com/moreinfo.php
[8]: http://blog.perforce.com/blog/?p=1394
[9]: http://qt.nokia.com/doc/4.0/plugins-howto.html#the-build-key
[10]: http://github.com/downloads/zoon/FreeImage-Plugin-for-QT4/qfreeimage4.dll

Previous post Next post
Up