1cb93a386Sopenharmony_ci/*
2cb93a386Sopenharmony_ci * Copyright 2020 Google LLC
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 "tools/gpu/BackendTextureImageFactory.h"
9cb93a386Sopenharmony_ci
10cb93a386Sopenharmony_ci#include "include/core/SkImage.h"
11cb93a386Sopenharmony_ci#include "include/core/SkPixmap.h"
12cb93a386Sopenharmony_ci#include "include/gpu/GrBackendSurface.h"
13cb93a386Sopenharmony_ci#include "include/gpu/GrDirectContext.h"
14cb93a386Sopenharmony_ci#include "src/core/SkAutoPixmapStorage.h"
15cb93a386Sopenharmony_ci#include "tools/gpu/ManagedBackendTexture.h"
16cb93a386Sopenharmony_ci
17cb93a386Sopenharmony_cinamespace sk_gpu_test {
18cb93a386Sopenharmony_cisk_sp<SkImage> MakeBackendTextureImage(GrDirectContext* dContext,
19cb93a386Sopenharmony_ci                                       const SkPixmap& pixmap,
20cb93a386Sopenharmony_ci                                       GrRenderable renderable,
21cb93a386Sopenharmony_ci                                       GrSurfaceOrigin origin) {
22cb93a386Sopenharmony_ci    auto mbet = ManagedBackendTexture::MakeWithData(dContext,
23cb93a386Sopenharmony_ci                                                    pixmap,
24cb93a386Sopenharmony_ci                                                    origin,
25cb93a386Sopenharmony_ci                                                    renderable,
26cb93a386Sopenharmony_ci                                                    GrProtected::kNo);
27cb93a386Sopenharmony_ci    if (!mbet) {
28cb93a386Sopenharmony_ci        return nullptr;
29cb93a386Sopenharmony_ci    }
30cb93a386Sopenharmony_ci    return SkImage::MakeFromTexture(dContext,
31cb93a386Sopenharmony_ci                                    mbet->texture(),
32cb93a386Sopenharmony_ci                                    origin,
33cb93a386Sopenharmony_ci                                    pixmap.colorType(),
34cb93a386Sopenharmony_ci                                    pixmap.alphaType(),
35cb93a386Sopenharmony_ci                                    pixmap.refColorSpace(),
36cb93a386Sopenharmony_ci                                    ManagedBackendTexture::ReleaseProc,
37cb93a386Sopenharmony_ci                                    mbet->releaseContext());
38cb93a386Sopenharmony_ci}
39cb93a386Sopenharmony_ci
40cb93a386Sopenharmony_cisk_sp<SkImage> MakeBackendTextureImage(GrDirectContext* dContext,
41cb93a386Sopenharmony_ci                                       const SkImageInfo& info,
42cb93a386Sopenharmony_ci                                       SkColor4f color,
43cb93a386Sopenharmony_ci                                       GrMipmapped mipmapped,
44cb93a386Sopenharmony_ci                                       GrRenderable renderable,
45cb93a386Sopenharmony_ci                                       GrSurfaceOrigin origin) {
46cb93a386Sopenharmony_ci    if (info.alphaType() == kOpaque_SkAlphaType) {
47cb93a386Sopenharmony_ci        color = color.makeOpaque();
48cb93a386Sopenharmony_ci    } else if (info.alphaType() == kPremul_SkAlphaType) {
49cb93a386Sopenharmony_ci        auto pmColor = color.premul();
50cb93a386Sopenharmony_ci        color = {pmColor.fR, pmColor.fG, pmColor.fB, pmColor.fA};
51cb93a386Sopenharmony_ci    }
52cb93a386Sopenharmony_ci    auto mbet = ManagedBackendTexture::MakeWithData(dContext,
53cb93a386Sopenharmony_ci                                                    info.width(),
54cb93a386Sopenharmony_ci                                                    info.height(),
55cb93a386Sopenharmony_ci                                                    info.colorType(),
56cb93a386Sopenharmony_ci                                                    color,
57cb93a386Sopenharmony_ci                                                    mipmapped,
58cb93a386Sopenharmony_ci                                                    renderable,
59cb93a386Sopenharmony_ci                                                    GrProtected::kNo);
60cb93a386Sopenharmony_ci    if (!mbet) {
61cb93a386Sopenharmony_ci        return nullptr;
62cb93a386Sopenharmony_ci    }
63cb93a386Sopenharmony_ci    return SkImage::MakeFromTexture(dContext,
64cb93a386Sopenharmony_ci                                    mbet->texture(),
65cb93a386Sopenharmony_ci                                    origin,
66cb93a386Sopenharmony_ci                                    info.colorType(),
67cb93a386Sopenharmony_ci                                    info.alphaType(),
68cb93a386Sopenharmony_ci                                    info.refColorSpace(),
69cb93a386Sopenharmony_ci                                    ManagedBackendTexture::ReleaseProc,
70cb93a386Sopenharmony_ci                                    mbet->releaseContext());
71cb93a386Sopenharmony_ci}
72cb93a386Sopenharmony_ci
73cb93a386Sopenharmony_ci}  // namespace sk_gpu_test
74