summaryrefslogtreecommitdiff
path: root/src/com/android/wallpaper/picker/preview/ui/util/FullResImageViewUtil.kt
blob: d1f9a5b78901370a350ecb1c0cae9b0ed024d5a5 (plain)
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
66
67
68
69
70
/*
 * Copyright (C) 2023 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.android.wallpaper.picker.preview.ui.util

import android.graphics.Point
import android.graphics.PointF
import android.graphics.Rect
import com.android.wallpaper.util.WallpaperCropUtils
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView

object FullResImageViewUtil {

    private const val DEFAULT_WALLPAPER_MAX_ZOOM = 8f

    fun getScaleAndCenter(
        viewSize: Point,
        rawWallpaperSize: Point,
        cropRect: Rect?,
    ): ScaleAndCenter {
        // Determine minimum zoom to fit maximum visible area of wallpaper on crop surface.
        // defaultRawWallpaperRect represents a brand new wallpaper preview with no crop hints.
        val defaultRawWallpaperRect =
            WallpaperCropUtils.calculateVisibleRect(rawWallpaperSize, viewSize)
        val visibleRawWallpaperRect = cropRect ?: defaultRawWallpaperRect
        val centerPosition =
            PointF(
                visibleRawWallpaperRect.centerX().toFloat(),
                visibleRawWallpaperRect.centerY().toFloat()
            )
        val defaultWallpaperZoom =
            WallpaperCropUtils.calculateMinZoom(
                Point(defaultRawWallpaperRect.width(), defaultRawWallpaperRect.height()),
                viewSize
            )
        val visibleWallpaperZoom =
            WallpaperCropUtils.calculateMinZoom(
                Point(visibleRawWallpaperRect.width(), visibleRawWallpaperRect.height()),
                viewSize
            )

        return ScaleAndCenter(
            defaultWallpaperZoom,
            defaultWallpaperZoom.coerceAtLeast(DEFAULT_WALLPAPER_MAX_ZOOM),
            visibleWallpaperZoom,
            centerPosition,
        )
    }

    fun SubsamplingScaleImageView.getCropRect() = Rect().apply { visibleFileRect(this) }

    data class ScaleAndCenter(
        val minScale: Float,
        val maxScale: Float,
        val defaultScale: Float,
        val center: PointF
    )
}