summary refs log tree commit diff
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/ico2png.c45
1 files changed, 20 insertions, 25 deletions
diff --git a/tools/ico2png.c b/tools/ico2png.c
index 71644b6..6e79ed7 100644
--- a/tools/ico2png.c
+++ b/tools/ico2png.c
@@ -128,7 +128,7 @@ int main(int argc, char *argv[]) {
 		icon.colors = SDL_ReadU8(ico);
 		SDL_ReadU8(ico); // reserved
 		icon.planes = SDL_ReadLE16(ico);
-		icon.bpp = SDL_ReadLE16(ico);
+		icon.bpp = SDL_ReadLE16(ico); // some ICOs lie about this...
 		icon.length = SDL_ReadLE32(ico);
 		icon.offset = SDL_ReadLE32(ico);
 		Uint32 score = icon.width * icon.height * icon.colors;
@@ -158,37 +158,32 @@ int main(int argc, char *argv[]) {
 	pngWrite(png, zero, 3);
 	pngUint32(png, ~pngCRC);
 
-	// Copy the palette, reserving index 0 for transparency. We assume at most
-	// 255 colors will be used by the icon.
+	// Read the real bpp and palette count from the DIB header
 	SDL_RWseek(ico, bestIcon.offset, RW_SEEK_SET);
 	Uint32 dibHeaderLength = SDL_ReadLE32(ico);
-	Uint32 paletteCount = 1 << bestIcon.bpp;
-	Uint8 *palette = calloc(1 + paletteCount, 3);
-	if (!palette) errx(1, "calloc failed");
-	if (dibHeaderLength == 0x0C) {
-		SDL_RWseek(ico, bestIcon.offset + dibHeaderLength, RW_SEEK_SET);
-		for (Uint32 i = 0; i < paletteCount; ++i) {
-			palette[3 * (i + 1) + 2] = SDL_ReadU8(ico);
-			palette[3 * (i + 1) + 1] = SDL_ReadU8(ico);
-			palette[3 * (i + 1) + 0] = SDL_ReadU8(ico);
-		}
-	} else if (dibHeaderLength == 0x28) {
-		SDL_RWseek(ico, 0x1C, RW_SEEK_CUR);
-		paletteCount = SDL_ReadLE32(ico);
-		if (!paletteCount) paletteCount = 1 << bestIcon.bpp;
-		SDL_RWseek(ico, bestIcon.offset + dibHeaderLength, RW_SEEK_SET);
-		for (Uint32 i = 0; i < paletteCount; ++i) {
-			palette[3 * (i + 1) + 2] = SDL_ReadU8(ico);
-			palette[3 * (i + 1) + 1] = SDL_ReadU8(ico);
-			palette[3 * (i + 1) + 0] = SDL_ReadU8(ico);
-			SDL_ReadU8(ico);
-		}
-	} else {
+	if (dibHeaderLength != 0x28) {
 		errx(
 			1, "%s: unrecognized DIB header length %u",
 			icoPath, dibHeaderLength
 		);
 	}
+	SDL_RWseek(ico, 0x0A, RW_SEEK_CUR);
+	bestIcon.bpp = SDL_ReadLE16(ico); // the truth
+	SDL_RWseek(ico, 0x10, RW_SEEK_CUR);
+	Uint32 paletteCount = SDL_ReadLE32(ico);
+	if (!paletteCount) paletteCount = 1 << bestIcon.bpp;
+
+	// Copy the palette, reserving index 0 for transparency. We assume at most
+	// 255 colors will be used by the icon.
+	Uint8 *palette = calloc(1 + paletteCount, 3);
+	if (!palette) errx(1, "calloc failed");
+	SDL_RWseek(ico, bestIcon.offset + dibHeaderLength, RW_SEEK_SET);
+	for (Uint32 i = 0; i < paletteCount; ++i) {
+		palette[3 * (i + 1) + 2] = SDL_ReadU8(ico);
+		palette[3 * (i + 1) + 1] = SDL_ReadU8(ico);
+		palette[3 * (i + 1) + 0] = SDL_ReadU8(ico);
+		SDL_ReadU8(ico);
+	}
 	pngChunk(png, "PLTE", 3 * (1 + paletteCount));
 	pngWrite(png, palette, 3 * (1 + paletteCount));
 	pngUint32(png, ~pngCRC);
Move /opt/pkg after /usr in PATHJune McEnroe Installing mandoc from pkgsrc also installs a man executable which is horribly broken. Keep using the system man. 2019-02-20Set man_hard_wrap in nvimJune McEnroe Vendoring man.vim until <https://github.com/neovim/neovim/pull/9633> is merged and appears in a release. 2019-02-18Use hi -o anchor in upJune McEnroe 2019-02-18Don't match nested parentheses in Tag for CJune McEnroe Fixes mistaken highlight of: pngWrite(file, (uint8_t []) { 0, 0, 0 }, 3); 2019-02-18Match whitespace between * [] {}June McEnroe 2019-02-18Fix function-like #define regexJune McEnroe A define like #define FOO (1) is not function-like. 2019-02-18Match Tag in RustJune McEnroe 2019-02-18Match sh functions as TagJune McEnroe 2019-02-18Match Sh and Ss as Tag in mdocJune McEnroe 2019-02-18Match statics and typedefs as TagJune McEnroe 2019-02-18Clean up htmlHeaderJune McEnroe 2019-02-18Remove hi line numberingJune McEnroe Tags are much better for referring to specific parts of a file and line numbering is better done by a post-processing tool such as cat -n or producing a two-column HTML <table>. 2019-02-18Add Tag class to hiJune McEnroe 2019-02-17Generate HTML with hi -n -f html -o anchorJune McEnroe Running hi twice to insert stuff between the head and the content is a bit of a hack but oh well. 2019-02-17Add hi -f html -o anchor for line number linksJune McEnroe 2019-02-17Simplify temp trap in upJune McEnroe 2019-02-17Add line numbers to hiJune McEnroe Renames previous -n option to -m to stay consistent with cat -n. Prefixing lines with line numbers affects where the first tab indent ends up relative to the text above it. Not sure if it's worth fixing somehow. 2019-02-17Always split spans after newlinesJune McEnroe Simplifies ANSI and IRC output code, and prepares for line numbered output. 2019-02-15Color format specifiers light cyan in vimJune McEnroe 2019-02-15Highlight Interp as yellowJune McEnroe 2019-02-15Highlight strings in sh command substitutionsJune McEnroe 2019-02-15Add nmap gpJune McEnroe 2019-02-14Avoid newline when copying URL to pasteboardJune McEnroe 2019-02-13Add forgotten "sixth" book of H2G2June McEnroe