typedef struct hwport_rectangle_ts { int x, y; unsigned int width, height; }__hwport_rectangle_t; #define hwport_rectangle_t __hwport_rectangle_t typedef struct hwport_screen_ts { int bits_per_pixel; size_t bytes_per_line; hwport_rectangle_t rectangle; }__hwport_screen_t; #define hwport_screen_t __hwport_screen_t static hwport_screen_t my_screen = { 16, /* bits_per_pixel = <위 그림에서 하나의 점은 16K 의 Color수를 표현한다고 가정하면 하나의 점을 표현하는데는 16bits가 필요합니다.> */ (size_t)((32u + 4u) * (16u / 8u)), /* bytes_per_line = 가시영역인 32개의 가로 Pixel수와 비가시영역 4개의 Pixel을 더하고 bits_per_pixel을 bytes_per_pixel로 곱한것입니다. */ { 0, 0, 32u, 32u } /* rectangle = 비가시영역을 제외한 부분을 뜻합니다. 여기서 x, y는 항상 0이라고 할수는 없고 Over scan등이 고려될때는 0이 아닐수 있습니다. */ };
hwport_rectangle_t my_rectangle = { 2, 2, 9u, 9u };
typedef struct hwport_region_ts { int x1, y1, x2, y2; }__hwport_region_t; #define hwport_region_t __hwport_region_t hwport_region_t my_region = { 2, 2, 10, 10 };
#define MIN(m_left,m_right) ((m_left < m_right) ? (m_left) : (m_right)) #define MAX(m_left,m_right) ((m_left > m_right) ? (m_left) : (m_right)) my_rectangle.x = MIN(my_region.x1, my_region.x2); my_rectangle.y = MIN(my_region.y1, my_region.y2); my_rectangle.width = (unsigned int)( MAX(my_region.x1, my_region.x2) - MIN(my_region.x1, my_region.x2) + 1 ); my_rectangle.height = (unsigned int)( MAX(my_region.y1, my_region.y2) - MIN(my_region.y1, my_region.y2) + 1 );
if((my_rectangle.width <= 0u) || (my_rectangle.height <= 0u)) { /* ERROR: invalid width or height */ } my_region.x1 = my_rectangle.x; my_region.y1 = my_rectangle.y; my_region.x2 = ((int)my_rectangle.width) - my_rectangle.x - 1; my_region.y2 = ((int)my_rectangle.height) - my_rectangle.y - 1;
typedef struct hwport_bound_ts { int left, top, right, bottom; }__hwport_bound_t; #define hwport_bound_t __hwport_bound_t typedef struct hwport_screen_ts { int bits_per_pixel; size_t bytes_per_line; hwport_bound_t bound; }__hwport_screen_t; #define hwport_screen_t __hwport_screen_t static hwport_screen_t my_screen = { 16, /* bits_per_pixel */ (32 + 4) * (16 / 8), /* bytes_per_line */ { 0, 0, 32, 32 } /* bound */ };
hwport_bound_t my_bound = { 2, 2, 11, 11 };
my_rectangle.x = my_bound.left; my_rectangle.y = my_bound.top; my_rectangle.width = (unsigned int)(my_bound.right - my_bound.left); my_rectangle.height = (unsigned int)(my_bound.bottom - my_bound.top);
/* ************************ *[deal] | * * (0) | * * | * *------********** * * *[other] * (1) * * * * * * *Overlap * * * (3) * * * * * * * * **********------* * | * * | (2) * * | * ************************ */ #if !defined(hwport_rectangle_t) # pragma pack(push,8) typedef struct hwport_rectangle_ts { int m_x; int m_y; unsigned int m_w; unsigned int m_h; }__hwport_rectangle_t; # pragma pack(pop) # define hwport_rectangle_t __hwport_rectangle_t #endif int hwport_sep_overlap_window(const hwport_rectangle_t *s_deal_region, const hwport_rectangle_t *s_other_region, hwport_rectangle_t *s_overlap_region, hwport_rectangle_t *s_no_overlap_region /* array[4] */) { int s_temp1; int s_temp2; hwport_rectangle_t s_temp_window; if(hwport_unlikely((s_deal_region == ((hwport_rectangle_t *)0)) || (s_other_region == ((hwport_rectangle_t *)0)))) { return(-1); } /* wide region select to s_temp_window */ s_temp_window.m_x = (s_deal_region->m_x <= s_other_region->m_x) ? s_deal_region->m_x : s_other_region->m_x; s_temp_window.m_y = (s_deal_region->m_y <= s_other_region->m_y) ? s_deal_region->m_y : s_other_region->m_y; s_temp1 = s_deal_region->m_x + ((int)s_deal_region->m_w); s_temp2 = s_other_region->m_x + ((int)s_other_region->m_w); if(s_temp2 > s_temp1) { s_temp1 = s_temp2; } s_temp_window.m_w = (unsigned int)(s_temp1 - s_temp_window.m_x); s_temp1 = s_deal_region->m_y + ((int)s_deal_region->m_h); s_temp2 = s_other_region->m_y + ((int)s_other_region->m_h); if(s_temp2 > s_temp1) { s_temp1 = s_temp2; } s_temp_window.m_h = (unsigned int)(s_temp1 - s_temp_window.m_y); if(((s_deal_region->m_w + s_other_region->m_w) <= s_temp_window.m_w) || ((s_deal_region->m_h + s_other_region->m_h) <= s_temp_window.m_h)) { /* no overlap */ return(0); } if(s_overlap_region == ((hwport_rectangle_t *)0)) { s_overlap_region = (hwport_rectangle_t *)(&s_temp_window); } /* overlap region select */ s_overlap_region->m_x = (s_deal_region->m_x >= s_other_region->m_x) ? s_deal_region->m_x : s_other_region->m_x; s_overlap_region->m_y = (s_deal_region->m_y >= s_other_region->m_y) ? s_deal_region->m_y : s_other_region->m_y; s_overlap_region->m_w = s_deal_region->m_w + s_other_region->m_w - s_temp_window.m_w; s_overlap_region->m_h = s_deal_region->m_h + s_other_region->m_h - s_temp_window.m_h; /* no overlap region select */ if(s_no_overlap_region != ((hwport_rectangle_t *)0)) { s_no_overlap_region[0].m_x = s_deal_region->m_x; s_no_overlap_region[0].m_y = s_deal_region->m_y; s_no_overlap_region[0].m_w = (unsigned int)(s_overlap_region->m_x + ((int)s_overlap_region->m_w) - s_deal_region->m_x); s_no_overlap_region[0].m_h = (unsigned int)(s_overlap_region->m_y - s_deal_region->m_y); s_no_overlap_region[1].m_x = s_overlap_region->m_x + ((int)s_overlap_region->m_w); s_no_overlap_region[1].m_y = s_deal_region->m_y; s_no_overlap_region[1].m_w = (unsigned int)((s_deal_region->m_x + ((int)s_deal_region->m_w)) - (s_overlap_region->m_x + ((int)s_overlap_region->m_w))); s_no_overlap_region[1].m_h = (unsigned int)((s_overlap_region->m_y + ((int)s_overlap_region->m_h)) - s_deal_region->m_y); s_no_overlap_region[2].m_x = s_overlap_region->m_x; s_no_overlap_region[2].m_y = s_overlap_region->m_y + ((int)s_overlap_region->m_h); s_no_overlap_region[2].m_w = (unsigned int)(((int)s_deal_region->m_w) - (s_overlap_region->m_x - s_deal_region->m_x)); s_no_overlap_region[2].m_h = (unsigned int)((s_deal_region->m_y + ((int)s_deal_region->m_h)) - (s_overlap_region->m_y + ((int)s_overlap_region->m_h))); s_no_overlap_region[3].m_x = s_deal_region->m_x; s_no_overlap_region[3].m_y = s_overlap_region->m_y; s_no_overlap_region[3].m_w = (unsigned int)(s_overlap_region->m_x - s_deal_region->m_x); s_no_overlap_region[3].m_h = (unsigned int)(((int)s_deal_region->m_h) - (s_overlap_region->m_y - s_deal_region->m_y)); } return(1); }