Update rive-cpp to 2.0 version
[platform/core/uifw/rive-tizen.git] / submodule / skia / gm / ycbcrimage.cpp
1 /*
2  * Copyright 2020 Google LLC
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7
8 #include "gm/gm.h"
9
10 // This test only works with the Vulkan backend.
11 #ifdef SK_VULKAN
12
13 #include "include/core/SkCanvas.h"
14 #include "include/core/SkColorSpace.h"
15 #include "include/core/SkImage.h"
16 #include "include/core/SkPaint.h"
17 #include "include/core/SkSize.h"
18 #include "include/core/SkString.h"
19 #include "include/gpu/GrDirectContext.h"
20 #include "tools/gpu/vk/VkYcbcrSamplerHelper.h"
21
22 static void release_ycbcrhelper(void* releaseContext) {
23     VkYcbcrSamplerHelper* ycbcrHelper = reinterpret_cast<VkYcbcrSamplerHelper*>(releaseContext);
24     delete ycbcrHelper;
25 }
26
27 namespace skiagm {
28
29 // This GM exercises the native YCbCr image format on Vulkan
30 class YCbCrImageGM : public GM {
31 public:
32     YCbCrImageGM() {
33         this->setBGColor(0xFFCCCCCC);
34     }
35
36 protected:
37
38     SkString onShortName() override {
39         return SkString("ycbcrimage");
40     }
41
42     SkISize onISize() override {
43         return SkISize::Make(2*kPad+kImageSize, 2*kPad+kImageSize);
44     }
45
46     DrawResult createYCbCrImage(GrDirectContext* dContext, SkString* errorMsg) {
47         std::unique_ptr<VkYcbcrSamplerHelper> ycbcrHelper(new VkYcbcrSamplerHelper(dContext));
48
49         if (!ycbcrHelper->isYCbCrSupported()) {
50             *errorMsg = "YCbCr sampling not supported.";
51             return skiagm::DrawResult::kSkip;
52         }
53
54         if (!ycbcrHelper->createBackendTexture(kImageSize, kImageSize)) {
55             *errorMsg = "Failed to create I420 backend texture.";
56             return skiagm::DrawResult::kFail;
57         }
58
59         SkASSERT(!fYCbCrImage);
60         fYCbCrImage = SkImage::MakeFromTexture(dContext, ycbcrHelper->backendTexture(),
61                                                kTopLeft_GrSurfaceOrigin, kRGB_888x_SkColorType,
62                                                kPremul_SkAlphaType, nullptr,
63                                                release_ycbcrhelper, ycbcrHelper.get());
64         ycbcrHelper.release();
65         if (!fYCbCrImage) {
66             *errorMsg = "Failed to create I420 image.";
67             return DrawResult::kFail;
68         }
69
70         return DrawResult::kOk;
71     }
72
73     DrawResult onGpuSetup(GrDirectContext* dContext, SkString* errorMsg) override {
74         if (!dContext || dContext->abandoned()) {
75             return DrawResult::kSkip;
76         }
77
78         if (dContext->backend() != GrBackendApi::kVulkan) {
79             *errorMsg = "This GM requires a Vulkan context.";
80             return DrawResult::kSkip;
81         }
82
83         DrawResult result = this->createYCbCrImage(dContext, errorMsg);
84         if (result != DrawResult::kOk) {
85             return result;
86         }
87
88         return DrawResult::kOk;
89     }
90
91     void onGpuTeardown() override {
92         fYCbCrImage = nullptr;
93     }
94
95     DrawResult onDraw(SkCanvas* canvas, SkString*) override {
96         SkASSERT(fYCbCrImage);
97
98         canvas->drawImage(fYCbCrImage, kPad, kPad, SkSamplingOptions(SkFilterMode::kLinear));
99         return DrawResult::kOk;
100     }
101
102 private:
103     static const int kImageSize = 112;
104     static const int kPad = 8;
105
106     sk_sp<SkImage> fYCbCrImage;
107
108     using INHERITED = GpuGM;
109 };
110
111 //////////////////////////////////////////////////////////////////////////////
112
113 DEF_GM(return new YCbCrImageGM;)
114
115 }  // namespace skiagm
116
117 #endif // SK_VULKAN