captureScreenshot method

Future<CockpitCapturedScreenshot> captureScreenshot(
  1. CockpitScreenshotRequest request, {
  2. double pixelRatio = 1.0,
})

Implementation

Future<CockpitCapturedScreenshot> captureScreenshot(
  CockpitScreenshotRequest request, {
  double pixelRatio = 1.0,
}) async {
  Rect? cropRect;
  final cropLocator = request.cropLocator;
  if (cropLocator != null) {
    final resolution = _registry.resolve(cropLocator);
    final geometry = resolution.target == null
        ? null
        : CockpitTargetGeometryResolver.maybeFromTarget(resolution.target!);
    final viewport = _viewportGeometry();
    if (!resolution.isSuccess || geometry == null || viewport == null) {
      throw StateError('Screenshot crop locator has no visible geometry.');
    }
    final target = Rect.fromLTWH(
      geometry.left,
      geometry.top,
      geometry.width,
      geometry.height,
    );
    final viewportRect = Rect.fromLTWH(
      viewport.left,
      viewport.top,
      viewport.width,
      viewport.height,
    );
    final visible = target.intersect(viewportRect);
    if (visible.isEmpty) {
      throw StateError(
        'Screenshot crop locator is outside the Flutter view.',
      );
    }
    cropRect = visible.shift(Offset(-viewport.left, -viewport.top));
  }
  final screenshot = await _capture.capture(
    repaintBoundaryKey: _boundaryKey,
    request: request,
    pixelRatio: pixelRatio,
    cropRect: cropRect,
  );
  if (!request.includeSnapshot) return screenshot;

  final attachedSnapshot = snapshot(
    options: request.snapshotOptions ?? const CockpitSnapshotOptions.live(),
  );
  final degradationReason = screenshot.degradationReason;
  return CockpitCapturedScreenshot(
    artifact: screenshot.artifact,
    bytes: screenshot.bytes,
    snapshot: degradationReason == null
        ? attachedSnapshot
        : attachedSnapshot.copyWith(degradationReason: degradationReason),
    degradationReason: degradationReason,
  );
}