summary refs log tree commit diff
path: root/cards/dump.c
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2020-01-27 19:10:18 -0500
committerJune McEnroe <june@causal.agency>2020-01-27 19:10:18 -0500
commitff011685a87e4314e0ddc58fc909d0d018dd788e (patch)
tree38939e200850a1bc76162b2bf3776b5cebd79005 /cards/dump.c
parentRemove cards submodule (diff)
parentRemove README (diff)
downloadwep-ff011685a87e4314e0ddc58fc909d0d018dd788e.tar.gz
wep-ff011685a87e4314e0ddc58fc909d0d018dd788e.zip
Add 'cards/' from commit 'daf6fd1d716aad3c03b6dadbbd7a4b724acbfece'
git-subtree-dir: cards
git-subtree-mainline: 97e1d0e9a7eb2cfad54e518cd5eba3f4523f788d
git-subtree-split: daf6fd1d716aad3c03b6dadbbd7a4b724acbfece
Diffstat (limited to 'cards/dump.c')
-rw-r--r--cards/dump.c82
1 files changed, 82 insertions, 0 deletions
diff --git a/cards/dump.c b/cards/dump.c
new file mode 100644
index 0000000..127d6b1
--- /dev/null
+++ b/cards/dump.c
@@ -0,0 +1,82 @@
+/* Copyright (C) 2019  C. McEnroe <june@causal.agency>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#define _XOPEN_SOURCE
+
+#include <err.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sysexits.h>
+#include <unistd.h>
+
+#include <SDL.h>
+
+#include "cards.h"
+
+int main(int argc, char *argv[]) {
+	bool freecell = false;
+	enum Cards_Flag flags = 0;
+	bool invert = false;
+
+	int opt;
+	while (0 < (opt = getopt(argc, argv, "abfik"))) {
+		switch (opt) {
+			break; case 'a': flags |= Cards_AlphaCorners;
+			break; case 'b': flags |= Cards_BlackBorders;
+			break; case 'f': freecell = true;
+			break; case 'i': invert = true;
+			break; case 'k': flags |= Cards_ColorKey;
+			break; default:  return EX_USAGE;
+		}
+	}
+
+	struct SDL_RWops *rw;
+	if (optind < argc) {
+		rw = SDL_RWFromFile(argv[optind], "rb");
+	} else {
+		rw = SDL_RWFromFP(stdin, SDL_FALSE);
+	}
+	if (!rw) errx(EX_NOINPUT, "SDL_RWFromFile: %s", SDL_GetError());
+
+	SDL_Surface *surfaces[Cards_CardCount];
+	if (freecell) {
+		int error = Cards_LoadFreeCell(
+			surfaces, Cards_CardCount, rw, flags
+		);
+		if (error) errx(EX_DATAERR, "Cards_LoadFreeCell: %s", SDL_GetError());
+	} else {
+		int error = Cards_LoadCards(surfaces, Cards_CardCount, rw, flags);
+		if (error) errx(EX_DATAERR, "Cards_LoadCards: %s", SDL_GetError());
+	}
+	SDL_RWclose(rw);
+
+	for (size_t i = 0; i < Cards_CardCount; ++i) {
+		if (!surfaces[i]) continue;
+
+		if (invert) {
+			int error = Cards_InvertSurface(surfaces[i]);
+			if (error) {
+				errx(EX_DATAERR, "Cards_InvertSurface: %s", SDL_GetError());
+			}
+		}
+
+		char name[sizeof("00.bmp")];
+		snprintf(name, sizeof(name), "%02zu.bmp", i);
+		int error = SDL_SaveBMP(surfaces[i], name);
+		if (error) errx(EX_CANTCREAT, "SDL_SaveBMP: %s", SDL_GetError());
+	}
+}