Gifcurry 2.2.0.0 → 2.3.0.0
raw patch · 10 files changed
+369/−186 lines, 10 filesbinary-added
Files
- CHANGELOG.md +30/−108
- Gifcurry.cabal +5/−3
- README.md +70/−48
- makefile +1/−2
- src/data/gifcurry-icon.png binary
- src/data/gifcurry-logo.svg +143/−0
- src/data/gui.glade +45/−11
- src/data/icon.ico binary
- src/gui/Main.hs +61/−10
- src/lib/Gifcurry.hs +14/−4
CHANGELOG.md view
@@ -2,16 +2,27 @@ ## Changelog -### Version+### 2.3.0.0 -2.2.0.0+#### Added -#### Downstreams+- Support for GTK 3.10+- Logo to about dialog+- `findOrCreateTemporaryDirectory` to Gifcurry library API -- [Hackage](https://hackage.haskell.org/package/Gifcurry-2.2.0.0)-- [Docker](https://hub.docker.com/r/lettier/gifcurry/)-- [Arch Linux AUR](https://aur.archlinux.org/packages/gifcurry)+#### Changed +- Switched icon from ICO to PNG+- Use XdgCache location for cross compatible way of storing temporary files++#### Removed++- ICO files++-------------------------------------------------------------------------------++### 2.2.0.0+ #### Added - Loading a video now populates the start and duration fields@@ -46,13 +57,7 @@ ------------------------------------------------------------------------------- -### Version--2.1.1.0--#### Downstreams--- [Hackage](https://hackage.haskell.org/package/Gifcurry-2.1.1.0)+### 2.1.1.0 #### Added @@ -71,13 +76,7 @@ ------------------------------------------------------------------------------- -### Version--2.1.0.0--#### Downstreams--- [Hackage](https://hackage.haskell.org/package/Gifcurry-2.1.0.0)+### 2.1.0.0 #### Added @@ -102,13 +101,7 @@ ------------------------------------------------------------------------------- -### Version--2.0.0.2--#### Downstreams--- [Hackage](https://hackage.haskell.org/package/Gifcurry-2.0.0.2)+### 2.0.0.2 #### Added @@ -124,13 +117,7 @@ ------------------------------------------------------------------------------- -### Version--2.0.0.1--#### Downstreams--- [Hackage](https://hackage.haskell.org/package/Gifcurry-2.0.0.1)+### 2.0.0.1 #### Added @@ -147,13 +134,7 @@ ------------------------------------------------------------------------------- -### Version--2.0.0.0--#### Downstreams--- [Hackage](https://hackage.haskell.org/package/Gifcurry-2.0.0.0)+### 2.0.0.0 #### Added @@ -171,13 +152,7 @@ ------------------------------------------------------------------------------- -### Version--0.1.1.0--#### Downstreams--- [Hackage](https://hackage.haskell.org/package/Gifcurry-0.1.1.0)+### 0.1.1.0 #### Added @@ -195,13 +170,7 @@ ------------------------------------------------------------------------------- -### Version--0.1.0.6--#### Downstreams---+### 0.1.0.6 #### Added @@ -217,13 +186,7 @@ ------------------------------------------------------------------------------- -### Version--0.1.0.5--#### Downstreams--- [Hackage](https://hackage.haskell.org/package/Gifcurry-0.1.0.5)+### 0.1.0.5 #### Added @@ -239,13 +202,7 @@ ------------------------------------------------------------------------------- -### Version--0.1.0.4--#### Downstreams--- [Hackage](https://hackage.haskell.org/package/Gifcurry-0.1.0.4)+### 0.1.0.4 #### Added @@ -261,13 +218,7 @@ ------------------------------------------------------------------------------- -### Version--0.1.0.3--#### Downstreams--- [Hackage](https://hackage.haskell.org/package/Gifcurry-0.1.0.3)+### 0.1.0.3 #### Added @@ -283,13 +234,7 @@ ------------------------------------------------------------------------------- -### Version--0.1.0.2--#### Downstreams--- [Hackage](https://hackage.haskell.org/package/Gifcurry-0.1.0.2)+### 0.1.0.2 #### Added @@ -305,13 +250,7 @@ ------------------------------------------------------------------------------- -### Version--0.1.0.1--#### Downstreams--- [Hackage](https://hackage.haskell.org/package/Gifcurry-0.1.0.1)+### 0.1.0.1 #### Added @@ -327,13 +266,7 @@ ------------------------------------------------------------------------------- -### Version--0.1.0.0--#### Downstreams--- [Hackage](https://hackage.haskell.org/package/Gifcurry-0.1.0.0)+### 0.1.0.0 #### Added @@ -346,14 +279,3 @@ #### Removed ------------------------------------------------------------------------------------## License--See [LICENSE](LICENSE).--## Copyright--(C) 2017 David Lettier -[lettier.com](http://www.lettier.com/)
Gifcurry.cabal view
@@ -1,5 +1,5 @@ name: Gifcurry-version: 2.2.0.0+version: 2.3.0.0 synopsis: GIF creation utility. description: Create animated GIFs, optionally overlaid with text, from video files. homepage: https://github.com/lettier/gifcurry@@ -18,10 +18,12 @@ , ./lib/GtkMainSyncAsync.hs , ./lib/LICENSE , ./src/dev/Paths_Gifcurry.hs- , ./src/data/icon.ico+ , ./src/data/gifcurry-logo.svg+ , ./src/data/gifcurry-icon.png , ./makefile data-files: data/gui.glade- , data/icon.ico+ , data/gifcurry-logo.svg+ , data/gifcurry-icon.png data-dir: ./src/ cabal-version: >=1.10
README.md view
@@ -16,16 +16,24 @@ ## CLI Usage ```bash-gifcurry_cli \- -i inputFile \- -o outputFile \- -s startTime \- -d durationTime \- -w widthSize \- -q qualityPercent \- -f fontChoice \- -t topText \- -b bottomText+gifcurry_cli [OPTIONS]++Common flags:+ -i --inputfile=FILE The input video file path and name.+ -o --outputfile=ITEM The output GIF file path and name.+ -s --starttime=NUM The start time (in seconds) for the first frame.+ -d --durationtime=NUM How long the GIF lasts (in seconds) from the start+ time.+ -w --widthsize=INT How wide the GIF needs to be. Height will scale to+ match.+ -q --qualitypercent=NUM Ranges from 0.0 to 100.0.+ -f --fontchoice=ITEM Choose your desired font for the top and bottom+ text.+ -t --toptext=ITEM The text you wish to add to the top of the GIF.+ -b --bottomtext=ITEM The text you wish to add to the bottom of the GIF.+ -? --help Display help message+ -V --version Print version information+ --numeric-version Print just the version number ``` ## CLI Example@@ -51,7 +59,7 @@ __/ | |___/ -Gifcurry 2.2.0.0+Gifcurry 2.3.0.0 (C) 2016 David Lettier lettier.com @@ -75,35 +83,59 @@ ## Dependencies -* [Haskell](https://www.haskell.org/platform/)+### Run++* [GTK+](http://www.gtk.org/download/index.php) * [FFmpeg](https://www.ffmpeg.org/download.html) * [ImageMagick](http://www.imagemagick.org/script/download.php)-* [GTK+](http://www.gtk.org/download/index.php) +### Build++* [Haskell](https://www.haskell.org/platform/)+ ## Install & Run ### Linux +#### [AppImage (GUI Only)](https://appimage.github.io/gifcurry/)++```bash+# Install FFmpeg (https://www.ffmpeg.org/download.html)+# Install ImageMagick (https://www.imagemagick.org/script/download.php)+# Install GNU Wget (https://www.gnu.org/software/wget/) or download the AppImage with your browser+# Find the latest release at https://github.com/lettier/gifcurry/releases+# * equals the version number+# Download gifcurry-*-x86_64.AppImage+# Right click on the AppImage and allow the file to be executed as a program+wget https://github.com/lettier/gifcurry/releases/download/*/gifcurry-*-x86_64.AppImage+chmod a+x gifcurry-*-x86_64.AppImage+./gifcurry-*-x86_64.AppImage+# If you would like to install the AppImage, you can run the following+cd+wget "https://raw.githubusercontent.com/lettier/gifcurry/master/packaging/linux/gifcurry-gui-install.sh" -O "gifcurry-gui-install.sh"+chmod +x "gifcurry-gui-install.sh"+./gifcurry-gui-install.sh+```+ #### Ubuntu/Mint ```bash # Install FFmpeg (https://www.ffmpeg.org/download.html) # Install ImageMagick (https://www.imagemagick.org/script/download.php)-sudo add-apt-repository ppa:kirillshkrogalev/ffmpeg-next+sudo add-apt-repository ppa:jonathonf/ffmpeg-3 sudo apt-get update sudo apt-get install ffmpeg imagemagick-# Install Haskell (https://www.haskell.org/platform/) # Install GNU Wget (https://www.gnu.org/software/wget/) # Find the latest release at https://github.com/lettier/gifcurry/releases # * equals the version number wget https://github.com/lettier/gifcurry/releases/download/*/gifcurry-linux-*.tar.gz tar -xvfz gifcurry-linux*.tar.gz cd gifcurry-linux-*/bin-./gifcurry_gui ./gifcurry_cli -?+./gifcurry_gui ``` -#### Arch/Manjaro+#### Arch/Manjaro/Antergos ```bash cd@@ -117,8 +149,8 @@ makepkg -sic cd rm -rf build_gifcurry-gifcurry_gui gifcurry_cli -?+gifcurry_gui ``` ### Mac@@ -126,8 +158,9 @@ #### Binaries ```bash-# If you do not have Homebrew+# Install Homebrew /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"+brew update brew install ffmpeg brew install imagemagick brew install ghostscript@@ -138,43 +171,32 @@ wget https://github.com/lettier/gifcurry/releases/download/*/gifcurry-macosx-*.tar.gz tar xvfz gifcurry-macosx-*.tar.gz cd gifcurry-macosx-*/bin-./gifcurry_gui ./gifcurry_cli -?+./gifcurry_gui ``` #### Compile ```bash-# If you do not have Homebrew+# Install Homebrew /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" brew update brew install xcode brew install git-brew install ghc-sudo chown -R $(whoami):admin /usr/local/bin-brew link ghc-brew install cabal-install-brew install pkg-config-brew install glib-brew install gtk+3-brew install cairo-brew install pango-brew install ffmpeg-brew install imagemagick-brew install ghostscript-brew install gnome-icon-theme-mkdir gifcurry-cd gifcurry-cabal sandbox init-cabal update-cabal install alex happy -j-cabal install gifcurry -j-cd .cabal-sandbox/bin/-./gifcurry_gui-./gifcurry_cli -?+git clone git@github.com:lettier/gifcurry.git+cd gifcurry/+brew cask install haskell-platform+brew install pkg-config gobject-introspection cairo gdk-pixbuf gsettings-desktop-schemas \+ gtk+3 gtk-mac-integration ffmpeg imagemagick ghostscript gnome-icon-theme+stack setup+stack install hsc2hs+stack install+export PATH=$PATH:"$HOME/.local/bin/"+gifcurry_cli -?+gifcurry_gui ``` -### Hackage+### [Hackage](https://hackage.haskell.org/package/Gifcurry) #### Stack @@ -190,8 +212,8 @@ cd Gifcurry-* stack setup stack install-stack exec -- gifcurry_gui stack exec -- gifcurry_cli -?+stack exec -- gifcurry_gui ``` #### Cabal@@ -204,11 +226,11 @@ cabal install alex happy -j cabal install gifcurry -j cd ~/.cabal/bin-./gifcurry_gui ./gifcurry_cli -?+./gifcurry_gui ``` -### Github+### [Github](https://github.com/lettier/gifcurry) ```bash # Install GNU Make (https://www.gnu.org/software/make/)@@ -218,8 +240,8 @@ git clone git@github.com:lettier/gifcurry.git cd gifcurry/ make-make run_gui make run_cli CLI_ARGS='-?'+make run_gui ``` ## License
makefile view
@@ -9,14 +9,13 @@ STACK_GHC_BIN=`$(STACK) path --compiler-bin` STACK_PATHS=$(STACK_PATH_LOCAL_BIN):$(STACK_GHC_BIN) CABAL=env PATH=$(PATH):$(STACK_PATHS) $(STACK_PATH_LOCAL_BIN)/cabal-VERSION='2.2.0.0'+VERSION='2.3.0.0' export PATH := $(PATH):$(STACK_PATH_LOCAL_BIN) all: setup update sandbox_clean clean alex happy install_dependencies configure build install setup:- $(STACK) setup && $(STACK) update && $(STACK) install Cabal && $(STACK) install cabal-install alex: setup
+ src/data/gifcurry-icon.png view
binary file changed (absent → 7692 bytes)
+ src/data/gifcurry-logo.svg view
@@ -0,0 +1,143 @@+<?xml version="1.0" encoding="UTF-8" standalone="no"?>+<svg+ xmlns:dc="http://purl.org/dc/elements/1.1/"+ xmlns:cc="http://creativecommons.org/ns#"+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"+ xmlns:svg="http://www.w3.org/2000/svg"+ xmlns="http://www.w3.org/2000/svg"+ viewBox="0 0 384 384"+ height="384"+ width="384"+ version="1.1"+ id="svg4247">+ <metadata+ id="metadata4253">+ <rdf:RDF>+ <cc:Work+ rdf:about="">+ <dc:format>image/svg+xml</dc:format>+ <dc:type+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />+ <dc:title></dc:title>+ </cc:Work>+ </rdf:RDF>+ </metadata>+ <defs+ id="defs4251" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+ d="m 125.90653,283.63875 39.795,55.55914"+ id="path4242" />+ <path+ id="path4244"+ d="m 165.39543,339.58456 58.9867,-88.19368"+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.02706873px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />+ <path+ id="path4246"+ d="M 106.73243,76.488293 224.38453,252.68766"+ style="fill:none;fill-rule:evenodd;stroke:#ea2a89;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />+ <path+ id="path4248"+ d="m 105.45393,253.63953 57.4321,-85.86931"+ style="fill:none;fill-rule:evenodd;stroke:#ea2a89;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />+ <path+ id="path4250"+ d="m 105.62833,253.21481 -80.554303,-118.985 61.3566,-89.60207 12.02058,19.213246"+ style="fill:none;fill-rule:evenodd;stroke:#3f3f3f;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />+ <path+ id="path4252"+ d="m 125.90653,283.63875 39.64195,55.75247 58.83365,-88.00034"+ style="fill:none;fill-rule:evenodd;stroke:#3f3f3f;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />+ <path+ id="path4266"+ d="M 130.78343,76.488293 248.43553,252.68766"+ style="fill:none;fill-rule:evenodd;stroke:#5cb86b;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />+ <path+ id="path4268"+ d="m 129.50493,253.63953 56.9392,-85.08075"+ style="fill:none;fill-rule:evenodd;stroke:#5cb86b;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />+ <path+ id="path4270"+ d="m 129.67923,253.21481 -80.554203,-118.985 61.356503,-89.60207 12.4395,19.804663"+ style="fill:none;fill-rule:evenodd;stroke:#3f3f3f;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />+ <path+ id="path4272"+ d="m 149.95743,283.63875 39.64195,55.75247 58.83365,-88.00034"+ style="fill:none;fill-rule:evenodd;stroke:#3f3f3f;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#3f9ce6;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+ d="M 158.38283,76.488293 276.03493,252.68766"+ id="path4286" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#3f9ce6;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+ d="m 157.10433,253.63953 56.2492,-84.19363"+ id="path4288" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#3f3f3f;stroke-width:6;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+ d="m 157.27873,253.21481 -80.554303,-118.985 61.356603,-89.60207 12.4395,19.804663"+ id="path4290" />+ <path+ style="fill:none;fill-rule:evenodd;stroke:#3f3f3f;stroke-width:6;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+ d="m 177.55693,283.63875 39.6419,55.75247 58.8337,-88.00034"+ id="path4292" />+ <g+ id="text4306"+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:'Roboto Condensed';-inkscape-font-specification:'Roboto Condensed, ';letter-spacing:0px;word-spacing:0px;opacity:1;fill:#373737;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+ transform="rotate(0.19415858)"+ aria-label="Gifcurry">+ <path+ id="path4507"+ style="font-size:40px;line-height:1.25"+ d="m 257.95808,163.97894 q -0.35156,0.46875 -0.95703,1.15235 -0.58593,0.66406 -1.58203,1.28906 -0.99609,0.60547 -2.46094,1.05469 -1.44531,0.42968 -3.51562,0.42968 -2.20703,0 -4.04297,-0.74218 -1.81641,-0.74219 -3.125,-2.22657 -1.30859,-1.48437 -2.03125,-3.73046 -0.72266,-2.2461 -0.72266,-5.23438 v -5.35156 q 0,-11.9336 9.55079,-11.9336 2.07031,0 3.67187,0.60547 1.62109,0.58594 2.73438,1.71875 1.11328,1.11328 1.73828,2.73438 0.625,1.62109 0.74218,3.67187 h -3.57421 q -0.21485,-2.65625 -1.48438,-4.14062 -1.25,-1.50391 -3.80859,-1.50391 -1.64063,0 -2.77344,0.54688 -1.13281,0.54687 -1.85547,1.66015 -0.70312,1.09375 -1.03516,2.75391 -0.3125,1.64062 -0.3125,3.84766 v 5.39062 q 0,2.26563 0.44922,3.94531 0.44922,1.67969 1.26953,2.77344 0.83985,1.09375 2.01172,1.64063 1.17188,0.52734 2.61719,0.52734 1.23047,0 2.07031,-0.21484 0.83985,-0.21485 1.38672,-0.52735 0.56641,-0.3125 0.89844,-0.625 0.33203,-0.3125 0.56641,-0.52734 v -6.5625 h -5.19532 v -3.04688 h 8.76953 z" />+ <path+ id="path4509"+ style="font-size:40px;line-height:1.25"+ d="m 267.07918,167.5141 h -3.45703 v -21.13281 h 3.45703 z m -3.65235,-26.73828 q 0,-0.87891 0.48829,-1.48438 0.48828,-0.60547 1.46484,-0.60547 0.97656,0 1.46484,0.625 0.50782,0.60547 0.50782,1.46485 0,0.8789 -0.48829,1.46484 -0.48828,0.58594 -1.48437,0.58594 -0.97656,0 -1.46484,-0.58594 -0.48829,-0.58594 -0.48829,-1.46484 z" />+ <path+ id="path4511"+ style="font-size:40px;line-height:1.25"+ d="m 274.01277,167.5141 v -18.33984 h -2.7539 v -2.79297 h 2.7539 v -2.22657 q 0,-1.69921 0.41016,-3.00781 0.42969,-1.32812 1.21094,-2.22656 0.78125,-0.89844 1.91406,-1.34766 1.13281,-0.46875 2.53906,-0.46875 1.03516,0 2.08984,0.33203 l -0.17578,2.92969 q -0.33203,-0.0781 -0.76172,-0.11719 -0.42968,-0.0586 -0.82031,-0.0586 -1.40625,0 -2.1875,1.03516 -0.76172,1.01562 -0.76172,2.92968 v 2.22657 h 3.61328 v 2.79297 h -3.61328 v 18.33984 z" />+ <path+ id="path4513"+ style="font-size:40px;line-height:1.25"+ d="m 292.02058,164.95551 q 0.76172,0 1.44532,-0.23438 0.68359,-0.23437 1.21093,-0.72266 0.52735,-0.50781 0.83985,-1.26953 0.33203,-0.78125 0.39062,-1.875 h 3.26172 q -0.0586,1.58203 -0.66406,2.89063 -0.58594,1.28906 -1.5625,2.22656 -0.95703,0.91797 -2.22656,1.42578 -1.26953,0.50781 -2.69532,0.50781 -2.05078,0 -3.57421,-0.66406 -1.50391,-0.66406 -2.5,-1.91406 -0.9961,-1.25 -1.48438,-3.06641 -0.48828,-1.8164 -0.48828,-4.12109 v -2.38281 q 0,-2.30469 0.48828,-4.10157 0.48828,-1.8164 1.48438,-3.0664 0.99609,-1.26953 2.5,-1.9336 1.5039,-0.66406 3.55468,-0.66406 1.60157,0 2.89063,0.52735 1.30859,0.50781 2.22656,1.5039 0.9375,0.97656 1.46484,2.40235 0.52735,1.42578 0.58594,3.22265 h -3.26172 q -0.11718,-2.34375 -1.13281,-3.51562 -0.99609,-1.17188 -2.77344,-1.17188 -1.36718,0 -2.24609,0.48828 -0.87891,0.48828 -1.40625,1.38672 -0.50781,0.87891 -0.72266,2.12891 -0.19531,1.25 -0.19531,2.79297 v 2.38281 q 0,1.5625 0.19531,2.83203 0.19532,1.25 0.70313,2.14844 0.52734,0.8789 1.40625,1.36719 0.89844,0.46875 2.28515,0.46875 z" />+ <path+ id="path4515"+ style="font-size:40px;line-height:1.25"+ d="m 313.97371,165.65863 q -0.82031,1.07422 -2.07031,1.66016 -1.23047,0.58593 -2.94922,0.58593 -1.3086,0 -2.38281,-0.42968 -1.07422,-0.44922 -1.83594,-1.38672 -0.76172,-0.95703 -1.19141,-2.44141 -0.41015,-1.5039 -0.41015,-3.61328 v -13.65234 h 3.4375 v 13.6914 q 0,1.42578 0.2539,2.36328 0.27344,0.91797 0.6836,1.46485 0.42968,0.52734 0.95703,0.74219 0.54687,0.19531 1.07422,0.19531 1.71875,0 2.7539,-0.76172 1.03516,-0.76172 1.58203,-2.05078 v -15.64453 h 3.45703 v 21.13281 h -3.28125 z" />+ <path+ id="path4517"+ style="font-size:40px;line-height:1.25"+ d="m 331.29793,149.62347 q -0.41016,-0.0781 -0.76172,-0.0976 -0.35156,-0.0391 -0.80078,-0.0391 -1.40625,0 -2.32422,0.78125 -0.89844,0.78125 -1.38672,2.1289 v 15.11719 h -3.45703 v -21.13281 h 3.35937 l 0.0586,2.14843 q 0.64453,-1.17187 1.60156,-1.85546 0.97656,-0.6836 2.32422,-0.6836 0.15625,0 0.35156,0.0391 0.21485,0.0195 0.41016,0.0586 0.19531,0.0391 0.35156,0.0976 0.17578,0.0391 0.25391,0.0781 z" />+ <path+ id="path4519"+ style="font-size:40px;line-height:1.25"+ d="m 343.48543,149.62347 q -0.41016,-0.0781 -0.76172,-0.0976 -0.35156,-0.0391 -0.80078,-0.0391 -1.40625,0 -2.32422,0.78125 -0.89844,0.78125 -1.38672,2.1289 v 15.11719 h -3.45703 v -21.13281 h 3.35937 l 0.0586,2.14843 q 0.64453,-1.17187 1.60156,-1.85546 0.97656,-0.6836 2.32422,-0.6836 0.15625,0 0.35156,0.0391 0.21485,0.0195 0.41016,0.0586 0.19531,0.0391 0.35156,0.0976 0.17578,0.0391 0.25391,0.0781 z" />+ <path+ id="path4521"+ style="font-size:40px;line-height:1.25"+ d="m 353.11433,161.77191 3.84766,-15.39062 h 3.67188 l -6.99219,24.39453 q -0.23438,0.78125 -0.66406,1.69922 -0.41016,0.91797 -1.05469,1.69922 -0.64453,0.80078 -1.5625,1.32812 -0.89844,0.54688 -2.08985,0.54688 -0.19531,0 -0.44921,-0.0391 -0.25391,-0.0391 -0.50782,-0.0976 -0.2539,-0.0391 -0.48828,-0.0977 -0.21484,-0.0391 -0.35156,-0.0781 v -2.92969 q 0.11719,0.0391 0.37109,0.0586 0.27344,0.0195 0.39063,0.0195 0.76172,0 1.34765,-0.17578 0.58594,-0.17578 1.03516,-0.58594 0.46875,-0.39062 0.80078,-1.05468 0.35156,-0.66407 0.625,-1.64063 l 0.60547,-2.08984 -6.21094,-20.95703 h 3.76953 z" />+ </g>+ <text+ xml:space="preserve"+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:'Roboto Condensed';-inkscape-font-specification:'Roboto Condensed, ';letter-spacing:0px;word-spacing:0px;opacity:1;fill:#373737;fill-opacity:0.284153;fill-rule:nonzero;stroke:none;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+ x="-160.13664"+ y="380.55551"+ id="text4502"+ transform="rotate(-56.324282)"><tspan+ style="font-size:7.5px;line-height:1.25"+ id="tspan4504"+ x="-160.13664"+ y="380.55551">(C) DAVID LETTIER</tspan></text>+ <text+ xml:space="preserve"+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:'Roboto Condensed';-inkscape-font-specification:'Roboto Condensed, ';letter-spacing:0px;word-spacing:0px;opacity:1;fill:#373737;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+ x="236.35316"+ y="-52.491615"+ id="text4505"+ transform="rotate(0.19415858)"><tspan+ id="tspan4503"+ x="236.35316"+ y="-52.491615"+ style="font-size:40px;line-height:1.25">Gifcurry</tspan></text>+</svg>
src/data/gui.glade view
@@ -1,7 +1,41 @@ <?xml version="1.0" encoding="UTF-8"?>-<!-- Generated with glade 3.20.0 -->+<!-- Generated with glade 3.20.0 ++Copyright (c) 2017 David Lettier+All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:+ * Redistributions of source code must retain the above copyright+ notice, this list of conditions and the following disclaimer.+ * Redistributions in binary form must reproduce the above copyright+ notice, this list of conditions and the following disclaimer in the+ documentation and/or other materials provided with the distribution.+ * Neither the name of the <organization> nor the+ names of its contributors may be used to endorse or promote products+ derived from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE+DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.++Author: David Lettier++--> <interface> <requires lib="gtk+" version="3.10"/>+ <!-- interface-license-type bsd3c -->+ <!-- interface-name Gifcurry -->+ <!-- interface-description Open source video to GIF maker, written in Haskell, that allows overlaid text. -->+ <!-- interface-copyright 2017 David Lettier -->+ <!-- interface-authors David Lettier --> <object class="GtkImage" id="about-image"> <property name="visible">True</property> <property name="can_focus">False</property>@@ -39,7 +73,7 @@ <property name="resizable">False</property> <property name="window_position">mouse</property> <property name="default_width">400</property>- <property name="icon">icon.ico</property>+ <property name="icon">gifcurry-icon.png</property> <property name="gravity">center</property> <child> <object class="GtkBox" id="app-box">@@ -307,7 +341,7 @@ </packing> </child> <child>- <object class="GtkSeparator">+ <object class="GtkSeparator" id="separator-2"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="orientation">vertical</property>@@ -396,7 +430,7 @@ </packing> </child> <child>- <object class="GtkSeparator">+ <object class="GtkSeparator" id="separator-3"> <property name="visible">True</property> <property name="sensitive">False</property> <property name="can_focus">False</property>@@ -475,7 +509,7 @@ </child> </object> </child>- <child type="titlebar">+ <child> <placeholder/> </child> </object>@@ -491,7 +525,7 @@ <property name="transient_for">gifcurry-window</property> <property name="attached_to">gifcurry-window</property> <property name="program_name">Gifcurry</property>- <property name="version">2.2.0.0</property>+ <property name="version">2.3.0.0</property> <property name="copyright" translatable="yes">(C) 2016 David Lettier lettier.com</property> <property name="website">https://github.com/lettier/gifcurry</property>@@ -526,15 +560,15 @@ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</property> <property name="authors"> David Lettier</property>- <property name="logo">icon.ico</property>+ <property name="logo">gifcurry-logo.svg</property> <property name="license_type">custom</property> <child internal-child="vbox">- <object class="GtkBox">+ <object class="GtkBox" id="about-dialog-box"> <property name="can_focus">False</property> <property name="orientation">vertical</property> <property name="spacing">2</property> <child internal-child="action_area">- <object class="GtkButtonBox">+ <object class="GtkButtonBox" id="about-dialog-button-box"> <property name="can_focus">False</property> <property name="layout_style">end</property> </object>@@ -567,12 +601,12 @@ <property name="message_type">warning</property> <property name="text" translatable="yes">Are you sure you want to make a GIF that long?</property> <child internal-child="vbox">- <object class="GtkBox">+ <object class="GtkBox" id="long-gif-message-dialog-box"> <property name="can_focus">False</property> <property name="orientation">vertical</property> <property name="spacing">2</property> <child internal-child="action_area">- <object class="GtkButtonBox">+ <object class="GtkButtonBox" id="long-gif-message-dialog-button-box"> <property name="can_focus">False</property> <property name="homogeneous">True</property> <property name="layout_style">end</property>
− src/data/icon.ico
binary file changed (14398 → absent bytes)
src/gui/Main.hs view
@@ -31,6 +31,7 @@ , defaultGifParams , gifParamsValid , getVideoDurationInSeconds+ , findOrCreateTemporaryDirectory ) import qualified GtkMainSyncAsync (gtkMainSync, gtkMainAsync) @@ -75,6 +76,8 @@ GI.Gtk.dialogAddActionWidget longGifGtkMessageDialog yesGtkButton (enumToInt32 GI.Gtk.ResponseTypeYes) GI.Gtk.dialogAddActionWidget longGifGtkMessageDialog noGtkButton (enumToInt32 GI.Gtk.ResponseTypeNo) + temporaryDirectory <- Gifcurry.findOrCreateTemporaryDirectory+ _ <- GI.Gtk.onFileChooserButtonFileSet inputFileButton $ do setStatusEntryReady statusEntry GI.Gtk.imageSetFromIconName firstFrameImage@@ -91,14 +94,31 @@ _ <- GI.Gtk.entrySetText startTimeEntry startText _ <- GI.Gtk.entrySetText durationTimeEntry durationText unless (Data.Text.null startText || Data.Text.null durationText) (- makeFirstFramePreview inputFileButton startTimeEntry durationTimeEntry firstFrameImage lastFrameImage+ makeFirstFramePreview+ inputFileButton+ startTimeEntry+ durationTimeEntry+ firstFrameImage+ lastFrameImage+ temporaryDirectory ) _ <- GI.Gtk.onEditableChanged startTimeEntry $- makeFirstFramePreview inputFileButton startTimeEntry durationTimeEntry firstFrameImage lastFrameImage+ makeFirstFramePreview+ inputFileButton+ startTimeEntry+ durationTimeEntry+ firstFrameImage+ lastFrameImage+ temporaryDirectory _ <- GI.Gtk.onEditableChanged durationTimeEntry $- makeLastFramePreview inputFileButton startTimeEntry durationTimeEntry lastFrameImage+ makeLastFramePreview+ inputFileButton+ startTimeEntry+ durationTimeEntry+ lastFrameImage+ temporaryDirectory _ <- GI.Gtk.onWidgetButtonReleaseEvent createButton $ \ _ -> do inputFilePathName <- inputFileButtonGetText inputFileButton@@ -238,10 +258,22 @@ framePreviewDirectoryName :: String framePreviewDirectoryName = "gifcurry-frame-previews" -makeLastFramePreview :: GI.Gtk.FileChooserButton -> GI.Gtk.Entry -> GI.Gtk.Entry -> GI.Gtk.Image -> IO ()-makeLastFramePreview inputFileButton startTimeEntry durationTimeEntry lastFrameImage =+makeLastFramePreview ::+ GI.Gtk.FileChooserButton ->+ GI.Gtk.Entry ->+ GI.Gtk.Entry ->+ GI.Gtk.Image ->+ System.FilePath.FilePath ->+ IO ()+makeLastFramePreview+ inputFileButton+ startTimeEntry+ durationTimeEntry+ lastFrameImage+ temporaryDirectory+ = void $ forkIO $- withTempDirectory "." framePreviewDirectoryName $ \ tmpdir -> do+ withTempDirectory temporaryDirectory framePreviewDirectoryName $ \ tmpdir -> do inputFilePathName <- inputFileButtonGetText inputFileButton startTimeText <- GI.Gtk.entryGetText startTimeEntry durationTimeText <- GI.Gtk.entryGetText durationTimeEntry@@ -258,17 +290,36 @@ _ <- setOrResetFramePrevew doSet inputFilePathName outputFilePathName startTime lastFrameImage " LAST FRAME " return() -makeFirstFramePreview :: GI.Gtk.FileChooserButton -> GI.Gtk.Entry -> GI.Gtk.Entry -> GI.Gtk.Image -> GI.Gtk.Image -> IO ()-makeFirstFramePreview inputFileButton startTimeEntry durationTimeEntry firstFrameImage lastFrameImage =+makeFirstFramePreview ::+ GI.Gtk.FileChooserButton ->+ GI.Gtk.Entry ->+ GI.Gtk.Entry ->+ GI.Gtk.Image ->+ GI.Gtk.Image ->+ System.FilePath.FilePath ->+ IO ()+makeFirstFramePreview+ inputFileButton+ startTimeEntry+ durationTimeEntry+ firstFrameImage+ lastFrameImage+ temporaryDirectory+ = void $ forkIO $ do- withTempDirectory "." framePreviewDirectoryName $ \ tmpDir -> do+ withTempDirectory temporaryDirectory framePreviewDirectoryName $ \ tmpDir -> do inputFilePathName <- inputFileButtonGetText inputFileButton startTime <- entryGetFloat startTimeEntry (-1.0) let outputFilePathName = tmpDir ++ "/gifcurry-first-frame-preview.gif" let doSet = not (Data.List.null inputFilePathName) && (startTime >= 0.0) _ <- setOrResetFramePrevew doSet inputFilePathName outputFilePathName startTime firstFrameImage " FIRST FRAME " return ()- makeLastFramePreview inputFileButton startTimeEntry durationTimeEntry lastFrameImage+ makeLastFramePreview+ inputFileButton+ startTimeEntry+ durationTimeEntry+ lastFrameImage+ temporaryDirectory setOrResetFramePrevew :: Bool -> String -> String -> Float -> GI.Gtk.Image -> String -> IO () setOrResetFramePrevew False _ _ _ image _ = GtkMainSyncAsync.gtkMainAsync $ resetImage image
src/lib/Gifcurry.hs view
@@ -15,6 +15,7 @@ , gifParamsValid , versionNumber , getVideoDurationInSeconds+ , findOrCreateTemporaryDirectory ) where import System.Process@@ -44,7 +45,7 @@ -- | The version number. versionNumber :: String-versionNumber = "2.2.0.0"+versionNumber = "2.3.0.0" -- | Specifies default parameters for 'startTime', 'durationTime', 'widthSize', 'qualityPercent', and 'fontChoice'. defaultGifParams :: GifParams@@ -75,13 +76,14 @@ -- else return () -- @ gif :: GifParams -> IO (Either IOError String)-gif gifParams =- withTempDirectory "." "gifcurry-frames" $ \tmpdir -> do+gif gifParams = do+ temporaryDirectory <- findOrCreateTemporaryDirectory+ withTempDirectory temporaryDirectory "gifcurry-frames" $ \tmpdir -> do printGifParams gifParams tmpdir validParams <- gifParamsValid gifParams if validParams then do- fFMpegResult <- tryFfmpeg gifParams tmpdir+ fFMpegResult <- tryFfmpeg gifParams tmpdir let fFMpegSuccess = eitherBool fFMpegResult if fFMpegSuccess then do@@ -154,6 +156,14 @@ result :: Either IOError String -> IO (Maybe Float) result (Left _) = return Nothing result (Right durationString) = return (readMaybe durationString :: Maybe Float)++-- | Finds or creates the temporary directory for Gifcurry.+-- This directory is used for storing temporary frames.+findOrCreateTemporaryDirectory :: IO FilePath+findOrCreateTemporaryDirectory = do+ filePath <- System.Directory.getXdgDirectory System.Directory.XdgCache "gifcurry"+ System.Directory.createDirectoryIfMissing True filePath+ return filePath printGifParams :: GifParams -> String -> IO () printGifParams