libc: BGI Фаза 2d-2 — setlinestyle (стили и толщина линий)
setlinestyle/getlinesettings: SOLID/DOTTED/CENTER/DASHED/USERBIT + NORM/THICK. _bgi_styled_line — Брезенхэм с 16-битной маской (пропуск пикселя по биту) и дублированием ±1 перпендикулярно оси для THICK; SOLID+NORM идёт быстрым путём (accel _bgi_lineseg). line/lineto/linerel/ rectangle/drawpoly переведены на него. Проверено в MAME (tests/bgitest). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+29
-31
@@ -1,15 +1,14 @@
|
||||
/*
|
||||
* bgitest — демонстрация BGI-слоя graphics.h (режим 320×256×256).
|
||||
* Фаза 2d-1: getimage/putimage/imagesize (спрайты, COPY/XOR/OR).
|
||||
* Фаза 2d-2: setlinestyle (SOLID/DOTTED/CENTER/DASHED + THICK).
|
||||
*/
|
||||
|
||||
#include <graphics.h>
|
||||
|
||||
static unsigned char buf[2048];
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int mx, my;
|
||||
int mx, my, i, y;
|
||||
static const char *name[4] = { "SOLID", "DOTTED", "CENTER", "DASHED" };
|
||||
|
||||
initgraph();
|
||||
mx = getmaxx();
|
||||
@@ -19,37 +18,36 @@ int main(void)
|
||||
setcolor(WHITE);
|
||||
rectangle(0, 0, mx, my);
|
||||
setcolor(YELLOW);
|
||||
outtextxy(88, 6, "BGI image / sprite");
|
||||
outtextxy(104, 6, "BGI linestyle");
|
||||
|
||||
/* Исходный спрайт 40×30 в левом верхнем углу. */
|
||||
setfillstyle(SOLID_FILL, LIGHTBLUE);
|
||||
bar(12, 28, 51, 57);
|
||||
setcolor(YELLOW);
|
||||
rectangle(12, 28, 51, 57);
|
||||
setcolor(LIGHTRED);
|
||||
line(12, 28, 51, 57);
|
||||
setfillstyle(SOLID_FILL, LIGHTGREEN);
|
||||
fillellipse(31, 42, 8, 8);
|
||||
/* Четыре стиля тонкой линией. */
|
||||
for (i = 0; i < 4; i++) {
|
||||
y = 40 + i * 22;
|
||||
setcolor(WHITE);
|
||||
outtextxy(12, y - 3, name[i]);
|
||||
setcolor(LIGHTGREEN);
|
||||
setlinestyle(i, 0, NORM_WIDTH);
|
||||
line(80, y, 300, y);
|
||||
}
|
||||
|
||||
/* Толстые версии тех же стилей. */
|
||||
for (i = 0; i < 4; i++) {
|
||||
y = 140 + i * 16;
|
||||
setcolor(LIGHTCYAN);
|
||||
setlinestyle(i, 0, THICK_WIDTH);
|
||||
line(80, y, 300, y);
|
||||
}
|
||||
setcolor(WHITE);
|
||||
outtextxy(12, 60, "src");
|
||||
outtextxy(12, 150, "THICK");
|
||||
|
||||
/* Захват и раскладка копий (COPY_PUT). */
|
||||
getimage(12, 28, 51, 57, buf);
|
||||
putimage(80, 28, buf, COPY_PUT);
|
||||
putimage(130, 28, buf, COPY_PUT);
|
||||
putimage(180, 28, buf, COPY_PUT);
|
||||
/* Прямоугольник пунктиром + диагонали. */
|
||||
setcolor(LIGHTMAGENTA);
|
||||
setlinestyle(DASHED_LINE, 0, NORM_WIDTH);
|
||||
rectangle(20, 212, 130, 250);
|
||||
line(20, 212, 130, 250);
|
||||
setcolor(WHITE);
|
||||
outtextxy(80, 60, "copy x3");
|
||||
|
||||
/* XOR и OR поверх серого фона. */
|
||||
setfillstyle(SOLID_FILL, DARKGRAY);
|
||||
bar(20, 110, 240, 170);
|
||||
putimage(30, 122, buf, XOR_PUT);
|
||||
outtextxy(30, 176, "xor");
|
||||
putimage(110, 122, buf, OR_PUT);
|
||||
outtextxy(110, 176, "or");
|
||||
putimage(190, 122, buf, COPY_PUT);
|
||||
outtextxy(190, 176, "copy");
|
||||
setlinestyle(SOLID_LINE, 0, NORM_WIDTH);
|
||||
outtextxy(150, 228, "dashed rect");
|
||||
|
||||
for (;;) { }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user