DecodeFile.h revision 145dbcd165d9d27298eb8888bc240e2d06a95464
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
8d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett#include "SkBitmap.h"
9d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett#include "SkCodec.h"
10d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett#include "SkData.h"
11ccebcec4aca71fd17626b45f27fbe613bfa18b64reed#include "SkImage.h"
12d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett
13ccebcec4aca71fd17626b45f27fbe613bfa18b64reedstatic inline bool decode_file(const char* filename, SkBitmap* bitmap,
14ccebcec4aca71fd17626b45f27fbe613bfa18b64reed                               SkColorType colorType = kN32_SkColorType,
15ccebcec4aca71fd17626b45f27fbe613bfa18b64reed                               bool requireUnpremul = false) {
16d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett    SkASSERT(kIndex_8_SkColorType != colorType);
1738d909ec2875f79952de08f36adfaac5680d2c53bungeman    sk_sp<SkData> data(SkData::MakeFromFileName(filename));
18145dbcd165d9d27298eb8888bc240e2d06a95464Ben Wagner    std::unique_ptr<SkCodec> codec(SkCodec::NewFromData(data));
19d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett    if (!codec) {
20d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett        return false;
21d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett    }
22d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett
23d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett    SkImageInfo info = codec->getInfo().makeColorType(colorType);
24d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett    if (requireUnpremul && kPremul_SkAlphaType == info.alphaType()) {
25d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett        info = info.makeAlphaType(kUnpremul_SkAlphaType);
26d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett    }
27d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett
28d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett    if (!bitmap->tryAllocPixels(info)) {
29d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett        return false;
30d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett    }
31d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett
32d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett    return SkCodec::kSuccess == codec->getPixels(info, bitmap->getPixels(), bitmap->rowBytes());
33d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett}
34ccebcec4aca71fd17626b45f27fbe613bfa18b64reed
35ccebcec4aca71fd17626b45f27fbe613bfa18b64reedstatic inline sk_sp<SkImage> decode_file(const char filename[]) {
36ccebcec4aca71fd17626b45f27fbe613bfa18b64reed    sk_sp<SkData> data(SkData::MakeFromFileName(filename));
37ccebcec4aca71fd17626b45f27fbe613bfa18b64reed    return data ? SkImage::MakeFromEncoded(data) : nullptr;
38ccebcec4aca71fd17626b45f27fbe613bfa18b64reed}
39