| /* |
| * Copyright 2023 Google LLC |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #include "tools/EncodeUtils.h" |
| |
| #include "include/core/SkBitmap.h" |
| #include "include/core/SkData.h" |
| #include "include/core/SkDataTable.h" |
| #include "include/core/SkPixmap.h" |
| #include "include/core/SkRefCnt.h" |
| #include "include/core/SkStream.h" |
| #include "include/core/SkString.h" |
| #include "include/encode/SkPngEncoder.h" |
| #include "src/base/SkBase64.h" |
| |
| #include <cstddef> |
| #include <cstdint> |
| |
| namespace ToolUtils { |
| |
| bool BitmapToBase64DataURI(const SkBitmap& bitmap, SkString* dst) { |
| SkPixmap pm; |
| if (!bitmap.peekPixels(&pm)) { |
| dst->set("peekPixels failed"); |
| return false; |
| } |
| |
| // We're going to embed this PNG in a data URI, so make it as small as possible |
| SkPngEncoder::Options options; |
| options.fFilterFlags = SkPngEncoder::FilterFlag::kAll; |
| options.fZLibLevel = 9; |
| |
| SkDynamicMemoryWStream wStream; |
| if (!SkPngEncoder::Encode(&wStream, pm, options)) { |
| dst->set("SkPngEncoder::Encode failed"); |
| return false; |
| } |
| |
| sk_sp<SkData> pngData = wStream.detachAsData(); |
| size_t len = SkBase64::EncodedSize(pngData->size()); |
| |
| // The PNG can be almost arbitrarily large. We don't want to fill our logs with enormous URLs. |
| // Infra says these can be pretty big, as long as we're only outputting them on failure. |
| static const size_t kMaxBase64Length = 1024 * 1024; |
| if (len > kMaxBase64Length) { |
| dst->printf("Encoded image too large (%u bytes)", static_cast<uint32_t>(len)); |
| return false; |
| } |
| |
| dst->resize(len); |
| SkBase64::Encode(pngData->data(), pngData->size(), dst->data()); |
| dst->prepend("data:image/png;base64,"); |
| return true; |
| } |
| |
| bool EncodeImageToPngFile(const char* path, const SkBitmap& src) { |
| SkFILEWStream file(path); |
| return file.isValid() && SkPngEncoder::Encode(&file, src.pixmap(), {}); |
| } |
| |
| bool EncodeImageToPngFile(const char* path, const SkPixmap& src) { |
| SkFILEWStream file(path); |
| return file.isValid() && SkPngEncoder::Encode(&file, src, {}); |
| } |
| |
| } // namespace ToolUtils |