📄 graphics.cpp
字号:
}
}
void getarccoords(arccoordstype *arccoords)
{
*arccoords = ac;
}
void pieslice(int x, int y, int start_angle, int end_angle,
int radius)
{
pcache.select(color+BG);
select_fill_color();
ac.x = x;
ac.y = y;
ac.xstart = x + int(radius*cos(start_angle*pi/180.0));
ac.ystart = y - int(radius*sin(start_angle*pi/180.0));
ac.xend = x + int(radius*cos(end_angle*pi/180.0));
ac.yend = y - int(radius*sin(end_angle*pi/180.0));
if (bgiemu_handle_redraw || visual_page != active_page) {
Pie(hdc[1], x-radius, y-radius, x+radius, y+radius,
ac.xstart, ac.ystart, ac.xend, ac.yend);
}
if (visual_page == active_page) {
Pie(hdc[0], x-radius, y-radius, x+radius, y+radius,
ac.xstart, ac.ystart, ac.xend, ac.yend);
}
}
void sector(int x, int y, int start_angle, int end_angle,
int rx, int ry)
{
ac.x = x;
ac.y = y;
arc_coords(start_angle, rx, ry, ac.xstart, ac.ystart);
arc_coords(end_angle, rx, ry, ac.xend, ac.yend);
ac.xstart += x; ac.ystart += y;
ac.xend += x; ac.yend += y;
pcache.select(color+BG);
if (bgiemu_handle_redraw || visual_page != active_page) {
Pie(hdc[1], x-rx, y-ry, x+rx, y+ry,
ac.xstart, ac.ystart, ac.xend, ac.yend);
}
if (visual_page == active_page) {
Pie(hdc[0], x-rx, y-ry, x+rx, y+ry,
ac.xstart, ac.ystart, ac.xend, ac.yend);
}
}
void bar(int left, int top, int right, int bottom)
{
RECT r;
if (left > right) { /* Turbo C corrects for badly ordered corners */
r.left = right;
r.right = left;
} else {
r.left = left;
r.right = right;
}
if (bottom < top) { /* Turbo C corrects for badly ordered corners */
r.top = bottom;
r.bottom = top;
} else {
r.top = top;
r.bottom = bottom;
}
select_fill_color();
if (bgiemu_handle_redraw || visual_page != active_page) {
FillRect(hdc[1], &r, hBrush[fill_settings.pattern]);
}
if (visual_page == active_page) {
FillRect(hdc[0], &r, hBrush[fill_settings.pattern]);
}
}
void bar3d(int left, int top, int right, int bottom, int depth, int topflag)
{
int temp;
const double tan30 = 1.0/1.73205080756887729352;
if (left > right) { /* Turbo C corrects for badly ordered corners */
temp = left;
left = right;
right = temp;
}
if (bottom < top) {
temp = bottom;
bottom = top;
top = temp;
}
bar(left+line_settings.thickness, top+line_settings.thickness,
right-line_settings.thickness+1, bottom-line_settings.thickness+1);
if (write_mode != COPY_PUT) {
SetROP2(hdc[0], write_mode_cnv[write_mode]);
SetROP2(hdc[1], write_mode_cnv[write_mode]);
}
pcache.select(ADJUSTED_MODE(write_mode) ? color : color + BG);
int dy = int(depth*tan30);
POINT p[11];
p[0].x = right, p[0].y = bottom;
p[1].x = right, p[1].y = top;
p[2].x = left, p[2].y = top;
p[3].x = left, p[3].y = bottom;
p[4].x = right, p[4].y = bottom;
p[5].x = right+depth, p[5].y = bottom-dy;
p[6].x = right+depth, p[6].y = top-dy;
p[7].x = right, p[7].y = top;
if (topflag) {
p[8].x = right+depth, p[8].y = top-dy;
p[9].x = left+depth, p[9].y = top-dy;
p[10].x = left, p[10].y = top;
}
if (bgiemu_handle_redraw || visual_page != active_page) {
Polyline(hdc[1], p, topflag ? 11 : 8);
}
if (visual_page == active_page) {
Polyline(hdc[0], p, topflag ? 11 : 8);
}
if (write_mode != COPY_PUT) {
SetROP2(hdc[0], R2_COPYPEN);
SetROP2(hdc[1], R2_COPYPEN);
}
}
void lineto(int x, int y)
{
if (write_mode != COPY_PUT) {
SetROP2(hdc[0], write_mode_cnv[write_mode]);
SetROP2(hdc[1], write_mode_cnv[write_mode]);
}
pcache.select(ADJUSTED_MODE(write_mode) ? color : color + BG);
if (bgiemu_handle_redraw || visual_page != active_page) {
LineTo(hdc[1], x, y);
}
if (visual_page == active_page) {
LineTo(hdc[0], x, y);
}
if (write_mode != COPY_PUT) {
SetROP2(hdc[0], R2_COPYPEN);
SetROP2(hdc[1], R2_COPYPEN);
}
}
void linerel(int dx, int dy)
{
POINT pos;
GetCurrentPositionEx(hdc[1], &pos);
lineto(pos.x + dx, pos.y + dy);
}
void drawpoly(int n_points, int* points)
{
if (write_mode != COPY_PUT) {
SetROP2(hdc[0], write_mode_cnv[write_mode]);
SetROP2(hdc[1], write_mode_cnv[write_mode]);
}
pcache.select(ADJUSTED_MODE(write_mode) ? color : color + BG);
if (bgiemu_handle_redraw || visual_page != active_page) {
Polyline(hdc[1], (POINT*)points, n_points);
}
if (visual_page == active_page) {
Polyline(hdc[0], (POINT*)points, n_points);
}
if (write_mode != COPY_PUT) {
SetROP2(hdc[0], R2_COPYPEN);
SetROP2(hdc[1], R2_COPYPEN);
}
}
void line(int x0, int y0, int x1, int y1)
{
POINT line[2];
line[0].x = x0;
line[0].y = y0;
line[1].x = x1;
line[1].y = y1;
drawpoly(2, (int*)&line);
}
void rectangle(int left, int top, int right, int bottom)
{
POINT rect[5];
rect[0].x = left, rect[0].y = top;
rect[1].x = right, rect[1].y = top;
rect[2].x = right, rect[2].y = bottom;
rect[3].x = left, rect[3].y = bottom;
rect[4].x = left, rect[4].y = top;
drawpoly(5, (int*)&rect);
}
void fillpoly(int n_points, int* points)
{
pcache.select(color+BG);
select_fill_color();
if (bgiemu_handle_redraw || visual_page != active_page) {
Polygon(hdc[1], (POINT*)points, n_points);
}
if (visual_page == active_page) {
Polygon(hdc[0], (POINT*)points, n_points);
}
}
void floodfill(int x, int y, int border)
{
select_fill_color();
if (bgiemu_handle_redraw || visual_page != active_page) {
FloodFill(hdc[1], x, y, PALETTEINDEX(border+BG));
}
if (visual_page == active_page) {
FloodFill(hdc[0], x, y, PALETTEINDEX(border+BG));
}
}
static bool handle_input(bool wait = 0)
{
MSG lpMsg;
if (wait ? GetMessage(&lpMsg, NULL, 0, 0)
: PeekMessage(&lpMsg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&lpMsg);
DispatchMessage(&lpMsg);
return true;
}
return false;
}
void delay(unsigned msec)
{
timeout_expired = false;
SetTimer(hWnd, TIMER_ID, msec, NULL);
while (!timeout_expired) handle_input(true);
}
// The Mouse functions (1-Oct-2000, Matthew Weathers)
bool mouseup() {
while (handle_input(false));
if (bMouseUp) {
bMouseUp=false;
return true;
} else {
return false;
}
}
bool mousedown() {
while (handle_input(false));
if (bMouseDown) {
bMouseDown=false;
return true;
} else {
return false;
}
}
void clearmouse() {
iClickedMouseX=0;
iClickedMouseY=0;
iCurrentMouseX=0;
iCurrentMouseY=0;
bMouseDown=false;
bMouseUp=false;
}
int mouseclickx() {
return iClickedMouseX;
}
int mouseclicky(){
return iClickedMouseY;
}
int mousecurrentx(){
return iCurrentMouseX;
}
int mousecurrenty(){
return iCurrentMouseY;
}
int whichmousebutton(){
return iWhichMouseButton;
}
int kbhit()
{
while (handle_input(false));
return !kbd_queue.is_empty();
}
int getch()
{
while (kbd_queue.is_empty()) handle_input(true);
return (unsigned char)kbd_queue.get();
}
void cleardevice()
{
RECT scr;
scr.left = -view_settings.left;
scr.top = -view_settings.top;
scr.right = screen_width-view_settings.left-1;
scr.bottom = screen_height-view_settings.top-1;
if (bgiemu_handle_redraw || visual_page != active_page) {
if (hRgn != NULL) {
SelectClipRgn(hdc[1], NULL);
}
FillRect(hdc[1], &scr, hBackgroundBrush);
if (hRgn != NULL) {
SelectClipRgn(hdc[1], hRgn);
}
}
if (visual_page == active_page) {
if (hRgn != NULL) {
SelectClipRgn(hdc[0], NULL);
}
FillRect(hdc[0], &scr, hBackgroundBrush);
if (hRgn != NULL) {
SelectClipRgn(hdc[0], hRgn);
}
}
moveto(0,0);
}
void clearviewport()
{
RECT scr;
scr.left = 0;
scr.top = 0;
scr.right = view_settings.right-view_settings.left;
scr.bottom = view_settings.bottom-view_settings.top;
if (bgiemu_handle_redraw || visual_page != active_page) {
FillRect(hdc[1], &scr, hBackgroundBrush);
}
if (visual_page == active_page) {
FillRect(hdc[0], &scr, hBackgroundBrush);
}
moveto(0,0);
}
void detectgraph(int *graphdriver, int *graphmode)
{
*graphdriver = VGA;
*graphmode = bgiemu_default_mode;
}
int getgraphmode()
{
return bgiemu_default_mode;
}
void setgraphmode(int) {}
void putimage(int x, int y, void* image, int bitblt)
{
BGIimage* bi = (BGIimage*)image;
static int putimage_width, putimage_height;
if (hPutimageBitmap == NULL ||
putimage_width < bi->width || putimage_height < bi->height)
{
if (putimage_width < bi->width) {
putimage_width = (bi->width+7) & ~7;
}
if (putimage_height < bi->height) {
putimage_height = bi->height;
}
HBITMAP h = CreateCompatibleBitmap(hdc[0], putimage_width,
putimage_height);
SelectObject(hdc[2], h);
if (hPutimageBitmap) {
DeleteObject(hPutimageBitmap);
}
hPutimageBitmap = h;
}
int mask = ADJUSTED_MODE(bitblt) ? 0 : BG;
for (int i = 0; i <= MAXCOLORS; i++) {
bminfo.color_table[i] = i + mask;
}
bminfo.hdr.biHeight = bi->height;
bminfo.hdr.biWidth = bi->width;
SetDIBits(hdc[2], hPutimageBitmap, 0, bi->height, bi->bits,
(BITMAPINFO*)&bminfo, DIB_PAL_COLORS);
if (bgiemu_handle_redraw || visual_page != active_page) {
BitBlt(hdc[1], x, y, bi->width, bi->height, hdc[2], 0, 0,
bitblt_mode_cnv[bitblt]);
}
if (visual_page == active_page) {
BitBlt(hdc[0], x, y, bi->width, bi->height, hdc[2], 0, 0,
bitblt_mode_cnv[bitblt]);
}
}
unsigned int imagesize(int x1, int y1, int x2, int y2)
{
return 8 + (((x2-x1+8) & ~7) >> 1)*(y2-y1+1);
}
void getimage(int x1, int y1, int x2, int y2, void* image)
{
BGIimage* bi = (BGIimage*)image;
int* image_bits;
bi->width = x2-x1+1;
bi->height = y2-y1+1;
bminfo.hdr.biHeight = bi->height;
bminfo.hdr.biWidth = bi->width;
for (int i = 0; i <= MAXCOLORS; i++) {
bminfo.color_table[i] = i + BG;
}
HBITMAP hb = CreateDIBSection(hdc[3], (BITMAPINFO*)&bminfo,
DIB_PAL_COLORS, (void**)&image_bits, 0, 0);
HBITMAP hdb = (HBITMAP__*) SelectObject(hdc[3], hb);
BitBlt(hdc[3], 0, 0, bi->width, bi->height,
hdc[visual_page != active_page || bgiemu_handle_redraw ? 1 : 0],
x1, y1, SRCCOPY);
GdiFlush();
memcpy(bi->bits, image_bits, (((bi->width+7) & ~7) >> 1)*bi->height);
SelectObject(hdc[3], hdb);
DeleteObject(hb);
}
unsigned int getpixel(int x, int y)
{
int color;
COLORREF rgb = GetPixel(hdc[visual_page != active_page
|| bgiemu_handle_redraw ? 1 : 0], x, y);
if (rgb == CLR_INVALID) {
return -1;
}
int red = GetRValue(rgb);
int blue = GetBValue(rgb);
int green = GetGValue(rgb);
for (color = 0; color <= MAXCOLORS; color++) {
if (BGIpalette[color].peRed == red &&
BGIpalette[color].peGreen == green &&
BGIpalette[color].peBlue == blue)
{
return color;
}
}
return -1;
}
void putpixel(int x, int y, int c)
{
c &= MAXCOLORS;
if (bgiemu_handle_redraw || visual_page != active_page) {
SetPixel(hdc[1], x, y, PALETTEINDEX(c+BG));
}
if (visual_page == active_page) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -