Tests drawing images are half pixel offsets in device space with nearest filtering to show how rasterization and image sample snapping at boundary points interact. Both drawImage and drawRect with an image shader are tested. Scale factors 1 and -1 are tested. The images are all two pixels wide or tall so we either get both values once each or one value repeated twice.
22 {
23
24
25 if (canvas->recordingContext() || (canvas->getSurface() && canvas->getSurface()->recorder())) {
26 *errorMsg = "Test is only relevant to CPU backend";
28 }
29
30
31 struct Images {
34 };
35
37 uint32_t
colors[] {0xFFFF0000, 0xFF0000FF};
49
50 uint8_t alphas[] {0xFF, 0xAA};
54 alphas,
55 sizeof(alphas));
59 alphas,
60 sizeof(alphas[0]));
62
63
64 auto surf = canvas->makeSurface(canvas->imageInfo().makeWH(80, 80));
65 if (!surf) {
66 *errorMsg = "Test only works with SkSurface backed canvases";
68 }
69 auto* c = surf->getCanvas();
71
72
73
74 static const float kOffAxisScale = 4;
75
77 c->save();
79 paint.setAlpha(alpha);
80 if (shader) {
82 }
83 if (doX) {
84 c->scale(
mirror ? -1 : 1, kOffAxisScale);
85 c->translate(
mirror ? -2.5 : 0.5, 0);
86 } else {
87 c->scale(kOffAxisScale,
mirror ? -1 : 1);
88 c->translate(0,
mirror ? -2.5 : 0.5);
89 }
90
91 if (shader) {
93 } else {
95 }
96 c->restore();
97 };
98
99 for (bool shader : {false, true})
100 for (uint8_t alpha : {0xFF , 0x70}) {
101 c->save();
103 for (
auto mirror : {
false,
true}) {
105 c->save();
106 c->translate(4, 0);
108 c->restore();
109 c->translate(0, kOffAxisScale*2);
110 }
111 c->restore();
112 c->translate(kOffAxisScale*2, 0);
113 }
114 canvas->scale(8, 8);
115 canvas->drawImage(surf->makeImageSnapshot(), 0, 0);
116
118}
@ kPremul_SkAlphaType
pixel components are premultiplied by alpha
static unsigned mirror(SkFixed fx, int max)
@ kAlpha_8_SkColorType
pixel with alpha in 8-bit byte
@ kRGBA_8888_SkColorType
pixel with 8 bits for red, green, blue, alpha; in 32-bit word
constexpr SkColor SK_ColorWHITE
static void draw(SkCanvas *canvas, SkRect &target, int x, int y)
SkISize dimensions() const
sk_sp< SkShader > makeShader(SkTileMode tmx, SkTileMode tmy, const SkSamplingOptions &, const SkMatrix *localMatrix=nullptr) const
std::array< MockImage, 3 > images
SK_API sk_sp< SkImage > RasterFromPixmapCopy(const SkPixmap &pixmap)
sk_sp< const SkImage > image
PODArray< SkColor > colors
static SkImageInfo Make(int width, int height, SkColorType ct, SkAlphaType at)
static SkRect Make(const SkISize &size)