blob: c2a5f4a7075dc5b66415040c0b3ff2c26a16b020 [file] [log] [blame]
scroggof24f2242015-03-03 08:59:20 -08001/*
2 * Copyright 2015 Google Inc.
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 "SkCodec.h"
scroggo05245902015-03-25 11:11:52 -07009#include "SkColorTable.h"
scroggocf98fa92015-11-23 08:14:40 -080010#include "SkPngChunkReader.h"
scroggo1dd3ea92015-03-20 11:55:55 -070011#include "SkEncodedFormat.h"
scroggof24f2242015-03-03 08:59:20 -080012#include "SkImageInfo.h"
scroggo05245902015-03-25 11:11:52 -070013#include "SkRefCnt.h"
14#include "SkSwizzler.h"
scroggof24f2242015-03-03 08:59:20 -080015
djsollenb2a6fe72015-04-03 12:35:27 -070016#include "png.h"
scroggof24f2242015-03-03 08:59:20 -080017
18class SkStream;
19
20class SkPngCodec : public SkCodec {
21public:
scroggof24f2242015-03-03 08:59:20 -080022 static bool IsPng(SkStream*);
scroggo9b2cdbf2015-07-10 12:07:02 -070023
scroggo1c005e42015-08-04 09:24:45 -070024 // Assume IsPng was called and returned true.
scroggocf98fa92015-11-23 08:14:40 -080025 static SkCodec* NewFromStream(SkStream*, SkPngChunkReader* = NULL);
scroggo1c005e42015-08-04 09:24:45 -070026
scroggo9b2cdbf2015-07-10 12:07:02 -070027 virtual ~SkPngCodec();
28
scroggof24f2242015-03-03 08:59:20 -080029protected:
msarette6dd0042015-10-09 11:07:34 -070030 Result onGetPixels(const SkImageInfo&, void*, size_t, const Options&, SkPMColor*, int*, int*)
mtklein36352bf2015-03-25 18:17:31 -070031 override;
32 SkEncodedFormat onGetEncodedFormat() const override { return kPNG_SkEncodedFormat; }
scroggob427db12015-08-12 07:24:13 -070033 bool onRewind() override;
msarette6dd0042015-10-09 11:07:34 -070034 uint32_t onGetFillValue(SkColorType colorType, SkAlphaType alphaType) const override;
scroggo46c57472015-09-30 08:57:13 -070035 bool onReallyHasAlpha() const final;
36
37 // Helper to set up swizzler and color table. Also calls png_read_update_info.
38 Result initializeSwizzler(const SkImageInfo& requestedInfo, const Options&,
39 SkPMColor*, int* ctableCount);
msarette6dd0042015-10-09 11:07:34 -070040 SkSampler* getSampler(bool createIfNecessary) override {
41 SkASSERT(fSwizzler);
42 return fSwizzler;
43 }
scroggo46c57472015-09-30 08:57:13 -070044
scroggocf98fa92015-11-23 08:14:40 -080045 SkPngCodec(const SkImageInfo&, SkStream*, SkPngChunkReader*, png_structp, png_infop, int, int);
scroggo46c57472015-09-30 08:57:13 -070046
47 png_structp png_ptr() { return fPng_ptr; }
48 SkSwizzler* swizzler() { return fSwizzler; }
49 SkSwizzler::SrcConfig srcConfig() const { return fSrcConfig; }
50 int numberPasses() const { return fNumberPasses; }
51
52 enum AlphaState {
53 // This class has done no decoding, or threw away its knowledge (in
54 // scanline decodes).
55 kUnknown_AlphaState,
56 // This class found the image (possibly partial, in the case of a
57 // scanline decode) to be opaque.
58 kOpaque_AlphaState,
59 // Ths class found the image to have alpha.
60 kHasAlpha_AlphaState,
61 };
62
63 virtual AlphaState alphaInScanlineDecode() const = 0;
emmaleer8f4ba762015-08-14 07:44:46 -070064
scroggof24f2242015-03-03 08:59:20 -080065private:
scroggocf98fa92015-11-23 08:14:40 -080066 SkAutoTUnref<SkPngChunkReader> fPngChunkReader;
67 png_structp fPng_ptr;
68 png_infop fInfo_ptr;
scroggo05245902015-03-25 11:11:52 -070069
70 // These are stored here so they can be used both by normal decoding and scanline decoding.
scroggocf98fa92015-11-23 08:14:40 -080071 SkAutoTUnref<SkColorTable> fColorTable; // May be unpremul.
72 SkAutoTDelete<SkSwizzler> fSwizzler;
scroggo05245902015-03-25 11:11:52 -070073
scroggocf98fa92015-11-23 08:14:40 -080074 SkSwizzler::SrcConfig fSrcConfig;
75 const int fNumberPasses;
76 int fBitDepth;
77 AlphaState fAlphaState;
scroggo6f29a3c2015-07-07 06:09:08 -070078
scroggo9b2cdbf2015-07-10 12:07:02 -070079 bool decodePalette(bool premultiply, int* ctableCount);
scroggo3eada2a2015-04-01 09:33:23 -070080 void destroyReadStruct();
scroggo05245902015-03-25 11:11:52 -070081
scroggof24f2242015-03-03 08:59:20 -080082 typedef SkCodec INHERITED;
83};