86static void PrintWideGamutWarningOnce() {
87 static BOOL did_print = NO;
91 FML_DLOG(WARNING) <<
"Rendering wide gamut colors is turned on but isn't "
92 "supported, downgrading the color gamut to sRGB.";
96- (void)layoutSubviews {
97 if ([
self.layer isKindOfClass:NSClassFromString(
@"CAMetalLayer")]) {
100#pragma clang diagnostic push
101#pragma clang diagnostic ignored "-Wunguarded-availability-new"
102 CAMetalLayer* layer = (CAMetalLayer*)
self.layer;
103#pragma clang diagnostic pop
104 CGFloat screenScale =
self.screen.scale;
105 layer.allowsGroupOpacity = YES;
106 layer.contentsScale = screenScale;
107 layer.rasterizationScale = screenScale;
109 BOOL isWideGamutSupported =
self.isWideGamutSupported;
111 CGColorSpaceRef srgb = CGColorSpaceCreateWithName(kCGColorSpaceExtendedSRGB);
112 layer.colorspace = srgb;
114 layer.pixelFormat = MTLPixelFormatBGRA10_XR;
116 PrintWideGamutWarningOnce();
120 [
super layoutSubviews];
125+ (
BOOL)forceSoftwareRendering {
129+ (void)setForceSoftwareRendering:(
BOOL)forceSoftwareRendering {
138- (void)drawLayer:(CALayer*)layer inContext:(CGContextRef)context {
141 if (layer !=
self.layer || context ==
nullptr) {
145 auto screenshot = [_delegate takeScreenshot:flutter::Rasterizer::ScreenshotType::UncompressedImage
148 if (!screenshot.data || screenshot.data->isEmpty() || screenshot.frame_size.isEmpty()) {
152 NSData*
data = [NSData dataWithBytes:const_cast<void*>(screenshot.data->data())
153 length:screenshot.data->size()];
156 CGDataProviderCreateWithCFData(
reinterpret_cast<CFDataRef
>(data)));
161 size_t bits_per_component = 8u;
162 size_t bits_per_pixel = 32u;
163 size_t bytes_per_row_multiplier = 4u;
164 CGBitmapInfo bitmap_info =
165 static_cast<CGBitmapInfo
>(
static_cast<uint32_t
>(kCGImageAlphaPremultipliedLast) |
166 static_cast<uint32_t
>(kCGBitmapByteOrder32Big));
168 switch (screenshot.pixel_format) {
176 static_cast<CGBitmapInfo
>(
static_cast<uint32_t
>(kCGImageAlphaPremultipliedFirst) |
177 static_cast<uint32_t
>(kCGBitmapByteOrder32Little));
180 bits_per_component = 16u;
181 bits_per_pixel = 64u;
182 bytes_per_row_multiplier = 8u;
184 static_cast<CGBitmapInfo
>(
static_cast<uint32_t
>(kCGImageAlphaPremultipliedLast) |
185 static_cast<uint32_t
>(kCGBitmapFloatComponents) |
186 static_cast<uint32_t
>(kCGBitmapByteOrder16Little));
191 screenshot.frame_size.width(),
192 screenshot.frame_size.height(),
195 bytes_per_row_multiplier * screenshot.frame_size.width(),
201 kCGRenderingIntentDefault
204 const CGRect frame_rect =
205 CGRectMake(0.0, 0.0, screenshot.frame_size.width(), screenshot.frame_size.height());
206 CGContextSaveGState(context);
208 CGFloat
height = CGBitmapContextGetHeight(context);
210 height = CGFloat(screenshot.frame_size.height());
212 CGContextTranslateCTM(context, 0.0,
height);
213 CGContextScaleCTM(context, 1.0, -1.0);
214 CGContextDrawImage(context, frame_rect,
image);
215 CGContextRestoreGState(context);