make_skqp_model.cpp 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. // Copyright 2019 Google LLC.
  2. // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
  3. #include "include/codec/SkCodec.h"
  4. #include "include/core/SkBitmap.h"
  5. #include "include/encode/SkPngEncoder.h"
  6. #include "src/core/SkOSFile.h"
  7. static void update(SkBitmap* maxBitmap, SkBitmap* minBitmap, const SkBitmap& bm) {
  8. SkASSERT(!bm.drawsNothing());
  9. SkASSERT(4 == bm.bytesPerPixel());
  10. if (maxBitmap->drawsNothing()) {
  11. maxBitmap->allocPixels(bm.info());
  12. maxBitmap->eraseColor(0x00000000);
  13. minBitmap->allocPixels(bm.info());
  14. minBitmap->eraseColor(0xFFFFFFFF);
  15. }
  16. SkASSERT_RELEASE(maxBitmap->info() == bm.info());
  17. const SkPixmap& pmin = minBitmap->pixmap();
  18. const SkPixmap& pmax = maxBitmap->pixmap();
  19. const SkPixmap& pm = bm.pixmap();
  20. for (int y = 0; y < pm.height(); ++y) {
  21. for (int x = 0; x < pm.width(); ++x) {
  22. uint32_t* minPtr = pmin.writable_addr32(x, y);
  23. uint32_t* maxPtr = pmax.writable_addr32(x, y);
  24. uint8_t minColor[4], maxColor[4], color[4];
  25. memcpy(minColor, minPtr, 4);
  26. memcpy(maxColor, maxPtr, 4);
  27. memcpy(color, pm.addr32(x, y), 4);
  28. for (unsigned i = 0; i < 4; ++i) {
  29. minColor[i] = std::min(minColor[i], color[i]);
  30. maxColor[i] = std::max(maxColor[i], color[i]);
  31. }
  32. memcpy(minPtr, minColor, 4);
  33. memcpy(maxPtr, maxColor, 4);
  34. }
  35. }
  36. }
  37. static SkBitmap decode_to_srgb_8888_unpremul(const char* path) {
  38. SkBitmap dst;
  39. if (auto codec = SkCodec::MakeFromData(SkData::MakeFromFileName(path))) {
  40. SkISize size = codec->getInfo().dimensions();
  41. SkASSERT(!size.isEmpty());
  42. dst.allocPixels(SkImageInfo::Make(
  43. size.width(), size.height(), kRGBA_8888_SkColorType,
  44. kUnpremul_SkAlphaType, SkColorSpace::MakeSRGB()));
  45. if (SkCodec::kSuccess != codec->getPixels(dst.pixmap())) {
  46. dst.reset();
  47. }
  48. }
  49. return dst;
  50. }
  51. bool encode_png(const char* path, const SkPixmap& pixmap) {
  52. if (!pixmap.addr()) {
  53. return false;
  54. }
  55. SkPngEncoder::Options encOpts;
  56. encOpts.fZLibLevel = 9; // slow encode;
  57. SkFILEWStream o(path);
  58. return o.isValid() && SkPngEncoder::Encode(&o, pixmap, encOpts);
  59. }
  60. int main(int argc, char** argv) {
  61. SkASSERT_RELEASE(argc > 2);
  62. const char* src_dir = argv[1];
  63. const char* dst_dir = argv[2];
  64. SkBitmap maxBitmap, minBitmap;
  65. SkOSFile::Iter iter(src_dir);
  66. SkString name;
  67. while (iter.next(&name)) {
  68. name.prependf("%s/", src_dir);
  69. SkBitmap bm = decode_to_srgb_8888_unpremul(name.c_str());
  70. if (!bm.drawsNothing()) {
  71. update(&maxBitmap, &minBitmap, bm);
  72. }
  73. }
  74. SkASSERT_RELEASE(sk_mkdir(dst_dir));
  75. encode_png(SkStringPrintf("%s/min.png", dst_dir).c_str(), minBitmap.pixmap());
  76. encode_png(SkStringPrintf("%s/max.png", dst_dir).c_str(), maxBitmap.pixmap());
  77. }