std::unique_ptr<SkEncoder> SkJpegEncoder::Make(SkWStream* dst, const SkPixmap& src, const Options& options) { if (!SkPixmapIsValid(src, options.fBlendBehavior)) { return nullptr; } std::unique_ptr<SkJpegEncoderMgr> encoderMgr = SkJpegEncoderMgr::Make(dst); if (setjmp(encoderMgr->jmpBuf())) { return nullptr; } if (!encoderMgr->setParams(src.info(), options)) { return nullptr; } jpeg_set_quality(encoderMgr->cinfo(), options.fQuality, TRUE); jpeg_start_compress(encoderMgr->cinfo(), TRUE); sk_sp<SkData> icc = icc_from_color_space(src.info()); if (icc) { // Create a contiguous block of memory with the icc signature followed by the profile. sk_sp<SkData> markerData = SkData::MakeUninitialized(kICCMarkerHeaderSize + icc->size()); uint8_t* ptr = (uint8_t*) markerData->writable_data(); memcpy(ptr, kICCSig, sizeof(kICCSig)); ptr += sizeof(kICCSig); *ptr++ = 1; // This is the first marker. *ptr++ = 1; // Out of one total markers. memcpy(ptr, icc->data(), icc->size()); jpeg_write_marker(encoderMgr->cinfo(), kICCMarker, markerData->bytes(), markerData->size()); } return std::unique_ptr<SkJpegEncoder>(new SkJpegEncoder(std::move(encoderMgr), src)); }
std::unique_ptr<SkEncoder> SkPngEncoder::Make(SkWStream* dst, const SkPixmap& src, const Options& options) { if (!SkPixmapIsValid(src)) { return nullptr; } std::unique_ptr<SkPngEncoderMgr> encoderMgr = SkPngEncoderMgr::Make(dst); if (!encoderMgr) { return nullptr; } if (!encoderMgr->setHeader(src.info(), options)) { return nullptr; } if (!encoderMgr->setColorSpace(src.info())) { return nullptr; } if (!encoderMgr->writeInfo(src.info())) { return nullptr; } encoderMgr->chooseProc(src.info()); return std::unique_ptr<SkPngEncoder>(new SkPngEncoder(std::move(encoderMgr), src)); }