1 /* 2 * Copyright 2017 Google Inc. 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 #ifndef TestUtils_DEFINED 9 #define TestUtils_DEFINED 10 11 #include "include/core/SkBitmap.h" 12 #include "src/gpu/GrDataUtils.h" 13 #include "tests/Test.h" 14 15 namespace skgpu { class SurfaceContext; } 16 class GrSurfaceProxy; 17 typedef uint32_t GrColor; 18 19 // Ensure that reading back from 'srcContext' as RGBA 8888 matches 'expectedPixelValues 20 void TestReadPixels(skiatest::Reporter*, GrDirectContext*, skgpu::SurfaceContext*, 21 uint32_t expectedPixelValues[], const char* testName); 22 23 // See if trying to write RGBA 8888 pixels to 'dstContext' matches matches the 24 // expectation ('expectedToWork') 25 void TestWritePixels(skiatest::Reporter*, GrDirectContext*, skgpu::SurfaceContext*, 26 bool expectedToWork, const char* testName); 27 28 // Ensure that the pixels can be copied from 'proxy' viewed as colorType, to an RGBA 8888 29 // destination (both texture-backed and rendertarget-backed). 30 void TestCopyFromSurface(skiatest::Reporter*, 31 GrDirectContext*, 32 sk_sp<GrSurfaceProxy> proxy, 33 GrSurfaceOrigin origin, 34 GrColorType colorType, 35 uint32_t expectedPixelValues[], 36 const char* testName); 37 38 // Encodes the bitmap into a data:/image/png;base64,... url suitable to view in a browser after 39 // printing to a log. If false is returned, dst holds an error message instead of a URI. 40 bool BipmapToBase64DataURI(const SkBitmap& bitmap, SkString* dst); 41 42 /** Used by compare_pixels. */ 43 using ComparePixmapsErrorReporter = void(int x, int y, const float diffs[4]); 44 45 /** 46 * Compares pixels pointed to by 'a' with 'infoA' and rowBytesA to pixels pointed to by 'b' with 47 * 'infoB' and 'rowBytesB'. 48 * 49 * If the pixmaps have different dimensions error is called with negative coordinate values and 50 * zero diffs and no comparisons are made. 51 * 52 * Before comparison pixels are converted to a common color type, alpha type, and color space. 53 * The color type is always 32 bit float. The alpha type is premul if one of the pixmaps is 54 * premul and the other is unpremul. The color space is linear sRGB if the pixmaps have 55 * different colorspaces, otherwise their common color space is used. 56 * 57 * 'tolRGBA' expresses the allowed difference between pixels in the comparison space per channel. If 58 * pixel components differ more than by 'tolRGBA' in absolute value in any channel then 'error' is 59 * called with the coordinate and difference in the comparison space (B - A). 60 * 61 * The function quits after a single error is reported and returns false if 'error' was called and 62 * true otherwise. 63 */ 64 bool ComparePixels(const GrCPixmap& a, 65 const GrCPixmap& b, 66 const float tolRGBA[4], 67 std::function<ComparePixmapsErrorReporter>& error); 68 69 /** 70 * Convenience version that checks that 'pixmap' is a solid field of 'col' 71 */ 72 bool CheckSolidPixels(const SkColor4f& col, 73 const SkPixmap& pixmap, 74 const float tolRGBA[4], 75 std::function<ComparePixmapsErrorReporter>& error); 76 77 /** 78 * Checks the ref cnt on a proxy and its backing store. This is only valid if the proxy and the 79 * resource are both used on a single thread. 80 */ 81 void CheckSingleThreadedProxyRefs(skiatest::Reporter* reporter, 82 GrSurfaceProxy* proxy, 83 int32_t expectedProxyRefs, 84 int32_t expectedBackingRefs); 85 86 // Makes either a SurfaceContext, SurfaceFillContext, or a SurfaceDrawContext, depending on 87 // GrRenderable and the GrImageInfo. 88 // The texture format is the default for the provided color type. 89 std::unique_ptr<skgpu::SurfaceContext> CreateSurfaceContext( 90 GrRecordingContext*, 91 const GrImageInfo&, 92 SkBackingFit = SkBackingFit::kExact, 93 GrSurfaceOrigin = kTopLeft_GrSurfaceOrigin, 94 GrRenderable = GrRenderable::kNo, 95 int sampleCount = 1, 96 GrMipmapped = GrMipmapped::kNo, 97 GrProtected = GrProtected::kNo, 98 SkBudgeted = SkBudgeted::kYes); 99 100 #endif 101