alder_lake_bios/Insyde/InsydeModulePkg/Library/RectLib/RectLib.c

315 lines
8.5 KiB
C

/** @file
Instance of rectangular library
;******************************************************************************
;* Copyright (c) 2013 - 2019, Insyde Software Corp. All Rights Reserved.
;*
;* You may not reproduce, distribute, publish, display, perform, modify, adapt,
;* transmit, broadcast, present, recite, release, license or otherwise exploit
;* any part of this publication in any form, by any means, without the prior
;* written permission of Insyde Software Corporation.
;*
;******************************************************************************
*/
#include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
#include <Library/RectLib.h>
/**
Set rectangle data
@param[in, out] Rect Pointer to rectangle data which will be set
@param[in] Left Left value of rectangle data
@param[in] Top Top value of rectangle data
@param[in] Right Right value of rectangle data
@param[in] Bottom Bottom value of rectangle data
@retval TRUE Rectangle data is set
**/
BOOLEAN
EFIAPI
SetRect(
IN OUT RECT *Rect,
IN INT32 Left,
IN INT32 Top,
IN INT32 Right,
IN INT32 Bottom
)
{
Rect->left = Left;
Rect->top = Top;
Rect->right = Right;
Rect->bottom = Bottom;
return TRUE;
}
/**
Set rectangle to empty
@param[in] Rect Rectangle
@retval TRUE Point is empty
**/
BOOLEAN
EFIAPI
SetRectEmpty (
IN RECT *Rect
)
{
ZeroMem (Rect, sizeof (RECT));
return TRUE;
}
/**
Copy rectangle data
@param[out] DestRect Pointer to destination rectangle data
@param[in] SrcRect Pointer to source rectangle data
@retval TRUE Rectangle data is copied
**/
BOOLEAN
EFIAPI
CopyRect (
OUT RECT *DestRect,
IN CONST RECT *SrcRect
)
{
CopyMem (DestRect, SrcRect, sizeof (RECT));
return TRUE;
}
/**
Test rectangle is empty
@param[in] Rect Pointer to rectangle data
@retval TRUE Rectangle is empty
@retval FALSE Rectangle isn't empty
**/
BOOLEAN
EFIAPI
IsRectEmpty (
IN CONST RECT *Rect
)
{
return (BOOLEAN) (Rect->right == Rect->left || Rect->bottom == Rect->top);
}
/**
Inflate the rectangle data
@param[in, out] Rect Pointer to rectangle data which will be inflated
@param[in] DiffX Inflated x-axis value
@param[in] DiffY Inflated y-axis value
@retval TRUE Rectangle data is inflated
**/
BOOLEAN
EFIAPI
InflateRect (
IN OUT RECT *Rect,
IN INT32 DiffX,
IN INT32 DiffY
)
{
Rect->left -= DiffX;
Rect->top -= DiffY;
Rect->right += DiffX;
Rect->bottom += DiffY;
return TRUE;
}
/**
Offset the rectangle data
@param[in, out] Rect Pointer to rectangle data which will be offset
@param[in] DiffX Offset x-axis value
@param[in] DiffY Offset y-axis value
@retval TRUE Rectangle data is offset
**/
BOOLEAN
EFIAPI
OffsetRect(
IN OUT RECT *Rect,
IN INT32 DiffX,
IN INT32 DiffY
)
{
Rect->left += DiffX;
Rect->right += DiffX;
Rect->top += DiffY;
Rect->bottom += DiffY;
return TRUE;
}
/**
Point is in rectangle range
@param[in] Rect Test rectangle
@param[in] Pt Test point
@retval TRUE Point is in rectangle range
@retval FALS Point is not in rectangle range
**/
BOOLEAN
EFIAPI
PtInRect (
IN RECT *Rect,
IN POINT Pt
)
{
return (BOOLEAN) (Pt.x >= Rect->left && Pt.x < Rect->right &&
Pt.y >= Rect->top && Pt.y < Rect->bottom);
}
/**
Get intersetion region from two rectangle data
@param[out] DestRect Pointer to rectangle data which is intersetion of SrcRect1 and SrcRect2
@param[in] SrcRect1 Pointer to rectangle data one
@param[in] SrcRect2 Pointer to rectangle data two
@retval TRUE Get intersetional rectangle data sucessfully
@retval FALSE Get intersetional rectangle data fail
**/
BOOLEAN
EFIAPI
IntersectRect (
IN OUT RECT *DestRect,
IN CONST RECT *SrcRect1,
IN CONST RECT *SrcRect2
)
{
if (IsRectEmpty(SrcRect1) || IsRectEmpty(SrcRect2) ||
(SrcRect1->left >= SrcRect2->right) || (SrcRect2->left >= SrcRect1->right) ||
(SrcRect1->top >= SrcRect2->bottom) || (SrcRect2->top >= SrcRect1->bottom)) {
SetRectEmpty(DestRect);
return FALSE;
}
DestRect->left = MAX(SrcRect1->left, SrcRect2->left);
DestRect->right = MIN(SrcRect1->right, SrcRect2->right);
DestRect->top = MAX(SrcRect1->top, SrcRect2->top);
DestRect->bottom = MIN(SrcRect1->bottom, SrcRect2->bottom);
return TRUE;
}
/**
Get union region from two rectangle data
@param[out] DestRect Pointer to rectangle data which is union of SrcRect1 and SrcRect2
@param[in] SrcRect1 Pointer to rectangle data one
@param[in] SrcRect2 Pointer to rectangle data two
@retval TRUE Get union rectangle data sucessfully
@retval FALSE Get union rectangle data fail
**/
BOOLEAN
EFIAPI
UnionRect (
IN OUT RECT *DestRect,
IN CONST RECT *SrcRect1,
IN CONST RECT *SrcRect2
)
{
if (IsRectEmpty(SrcRect1)) {
if (IsRectEmpty(SrcRect2)) {
SetRectEmpty(DestRect);
return FALSE;
} else {
*DestRect = *SrcRect2;
}
} else {
if (IsRectEmpty(SrcRect2)) {
*DestRect = *SrcRect1;
} else {
DestRect->left = MIN( SrcRect1->left, SrcRect2->left );
DestRect->right = MAX( SrcRect1->right, SrcRect2->right );
DestRect->top = MIN( SrcRect1->top, SrcRect2->top );
DestRect->bottom = MAX( SrcRect1->bottom, SrcRect2->bottom );
}
}
return TRUE;
}
/**
Subtract Src2Rect region from Src1Rect region
@param[out] DestRect Pointer to destination rectangle data
@param[in] Src1Rect Pointer to source rectangle data one
@param[in] Src2Rect Pointer to source rectangle data two
@retval TRUE Rectangle data is subtracted
@retval FALSE Source rectangle data one is empty
**/
BOOLEAN
EFIAPI
SubtractRect(
OUT RECT *DestRect,
IN CONST RECT *Src1Rect,
IN CONST RECT *Src2Rect
)
{
RECT Tmp;
if (IsRectEmpty (Src1Rect)) {
SetRectEmpty (DestRect);
return FALSE;
}
CopyRect (DestRect, Src1Rect);
if (IntersectRect (&Tmp, Src1Rect, Src2Rect)) {
if (EqualRect (&Tmp, DestRect)) {
SetRectEmpty( DestRect );
return FALSE;
}
if ((Tmp.top == DestRect->top) && (Tmp.bottom == DestRect->bottom)) {
if (Tmp.left == DestRect->left) {
DestRect->left = Tmp.right;
} else if (Tmp.right == DestRect->right) {
DestRect->right = Tmp.left;
}
} else if ((Tmp.left == DestRect->left) && (Tmp.right == DestRect->right)) {
if (Tmp.top == DestRect->top) {
DestRect->top = Tmp.bottom;
} else if (Tmp.bottom == DestRect->bottom) {
DestRect->bottom = Tmp.top;
}
}
}
return TRUE;
}
/**
Copy rectangle data
@param[in] Rect1 Pointer to rectangle data one
@param[in] Rect2 Pointer to rectangle data two
@retval TRUE Rectangle data is equal
@retval FALSE Rectangle data is not equal
**/
BOOLEAN
EFIAPI
EqualRect (
IN CONST RECT *Rect1,
IN CONST RECT *Rect2
)
{
return (BOOLEAN) ((Rect1->left == Rect2->left) && (Rect1->right == Rect2->right) &&
(Rect1->top == Rect2->top) && (Rect1->bottom == Rect2->bottom));
}