blob: 2daba483c544b0f045daed9d9aa59d5a18112149 [file] [log] [blame]
reed@android.comb08eb2b2009-01-06 20:16:26 +00001/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00002 * Copyright 2009 The Android Open Source Project
reed@android.comb08eb2b2009-01-06 20:16:26 +00003 *
epoger@google.comec3ed6a2011-07-28 14:26:00 +00004 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
reed@android.comb08eb2b2009-01-06 20:16:26 +00006 */
7
Hal Canarydb683012016-11-23 08:55:18 -07008#include "SkImageEncoderPriv.h"
Matt Sarett26b44df2017-05-02 16:04:56 -04009#include "SkJpegEncoder.h"
Matt Sarettc367d032017-05-05 11:13:26 -040010#include "SkPngEncoder.h"
reed@android.comb08eb2b2009-01-06 20:16:26 +000011
Hal Canarydb683012016-11-23 08:55:18 -070012bool SkEncodeImage(SkWStream* dst, const SkPixmap& src,
13 SkEncodedImageFormat format, int quality) {
Hal Canary1fcc4042016-11-30 17:07:59 -050014 #ifdef SK_USE_CG_ENCODER
15 (void)quality;
16 return SkEncodeImageWithCG(dst, src, format);
17 #elif SK_USE_WIC_ENCODER
18 return SkEncodeImageWithWIC(dst, src, format, quality);
19 #else
20 switch(format) {
Matt Sarett26b44df2017-05-02 16:04:56 -040021 case SkEncodedImageFormat::kJPEG: {
22 SkJpegEncoder::Options opts;
23 opts.fQuality = quality;
24 return SkJpegEncoder::Encode(dst, src, opts);
25 }
Matt Sarettc367d032017-05-05 11:13:26 -040026 case SkEncodedImageFormat::kPNG: {
27 SkPngEncoder::Options opts;
28 opts.fUnpremulBehavior = SkTransferFunctionBehavior::kIgnore;
29 return SkPngEncoder::Encode(dst, src, opts);
30 }
Matt Sarett84014f02017-01-10 11:28:54 -050031 case SkEncodedImageFormat::kWEBP:
32 return SkEncodeImageAsWEBP(dst, src, quality);
33 default:
34 return false;
Hal Canary1fcc4042016-11-30 17:07:59 -050035 }
36 #endif
reed53b9e2e2014-12-19 12:26:07 -080037}
Matt Sarettc367d032017-05-05 11:13:26 -040038
39bool SkEncoder::encodeRows(int numRows) {
40 SkASSERT(numRows > 0 && fCurrRow < fSrc.height());
41 if (numRows <= 0 || fCurrRow >= fSrc.height()) {
42 return false;
43 }
44
45 if (fCurrRow + numRows > fSrc.height()) {
46 numRows = fSrc.height() - fCurrRow;
47 }
48
49 if (!this->onEncodeRows(numRows)) {
50 // If we fail, short circuit any future calls.
51 fCurrRow = fSrc.height();
52 return false;
53 }
54
55 return true;
56}