From 9301ec21272bb9d3b087c16791486eab5fa1eebf Mon Sep 17 00:00:00 2001 From: June McEnroe Date: Sun, 18 Feb 2018 12:29:36 -0500 Subject: Eliminate redundant color in pngo --- bin/pngo.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 53 insertions(+), 10 deletions(-) diff --git a/bin/pngo.c b/bin/pngo.c index 70692c20..1dcc8b22 100644 --- a/bin/pngo.c +++ b/bin/pngo.c @@ -366,15 +366,12 @@ static void filterData(void) { static void eliminateAlpha(void) { if (!(header.color & ALPHA)) return; - - size_t pixelSize = lineSize() / header.width; - size_t alphaSize = header.depth / 8; - size_t colorSize = pixelSize - alphaSize; - + size_t sampleSize = header.depth / 8; + size_t pixelSize = 4 * sampleSize; for (uint32_t y = 0; y < header.height; ++y) { for (uint32_t x = 0; x < header.width; ++x) { - for (size_t i = 0; i < alphaSize; ++i) { - if (lines[y].data[x * pixelSize + colorSize + i] != 0xFF) return; + for (size_t i = 0; i < sampleSize; ++i) { + if (lines[y].data[x * pixelSize + 3 * sampleSize + i] != 0xFF) return; } } } @@ -385,16 +382,61 @@ static void eliminateAlpha(void) { uint8_t *data = ptr; *type = *lines[y].type; for (uint32_t x = 0; x < header.width; ++x) { - memcpy(ptr, &lines[y].data[x * pixelSize], colorSize); - ptr += colorSize; + memcpy(ptr, &lines[y].data[x * pixelSize], 3 * sampleSize); + ptr += 3 * sampleSize; } lines[y].type = type; lines[y].data = data; } - header.color &= ~ALPHA; } +static void eliminateColor(void) { + if (!(header.color & TRUECOLOR)) return; + size_t sampleSize = header.depth / 8; + size_t pixelSize = ((header.color & ALPHA) ? 4 : 3) * sampleSize; + for (uint32_t y = 0; y < header.height; ++y) { + for (uint32_t x = 0; x < header.width; ++x) { + if ( + 0 != memcmp( + &lines[y].data[x * pixelSize], + &lines[y].data[x * pixelSize + 1 * sampleSize], + sampleSize + ) + ) return; + if ( + 0 != memcmp( + &lines[y].data[x * pixelSize + 1 * sampleSize], + &lines[y].data[x * pixelSize + 2 * sampleSize], + sampleSize + ) + ) return; + } + } + + 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) { + memcpy(ptr, &lines[y].data[x * pixelSize], sampleSize); + ptr += sampleSize; + if (header.color & ALPHA) { + memcpy( + ptr, + &lines[y].data[x * pixelSize + 3 * sampleSize], + sampleSize + ); + ptr += sampleSize; + } + } + lines[y].type = type; + lines[y].data = data; + } + header.color &= ~TRUECOLOR; +} + static void optimize(const char *inPath, const char *outPath) { if (inPath) { path = inPath; @@ -421,6 +463,7 @@ static void optimize(const char *inPath, const char *outPath) { scanlines(); reconData(); eliminateAlpha(); + eliminateColor(); filterData(); free(lines); -- cgit 1.4.1 /td> 2019-10-28Add option to save and load ring contents across restartsJune McEnroe 2019-10-28Use "producer/consumer" consistently in ring codeJune McEnroe 2019-10-28Add quit message optionJune McEnroe 2019-10-28Specify when command is allowed in Handlers listJune McEnroe 2019-10-28Disallow PRIVMSG/NOTICE before registrationJune McEnroe 2019-10-28Move entire login flow to state and reorganize itJune McEnroe 2019-10-27Wait for SASL success before sending CAP ENDJune McEnroe 2019-10-27Only increment consumer after successful sendJune McEnroe 2019-10-27Set SO_REUSEADDR on bindsJune McEnroe 2019-10-27Output ring info on SIGINFOJune McEnroe 2019-10-27Improve client/server error messagesJune McEnroe 2019-10-27Add reload cmd to rc scriptJune McEnroe 2019-10-27Reload certificate on SIGUSR1June McEnroe 2019-10-27Drop clients on zero-length readsJune McEnroe 2019-10-27Explicitly tls_handshake new clientsJune McEnroe 2019-10-26Document rationaleJune McEnroe 2019-10-26Handle nick collisionJune McEnroe 2019-10-26Wait for AUTHENTICATE + from serverJune McEnroe 2019-10-26Respond to PING with same parameterJune McEnroe 2019-10-26Add undocumented flag to disable verificationJune McEnroe 2019-10-26Do not require RPL_ISUPPORT for stateReadyJune McEnroe 2019-10-26Implement graceful shutdownJune McEnroe 2019-10-26Require PASS before USERJune McEnroe 2019-10-26Track channel topicsJune McEnroe 2019-10-26Set AWAY when no clients are connectedJune McEnroe 2019-10-26Add flags to request TOPIC and NAMES on client connectJune McEnroe 2019-10-26OopsJune McEnroe 2019-10-26Disconnect client on unknown commandJune McEnroe 2019-10-26Allow reading sensitive information from filesJune McEnroe 2019-10-26Add rc scriptJune McEnroe 2019-10-25Add install and uninstall targetsJune McEnroe 2019-10-25Expand documentationJune McEnroe 2019-10-25Add AGPLv3 notice on client registrationJune McEnroe 2019-10-25Rename project pounceJune McEnroe