1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2014 Google Inc.
3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be
5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file.
6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "ResourceFactory.h"
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "Resources.h"
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkBitmap.h"
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkCommandLineFlags.h"
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkData.h"
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkImage.h"
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkImageGenerator.h"
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkOSFile.h"
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkOSPath.h"
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkStream.h"
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkTypeface.h"
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEFINE_string2(resourcePath, i, "resources", "Directory with test resources: images, fonts, etc.");
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotsk_sp<SkData> (*gResourceFactory)(const char*) = nullptr;
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotSkString GetResourcePath(const char* resource) {
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return SkOSPath::Join(FLAGS_resourcePath[0], resource);
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid SetResourcePath(const char* resource) {
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    FLAGS_resourcePath.set(0, resource);
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotbool DecodeDataToBitmap(sk_sp<SkData> data, SkBitmap* dst) {
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    std::unique_ptr<SkImageGenerator> gen(SkImageGenerator::MakeFromEncoded(std::move(data)));
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return gen && dst->tryAllocPixels(gen->getInfo()) &&
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        gen->getPixels(gen->getInfo().makeColorSpace(nullptr), dst->getPixels(), dst->rowBytes(),
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                       nullptr);
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstd::unique_ptr<SkStreamAsset> GetResourceAsStream(const char* resource) {
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    auto data = GetResourceAsData(resource);
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return data ? std::unique_ptr<SkStreamAsset>(new SkMemoryStream(std::move(data)))
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                : nullptr;
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotsk_sp<SkData> GetResourceAsData(const char* resource) {
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (gResourceFactory) {
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (auto data = gResourceFactory(resource)) {
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            return data;
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkDebugf("Resource \"%s\" not found.\n", resource);
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SK_ABORT("missing resource");
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (auto data = SkData::MakeFromFileName(GetResourcePath(resource).c_str())) {
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return data;
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkDebugf("Resource \"%s\" not found.\n", resource);
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return nullptr;
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotsk_sp<SkTypeface> MakeResourceAsTypeface(const char* resource) {
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    std::unique_ptr<SkStreamAsset> stream(GetResourceAsStream(resource));
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (!stream) {
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return nullptr;
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return SkTypeface::MakeFromStream(stream.release());
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
67