• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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