Adds support for f16 surfaces to wide gamut unit tests. (#126712)
issue: https://github.com/flutter/flutter/issues/126620 ## Pre-launch Checklist - [x] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [x] I read the [Tree Hygiene] wiki page, which explains my responsibilities. - [x] I read and followed the [Flutter Style Guide], including [Features we expect every widget to implement]. - [x] I signed the [CLA]. - [x] I listed at least one issue that this PR fixes in the description above. - [x] I updated/added relevant documentation (doc comments with `///`). - [x] I added new tests to check the change I am making, or this PR is [test-exempt]. - [x] All existing and new tests are passing. If you need help, consider asking for advice on the #hackers-new channel on [Discord]. <!-- Links --> [Contributor Guide]: https://github.com/flutter/flutter/wiki/Tree-hygiene#overview [Tree Hygiene]: https://github.com/flutter/flutter/wiki/Tree-hygiene [test-exempt]: https://github.com/flutter/flutter/wiki/Tree-hygiene#tests [Flutter Style Guide]: https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo [Features we expect every widget to implement]: https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo#features-we-expect-every-widget-to-implement [CLA]: https://cla.developers.google.com/ [flutter/tests]: https://github.com/flutter/tests [breaking change policy]: https://github.com/flutter/flutter/wiki/Tree-hygiene#handling-breaking-changes [Discord]: https://github.com/flutter/flutter/wiki/Chat
This commit is contained in:
parent
d3e0e03e2e
commit
658a1a256a
@ -2,6 +2,7 @@
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
import 'dart:math' as math;
|
||||
import 'dart:typed_data';
|
||||
|
||||
import 'package:flutter/services.dart';
|
||||
@ -19,12 +20,49 @@ double _decodeBGR10(int x) {
|
||||
return (x * slope) + intercept;
|
||||
}
|
||||
|
||||
double _decodeHalf(int x) {
|
||||
if (x == 0x7c00) {
|
||||
return double.infinity;
|
||||
}
|
||||
if (x == 0xfc00) {
|
||||
return -double.infinity;
|
||||
}
|
||||
final double sign = x & 0x8000 == 0 ? 1.0 : -1.0;
|
||||
final int exponent = (x >> 10) & 0x1f;
|
||||
final int fraction = x & 0x3ff;
|
||||
if (exponent == 0) {
|
||||
return sign * math.pow(2.0, -14) * (fraction / 1024.0);
|
||||
} else {
|
||||
return sign * math.pow(2.0, exponent - 15) * (1.0 + fraction / 1024.0);
|
||||
}
|
||||
}
|
||||
|
||||
bool _isAlmost(double x, double y, double epsilon) {
|
||||
return (x - y).abs() < epsilon;
|
||||
}
|
||||
|
||||
List<double> _deepRed = <double>[1.0931, -0.2268, -0.1501];
|
||||
|
||||
bool _findRGBAF16Color(
|
||||
Uint8List bytes, int width, int height, List<double> color) {
|
||||
final ByteData byteData = ByteData.sublistView(bytes);
|
||||
expect(bytes.lengthInBytes, width * height * 8);
|
||||
expect(bytes.lengthInBytes, byteData.lengthInBytes);
|
||||
bool foundDeepRed = false;
|
||||
for (int i = 0; i < bytes.lengthInBytes; i += 8) {
|
||||
final int pixel = byteData.getUint64(i, Endian.host);
|
||||
final double blue = _decodeHalf((pixel >> 32) & 0xffff);
|
||||
final double green = _decodeHalf((pixel >> 16) & 0xffff);
|
||||
final double red = _decodeHalf((pixel >> 0) & 0xffff);
|
||||
if (_isAlmost(red, color[0], 0.01) &&
|
||||
_isAlmost(green, color[1], 0.01) &&
|
||||
_isAlmost(blue, color[2], 0.01)) {
|
||||
foundDeepRed = true;
|
||||
}
|
||||
}
|
||||
return foundDeepRed;
|
||||
}
|
||||
|
||||
bool _findBGRA10Color(
|
||||
Uint8List bytes, int width, int height, List<double> color) {
|
||||
final ByteData byteData = ByteData.sublistView(bytes);
|
||||
@ -75,6 +113,8 @@ bool _findColor(List<Object?> result, List<double> color) {
|
||||
return _findBGR10Color((result[3] as Uint8List?)!, width, height, color);
|
||||
} else if (format == 'MTLPixelFormatBGRA10_XR') {
|
||||
return _findBGRA10Color((result[3] as Uint8List?)!, width, height, color);
|
||||
} else if (format == 'MTLPixelFormatRGBA16Float') {
|
||||
return _findRGBAF16Color((result[3] as Uint8List?)!, width, height, color);
|
||||
} else {
|
||||
fail('Unsupported pixel format: $format');
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user