summary refs log tree commit diff
path: root/bin
diff options
context:
space:
mode:
Diffstat (limited to 'bin')
-rw-r--r--bin/README1
-rw-r--r--bin/pngo.c42
2 files changed, 40 insertions, 3 deletions
diff --git a/bin/README b/bin/README
index 94429275..32f9862d 100644
--- a/bin/README
+++ b/bin/README
@@ -82,6 +82,7 @@ PNG optimizer. Does not support interlaced PNGs.
  - Discards ancillary chunks
  - Discards unnecessary alpha channel
  - Converts unnecessary truecolor to grayscale
+ - Indexes color if possible
  - Applies a simple filter type heuristic
  - Applies zlib's best compression
 
diff --git a/bin/pngo.c b/bin/pngo.c
index bf592ad1..37fd6af7 100644
--- a/bin/pngo.c
+++ b/bin/pngo.c
@@ -197,9 +197,7 @@ static void writeHeader(void) {
 
 static struct {
     uint32_t len;
-    struct PACKED {
-        uint8_t r, g, b;
-    } entries[256];
+    uint8_t entries[256][3];
 } palette;
 
 static void readPalette(void) {
@@ -473,6 +471,43 @@ static void discardColor(void) {
     header.color &= ~TRUECOLOR;
 }
 
+static void indexColor(void) {
+    if (header.color != TRUECOLOR || header.depth != 8) return;
+    for (uint32_t y = 0; y < header.height; ++y) {
+        for (uint32_t x = 0; x < header.width; ++x) {
+            uint32_t i;
+            for (i = 0; i < palette.len; ++i) {
+                if (0 == memcmp(palette.entries[i], &lines[y].data[x * 3], 3)) {
+                    break;
+                }
+            }
+            if (i < palette.len) continue;
+            if (palette.len == 256) return;
+            memcpy(palette.entries[i], &lines[y].data[x * 3], 3);
+            palette.len++;
+        }
+    }
+
+    uint8_t *ptr = data;
+    for (uint32_t y = 0; y < header.height; ++y) {
+        uint8_t *type = ptr++;
+        uint8_t *data = ptr;
+        *type = *lines[y].type;
+        for (uint32_t x = 0; x < header.width; ++x) {
+            uint32_t i;
+            for (i = 0; i < palette.len; ++i) {
+                if (0 == memcmp(palette.entries[i], &lines[y].data[x * 3], 3)) {
+                    break;
+                }
+            }
+            *ptr++ = i;
+        }
+        lines[y].type = type;
+        lines[y].data = data;
+    }
+    header.color = INDEXED;
+}
+
 static void optimize(const char *inPath, const char *outPath) {
     if (inPath) {
         path = inPath;
@@ -501,6 +536,7 @@ static void optimize(const char *inPath, const char *outPath) {
     reconData();
     discardAlpha();
     discardColor();
+    indexColor();
     filterData();
     free(lines);
 
ypothetically the .h rule could match up headers with .3 manual pages if I cared to write them. 2019-02-20Add Dirk Gently's Holistic Detective AgencyJune McEnroe 2019-02-20Move /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