12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- /*
- * Copyright 2019 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
- #include "tools/gpu/YUVUtils.h"
- #include "include/core/SkData.h"
- #include "include/gpu/GrContext.h"
- #include "src/codec/SkCodecImageGenerator.h"
- #include "src/gpu/GrContextPriv.h"
- namespace sk_gpu_test {
- std::unique_ptr<LazyYUVImage> LazyYUVImage::Make(sk_sp<SkData> data) {
- std::unique_ptr<LazyYUVImage> image(new LazyYUVImage());
- if (image->reset(std::move(data))) {
- return image;
- } else {
- return nullptr;
- }
- }
- sk_sp<SkImage> LazyYUVImage::refImage(GrContext* context) {
- if (this->ensureYUVImage(context)) {
- return fYUVImage;
- } else {
- return nullptr;
- }
- }
- const SkImage* LazyYUVImage::getImage(GrContext* context) {
- if (this->ensureYUVImage(context)) {
- return fYUVImage.get();
- } else {
- return nullptr;
- }
- }
- bool LazyYUVImage::reset(sk_sp<SkData> data) {
- auto codec = SkCodecImageGenerator::MakeFromEncodedCodec(data);
- if (!codec) {
- return false;
- }
- if (!codec->queryYUVA8(&fSizeInfo, fComponents, &fColorSpace)) {
- return false;
- }
- fPlaneData.reset(fSizeInfo.computeTotalBytes());
- void* planes[SkYUVASizeInfo::kMaxCount];
- fSizeInfo.computePlanes(fPlaneData.get(), planes);
- if (!codec->getYUVA8Planes(fSizeInfo, fComponents, planes)) {
- return false;
- }
- for (int i = 0; i < SkYUVASizeInfo::kMaxCount; ++i) {
- if (fSizeInfo.fSizes[i].isEmpty()) {
- fPlanes[i].reset();
- } else {
- SkASSERT(planes[i]);
- auto planeInfo = SkImageInfo::Make(fSizeInfo.fSizes[i].fWidth,
- fSizeInfo.fSizes[i].fHeight,
- kGray_8_SkColorType, kOpaque_SkAlphaType, nullptr);
- fPlanes[i].reset(planeInfo, planes[i], fSizeInfo.fWidthBytes[i]);
- }
- }
- // The SkPixmap data is fully configured now for MakeFromYUVAPixmaps once we get a GrContext
- return true;
- }
- bool LazyYUVImage::ensureYUVImage(GrContext* context) {
- if (!context) {
- return false; // Cannot make a YUV image from planes
- }
- if (context->priv().contextID() == fOwningContextID) {
- return fYUVImage != nullptr; // Have already made a YUV image (or tried and failed)
- }
- // Must make a new YUV image
- fYUVImage = SkImage::MakeFromYUVAPixmaps(context, fColorSpace, fPlanes, fComponents,
- fSizeInfo.fSizes[0], kTopLeft_GrSurfaceOrigin, false, false);
- fOwningContextID = context->priv().contextID();
- return fYUVImage != nullptr;
- }
- } // namespace sk_gpu_test
|