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);
}
bitblit.tar.gz (1.22 KB) : Text console 상에서 구현하는 간략한 FrameBuffer 에 대한 개념을 이해하기 위한 예제
fbinfo.tar.gz (1.6 KB) : Linux Frame Buffer 를 이해하기 위한 간략한 FrameBuffer 정보추출 기초 예제
fbclock.tar.gz (2.81 KB) : Linux Frame Buffer 상에서 시계바늘을 그리는 간략한 예제 (점, 선, 회전각에 대한 이해를 위한...)
fbfire.tar.gz (2.44 KB) : Linux Frame Buffer 상에서 좀더 가시적인 효과를 어떻게 구현하는지에 대한 예제 (불타오르는 화면효과 연출, 색상을 다루는 예제)
bitmap.tar.gz (17.46 KB) : Text console 상에서 간략히 글자를 어떻게 Bitmap으로 다루고 이를 Frame Buffer에 도입할수 있는지에 대한 예제
mz3d.tar.gz (16.39 KB) : Linux frame buffer 상에서 동작하는 3차원를 다루는 예제
mz3dx_simple.tar.gz (6.27 KB) : X-Windows 상에서 동작하는 3차원을 다루는 예제