aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/images
diff options
context:
space:
mode:
authorGravatar Yuqian Li <liyuqian@google.com>2017-06-09 11:35:58 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-06-09 17:24:03 +0000
commitd0dbee6559341247fadc8c828cde82bfa737cc04 (patch)
tree70166b4dc1467722729ec57982e0b5777fa65f54 /src/images
parent9a87cda3d308eb41703828e17ed1cf2cfd8e0901 (diff)
Add comments support for PNG encoder
Bug: skia:6689 Change-Id: I6ccac8890f44724ccd6e20c8f4ea80bc99f9fa58 Reviewed-on: https://skia-review.googlesource.com/19080 Reviewed-by: Mike Reed <reed@google.com> Reviewed-by: Matt Sarett <msarett@google.com> Commit-Queue: Yuqian Li <liyuqian@google.com>
Diffstat (limited to 'src/images')
-rw-r--r--src/images/SkPngEncoder.cpp28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/images/SkPngEncoder.cpp b/src/images/SkPngEncoder.cpp
index d28657f008..cc925207b1 100644
--- a/src/images/SkPngEncoder.cpp
+++ b/src/images/SkPngEncoder.cpp
@@ -175,6 +175,34 @@ bool SkPngEncoderMgr::setHeader(const SkImageInfo& srcInfo, const SkPngEncoder::
int zlibLevel = SkTMin(SkTMax(0, options.fZLibLevel), 9);
SkASSERT(zlibLevel == options.fZLibLevel);
png_set_compression_level(fPngPtr, zlibLevel);
+
+ // Set comments in tEXt chunk
+ const sk_sp<SkDataTable>& comments = options.fComments;
+ if (comments != nullptr) {
+ std::vector<png_text> png_texts(comments->count());
+ std::vector<SkString> clippedKeys;
+ for (int i = 0; i < comments->count() / 2; ++i) {
+ const char* keyword;
+ const char* originalKeyword = comments->atStr(2 * i);
+ const char* text = comments->atStr(2 * i + 1);
+ if (strlen(originalKeyword) <= PNG_KEYWORD_MAX_LENGTH) {
+ keyword = originalKeyword;
+ } else {
+ SkDEBUGFAILF("PNG tEXt keyword should be no longer than %d.",
+ PNG_KEYWORD_MAX_LENGTH);
+ clippedKeys.emplace_back(originalKeyword, PNG_KEYWORD_MAX_LENGTH);
+ keyword = clippedKeys.back().c_str();
+ }
+ // It seems safe to convert png_const_charp to png_charp for key/text,
+ // and we don't have to provide text_length and other fields as we're providing
+ // 0-terminated c_str with PNG_TEXT_COMPRESSION_NONE (no compression, no itxt).
+ png_texts[i].compression = PNG_TEXT_COMPRESSION_NONE;
+ png_texts[i].key = (png_charp)keyword;
+ png_texts[i].text = (png_charp)text;
+ }
+ png_set_text(fPngPtr, fInfoPtr, png_texts.data(), png_texts.size());
+ }
+
return true;
}