7 #include "flutter/fml/synchronization/waitable_event.h"
9 #define GLFW_INCLUDE_NONE
10 #include "third_party/glfw/include/GLFW/glfw3.h"
18 decltype(&CGContextRelease)>;
20 decltype(&CGImageRelease)>;
21 using CGColorSpacePtr =
23 decltype(&CGColorSpaceRelease)>;
25 std::unique_ptr<Screenshot> ReadTexture(
26 const std::shared_ptr<Context>& surface_context,
27 const std::shared_ptr<Texture>& texture) {
28 DeviceBufferDescriptor buffer_desc;
31 texture->GetTextureDescriptor().GetByteSizeOfBaseMipLevel();
32 buffer_desc.readback =
true;
33 std::shared_ptr<DeviceBuffer> device_buffer =
34 surface_context->GetResourceAllocator()->CreateBuffer(buffer_desc);
35 FML_CHECK(device_buffer);
37 auto command_buffer = surface_context->CreateCommandBuffer();
38 auto blit_pass = command_buffer->CreateBlitPass();
39 bool success = blit_pass->AddCopy(texture, device_buffer);
42 success = blit_pass->EncodeCommands(surface_context->GetResourceAllocator());
45 fml::AutoResetWaitableEvent latch;
47 surface_context->GetCommandQueue()
48 ->Submit({command_buffer},
56 device_buffer->Invalidate();
61 CGColorSpacePtr color_space(CGColorSpaceCreateDeviceRGB(),
62 &CGColorSpaceRelease);
63 CGBitmapInfo bitmap_info =
65 ? kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little
66 : kCGImageAlphaPremultipliedLast;
68 CGBitmapContextCreate(
69 device_buffer->OnGetContents(), texture->GetSize().width,
70 texture->GetSize().height,
72 texture->GetTextureDescriptor().GetBytesPerRow(),
73 color_space.get(), bitmap_info),
76 CGImagePtr image(CGBitmapContextCreateImage(context.get()), &CGImageRelease);
80 if (texture->GetYCoordScale() == -1) {
81 CGContextPtr flipped_context(
82 CGBitmapContextCreate(
83 nullptr, texture->GetSize().width, texture->GetSize().height,
85 0, color_space.get(), bitmap_info),
87 CGContextTranslateCTM(flipped_context.get(), 0, texture->GetSize().height);
88 CGContextScaleCTM(flipped_context.get(), 1.0, -1.0);
90 flipped_context.get(),
91 CGRectMake(0, 0, texture->GetSize().width, texture->GetSize().height),
93 CGImagePtr flipped_image(CGBitmapContextCreateImage(flipped_context.get()),
95 image.swap(flipped_image);
98 return std::make_unique<MetalScreenshot>(image.release());
103 const std::unique_ptr<PlaygroundImpl>& playground)
104 : playground_(playground) {
105 FML_CHECK(playground_);
110 const std::shared_ptr<Texture> texture) {
111 return ReadTexture(aiks_context.
GetContext(), texture);