SkImageEncoder.cpp revision 42943c8aa9c611c18ad0f1a30a27669f3d82239c
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 "SkImageEncoder.h" 9#include "SkBitmap.h" 10#include "SkPixelSerializer.h" 11#include "SkPixmap.h" 12#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 30SkData* 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.detachAsData().release(); 35 } 36 return nullptr; 37} 38 39bool 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, 46 int quality) { 47 SkAutoTDelete<SkImageEncoder> enc(SkImageEncoder::Create(t)); 48 return enc.get() && enc.get()->encodeStream(stream, bm, quality); 49} 50 51SkData* SkImageEncoder::EncodeData(const SkBitmap& bm, Type t, int quality) { 52 SkAutoTDelete<SkImageEncoder> enc(SkImageEncoder::Create(t)); 53 return enc.get() ? enc.get()->encodeData(bm, quality) : nullptr; 54} 55 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)) { 60 return nullptr; 61 } 62 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; 88} 89