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