1bcbc1788b478b1e54079318ad073e8490aa66faetfarina/*
2bcbc1788b478b1e54079318ad073e8490aa66faetfarina * Copyright 2014 Google Inc.
3bcbc1788b478b1e54079318ad073e8490aa66faetfarina *
4bcbc1788b478b1e54079318ad073e8490aa66faetfarina * Use of this source code is governed by a BSD-style license that can be
5bcbc1788b478b1e54079318ad073e8490aa66faetfarina * found in the LICENSE file.
6bcbc1788b478b1e54079318ad073e8490aa66faetfarina */
7bcbc1788b478b1e54079318ad073e8490aa66faetfarina
8537d9c0229b296a1b19f678432011d748d73cf18Hal Canary#include "ResourceFactory.h"
9bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "Resources.h"
1030b83d45a3af444e6868c638d86442c2ea3e20c6halcanary#include "SkBitmap.h"
11bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "SkCommandLineFlags.h"
1230b83d45a3af444e6868c638d86442c2ea3e20c6halcanary#include "SkData.h"
132f0a728e5aed1553811a44c4203b68853255f1bdhalcanary#include "SkImage.h"
145965c8ae4ee960275da4bc40189bdba85aab8b5ereed#include "SkImageGenerator.h"
15bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "SkOSFile.h"
16bf111d7bc9ba3857433e30eae27f0272c34ed0fbBen Wagner#include "SkOSPath.h"
173ffa126066542590dc7430514a1174e49191b875bungeman#include "SkStream.h"
183ffa126066542590dc7430514a1174e49191b875bungeman#include "SkTypeface.h"
19bcbc1788b478b1e54079318ad073e8490aa66faetfarina
20bcbc1788b478b1e54079318ad073e8490aa66faetfarinaDEFINE_string2(resourcePath, i, "resources", "Directory with test resources: images, fonts, etc.");
21bcbc1788b478b1e54079318ad073e8490aa66faetfarina
22537d9c0229b296a1b19f678432011d748d73cf18Hal Canarysk_sp<SkData> (*gResourceFactory)(const char*) = nullptr;
23537d9c0229b296a1b19f678432011d748d73cf18Hal Canary
24bcbc1788b478b1e54079318ad073e8490aa66faetfarinaSkString GetResourcePath(const char* resource) {
25a8e2e1504b9af6ba791637f228debaa23953064atfarina    return SkOSPath::Join(FLAGS_resourcePath[0], resource);
26bcbc1788b478b1e54079318ad073e8490aa66faetfarina}
27936b73424f7393994be832376287da988a52b993caryclark
28936b73424f7393994be832376287da988a52b993caryclarkvoid SetResourcePath(const char* resource) {
29936b73424f7393994be832376287da988a52b993caryclark    FLAGS_resourcePath.set(0, resource);
30936b73424f7393994be832376287da988a52b993caryclark}
3130b83d45a3af444e6868c638d86442c2ea3e20c6halcanary
320933bc9b679457ef9333988fe3a1faae6a0b4126Mike Reedbool DecodeDataToBitmap(sk_sp<SkData> data, SkBitmap* dst) {
330933bc9b679457ef9333988fe3a1faae6a0b4126Mike Reed    std::unique_ptr<SkImageGenerator> gen(SkImageGenerator::MakeFromEncoded(std::move(data)));
340933bc9b679457ef9333988fe3a1faae6a0b4126Mike Reed    return gen && dst->tryAllocPixels(gen->getInfo()) &&
357992da32f02f90e0ac9ab6914eb31676b502eb71Brian Osman        gen->getPixels(gen->getInfo().makeColorSpace(nullptr), dst->getPixels(), dst->rowBytes(),
36ebb1b5c297e394ab19f99d807095672b7f5d8aefMatt Sarett                       nullptr);
3730b83d45a3af444e6868c638d86442c2ea3e20c6halcanary}
383ffa126066542590dc7430514a1174e49191b875bungeman
3971f867c2294655ccf8981500ad5a3beefb71295eMike Reedstd::unique_ptr<SkStreamAsset> GetResourceAsStream(const char* resource) {
400933bc9b679457ef9333988fe3a1faae6a0b4126Mike Reed    auto data = GetResourceAsData(resource);
410933bc9b679457ef9333988fe3a1faae6a0b4126Mike Reed    return data ? std::unique_ptr<SkStreamAsset>(new SkMemoryStream(std::move(data)))
420933bc9b679457ef9333988fe3a1faae6a0b4126Mike Reed                : nullptr;
433ffa126066542590dc7430514a1174e49191b875bungeman}
443ffa126066542590dc7430514a1174e49191b875bungeman
45a4935104a5dfd646bfecb01b5f4618785bedaff7Hal Canarysk_sp<SkData> GetResourceAsData(const char* resource) {
46b4d01a95c9cbb7adf7adaba193c813313d9d7261Hal Canary    if (gResourceFactory) {
47537d9c0229b296a1b19f678432011d748d73cf18Hal Canary        if (auto data = gResourceFactory(resource)) {
48537d9c0229b296a1b19f678432011d748d73cf18Hal Canary            return data;
49a4935104a5dfd646bfecb01b5f4618785bedaff7Hal Canary        }
50537d9c0229b296a1b19f678432011d748d73cf18Hal Canary        SkDebugf("Resource \"%s\" not found.\n", resource);
51537d9c0229b296a1b19f678432011d748d73cf18Hal Canary        SK_ABORT("missing resource");
52537d9c0229b296a1b19f678432011d748d73cf18Hal Canary    }
53537d9c0229b296a1b19f678432011d748d73cf18Hal Canary    if (auto data = SkData::MakeFromFileName(GetResourcePath(resource).c_str())) {
54537d9c0229b296a1b19f678432011d748d73cf18Hal Canary        return data;
55a4935104a5dfd646bfecb01b5f4618785bedaff7Hal Canary    }
56a4935104a5dfd646bfecb01b5f4618785bedaff7Hal Canary    SkDebugf("Resource \"%s\" not found.\n", resource);
57a4935104a5dfd646bfecb01b5f4618785bedaff7Hal Canary    return nullptr;
58a4935104a5dfd646bfecb01b5f4618785bedaff7Hal Canary}
59463c848f3b63b52e3834e405ff11fd1e653ed271Mike Reed
6013b9c95295f4c5732e34574789e721a6bc08f7b4bungemansk_sp<SkTypeface> MakeResourceAsTypeface(const char* resource) {
61145dbcd165d9d27298eb8888bc240e2d06a95464Ben Wagner    std::unique_ptr<SkStreamAsset> stream(GetResourceAsStream(resource));
623ffa126066542590dc7430514a1174e49191b875bungeman    if (!stream) {
6396fcdcc219d2a0d3579719b84b28bede76efba64halcanary        return nullptr;
643ffa126066542590dc7430514a1174e49191b875bungeman    }
6513b9c95295f4c5732e34574789e721a6bc08f7b4bungeman    return SkTypeface::MakeFromStream(stream.release());
663ffa126066542590dc7430514a1174e49191b875bungeman}
67