commit 65b55cbf01f250c4e34040c29c3baeefc8a2b2ca
parent c5e6364a0fbd3aa4950cc203ceda8e9f7aad75d9
Author: lumidify <nobody@lumidify.org>
Date:   Sat,  2 Jan 2021 09:06:23 +0100
Add croptool_crop
Diffstat:
5 files changed, 124 insertions(+), 8 deletions(-)
diff --git a/Makefile b/Makefile
@@ -6,7 +6,7 @@ VERSION = 1.2-dev
 PREFIX = /usr/local
 MANPREFIX = ${PREFIX}/man
 
-BIN = ${NAME}
+BIN = ${NAME} croptool_crop
 SRC = ${BIN:=.c}
 MAN1 = ${BIN:=.1}
 
@@ -15,20 +15,20 @@ LDFLAGS += `pkg-config --libs x11` `imlib2-config --libs` -lm
 
 all: ${BIN}
 
-${BIN}:
-	${CC} ${CFLAGS} ${LDFLAGS} -o $@ ${SRC}
+.c:
+	${CC} ${CFLAGS} ${LDFLAGS} -o $@ $<
 
 install: all
 	mkdir -p "${DESTDIR}${PREFIX}/bin"
 	cp -f ${BIN} "${DESTDIR}${PREFIX}/bin"
-	chmod 755 ${PREFIX}/bin/${BIN}
+	for f in ${BIN}; do chmod 755 "${DESTDIR}${PREFIX}/bin/$$f"; done
 	mkdir -p "${DESTDIR}${MANPREFIX}/man1"
 	cp -f ${MAN1} "${DESTDIR}${MANPREFIX}/man1"
-	chmod 644 "${DESTDIR}${MANPREFIX}/man1/${MAN1}"
+	for m in ${MAN1}; do chmod 644 "${DESTDIR}${MANPREFIX}/man1/$$m"; done
 
 uninstall:
-	rm -f "${DESTDIR}${PREFIX}/bin/${BIN}
-	rm -f "${DESTDIR}${MANPREFIX}/man1/${MAN1}"
+	for f in ${BIN}; do rm -f "${DESTDIR}${PREFIX}/bin/$$f"; done
+	for m in ${MAN1}; do rm -f "${DESTDIR}${MANPREFIX}/man1/$$m"; done
 
 clean:
 	rm -f ${BIN}
diff --git a/croptool.1 b/croptool.1
@@ -105,6 +105,9 @@ may cause issues depending on the output format.
 Nothing in particular has been done to prevent screen flicker, so there is
 flickering when resizing the window or cropping rectangle.
 .Pp
+Transparent portions of images should probably be shown differently, but I'm
+too lazy to fix that and don't really care at the moment.
+.Pp
 Since the coordinates of the cropping rectangle are stored as integers, they
 will become skewed while resizing. If this becomes a real problem, though,
 you're probably doing something wrong anyways.
diff --git a/croptool.c b/croptool.c
@@ -54,7 +54,7 @@ static short SELECTION_REDRAW = 1;
   %b: Bottom side of cropped area.
   %f: Filename of image.
 */
-static char *CMD_FORMAT = "mogrify -crop %wx%h+%l+%t '%f'";
+static char *CMD_FORMAT = "croptool_crop %wx%h+%l+%t '%f'";
 
 extern char *optarg;
 extern int optind;
diff --git a/croptool_crop.1 b/croptool_crop.1
@@ -0,0 +1,34 @@
+.Dd January 2, 2021
+.Dt CROPTOOL_CROP 1
+.Os
+.Sh NAME
+.Nm croptool_crop
+.Nd simple image cropping tool
+.Sh SYNOPSIS
+.Nm
+.Ar WIDTHxHEIGHT+X+Y
+.Ar filename
+.Sh DESCRIPTION
+.Nm
+crops the given
+.Ar filename
+to the dimensions specified, where
+.Ar WIDTH
+and
+.Ar HEIGHT
+are the width and height of the cropping rectangle, and
+.Ar X
+and
+.Ar Y
+specify the top left corner of the cropping rectangle.
+This is primarily meant as a companion to
+.Xr croptool 1 .
+.Sh EXIT STATUS
+.Ex -std
+.Sh SEE ALSO
+.Xr mogrify 1
+.Xr croptool 1
+.Sh BUGS
+At least some versions of Imlib2 seem to have issues with saving gif files.
+.Sh AUTHORS
+.An lumidify Aq Mt nobody@lumidify.org
diff --git a/croptool_crop.c b/croptool_crop.c
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2021 lumidify <nobody[at]lumidify.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <Imlib2.h>
+
+int
+main(int argc, char *argv[]) {
+	char *format;
+	char alpha;
+	int w, h, x, y;
+	int orig_w, orig_h;
+	Imlib_Image src, dst;
+	Imlib_Load_Error error;
+	if (argc != 3) {
+		fprintf(stderr, "USAGE: croptool_crop WIDTHxHEIGHT+X+Y FILENAME\n");
+		exit(1);
+	}
+	if (sscanf(argv[1], "%dx%d+%d+%d", &w, &h, &x, &y) < 4) {
+		fprintf(stderr, "Invalid cropping rectangle specified.\n");
+		exit(1);
+	}
+	src = imlib_load_image(argv[2]);
+	if (!src) {
+		fprintf(stderr, "Unable to load image.\n");
+		exit(1);
+	}
+	imlib_context_set_image(src);
+	alpha = imlib_image_has_alpha();
+	format = strdup(imlib_image_format());
+	if (!format) {
+		fprintf(stderr, "Unable to allocate memory.\n");
+		exit(1);
+	}
+	orig_w = imlib_image_get_width();
+	orig_h = imlib_image_get_height();
+	if (w <= 0 || h <= 0 || x < 0 | y < 0 || x + w > orig_w || y + h > orig_h) {
+		fprintf(stderr, "Invalid cropping rectangle specified.\n");
+		exit(1);
+	}
+
+	dst = imlib_create_image(w, h);
+	if (!dst) {
+		fprintf(stderr, "Unable to create cropped image.\n");
+		exit(1);
+	}
+	imlib_context_set_image(dst);
+	imlib_image_set_has_alpha(alpha);
+	imlib_blend_image_onto_image(src, 1, x, y, w, h, 0, 0, w, h);
+
+	imlib_image_set_format(format);
+	imlib_save_image_with_error_return(argv[2], &error);
+	if (error) {
+		fprintf(stderr, "Unable to save cropped image.\n");
+		exit(1);
+	}
+
+	imlib_free_image();
+	imlib_context_set_image(src);
+	imlib_free_image();
+	free(format);
+
+	return 0;
+}