File size: 2,482 Bytes
8a37e0a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import { createMemoizedSelector } from 'app/store/createMemoizedSelector';
import type { Dimensions } from 'features/controlLayers/store/types';
import { selectGallerySlice } from 'features/gallery/store/gallerySlice';
import type { ComparisonFit } from 'features/gallery/store/types';
import type { ImageDTO } from 'services/api/types';

export const DROP_SHADOW = 'drop-shadow(0px 0px 4px rgb(0, 0, 0)) drop-shadow(0px 0px 4px rgba(0, 0, 0, 0.3))';

export type ComparisonProps = {
  firstImage: ImageDTO;
  secondImage: ImageDTO;
  containerDims: Dimensions;
};

export const fitDimsToContainer = (containerDims: Dimensions, imageDims: Dimensions): Dimensions => {
  // Fall back to the image's dimensions if the container has no dimensions
  if (containerDims.width === 0 || containerDims.height === 0) {
    return { width: imageDims.width, height: imageDims.height };
  }

  // Fall back to the image's dimensions if the image fits within the container
  if (imageDims.width <= containerDims.width && imageDims.height <= containerDims.height) {
    return { width: imageDims.width, height: imageDims.height };
  }

  const targetAspectRatio = containerDims.width / containerDims.height;
  const imageAspectRatio = imageDims.width / imageDims.height;

  let width: number;
  let height: number;

  if (imageAspectRatio > targetAspectRatio) {
    // Image is wider than container's aspect ratio
    width = containerDims.width;
    height = width / imageAspectRatio;
  } else {
    // Image is taller than container's aspect ratio
    height = containerDims.height;
    width = height * imageAspectRatio;
  }
  return { width, height };
};

/**
 * Gets the dimensions of the second image in a comparison based on the comparison fit mode.
 */
export const getSecondImageDims = (
  comparisonFit: ComparisonFit,
  fittedDims: Dimensions,
  firstImageDims: Dimensions,
  secondImageDims: Dimensions
): Dimensions => {
  const width =
    comparisonFit === 'fill' ? fittedDims.width : (fittedDims.width * secondImageDims.width) / firstImageDims.width;
  const height =
    comparisonFit === 'fill' ? fittedDims.height : (fittedDims.height * secondImageDims.height) / firstImageDims.height;

  return { width, height };
};
export const selectComparisonImages = createMemoizedSelector(selectGallerySlice, (gallerySlice) => {
  const firstImage = gallerySlice.selection.slice(-1)[0] ?? null;
  const secondImage = gallerySlice.imageToCompare;
  return { firstImage, secondImage };
});