recalculateLayerPosition method

void recalculateLayerPosition({
  1. required List<EditorStateHistory> history,
  2. required ResizeEvent resizeEvent,
})

Recalculates the position and scale of layers based on the temporary decoded image size.

Implementation

void recalculateLayerPosition({
  required List<EditorStateHistory> history,
  required ResizeEvent resizeEvent,
}) {
  Size getCropImageSize({
    required TransformConfigs transformConfigs,
    required Size drawSize,
  }) {
    double ratio = transformConfigs.originalSize.isInfinite
        ? decodedImageSize.aspectRatio
        : transformConfigs.cropRect.size.aspectRatio;
    double convertedRatio =
        transformConfigs.is90DegRotated ? 1 / ratio : ratio;

    if (convertedRatio < drawSize.aspectRatio) {
      return Size(drawSize.height * convertedRatio, drawSize.height);
    } else {
      return Size(drawSize.width, drawSize.width / convertedRatio);
    }
  }

  for (var el in history) {
    Size oldSize = getCropImageSize(
      transformConfigs: el.transformConfigs,
      drawSize: resizeEvent.oldContentSize,
    );
    Size newSize = getCropImageSize(
      transformConfigs: el.transformConfigs,
      drawSize: resizeEvent.newContentSize,
    );
    double scaleFactor = min(
      oldSize.width / newSize.width,
      oldSize.height / newSize.height,
    );
    if (scaleFactor != 0) {
      for (var layer in el.layers) {
        layer.scale /= scaleFactor;
        layer.offset = Offset(
          layer.offset.dx / scaleFactor,
          layer.offset.dy / scaleFactor,
        );
      }
    }
  }
}