Files
player/Project/Src/MyWin/MyWinCore/mywin_lib.c

207 lines
5.2 KiB
C
Raw Normal View History

2025-06-27 00:32:57 +08:00
#include "mywin_inc.h"
2025-07-05 19:47:28 +08:00
/******************<2A><><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><D8BA><EFBFBD>**********************/
2025-06-27 00:32:57 +08:00
2025-07-06 18:46:13 +08:00
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD>
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;
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20><><EFBFBD>ٶ<EFBFBD><D9B6><EFBFBD>
void QUEUE_Delete(QUEUE_Struct *q) {
myfree(q->data);
q->data = 0;
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20><><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>գ<EFBFBD><D5A3><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD>򷵻<EFBFBD>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; // <20><><EFBFBD>з<EFBFBD><D0B7><EFBFBD>
}
return ret;
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20><><EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD>ұ<EFBFBD><D2B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
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) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
q->fill = 1;
return 0;
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20><EFBFBD><E9BFB4>ʼ<EFBFBD><CABC>
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;
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20><EFBFBD><E9BFB4><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7>أ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD>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;
2025-06-27 00:32:57 +08:00
}
2025-07-05 19:47:28 +08:00
/****************<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*************************/
2025-06-27 00:32:57 +08:00
2025-07-06 18:46:13 +08:00
// <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD>Ƿ񳬹<C7B7><F1B3ACB9>˰뾶<CBB0><EBBEB6>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˷<EFBFBD><CBB7>ط<EFBFBD>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;
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20>ж<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>ھ<EFBFBD><DABE><EFBFBD><EFBFBD><EFBFBD>,1,<2C>ڣ<EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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;
}
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>󽻼<EFBFBD>,<2C>н<EFBFBD><D0BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1
int POS_RectIntersection(RECT_Struct *out, RECT_Struct *r1, RECT_Struct *r2) {
// ȡ<><C8A1><EFBFBD>¾<EFBFBD><C2BE>ε<EFBFBD><CEB5><EFBFBD><EFBFBD>Ͻ<EFBFBD>
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;
// ȡ<><C8A1><EFBFBD>¾<EFBFBD><C2BE>ε<EFBFBD><CEB5><EFBFBD><EFBFBD>½<EFBFBD>
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;
}
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Σ<EFBFBD><CEA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD>
int POS_RectContain(RECT_Struct *out, RECT_Struct *r1, RECT_Struct *r2) {
// ȡ<><C8A1><EFBFBD>¾<EFBFBD><C2BE>ε<EFBFBD><CEB5><EFBFBD><EFBFBD>Ͻ<EFBFBD>
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;
// ȡ<><C8A1><EFBFBD>¾<EFBFBD><C2BE>ε<EFBFBD><CEB5><EFBFBD><EFBFBD>½<EFBFBD>
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;
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>r2<72><32><EFBFBD><EFBFBD>r1,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>վ<EFBFBD><D5BE><EFBFBD>
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)) {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><D0BD><EFBFBD>
if (temp.x_size < r1->x_size && temp.y_size < r1->y_size) {
// <20>¾<EFBFBD><C2BE>γ<EFBFBD><CEB3>Ϳ<EFBFBD><CDBF><EFBFBD>С<EFBFBD><D0A1>ԭ<EFBFBD><D4AD><EFBFBD>Σ<EFBFBD><CEA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӱ<EFBFBD><D3B0>
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))) {
// <20>¾<EFBFBD><C2BE><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD><EFBFBD>ε<EFBFBD><CEB5>м䣬<D0BC><E4A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӱ<EFBFBD><D3B0>
return 1;
} else if (POS_RectEqual(&temp, r1)) {
// <20>¾<EFBFBD><C2BE><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>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) {
// <20>¾<EFBFBD><C2BE><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD><EFBFBD>εĿ<CEB5><C4BF><EFBFBD><EFBFBD><EFBFBD>
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) {
// <20>¾<EFBFBD><C2BE><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD><EFBFBD>εĸ<CEB5><C4B8><EFBFBD><EFBFBD><EFBFBD>
if (r1->x == temp.x)
out->x += temp.x_size;
out->x_size -= temp.x_size;
return 1;
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӱ<EFBFBD><D3B0>
return 1;
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD><C8A3>Ƿ<EFBFBD><C7B7><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>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;
}