Files
player/Project/Src/MyWin/MyWinCore/mywin_lib.c
2025-06-27 00:32:57 +08:00

252 lines
4.9 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "mywin_inc.h"
/******************队列操作相关函数**********************/
//初始化已实例化的队列
void QUEUE_Init (QUEUE_Struct *q,int blocksize,int blocknum)
{
q->queueByteSize=blocksize*blocknum;
q->blockByteSize=blocksize;
q->data=mymalloc (q->queueByteSize);
q->inPointer=q->data;
q->outPointer=q->data;
}
//销毁队列
void QUEUE_Delete (QUEUE_Struct *q)
{
myfree(q->data);
q->data=0;
}
//出队,如果队列为空返回0否则返回1
int QUEUE_Out (QUEUE_Struct *q,void *buff)
{
int ret=0;
if (q->data==0) return ret;
if ((q->outPointer!=q->inPointer)||q->fill==1)
{
ret=1;
mymemcpy (buff,q->outPointer,q->blockByteSize);
q->outPointer+=q->blockByteSize;
if (q->outPointer>=q->data+q->queueByteSize)
q->outPointer=q->data;
q->fill=0;//队列非满
}
return ret;
}
//入队如果队列已满返回1并且本次入队失败
int QUEUE_In (QUEUE_Struct *q,void *block)
{
if (q->data==0) return 1;
if (q->fill==1) return 1;
mymemcpy (q->inPointer,block,q->blockByteSize);
q->inPointer+=q->blockByteSize;
if (q->inPointer>=q->data+q->queueByteSize)
q->inPointer=q->data;
if (q->inPointer==q->outPointer)//如果入队指针和出队指针相等,则队列满
q->fill=1;
return 0;
}
//查看初始化
int QUEUE_CheckStart (QUEUE_Struct *q)
{
if (q->data==0) return 1;
q->checkPointer=q->checkPointer=q->outPointer;
if ((q->checkPointer!=q->inPointer)||q->fill==1)
q->checkEnd=0;
else q->checkEnd=1;
return 0;
}
//查看数据还有数据返回没有数据返回0
void *QUEUE_Check (QUEUE_Struct *q)
{
void *ret=0;
if (q->data==0) return ret;
if (q->checkEnd==0)
{
ret=q->checkPointer;
q->checkPointer+=q->blockByteSize;
if (q->checkPointer>=q->data+q->queueByteSize)
q->outPointer=q->data;
if (q->checkPointer==q->inPointer) q->checkEnd=1;
}
return ret;
}
/****************坐标计算*************************/
//判断两个点的距离是否超过了半径没超过返回0超过了返回非0
int POS_RoundPix (int r,int x1,int y1,int x2,int y2)
{
if ((x1-x2>r)||(x2-x1>r))
return -1;
if ((y1-y2>r)||(y2-y1>r))
return -1;
return 0;
}
//判断指定点是否在矩形内,1,在0不在
int POS_InRect (int rect_x,int rect_y,int rect_x_size,int rect_y_size,int x,int y)
{
if (((x>=rect_x)&&(x<=rect_x+rect_x_size-1))&&
((y>=rect_y)&&(y<=rect_y+rect_y_size-1)))
{
return 1;
}
else
{
return 0;
}
}
//两个矩形求交集,有交集返回1
int POS_RectIntersection (RECT_Struct *out,RECT_Struct *r1,RECT_Struct *r2)
{
//取得新矩形的左上角
int x_s=r1->x;
int y_s=r1->y;
if (x_s<r2->x)
x_s=r2->x;
if (y_s<r2->y)
y_s=r2->y;
//取得新矩形的右下角
int x_e=r1->x+r1->x_size-1;
int y_e=r1->y+r1->y_size-1;
if (x_e>r2->x+r2->x_size-1)
x_e=r2->x+r2->x_size-1;
if (y_e>r2->y+r2->y_size-1)
y_e=r2->y+r2->y_size-1;
out->x=x_s;
out->y=y_s;
out->x_size=x_e-x_s+1;
out->y_size=y_e-y_s+1;
if ((y_e>=y_s)&&(x_e>=x_s))
{
return 1;
}
else
{
return 0;
}
}
//求一个大矩形,包含两个小矩形
int POS_RectContain (RECT_Struct *out,RECT_Struct *r1,RECT_Struct *r2)
{
//取得新矩形的左上角
int x_s=r1->x;
int y_s=r1->y;
if (x_s>r2->x)
x_s=r2->x;
if (y_s>r2->y)
y_s=r2->y;
//取得新矩形的右下角
int x_e=r1->x+r1->x_size-1;
int y_e=r1->y+r1->y_size-1;
if (x_e<r2->x+r2->x_size-1)
x_e=r2->x+r2->x_size-1;
if (y_e<r2->y+r2->y_size-1)
y_e=r2->y+r2->y_size-1;
out->x=x_s;
out->y=y_s;
out->x_size=x_e-x_s+1;
out->y_size=y_e-y_s+1;
return 1;
}
//两个矩形相减如果r2大于r1,则输出为空矩形
int POS_RectSub (RECT_Struct *out,RECT_Struct *r1,RECT_Struct *r2)
{
RECT_Struct temp={0};
out->x=r1->x;
out->y=r1->y;
out->x_size=r1->x_size;
out->y_size=r1->y_size;
if(POS_RectIntersection(&temp,r1,r2))
{
//如果两个矩形有交集
if(temp.x_size<r1->x_size&&temp.y_size<r1->y_size)
{
//新矩形长和宽都小于原矩形,结果不受影响
return 1;
}
else if((temp.x>r1->x&&(temp.x+temp.x_size<r1->x+r1->x_size))||
(temp.y>r1->y&&(temp.y+temp.y_size<r1->y+r1->y_size)))
{
//新矩形在原矩形的中间,结果不受影响
return 1;
}
else if(POS_RectEqual(&temp,r1))
{
//新矩形与原矩形相等结果返回0
out->x=0;
out->x_size=0;
out->y=0;
out->y_size=0;
return 0;
}
else if(temp.x_size==r1->x_size)
{
//新矩形与原矩形的宽相等
if(r1->y==temp.y)
out->y+=temp.y_size;
out->y_size-=temp.y_size;
return 1;
}
else if(temp.y_size==r1->y_size)
{
//新矩形与原矩形的高相等
if(r1->x==temp.x)
out->x+=temp.x_size;
out->x_size-=temp.x_size;
return 1;
}
}
//其他情况,结果不受影响
return 1;
}
//判断两个矩形相等是返回1不是返回0
int POS_RectEqual (RECT_Struct *r1,RECT_Struct *r2)
{
if(r1->x==r2->x&&r1->y==r2->y&&r1->x_size==r2->x_size&&r1->y_size==r2->y_size)
return 1;
else
return 0;
}