7992da32f0
Our codec generator will now preserve any asked-for color space, and convert the encoded data to that representation. Cacherator now allows decoding an image to both legacy (nullptr color space), and color-correct formats. In color-correct mode, we choose the best decoded format, based on the original properties, and our backend's capabilities. Preference is given to the native format, when it's already texturable (sRGB 8888 or F16 linear). Otherwise, we prefer linear F16, and fall back to sRGB when that's not an option. Re-land (and fix) of: https://skia-review.googlesource.com/c/4438/ https://skia-review.googlesource.com/c/4796/ BUG=skia:5907 GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=4838 Change-Id: I20ff972ffe1c7e6535ddc501e2a8ab8c246e4061 Reviewed-on: https://skia-review.googlesource.com/4838 Commit-Queue: Brian Osman <brianosman@google.com> Reviewed-by: Matt Sarett <msarett@google.com>
64 lines
2.1 KiB
C++
64 lines
2.1 KiB
C++
/*
|
|
* Copyright 2014 Google Inc.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*/
|
|
|
|
#include "Resources.h"
|
|
#include "SkBitmap.h"
|
|
#include "SkCommandLineFlags.h"
|
|
#include "SkData.h"
|
|
#include "SkImage.h"
|
|
#include "SkImageGenerator.h"
|
|
#include "SkOSFile.h"
|
|
#include "SkOSPath.h"
|
|
#include "SkStream.h"
|
|
#include "SkTypeface.h"
|
|
|
|
DEFINE_string2(resourcePath, i, "resources", "Directory with test resources: images, fonts, etc.");
|
|
|
|
SkString GetResourcePath(const char* resource) {
|
|
return SkOSPath::Join(FLAGS_resourcePath[0], resource);
|
|
}
|
|
|
|
void SetResourcePath(const char* resource) {
|
|
FLAGS_resourcePath.set(0, resource);
|
|
}
|
|
|
|
bool GetResourceAsBitmap(const char* resource, SkBitmap* dst) {
|
|
SkString resourcePath = GetResourcePath(resource);
|
|
sk_sp<SkData> resourceData(SkData::MakeFromFileName(resourcePath.c_str()));
|
|
std::unique_ptr<SkImageGenerator> gen(SkImageGenerator::NewFromEncoded(resourceData.get()));
|
|
SkPMColor ctStorage[256];
|
|
sk_sp<SkColorTable> ctable(new SkColorTable(ctStorage, 256));
|
|
int count = ctable->count();
|
|
return dst->tryAllocPixels(gen->getInfo(), nullptr, ctable.get()) &&
|
|
gen->getPixels(gen->getInfo().makeColorSpace(nullptr), dst->getPixels(), dst->rowBytes(),
|
|
const_cast<SkPMColor*>(ctable->readColors()), &count);
|
|
}
|
|
|
|
sk_sp<SkImage> GetResourceAsImage(const char* resource) {
|
|
SkString path = GetResourcePath(resource);
|
|
sk_sp<SkData> resourceData(SkData::MakeFromFileName(path.c_str()));
|
|
return SkImage::MakeFromEncoded(resourceData);
|
|
}
|
|
|
|
SkStreamAsset* GetResourceAsStream(const char* resource) {
|
|
SkString resourcePath = GetResourcePath(resource);
|
|
std::unique_ptr<SkFILEStream> stream(new SkFILEStream(resourcePath.c_str()));
|
|
if (!stream->isValid()) {
|
|
SkDebugf("Resource %s not found.\n", resource);
|
|
return nullptr;
|
|
}
|
|
return stream.release();
|
|
}
|
|
|
|
sk_sp<SkTypeface> MakeResourceAsTypeface(const char* resource) {
|
|
std::unique_ptr<SkStreamAsset> stream(GetResourceAsStream(resource));
|
|
if (!stream) {
|
|
return nullptr;
|
|
}
|
|
return SkTypeface::MakeFromStream(stream.release());
|
|
}
|