packages feed

Gifcurry 2.2.0.0 → 2.3.0.0

raw patch · 10 files changed

+369/−186 lines, 10 filesbinary-added

Files

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