blob: ec36bc75e94e00edd22b857b179a9033a95fe5c1 [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"
9#include "SkData.h"
10#include "SkCodec_libpng.h"
11#include "SkStream.h"
12
13SkCodec* SkCodec::NewFromStream(SkStream* stream) {
14 if (!stream) {
15 return NULL;
16 }
msarettdfdec782015-03-16 11:07:02 -070017 SkAutoTDelete<SkStream> streamDeleter(stream);
18 const bool isPng = SkPngCodec::IsPng(stream);
19 // TODO: Avoid rewinding.
20 if (!stream->rewind()) {
21 return NULL;
scroggof24f2242015-03-03 08:59:20 -080022 }
msarettdfdec782015-03-16 11:07:02 -070023 if (isPng) {
24 streamDeleter.detach();
25 return SkPngCodec::NewFromStream(stream);
26 }
27 // TODO: Check other image types.
scroggof24f2242015-03-03 08:59:20 -080028 return NULL;
29}
30
31SkCodec* SkCodec::NewFromData(SkData* data) {
32 if (!data) {
33 return NULL;
34 }
35 return NewFromStream(SkNEW_ARGS(SkMemoryStream, (data)));
36}
37
38SkCodec::SkCodec(const SkImageInfo& info, SkStream* stream)
39 : fInfo(info)
40 , fStream(stream)
41 , fNeedsRewind(false)
42{}
43
44bool SkCodec::rewindIfNeeded() {
45 // Store the value of fNeedsRewind so we can update it. Next read will
46 // require a rewind.
47 const bool neededRewind = fNeedsRewind;
48 fNeedsRewind = true;
49 return !neededRewind || fStream->rewind();
50}