1 /*
2 * Copyright 2009 The Android Open Source Project
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8 #include "SkImageEncoderPriv.h"
9 #include "SkJpegEncoder.h"
10 #include "SkPngEncoder.h"
11 #include "SkWebpEncoder.h"
12
13 #ifndef SK_HAS_JPEG_LIBRARY
Encode(SkWStream *,const SkPixmap &,const Options &)14 bool SkJpegEncoder::Encode(SkWStream*, const SkPixmap&, const Options&) { return false; }
Make(SkWStream *,const SkPixmap &,const Options &)15 std::unique_ptr<SkEncoder> SkJpegEncoder::Make(SkWStream*, const SkPixmap&, const Options&) {
16 return nullptr;
17 }
18 #endif
19
20 #ifndef SK_HAS_PNG_LIBRARY
Encode(SkWStream *,const SkPixmap &,const Options &)21 bool SkPngEncoder::Encode(SkWStream*, const SkPixmap&, const Options&) { return false; }
Make(SkWStream *,const SkPixmap &,const Options &)22 std::unique_ptr<SkEncoder> SkPngEncoder::Make(SkWStream*, const SkPixmap&, const Options&) {
23 return nullptr;
24 }
25 #endif
26
27 #ifndef SK_HAS_WEBP_LIBRARY
Encode(SkWStream *,const SkPixmap &,const Options &)28 bool SkWebpEncoder::Encode(SkWStream*, const SkPixmap&, const Options&) { return false; }
29 #endif
30
SkEncodeImage(SkWStream * dst,const SkPixmap & src,SkEncodedImageFormat format,int quality)31 bool SkEncodeImage(SkWStream* dst, const SkPixmap& src,
32 SkEncodedImageFormat format, int quality) {
33 #ifdef SK_USE_CG_ENCODER
34 (void)quality;
35 return SkEncodeImageWithCG(dst, src, format);
36 #elif SK_USE_WIC_ENCODER
37 return SkEncodeImageWithWIC(dst, src, format, quality);
38 #else
39 switch(format) {
40 case SkEncodedImageFormat::kJPEG: {
41 SkJpegEncoder::Options opts;
42 opts.fQuality = quality;
43 opts.fBlendBehavior = SkTransferFunctionBehavior::kIgnore;
44 return SkJpegEncoder::Encode(dst, src, opts);
45 }
46 case SkEncodedImageFormat::kPNG: {
47 SkPngEncoder::Options opts;
48 opts.fUnpremulBehavior = SkTransferFunctionBehavior::kIgnore;
49 return SkPngEncoder::Encode(dst, src, opts);
50 }
51 case SkEncodedImageFormat::kWEBP: {
52 SkWebpEncoder::Options opts;
53 opts.fCompression = SkWebpEncoder::Compression::kLossy;
54 opts.fQuality = quality;
55 opts.fUnpremulBehavior = SkTransferFunctionBehavior::kIgnore;
56 return SkWebpEncoder::Encode(dst, src, opts);
57 }
58 default:
59 return false;
60 }
61 #endif
62 }
63
encodeRows(int numRows)64 bool SkEncoder::encodeRows(int numRows) {
65 SkASSERT(numRows > 0 && fCurrRow < fSrc.height());
66 if (numRows <= 0 || fCurrRow >= fSrc.height()) {
67 return false;
68 }
69
70 if (fCurrRow + numRows > fSrc.height()) {
71 numRows = fSrc.height() - fCurrRow;
72 }
73
74 if (!this->onEncodeRows(numRows)) {
75 // If we fail, short circuit any future calls.
76 fCurrRow = fSrc.height();
77 return false;
78 }
79
80 return true;
81 }
82
SkEncodePixmap(const SkPixmap & src,SkEncodedImageFormat format,int quality)83 sk_sp<SkData> SkEncodePixmap(const SkPixmap& src, SkEncodedImageFormat format, int quality) {
84 SkDynamicMemoryWStream stream;
85 return SkEncodeImage(&stream, src, format, quality) ? stream.detachAsData() : nullptr;
86 }
87
SkEncodeBitmap(const SkBitmap & src,SkEncodedImageFormat format,int quality)88 sk_sp<SkData> SkEncodeBitmap(const SkBitmap& src, SkEncodedImageFormat format, int quality) {
89 SkPixmap pixmap;
90 return src.peekPixels(&pixmap) ? SkEncodePixmap(pixmap, format, quality) : nullptr;
91 }
92