blob: 22bbc57c2f593a083734311f0c2dadb5f4994947 [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
reed@android.comb08eb2b2009-01-06 20:16:26 +00008#include "SkImageEncoder.h"
9#include "SkBitmap.h"
halcanaryf2848b62015-12-10 12:40:23 -080010#include "SkPixelSerializer.h"
11#include "SkPixmap.h"
reed@android.comb08eb2b2009-01-06 20:16:26 +000012#include "SkStream.h"
13#include "SkTemplates.h"
14
15SkImageEncoder::~SkImageEncoder() {}
16
17bool SkImageEncoder::encodeStream(SkWStream* stream, const SkBitmap& bm,
18 int quality) {
19 quality = SkMin32(100, SkMax32(0, quality));
20 return this->onEncode(stream, bm, quality);
21}
22
23bool SkImageEncoder::encodeFile(const char file[], const SkBitmap& bm,
24 int quality) {
25 quality = SkMin32(100, SkMax32(0, quality));
26 SkFILEWStream stream(file);
27 return this->onEncode(&stream, bm, quality);
28}
29
reed@google.com4b0757b2013-05-20 16:33:41 +000030SkData* SkImageEncoder::encodeData(const SkBitmap& bm, int quality) {
31 SkDynamicMemoryWStream stream;
32 quality = SkMin32(100, SkMax32(0, quality));
33 if (this->onEncode(&stream, bm, quality)) {
34 return stream.copyToData();
35 }
halcanary96fcdcc2015-08-27 07:41:13 -070036 return nullptr;
reed@google.com4b0757b2013-05-20 16:33:41 +000037}
38
reed@android.comb08eb2b2009-01-06 20:16:26 +000039bool SkImageEncoder::EncodeFile(const char file[], const SkBitmap& bm, Type t,
40 int quality) {
41 SkAutoTDelete<SkImageEncoder> enc(SkImageEncoder::Create(t));
42 return enc.get() && enc.get()->encodeFile(file, bm, quality);
43}
44
45bool SkImageEncoder::EncodeStream(SkWStream* stream, const SkBitmap& bm, Type t,
reed@google.com4b0757b2013-05-20 16:33:41 +000046 int quality) {
reed@android.comb08eb2b2009-01-06 20:16:26 +000047 SkAutoTDelete<SkImageEncoder> enc(SkImageEncoder::Create(t));
48 return enc.get() && enc.get()->encodeStream(stream, bm, quality);
49}
reed@google.com4b0757b2013-05-20 16:33:41 +000050
51SkData* SkImageEncoder::EncodeData(const SkBitmap& bm, Type t, int quality) {
52 SkAutoTDelete<SkImageEncoder> enc(SkImageEncoder::Create(t));
halcanary96fcdcc2015-08-27 07:41:13 -070053 return enc.get() ? enc.get()->encodeData(bm, quality) : nullptr;
reed@google.com4b0757b2013-05-20 16:33:41 +000054}
reed53b9e2e2014-12-19 12:26:07 -080055
56SkData* SkImageEncoder::EncodeData(const SkImageInfo& info, const void* pixels, size_t rowBytes,
57 Type t, int quality) {
58 SkBitmap bm;
59 if (!bm.installPixels(info, const_cast<void*>(pixels), rowBytes)) {
halcanary96fcdcc2015-08-27 07:41:13 -070060 return nullptr;
reed53b9e2e2014-12-19 12:26:07 -080061 }
halcanaryf2848b62015-12-10 12:40:23 -080062 bm.setImmutable();
63 return SkImageEncoder::EncodeData(bm, t, quality);
64}
65
66SkData* SkImageEncoder::EncodeData(const SkPixmap& pixmap,
67 Type t, int quality) {
68 SkBitmap bm;
69 if (!bm.installPixels(pixmap)) {
70 return nullptr;
71 }
72 bm.setImmutable();
73 return SkImageEncoder::EncodeData(bm, t, quality);
74}
75
76namespace {
77class ImageEncoderPixelSerializer final : public SkPixelSerializer {
78protected:
79 bool onUseEncodedData(const void*, size_t) override { return true; }
80 SkData* onEncode(const SkPixmap& pmap) override {
81 return SkImageEncoder::EncodeData(pmap, SkImageEncoder::kPNG_Type, 100);
82 }
83};
84} // namespace
85
86SkPixelSerializer* SkImageEncoder::CreatePixelSerializer() {
87 return new ImageEncoderPixelSerializer;
reed53b9e2e2014-12-19 12:26:07 -080088}