1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2015 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h" 9cb93a386Sopenharmony_ci#include "include/core/SkImageGenerator.h" 10cb93a386Sopenharmony_ci#include "include/core/SkMatrix.h" 11cb93a386Sopenharmony_ci#include "include/core/SkPaint.h" 12cb93a386Sopenharmony_ci#include "include/core/SkPicture.h" 13cb93a386Sopenharmony_ci#include "include/core/SkSurface.h" 14cb93a386Sopenharmony_ci#include "src/core/SkTLazy.h" 15cb93a386Sopenharmony_ci#include "src/image/SkImage_Base.h" 16cb93a386Sopenharmony_ci 17cb93a386Sopenharmony_ciclass SkPictureImageGenerator : public SkImageGenerator { 18cb93a386Sopenharmony_cipublic: 19cb93a386Sopenharmony_ci SkPictureImageGenerator(const SkImageInfo& info, sk_sp<SkPicture>, const SkMatrix*, 20cb93a386Sopenharmony_ci const SkPaint*); 21cb93a386Sopenharmony_ci 22cb93a386Sopenharmony_ciprotected: 23cb93a386Sopenharmony_ci bool onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, const Options& opts) 24cb93a386Sopenharmony_ci override; 25cb93a386Sopenharmony_ci 26cb93a386Sopenharmony_ci#if SK_SUPPORT_GPU 27cb93a386Sopenharmony_ci GrSurfaceProxyView onGenerateTexture(GrRecordingContext*, const SkImageInfo&, const SkIPoint&, 28cb93a386Sopenharmony_ci GrMipmapped, GrImageTexGenPolicy) override; 29cb93a386Sopenharmony_ci#endif 30cb93a386Sopenharmony_ci 31cb93a386Sopenharmony_ciprivate: 32cb93a386Sopenharmony_ci sk_sp<SkPicture> fPicture; 33cb93a386Sopenharmony_ci SkMatrix fMatrix; 34cb93a386Sopenharmony_ci SkTLazy<SkPaint> fPaint; 35cb93a386Sopenharmony_ci 36cb93a386Sopenharmony_ci using INHERITED = SkImageGenerator; 37cb93a386Sopenharmony_ci}; 38cb93a386Sopenharmony_ci 39cb93a386Sopenharmony_ci/////////////////////////////////////////////////////////////////////////////////////////////////// 40cb93a386Sopenharmony_ci 41cb93a386Sopenharmony_cistd::unique_ptr<SkImageGenerator> 42cb93a386Sopenharmony_ciSkImageGenerator::MakeFromPicture(const SkISize& size, sk_sp<SkPicture> picture, 43cb93a386Sopenharmony_ci const SkMatrix* matrix, const SkPaint* paint, 44cb93a386Sopenharmony_ci SkImage::BitDepth bitDepth, sk_sp<SkColorSpace> colorSpace) { 45cb93a386Sopenharmony_ci if (!picture || !colorSpace || size.isEmpty()) { 46cb93a386Sopenharmony_ci return nullptr; 47cb93a386Sopenharmony_ci } 48cb93a386Sopenharmony_ci 49cb93a386Sopenharmony_ci SkColorType colorType = kN32_SkColorType; 50cb93a386Sopenharmony_ci if (SkImage::BitDepth::kF16 == bitDepth) { 51cb93a386Sopenharmony_ci colorType = kRGBA_F16_SkColorType; 52cb93a386Sopenharmony_ci } 53cb93a386Sopenharmony_ci 54cb93a386Sopenharmony_ci SkImageInfo info = 55cb93a386Sopenharmony_ci SkImageInfo::Make(size, colorType, kPremul_SkAlphaType, std::move(colorSpace)); 56cb93a386Sopenharmony_ci return std::unique_ptr<SkImageGenerator>( 57cb93a386Sopenharmony_ci new SkPictureImageGenerator(info, std::move(picture), matrix, paint)); 58cb93a386Sopenharmony_ci} 59cb93a386Sopenharmony_ci 60cb93a386Sopenharmony_ci/////////////////////////////////////////////////////////////////////////////////////////////////// 61cb93a386Sopenharmony_ci 62cb93a386Sopenharmony_ciSkPictureImageGenerator::SkPictureImageGenerator(const SkImageInfo& info, sk_sp<SkPicture> picture, 63cb93a386Sopenharmony_ci const SkMatrix* matrix, const SkPaint* paint) 64cb93a386Sopenharmony_ci : INHERITED(info) 65cb93a386Sopenharmony_ci , fPicture(std::move(picture)) { 66cb93a386Sopenharmony_ci 67cb93a386Sopenharmony_ci if (matrix) { 68cb93a386Sopenharmony_ci fMatrix = *matrix; 69cb93a386Sopenharmony_ci } else { 70cb93a386Sopenharmony_ci fMatrix.reset(); 71cb93a386Sopenharmony_ci } 72cb93a386Sopenharmony_ci 73cb93a386Sopenharmony_ci if (paint) { 74cb93a386Sopenharmony_ci fPaint.set(*paint); 75cb93a386Sopenharmony_ci } 76cb93a386Sopenharmony_ci} 77cb93a386Sopenharmony_ci 78cb93a386Sopenharmony_cibool SkPictureImageGenerator::onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, 79cb93a386Sopenharmony_ci const Options& opts) { 80cb93a386Sopenharmony_ci SkSurfaceProps props(0, kUnknown_SkPixelGeometry); 81cb93a386Sopenharmony_ci std::unique_ptr<SkCanvas> canvas = SkCanvas::MakeRasterDirect(info, pixels, rowBytes, &props); 82cb93a386Sopenharmony_ci if (!canvas) { 83cb93a386Sopenharmony_ci return false; 84cb93a386Sopenharmony_ci } 85cb93a386Sopenharmony_ci canvas->clear(0); 86cb93a386Sopenharmony_ci canvas->drawPicture(fPicture, &fMatrix, fPaint.getMaybeNull()); 87cb93a386Sopenharmony_ci return true; 88cb93a386Sopenharmony_ci} 89cb93a386Sopenharmony_ci 90cb93a386Sopenharmony_ci/////////////////////////////////////////////////////////////////////////////////////////////////// 91cb93a386Sopenharmony_ci 92cb93a386Sopenharmony_ci#if SK_SUPPORT_GPU 93cb93a386Sopenharmony_ci#include "include/gpu/GrRecordingContext.h" 94cb93a386Sopenharmony_ci#include "src/gpu/GrRecordingContextPriv.h" 95cb93a386Sopenharmony_ci#include "src/gpu/SkGr.h" 96cb93a386Sopenharmony_ci 97cb93a386Sopenharmony_ciGrSurfaceProxyView SkPictureImageGenerator::onGenerateTexture(GrRecordingContext* ctx, 98cb93a386Sopenharmony_ci const SkImageInfo& info, 99cb93a386Sopenharmony_ci const SkIPoint& origin, 100cb93a386Sopenharmony_ci GrMipmapped mipmapped, 101cb93a386Sopenharmony_ci GrImageTexGenPolicy texGenPolicy) { 102cb93a386Sopenharmony_ci SkASSERT(ctx); 103cb93a386Sopenharmony_ci 104cb93a386Sopenharmony_ci SkSurfaceProps props(0, kUnknown_SkPixelGeometry); 105cb93a386Sopenharmony_ci 106cb93a386Sopenharmony_ci SkBudgeted budgeted = texGenPolicy == GrImageTexGenPolicy::kNew_Uncached_Unbudgeted 107cb93a386Sopenharmony_ci ? SkBudgeted::kNo 108cb93a386Sopenharmony_ci : SkBudgeted::kYes; 109cb93a386Sopenharmony_ci auto surface = SkSurface::MakeRenderTarget(ctx, budgeted, info, 0, kTopLeft_GrSurfaceOrigin, 110cb93a386Sopenharmony_ci &props, mipmapped == GrMipmapped::kYes); 111cb93a386Sopenharmony_ci if (!surface) { 112cb93a386Sopenharmony_ci return {}; 113cb93a386Sopenharmony_ci } 114cb93a386Sopenharmony_ci 115cb93a386Sopenharmony_ci SkMatrix matrix = fMatrix; 116cb93a386Sopenharmony_ci matrix.postTranslate(-origin.x(), -origin.y()); 117cb93a386Sopenharmony_ci surface->getCanvas()->clear(0); 118cb93a386Sopenharmony_ci surface->getCanvas()->drawPicture(fPicture.get(), &matrix, fPaint.getMaybeNull()); 119cb93a386Sopenharmony_ci sk_sp<SkImage> image(surface->makeImageSnapshot()); 120cb93a386Sopenharmony_ci if (!image) { 121cb93a386Sopenharmony_ci return {}; 122cb93a386Sopenharmony_ci } 123cb93a386Sopenharmony_ci auto [view, ct] = as_IB(image)->asView(ctx, mipmapped); 124cb93a386Sopenharmony_ci SkASSERT(view); 125cb93a386Sopenharmony_ci SkASSERT(mipmapped == GrMipmapped::kNo || 126cb93a386Sopenharmony_ci view.asTextureProxy()->mipmapped() == GrMipmapped::kYes); 127cb93a386Sopenharmony_ci return view; 128cb93a386Sopenharmony_ci} 129cb93a386Sopenharmony_ci#endif 130