2026-01-26 18:56:53 +09:00

118 lines
4.5 KiB
C#

/*
* Copyright (c) 2025 LG Electronics Inc.
* SPDX-License-Identifier: LicenseRef-LGE-Proprietary
*/
using Aurora.Api.DataType;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
namespace VisionCommon {
public class ScreenShotUtil {
public static (FovInfo, eFovUiPos) GetLeftTopFovInfo(List<FovInfo> fovInfos, eDisplayType displayType) {
var fovRecipe = VisionRecipeManager.GetFovRecipe(fovInfos[0]);
var leftTopUiPos = VisionRecipeManager.GetFovUiPos(fovRecipe, displayType);
var leftTopFovInfo = fovInfos[0];
for (int i = 1; i < fovInfos.Count; i++) {
fovRecipe = VisionRecipeManager.GetFovRecipe(fovInfos[i]);
var fovPos = VisionRecipeManager.GetFovUiPos(fovRecipe, displayType);
if (fovPos < leftTopUiPos) {
leftTopUiPos = fovPos;
leftTopFovInfo = fovInfos[i];
}
}
return (leftTopFovInfo, leftTopUiPos);
}
public static bool HasRightFov(FovInfo ltFovInfo, eFovUiPos ltFovUiPos, List<FovInfo> fovInfos, eDisplayType displayType) {
var (ltFovUiPosRow, ltFovUiPosCol) = FovRecipe.GetFovUiPosRowCol(ltFovUiPos);
foreach (var curfovInfo in fovInfos) {
if (curfovInfo == ltFovInfo) {
continue;
}
var fovRecipe = VisionRecipeManager.GetFovRecipe(curfovInfo);
var fovUiPos = VisionRecipeManager.GetFovUiPos(fovRecipe, displayType);
var (curFovUiPosRow, curFovUiPosCol) = FovRecipe.GetFovUiPosRowCol(fovUiPos);
// RightTop
if ((ltFovUiPosRow == curFovUiPosRow) &&
(ltFovUiPosCol + 1 == curFovUiPosCol)) {
return true;
}
// RightBottom
else if ((ltFovUiPosRow + 1 == curFovUiPosRow) &&
(ltFovUiPosCol + 1 == curFovUiPosCol)) {
return true;
}
}
return false;
}
public static bool HasBottomFov(FovInfo ltFovInfo, eFovUiPos ltFovUiPos, List<FovInfo> fovInfos, eDisplayType displayType) {
var (ltFovUiPosRow, ltFovUiPosCol) = FovRecipe.GetFovUiPosRowCol(ltFovUiPos);
foreach (var curfovInfo in fovInfos) {
if (curfovInfo == ltFovInfo) {
continue;
}
var fovRecipe = VisionRecipeManager.GetFovRecipe(curfovInfo);
var fovUiPos = VisionRecipeManager.GetFovUiPos(fovRecipe, displayType);
var (curFovUiPosRow, curFovUiPosCol) = FovRecipe.GetFovUiPosRowCol(fovUiPos);
// LeftBottom
if ((ltFovUiPosRow + 1 == curFovUiPosRow) &&
(ltFovUiPosCol == curFovUiPosCol)) {
return true;
}
// RightBottom
else if ((ltFovUiPosRow + 1 == curFovUiPosRow) &&
(ltFovUiPosCol + 1 == curFovUiPosCol)) {
return true;
}
}
return false;
}
public static void MergeImages(Bitmap src, Bitmap dst, int destOffsetX, int destOffsetY) {
using (Graphics g = Graphics.FromImage(dst)) {
g.DrawImage(src, destOffsetX, destOffsetY);
}
}
public static ImageSize GetScreenShotImageSize(Dictionary<FovInfo, Bitmap> overlayImages, eDisplayType displayType) {
if (0 < overlayImages.Count && 0 < overlayImages.Count) {
var (ltFovInfo, ltFovUiPos) = GetLeftTopFovInfo(overlayImages.Keys.ToList(), displayType);
if (ltFovInfo == null) {
return null;
}
var imageSize = new ImageSize();
imageSize.Width = overlayImages[ltFovInfo].Width;
imageSize.Height = overlayImages[ltFovInfo].Height;
imageSize.Channel = 3;
if (HasRightFov(ltFovInfo, ltFovUiPos, overlayImages.Keys.ToList(), displayType)) {
imageSize.Width *= 2;
}
if (HasBottomFov(ltFovInfo, ltFovUiPos, overlayImages.Keys.ToList(), displayType)) {
imageSize.Height *= 2;
}
return imageSize;
}
return null;
}
}
}