xref: /aosp_15_r20/external/skia/gm/crosscontextimage.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2017 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #include "gm/gm.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkBitmap.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkData.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImage.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPaint.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPixmap.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrDirectContext.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrRecordingContext.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/SkImageGanesh.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "tools/Resources.h"
23*c8dee2aaSAndroid Build Coastguard Worker 
24*c8dee2aaSAndroid Build Coastguard Worker DEF_SIMPLE_GPU_GM_CAN_FAIL(cross_context_image, rContext, canvas, errorMsg,
25*c8dee2aaSAndroid Build Coastguard Worker                            3 * 256 + 40, 256 + 128 + 30) {
26*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkData> encodedData = GetResourceAsData("images/mandrill_256.png");
27*c8dee2aaSAndroid Build Coastguard Worker     if (!encodedData) {
28*c8dee2aaSAndroid Build Coastguard Worker         *errorMsg = "Could not load mandrill_256.png. Did you forget to set the resourcePath?";
29*c8dee2aaSAndroid Build Coastguard Worker         return skiagm::DrawResult::kFail;
30*c8dee2aaSAndroid Build Coastguard Worker     }
31*c8dee2aaSAndroid Build Coastguard Worker 
32*c8dee2aaSAndroid Build Coastguard Worker     auto dContext = rContext->asDirectContext();
33*c8dee2aaSAndroid Build Coastguard Worker     if (!dContext) {
34*c8dee2aaSAndroid Build Coastguard Worker         *errorMsg = "CrossContext image creation requires a direct context.";
35*c8dee2aaSAndroid Build Coastguard Worker         return skiagm::DrawResult::kSkip;
36*c8dee2aaSAndroid Build Coastguard Worker     }
37*c8dee2aaSAndroid Build Coastguard Worker 
38*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkImage> images[3];
39*c8dee2aaSAndroid Build Coastguard Worker     images[0] = SkImages::DeferredFromEncodedData(encodedData);
40*c8dee2aaSAndroid Build Coastguard Worker 
41*c8dee2aaSAndroid Build Coastguard Worker     SkBitmap bmp;
42*c8dee2aaSAndroid Build Coastguard Worker     SkPixmap pixmap;
43*c8dee2aaSAndroid Build Coastguard Worker     SkAssertResult(images[0]->asLegacyBitmap(&bmp) &&
44*c8dee2aaSAndroid Build Coastguard Worker                    bmp.peekPixels(&pixmap));
45*c8dee2aaSAndroid Build Coastguard Worker 
46*c8dee2aaSAndroid Build Coastguard Worker     images[1] = SkImages::CrossContextTextureFromPixmap(dContext, pixmap, false);
47*c8dee2aaSAndroid Build Coastguard Worker     images[2] = SkImages::CrossContextTextureFromPixmap(dContext, pixmap, true);
48*c8dee2aaSAndroid Build Coastguard Worker 
49*c8dee2aaSAndroid Build Coastguard Worker     canvas->translate(10, 10);
50*c8dee2aaSAndroid Build Coastguard Worker 
51*c8dee2aaSAndroid Build Coastguard Worker     for (size_t i = 0; i < std::size(images); ++i) {
52*c8dee2aaSAndroid Build Coastguard Worker         canvas->save();
53*c8dee2aaSAndroid Build Coastguard Worker 
54*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawImage(images[i], 0, 0);
55*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(0, 256 + 10);
56*c8dee2aaSAndroid Build Coastguard Worker 
57*c8dee2aaSAndroid Build Coastguard Worker         auto subset = images[i]->makeSubset(dContext, SkIRect::MakeXYWH(64, 64, 128, 128));
58*c8dee2aaSAndroid Build Coastguard Worker         SkASSERTF(subset, "subset was null");
59*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawImage(subset, 0, 0);
60*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(128, 0);
61*c8dee2aaSAndroid Build Coastguard Worker 
62*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawImageRect(images[i], SkRect::MakeWH(128, 128),
63*c8dee2aaSAndroid Build Coastguard Worker                               SkSamplingOptions(SkFilterMode::kLinear,
64*c8dee2aaSAndroid Build Coastguard Worker                                                 SkMipmapMode::kLinear));
65*c8dee2aaSAndroid Build Coastguard Worker 
66*c8dee2aaSAndroid Build Coastguard Worker         canvas->restore();
67*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(256 + 10, 0);
68*c8dee2aaSAndroid Build Coastguard Worker     }
69*c8dee2aaSAndroid Build Coastguard Worker     return skiagm::DrawResult::kOk;
70*c8dee2aaSAndroid Build Coastguard Worker }
71