1d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett/*
2d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett * Copyright 2016 Google Inc.
3d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett *
4d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett * Use of this source code is governed by a BSD-style license that can be
5d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett * found in the LICENSE file.
6d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett */
7d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett
803a7f5fe2de9b0c886be4063533c91720ced0bf9Hal Canary#ifndef DecodeFile_DEFINED
903a7f5fe2de9b0c886be4063533c91720ced0bf9Hal Canary#define DecodeFile_DEFINED
1003a7f5fe2de9b0c886be4063533c91720ced0bf9Hal Canary
11d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett#include "SkBitmap.h"
12d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett#include "SkCodec.h"
13d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett#include "SkData.h"
14ccebcec4aca71fd17626b45f27fbe613bfa18b64reed#include "SkImage.h"
15d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett
16ccebcec4aca71fd17626b45f27fbe613bfa18b64reedstatic inline bool decode_file(const char* filename, SkBitmap* bitmap,
17ccebcec4aca71fd17626b45f27fbe613bfa18b64reed                               SkColorType colorType = kN32_SkColorType,
18ccebcec4aca71fd17626b45f27fbe613bfa18b64reed                               bool requireUnpremul = false) {
19d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett    SkASSERT(kIndex_8_SkColorType != colorType);
2038d909ec2875f79952de08f36adfaac5680d2c53bungeman    sk_sp<SkData> data(SkData::MakeFromFileName(filename));
21145dbcd165d9d27298eb8888bc240e2d06a95464Ben Wagner    std::unique_ptr<SkCodec> codec(SkCodec::NewFromData(data));
22d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett    if (!codec) {
23d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett        return false;
24d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett    }
25d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett
26d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett    SkImageInfo info = codec->getInfo().makeColorType(colorType);
27d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett    if (requireUnpremul && kPremul_SkAlphaType == info.alphaType()) {
28d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett        info = info.makeAlphaType(kUnpremul_SkAlphaType);
29d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett    }
30d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett
31d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett    if (!bitmap->tryAllocPixels(info)) {
32d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett        return false;
33d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett    }
34d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett
35d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett    return SkCodec::kSuccess == codec->getPixels(info, bitmap->getPixels(), bitmap->rowBytes());
36d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett}
37ccebcec4aca71fd17626b45f27fbe613bfa18b64reed
38ccebcec4aca71fd17626b45f27fbe613bfa18b64reedstatic inline sk_sp<SkImage> decode_file(const char filename[]) {
39ccebcec4aca71fd17626b45f27fbe613bfa18b64reed    sk_sp<SkData> data(SkData::MakeFromFileName(filename));
40ccebcec4aca71fd17626b45f27fbe613bfa18b64reed    return data ? SkImage::MakeFromEncoded(data) : nullptr;
41ccebcec4aca71fd17626b45f27fbe613bfa18b64reed}
4203a7f5fe2de9b0c886be4063533c91720ced0bf9Hal Canary#endif  // DecodeFile_DEFINED
43