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
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
import 'dart:math' as math;
|
||||||
import 'dart:typed_data';
|
import 'dart:typed_data';
|
||||||
|
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
@ -19,12 +20,49 @@ double _decodeBGR10(int x) {
|
|||||||
return (x * slope) + intercept;
|
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) {
|
bool _isAlmost(double x, double y, double epsilon) {
|
||||||
return (x - y).abs() < epsilon;
|
return (x - y).abs() < epsilon;
|
||||||
}
|
}
|
||||||
|
|
||||||
List<double> _deepRed = <double>[1.0931, -0.2268, -0.1501];
|
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(
|
bool _findBGRA10Color(
|
||||||
Uint8List bytes, int width, int height, List<double> color) {
|
Uint8List bytes, int width, int height, List<double> color) {
|
||||||
final ByteData byteData = ByteData.sublistView(bytes);
|
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);
|
return _findBGR10Color((result[3] as Uint8List?)!, width, height, color);
|
||||||
} else if (format == 'MTLPixelFormatBGRA10_XR') {
|
} else if (format == 'MTLPixelFormatBGRA10_XR') {
|
||||||
return _findBGRA10Color((result[3] as Uint8List?)!, width, height, color);
|
return _findBGRA10Color((result[3] as Uint8List?)!, width, height, color);
|
||||||
|
} else if (format == 'MTLPixelFormatRGBA16Float') {
|
||||||
|
return _findRGBAF16Color((result[3] as Uint8List?)!, width, height, color);
|
||||||
} else {
|
} else {
|
||||||
fail('Unsupported pixel format: $format');
|
fail('Unsupported pixel format: $format');
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user