12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- // Copyright 2019 Google LLC.
- // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
- #include "include/codec/SkCodec.h"
- #include "include/core/SkBitmap.h"
- #include "include/encode/SkPngEncoder.h"
- #include "src/core/SkOSFile.h"
- static void update(SkBitmap* maxBitmap, SkBitmap* minBitmap, const SkBitmap& bm) {
- SkASSERT(!bm.drawsNothing());
- SkASSERT(4 == bm.bytesPerPixel());
- if (maxBitmap->drawsNothing()) {
- maxBitmap->allocPixels(bm.info());
- maxBitmap->eraseColor(0x00000000);
- minBitmap->allocPixels(bm.info());
- minBitmap->eraseColor(0xFFFFFFFF);
- }
- SkASSERT_RELEASE(maxBitmap->info() == bm.info());
- const SkPixmap& pmin = minBitmap->pixmap();
- const SkPixmap& pmax = maxBitmap->pixmap();
- const SkPixmap& pm = bm.pixmap();
- for (int y = 0; y < pm.height(); ++y) {
- for (int x = 0; x < pm.width(); ++x) {
- uint32_t* minPtr = pmin.writable_addr32(x, y);
- uint32_t* maxPtr = pmax.writable_addr32(x, y);
- uint8_t minColor[4], maxColor[4], color[4];
- memcpy(minColor, minPtr, 4);
- memcpy(maxColor, maxPtr, 4);
- memcpy(color, pm.addr32(x, y), 4);
- for (unsigned i = 0; i < 4; ++i) {
- minColor[i] = std::min(minColor[i], color[i]);
- maxColor[i] = std::max(maxColor[i], color[i]);
- }
- memcpy(minPtr, minColor, 4);
- memcpy(maxPtr, maxColor, 4);
- }
- }
- }
- static SkBitmap decode_to_srgb_8888_unpremul(const char* path) {
- SkBitmap dst;
- if (auto codec = SkCodec::MakeFromData(SkData::MakeFromFileName(path))) {
- SkISize size = codec->getInfo().dimensions();
- SkASSERT(!size.isEmpty());
- dst.allocPixels(SkImageInfo::Make(
- size.width(), size.height(), kRGBA_8888_SkColorType,
- kUnpremul_SkAlphaType, SkColorSpace::MakeSRGB()));
- if (SkCodec::kSuccess != codec->getPixels(dst.pixmap())) {
- dst.reset();
- }
- }
- return dst;
- }
- bool encode_png(const char* path, const SkPixmap& pixmap) {
- if (!pixmap.addr()) {
- return false;
- }
- SkPngEncoder::Options encOpts;
- encOpts.fZLibLevel = 9; // slow encode;
- SkFILEWStream o(path);
- return o.isValid() && SkPngEncoder::Encode(&o, pixmap, encOpts);
- }
- int main(int argc, char** argv) {
- SkASSERT_RELEASE(argc > 2);
- const char* src_dir = argv[1];
- const char* dst_dir = argv[2];
- SkBitmap maxBitmap, minBitmap;
- SkOSFile::Iter iter(src_dir);
- SkString name;
- while (iter.next(&name)) {
- name.prependf("%s/", src_dir);
- SkBitmap bm = decode_to_srgb_8888_unpremul(name.c_str());
- if (!bm.drawsNothing()) {
- update(&maxBitmap, &minBitmap, bm);
- }
- }
- SkASSERT_RELEASE(sk_mkdir(dst_dir));
- encode_png(SkStringPrintf("%s/min.png", dst_dir).c_str(), minBitmap.pixmap());
- encode_png(SkStringPrintf("%s/max.png", dst_dir).c_str(), maxBitmap.pixmap());
- }
|