blob: 67680d66e85fdc78cb0e7b9a5c500e2463c3a233 [file] [log] [blame]
msarette16b04a2015-04-15 07:32:19 -07001/*
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#ifndef SkJpegCodec_DEFINED
9#define SkJpegCodec_DEFINED
10
11#include "SkCodec.h"
12#include "SkImageInfo.h"
13#include "SkJpegDecoderMgr.h"
mtklein525e90a2015-06-18 09:58:57 -070014#include "SkJpegUtility_codec.h"
msarette16b04a2015-04-15 07:32:19 -070015#include "SkStream.h"
16
17extern "C" {
18 #include "jpeglib.h"
19}
20
21/*
22 *
23 * This class implements the decoding for jpeg images
24 *
25 */
26class SkJpegCodec : public SkCodec {
27public:
28
29 /*
30 * Checks the start of the stream to see if the image is a jpeg
31 * Does not take ownership of the stream
32 */
33 static bool IsJpeg(SkStream*);
34
35 /*
36 * Assumes IsJpeg was called and returned true
37 * Creates a jpeg decoder
38 * Takes ownership of the stream
39 */
40 static SkCodec* NewFromStream(SkStream*);
41
42protected:
43
44 /*
45 * Recommend a set of destination dimensions given a requested scale
46 */
47 SkISize onGetScaledDimensions(float desiredScale) const override;
48
49 /*
50 * Initiates the jpeg decode
51 */
52 Result onGetPixels(const SkImageInfo& dstInfo, void* dst, size_t dstRowBytes, const Options&,
msarette6dd0042015-10-09 11:07:34 -070053 SkPMColor*, int*, int*) override;
msarette16b04a2015-04-15 07:32:19 -070054
55 SkEncodedFormat onGetEncodedFormat() const override {
56 return kJPEG_SkEncodedFormat;
57 }
58
scroggob427db12015-08-12 07:24:13 -070059 bool onRewind() override;
60
scroggoe7fc14b2015-10-02 13:14:46 -070061 bool onDimensionsSupported(const SkISize&) override;
62
msarette16b04a2015-04-15 07:32:19 -070063private:
64
65 /*
66 * Read enough of the stream to initialize the SkJpegCodec.
67 * Returns a bool representing success or failure.
68 *
69 * @param codecOut
halcanary96fcdcc2015-08-27 07:41:13 -070070 * If this returns true, and codecOut was not nullptr,
msarette16b04a2015-04-15 07:32:19 -070071 * codecOut will be set to a new SkJpegCodec.
72 *
73 * @param decoderMgrOut
halcanary96fcdcc2015-08-27 07:41:13 -070074 * If this returns true, and codecOut was nullptr,
75 * decoderMgrOut must be non-nullptr and decoderMgrOut will be set to a new
msarette16b04a2015-04-15 07:32:19 -070076 * JpegDecoderMgr pointer.
77 *
78 * @param stream
79 * Deleted on failure.
80 * codecOut will take ownership of it in the case where we created a codec.
81 * Ownership is unchanged when we set decoderMgrOut.
82 *
83 */
84 static bool ReadHeader(SkStream* stream, SkCodec** codecOut,
85 JpegDecoderMgr** decoderMgrOut);
86
87 /*
88 * Creates an instance of the decoder
89 * Called only by NewFromStream
90 *
91 * @param srcInfo contains the source width and height
92 * @param stream the encoded image data
93 * @param decoderMgr holds decompress struct, src manager, and error manager
94 * takes ownership
95 */
96 SkJpegCodec(const SkImageInfo& srcInfo, SkStream* stream, JpegDecoderMgr* decoderMgr);
97
msarett97fdea62015-04-29 08:17:15 -070098 /*
msarett1c8a5872015-07-07 08:50:01 -070099 * Checks if the conversion between the input image and the requested output
100 * image has been implemented
101 * Sets the output color space
102 */
103 bool setOutputColorSpace(const SkImageInfo& dst);
104
scroggo46c57472015-09-30 08:57:13 -0700105 // scanline decoding
msarette6dd0042015-10-09 11:07:34 -0700106 SkSampler* getSampler(bool createIfNecessary) override;
scroggo46c57472015-09-30 08:57:13 -0700107 Result onStartScanlineDecode(const SkImageInfo& dstInfo, const Options& options,
108 SkPMColor ctable[], int* ctableCount) override;
msarette6dd0042015-10-09 11:07:34 -0700109 int onGetScanlines(void* dst, int count, size_t rowBytes) override;
110 bool onSkipScanlines(int count) override;
scroggo46c57472015-09-30 08:57:13 -0700111
msarette16b04a2015-04-15 07:32:19 -0700112 SkAutoTDelete<JpegDecoderMgr> fDecoderMgr;
msarettfbccb592015-09-01 06:43:41 -0700113 // We will save the state of the decompress struct after reading the header.
114 // This allows us to safely call onGetScaledDimensions() at any time.
115 const int fReadyState;
msarette16b04a2015-04-15 07:32:19 -0700116
scroggo46c57472015-09-30 08:57:13 -0700117 // scanline decoding
118 SkAutoMalloc fStorage; // Only used if sampling is needed
119 uint8_t* fSrcRow; // Only used if sampling is needed
120 SkAutoTDelete<SkSwizzler> fSwizzler;
121
msarette16b04a2015-04-15 07:32:19 -0700122 typedef SkCodec INHERITED;
123};
124
125#endif