aboutsummaryrefslogtreecommitdiffhomepage
path: root/tests/SRGBReadWritePixelsTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/SRGBReadWritePixelsTest.cpp')
-rw-r--r--tests/SRGBReadWritePixelsTest.cpp146
1 files changed, 90 insertions, 56 deletions
diff --git a/tests/SRGBReadWritePixelsTest.cpp b/tests/SRGBReadWritePixelsTest.cpp
index 7ced2ebe97..8b7dd07a57 100644
--- a/tests/SRGBReadWritePixelsTest.cpp
+++ b/tests/SRGBReadWritePixelsTest.cpp
@@ -182,23 +182,21 @@ static const char* encoding_as_str(Encoding encoding) {
return nullptr;
}
-static void do_test(Encoding contextEncoding, Encoding writeEncoding, Encoding readEncoding,
- float error, CheckFn check, GrContext* context, skiatest::Reporter* reporter) {
-#if defined(SK_BUILD_FOR_GOOGLE3)
- // Stack frame size is limited in SK_BUILD_FOR_GOOGLE3.
- static const int kW = 63;
- static const int kH = 63;
-#else
- static const int kW = 255;
- static const int kH = 255;
-#endif
- uint32_t origData[kW * kH];
+static constexpr int kW = 255;
+static constexpr int kH = 255;
+
+static std::unique_ptr<uint32_t[]> make_data() {
+ std::unique_ptr<uint32_t[]> data(new uint32_t[kW * kH]);
for (int j = 0; j < kH; ++j) {
for (int i = 0; i < kW; ++i) {
- origData[j * kW + i] = (j << 24) | (i << 16) | (i << 8) | i;
+ data[j * kW + i] = (j << 24) | (i << 16) | (i << 8) | i;
}
}
+ return data;
+}
+static sk_sp<GrSurfaceContext> make_surface_context(Encoding contextEncoding, GrContext* context,
+ skiatest::Reporter* reporter) {
GrSurfaceDesc desc;
desc.fFlags = kRenderTarget_GrSurfaceFlag;
desc.fOrigin = kBottomLeft_GrSurfaceOrigin;
@@ -211,12 +209,38 @@ static void do_test(Encoding contextEncoding, Encoding writeEncoding, Encoding r
encoding_as_color_space(contextEncoding));
if (!surfaceContext) {
ERRORF(reporter, "Could not create %s surface context.", encoding_as_str(contextEncoding));
+ }
+ return surfaceContext;
+}
+
+#ifndef SK_LEGACY_GPU_PIXEL_OPS
+static void text_write_fails(Encoding contextEncoding, Encoding writeEncoding, GrContext* context,
+ skiatest::Reporter* reporter) {
+ auto surfaceContext = make_surface_context(contextEncoding, context, reporter);
+ if (!surfaceContext) {
return;
}
auto writeII = SkImageInfo::Make(kW, kH, kRGBA_8888_SkColorType, kPremul_SkAlphaType,
encoding_as_color_space(writeEncoding));
+ auto data = make_data();
+ if (surfaceContext->writePixels(writeII, data.get(), 0, 0, 0)) {
+ ERRORF(reporter, "Expected %s write to %s surface context to fail.",
+ encoding_as_str(writeEncoding), encoding_as_str(contextEncoding));
+ }
+}
+#endif
- if (!surfaceContext->writePixels(writeII, origData, 0, 0, 0)) {
+static void test_write_read(Encoding contextEncoding, Encoding writeEncoding, Encoding readEncoding,
+ float error, CheckFn check, GrContext* context,
+ skiatest::Reporter* reporter) {
+ auto surfaceContext = make_surface_context(contextEncoding, context, reporter);
+ if (!surfaceContext) {
+ return;
+ }
+ auto writeII = SkImageInfo::Make(kW, kH, kRGBA_8888_SkColorType, kPremul_SkAlphaType,
+ encoding_as_color_space(writeEncoding));
+ auto data = make_data();
+ if (!surfaceContext->writePixels(writeII, data.get(), 0, 0, 0)) {
ERRORF(reporter, "Could not write %s to %s surface context.",
encoding_as_str(writeEncoding), encoding_as_str(contextEncoding));
return;
@@ -227,7 +251,7 @@ static void do_test(Encoding contextEncoding, Encoding writeEncoding, Encoding r
SkString testName;
testName.printf("write %s data to a %s context and read as %s.", encoding_as_str(writeEncoding),
encoding_as_str(contextEncoding), encoding_as_str(readEncoding));
- read_and_check_pixels(reporter, surfaceContext.get(), origData, readII, check, error,
+ read_and_check_pixels(reporter, surfaceContext.get(), data.get(), readII, check, error,
testName.c_str());
}
@@ -250,94 +274,104 @@ DEF_GPUTEST_FOR_RENDERING_CONTEXTS(SRGBReadWritePixels, reporter, ctxInfo) {
// Write sRGB data to a sRGB context - no conversion on the write.
// back to sRGB no conversion
- do_test(Encoding::kSRGB, Encoding::kSRGB, Encoding::kSRGB, smallError, check_no_conversion,
- context, reporter);
+ test_write_read(Encoding::kSRGB, Encoding::kSRGB, Encoding::kSRGB, smallError,
+ check_no_conversion, context, reporter);
// Untagged read from sRGB is treated as a conversion back to linear. TODO: Fail or don't
// convert?
- do_test(Encoding::kSRGB, Encoding::kSRGB, Encoding::kUntagged, error,
- check_srgb_to_linear_conversion, context, reporter);
+ test_write_read(Encoding::kSRGB, Encoding::kSRGB, Encoding::kUntagged, error,
+ check_srgb_to_linear_conversion, context, reporter);
// Converts back to linear
- do_test(Encoding::kSRGB, Encoding::kSRGB, Encoding::kLinear, error,
- check_srgb_to_linear_conversion, context, reporter);
+ test_write_read(Encoding::kSRGB, Encoding::kSRGB, Encoding::kLinear, error,
+ check_srgb_to_linear_conversion, context, reporter);
+#ifdef SK_LEGACY_GPU_PIXEL_OPS
///////////////////////////////////////////////////////////////////////////////////////////////
// Write untagged data to a sRGB context - Currently this treats the untagged data as
// linear and converts to sRGB during the write. TODO: Fail or passthrough?
// read back to srgb, no additional conversion
- do_test(Encoding::kSRGB, Encoding::kUntagged, Encoding::kSRGB, error,
- check_linear_to_srgb_conversion, context, reporter);
+ test_write_read(Encoding::kSRGB, Encoding::kUntagged, Encoding::kSRGB, error,
+ check_linear_to_srgb_conversion, context, reporter);
// read back to untagged. Currently converts back to linear. TODO: Fail or don't convert?
- do_test(Encoding::kSRGB, Encoding::kUntagged, Encoding::kUntagged, error,
- check_linear_to_srgb_to_linear_conversion, context, reporter);
+ test_write_read(Encoding::kSRGB, Encoding::kUntagged, Encoding::kUntagged, error,
+ check_linear_to_srgb_to_linear_conversion, context, reporter);
// Converts back to linear.
- do_test(Encoding::kSRGB, Encoding::kUntagged, Encoding::kLinear, error,
- check_linear_to_srgb_to_linear_conversion, context, reporter);
+ test_write_read(Encoding::kSRGB, Encoding::kUntagged, Encoding::kLinear, error,
+ check_linear_to_srgb_to_linear_conversion, context, reporter);
+#else
+ // Currently writing untagged data to kSRGB fails because SkImageInfoValidConversion fails.
+ text_write_fails(Encoding::kSRGB, Encoding::kUntagged, context, reporter);
+#endif
///////////////////////////////////////////////////////////////////////////////////////////////
// Write linear data to a sRGB context. It gets converted to sRGB on write. The reads
// are all the same as the above cases where the original data was untagged.
- do_test(Encoding::kSRGB, Encoding::kLinear, Encoding::kSRGB, error,
- check_linear_to_srgb_conversion, context, reporter);
+ test_write_read(Encoding::kSRGB, Encoding::kLinear, Encoding::kSRGB, error,
+ check_linear_to_srgb_conversion, context, reporter);
// TODO: Fail or don't convert?
- do_test(Encoding::kSRGB, Encoding::kLinear, Encoding::kUntagged, error,
- check_linear_to_srgb_to_linear_conversion, context, reporter);
- do_test(Encoding::kSRGB, Encoding::kLinear, Encoding::kLinear, error,
- check_linear_to_srgb_to_linear_conversion, context, reporter);
+ test_write_read(Encoding::kSRGB, Encoding::kLinear, Encoding::kUntagged, error,
+ check_linear_to_srgb_to_linear_conversion, context, reporter);
+ test_write_read(Encoding::kSRGB, Encoding::kLinear, Encoding::kLinear, error,
+ check_linear_to_srgb_to_linear_conversion, context, reporter);
///////////////////////////////////////////////////////////////////////////////////////////////
// Write data to an untagged context. The write does no conversion no matter what encoding the
// src data has.
for (auto writeEncoding : {Encoding::kSRGB, Encoding::kUntagged, Encoding::kLinear}) {
// The read from untagged to sRGB also does no conversion. TODO: Should it just fail?
- do_test(Encoding::kUntagged, writeEncoding, Encoding::kSRGB, error, check_no_conversion,
- context, reporter);
+ test_write_read(Encoding::kUntagged, writeEncoding, Encoding::kSRGB, error,
+ check_no_conversion, context, reporter);
// Reading untagged back as untagged should do no conversion.
- do_test(Encoding::kUntagged, writeEncoding, Encoding::kUntagged, error, check_no_conversion,
- context, reporter);
+ test_write_read(Encoding::kUntagged, writeEncoding, Encoding::kUntagged, error,
+ check_no_conversion, context, reporter);
// Reading untagged back as linear does no conversion. TODO: Should it just fail?
- do_test(Encoding::kUntagged, writeEncoding, Encoding::kLinear, error, check_no_conversion,
- context, reporter);
+ test_write_read(Encoding::kUntagged, writeEncoding, Encoding::kLinear, error,
+ check_no_conversion, context, reporter);
}
///////////////////////////////////////////////////////////////////////////////////////////////
// Write sRGB data to a linear context - converts to sRGB on the write.
// converts back to sRGB on read.
- do_test(Encoding::kLinear, Encoding::kSRGB, Encoding::kSRGB, error,
- check_srgb_to_linear_to_srgb_conversion, context, reporter);
+ test_write_read(Encoding::kLinear, Encoding::kSRGB, Encoding::kSRGB, error,
+ check_srgb_to_linear_to_srgb_conversion, context, reporter);
// Reading untagged data from linear currently does no conversion. TODO: Should it fail?
- do_test(Encoding::kLinear, Encoding::kSRGB, Encoding::kUntagged, error,
- check_srgb_to_linear_conversion, context, reporter);
+ test_write_read(Encoding::kLinear, Encoding::kSRGB, Encoding::kUntagged, error,
+ check_srgb_to_linear_conversion, context, reporter);
// Stays linear when read.
- do_test(Encoding::kLinear, Encoding::kSRGB, Encoding::kLinear, error,
- check_srgb_to_linear_conversion, context, reporter);
+ test_write_read(Encoding::kLinear, Encoding::kSRGB, Encoding::kLinear, error,
+ check_srgb_to_linear_conversion, context, reporter);
///////////////////////////////////////////////////////////////////////////////////////////////
// Write untagged data to a linear context. Currently does no conversion. TODO: Should this
// fail?
+#ifdef SK_LEGACY_GPU_PIXEL_OPS
// Reading to sRGB does a conversion.
- do_test(Encoding::kLinear, Encoding::kUntagged, Encoding::kSRGB, error,
- check_linear_to_srgb_conversion, context, reporter);
+ test_write_read(Encoding::kLinear, Encoding::kUntagged, Encoding::kSRGB, error,
+ check_linear_to_srgb_conversion, context, reporter);
// Reading to untagged does no conversion. TODO: Should it fail?
- do_test(Encoding::kLinear, Encoding::kUntagged, Encoding::kUntagged, error, check_no_conversion,
- context, reporter);
+ test_write_read(Encoding::kLinear, Encoding::kUntagged, Encoding::kUntagged, error,
+ check_no_conversion, context, reporter);
// Stays linear when read.
- do_test(Encoding::kLinear, Encoding::kUntagged, Encoding::kLinear, error, check_no_conversion,
- context, reporter);
+ test_write_read(Encoding::kLinear, Encoding::kUntagged, Encoding::kLinear, error,
+ check_no_conversion, context, reporter);
+#else
+ // Currently writing untagged data to kLinear fails because SkImageInfoValidConversion fails.
+ text_write_fails(Encoding::kSRGB, Encoding::kUntagged, context, reporter);
+#endif
///////////////////////////////////////////////////////////////////////////////////////////////
// Write linear data to a linear context. Does no conversion.
// Reading to sRGB does a conversion.
- do_test(Encoding::kLinear, Encoding::kLinear, Encoding::kSRGB, error,
- check_linear_to_srgb_conversion, context, reporter);
+ test_write_read(Encoding::kLinear, Encoding::kLinear, Encoding::kSRGB, error,
+ check_linear_to_srgb_conversion, context, reporter);
// Reading to untagged does no conversion. TODO: Should it fail?
- do_test(Encoding::kLinear, Encoding::kLinear, Encoding::kUntagged, error, check_no_conversion,
- context, reporter);
+ test_write_read(Encoding::kLinear, Encoding::kLinear, Encoding::kUntagged, error,
+ check_no_conversion, context, reporter);
// Stays linear when read.
- do_test(Encoding::kLinear, Encoding::kLinear, Encoding::kLinear, error, check_no_conversion,
- context, reporter);
+ test_write_read(Encoding::kLinear, Encoding::kLinear, Encoding::kLinear, error,
+ check_no_conversion, context, reporter);
}
#endif