/* * Copyright 2006 The Android Open Source Project * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file.
*/
class SkPngEncoderMgr final : SkNoncopyable { public: /* * Create the decode manager * Does not take ownership of stream
*/ static std::unique_ptr<SkPngEncoderMgr> Make(SkWStream* stream);
// 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) { constchar* keyword; constchar* originalKeyword = comments->atStr(2 * i); constchar* 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 = const_cast<png_charp>(keyword);
png_texts[i].text = const_cast<png_charp>(text);
}
png_set_text(fPngPtr, fInfoPtr, png_texts.data(), png_texts.size());
}
// TODO: I don't think this can just use kRGBA's procs. // kPremul is especially tricky here, since it's presumably TF⁻¹(rgb * a), // so to get at unpremul rgb we'd need to undo the transfer function first. case kSRGBA_8888_SkColorType: return nullptr;
case kRGBA_8888_SkColorType: switch (info.alphaType()) { case kOpaque_SkAlphaType: return transform_scanline_RGBX; case kUnpremul_SkAlphaType: return transform_scanline_memcpy; case kPremul_SkAlphaType: return transform_scanline_rgbA; default:
SkDEBUGFAIL("unknown alpha type"); return nullptr;
} case kBGRA_8888_SkColorType: switch (info.alphaType()) { case kOpaque_SkAlphaType: return transform_scanline_BGRX; case kUnpremul_SkAlphaType: return transform_scanline_BGRA; case kPremul_SkAlphaType: return transform_scanline_bgrA; default:
SkDEBUGFAIL("unknown alpha type"); return nullptr;
} case kRGB_565_SkColorType: return transform_scanline_565; case kRGB_888x_SkColorType: return transform_scanline_RGBX; case kARGB_4444_SkColorType: switch (info.alphaType()) { case kOpaque_SkAlphaType: return transform_scanline_444; case kPremul_SkAlphaType: return transform_scanline_4444; default:
SkDEBUGFAIL("unknown alpha type"); return nullptr;
} case kGray_8_SkColorType: return transform_scanline_memcpy;
case kRGBA_F16Norm_SkColorType: case kRGBA_F16_SkColorType: switch (info.alphaType()) { case kOpaque_SkAlphaType: case kUnpremul_SkAlphaType: return transform_scanline_F16; case kPremul_SkAlphaType: return transform_scanline_F16_premul; default:
SkDEBUGFAIL("unknown alpha type"); return nullptr;
} case kRGB_F16F16F16x_SkColorType: return transform_scanline_F16F16F16x; case kRGBA_F32_SkColorType: switch (info.alphaType()) { case kOpaque_SkAlphaType: case kUnpremul_SkAlphaType: return transform_scanline_F32; case kPremul_SkAlphaType: return transform_scanline_F32_premul; default:
SkDEBUGFAIL("unknown alpha type"); return nullptr;
} case kRGBA_1010102_SkColorType: switch (info.alphaType()) { case kOpaque_SkAlphaType: case kUnpremul_SkAlphaType: return transform_scanline_1010102; case kPremul_SkAlphaType: return transform_scanline_1010102_premul; default:
SkDEBUGFAIL("unknown alpha type"); return nullptr;
} case kBGRA_1010102_SkColorType: switch (info.alphaType()) { case kOpaque_SkAlphaType: case kUnpremul_SkAlphaType: return transform_scanline_bgra_1010102; case kPremul_SkAlphaType: return transform_scanline_bgra_1010102_premul; default:
SkDEBUGFAIL("unknown alpha type"); return nullptr;
} case kRGB_101010x_SkColorType: return transform_scanline_101010x; case kBGR_101010x_SkColorType: return transform_scanline_bgr_101010x; case kBGR_101010x_XR_SkColorType: switch (info.alphaType()) { case kOpaque_SkAlphaType: return transform_scanline_bgr_101010x_xr; default:
SkDEBUGFAIL("unsupported color type"); return nullptr;
} case kBGRA_10101010_XR_SkColorType: switch (info.alphaType()) { case kOpaque_SkAlphaType: case kUnpremul_SkAlphaType: return transform_scanline_bgra_10101010_xr; case kPremul_SkAlphaType: return transform_scanline_bgra_10101010_xr_premul; default:
SkDEBUGFAIL("unknown alpha type"); return nullptr;
} case kAlpha_8_SkColorType: return transform_scanline_A8_to_GrayAlpha; case kR8G8_unorm_SkColorType: case kR16G16_unorm_SkColorType: case kR16G16_float_SkColorType: case kA16_unorm_SkColorType: case kA16_float_SkColorType: case kR16G16B16A16_unorm_SkColorType: case kR8_unorm_SkColorType: case kRGBA_10x6_SkColorType: return nullptr;
}
SkDEBUGFAIL("unsupported color type"); return nullptr;
}
bool SkPngEncoderMgr::writeInfo(const SkImageInfo& srcInfo) { if (setjmp(png_jmpbuf(fPngPtr))) { returnfalse;
}
png_write_info(fPngPtr, fInfoPtr); if (kRGBA_F16_SkColorType == srcInfo.colorType() &&
kOpaque_SkAlphaType == srcInfo.alphaType()) { // For kOpaque, kRGBA_F16, we will keep the row as RGBA and tell libpng // to skip the alpha channel.
png_set_filler(fPngPtr, 0, PNG_FILLER_AFTER);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.