📄 accel.c
字号:
for(i = 0; i < 8; i++) bmaptmp[i] = rotbyte(gl_font8x8['3' * 8 + i]); vga_accel(ACCEL_PUTBITMAP, x + w - 9, y + h - 9, 8, 8, bmaptmp); vga_accel(ACCEL_SETFGCOLOR, gl_rgbcolor(255, 255, 0)); xo = (w - wizard_width) / 2; yo = (h - wizard_height) / 2; vga_accel(ACCEL_PUTBITMAP, x + xo, y + yo, wizard_width, wizard_height, conv_wizard_bits); } break; case 7: if ((accelfuncs & ACCELFLAG_PUTBITMAP) && (accelfuncs & ACCELFLAG_SETTRANSPARENCY) && (transfuncs & ACCELFLAG_PUTBITMAP) && (transmodes & (1 << ENABLE_BITMAP_TRANSPARENCY))) { gl_write(x + 1, y + h + 3, "BitmapTransparency"); gl_putbox(x + 1, y + 1, w - 2, h - 2, scaleimage); vga_accel(ACCEL_SETTRANSPARENCY, ENABLE_BITMAP_TRANSPARENCY); vga_accel(ACCEL_SETBGCOLOR, gl_rgbcolor(255, 0, 0)); vga_accel(ACCEL_SETFGCOLOR, gl_rgbcolor(0, 0, 0)); vga_accel(ACCEL_PUTBITMAP, x + 1, y + 1, wizardmsk_width, wizardmsk_height, conv_wizardmsk_bits); vga_accel(ACCEL_SETFGCOLOR, gl_rgbcolor(255, 255, 0)); vga_accel(ACCEL_PUTBITMAP, x + 1, y + 1, wizard_width, wizard_height, conv_wizard_bits); vga_accel(ACCEL_SETFGCOLOR, gl_rgbcolor(255, 0, 0)); vga_accel(ACCEL_PUTBITMAP, x + w - wizard_width - 1, y + 1, wizard_width, wizard_height, conv_wizard_bits); vga_accel(ACCEL_SETFGCOLOR, gl_rgbcolor(0, 255, 0)); vga_accel(ACCEL_PUTBITMAP, x + 1, y + h - wizard_height - 1, wizard_width, wizard_height, conv_wizard_bits); vga_accel(ACCEL_SETFGCOLOR, gl_rgbcolor(0, 255, 255)); vga_accel(ACCEL_PUTBITMAP, x + w - wizard_width - 1, y + h - wizard_height - 1, wizard_width, wizard_height, conv_wizard_bits); vga_accel(ACCEL_SETTRANSPARENCY, DISABLE_BITMAP_TRANSPARENCY); } break; case 8: if (accelfuncs & ACCELFLAG_SCREENCOPYMONO) { gl_write(x + 1, y + h + 3, "MonoScreenCopy"); vga_accel(ACCEL_SETBGCOLOR, gl_rgbcolor(255, 0, 0)); vga_accel(ACCEL_SETFGCOLOR, gl_rgbcolor(0, 255, 0)); vga_accel(ACCEL_SCREENCOPYMONO, x + 1, y + h + 3, x + 1, y + 1, 14 * 8, 8); vga_accel(ACCEL_SETFGCOLOR, gl_rgbcolor(255, 0, 0)); vga_accel(ACCEL_SETBGCOLOR, gl_rgbcolor(0, 255, 0)); vga_accel(ACCEL_SCREENCOPYMONO, x + 1, y + h + 3, x + w - 1 - 14 * 8, y + 1, 14 * 8, 8); vga_accel(ACCEL_SETFGCOLOR, gl_rgbcolor(0, 0, 0)); vga_accel(ACCEL_SETBGCOLOR, gl_rgbcolor(255, 255, 255)); vga_accel(ACCEL_SCREENCOPYMONO, x + 1, y + h + 3, x + 1, y + h - 9, 14 * 8, 8); vga_accel(ACCEL_SETBGCOLOR, gl_rgbcolor(0, 0, 0)); vga_accel(ACCEL_SETFGCOLOR, gl_rgbcolor(255, 255, 255)); vga_accel(ACCEL_SCREENCOPYMONO, x + 1, y + h + 3, x + w - 1 - 14 * 8, y + h - 9, 14 * 8, 8); } break; case 9: if (accelfuncs & ACCELFLAG_POLYLINE) { unsigned short X = x + 1, Y = y + 1, W = x + w - 2, H = y + (h >> 1) - 2; unsigned short coords[] = { X, Y, (X + W)/2, Y, W, Y, W, H, X + (3 * (W - X))/4, H, (X + W)/2, (Y + H)/2, X + (W - X)/4, H, X, H, X, Y }; gl_write(x + 1, y + h + 3, "Polyline"); vga_accel(ACCEL_SETFGCOLOR, gl_rgbcolor(0, 255, 0)); draw_poly(coords); if ((ropfuncs & ACCELFLAG_POLYLINE) && (accelfuncs & ACCELFLAG_SETRASTEROP) && (ropmodes & (1 << ROP_XOR))) { vga_accel(ACCEL_SETRASTEROP, ROP_XOR); vga_accel(ACCEL_SETFGCOLOR, gl_rgbcolor(0, 255, 255)); } H = y + h - 2 - H; for (X = 1; X < (sizeof(coords) / sizeof(unsigned short)); X += 2) { coords[X] += H; } draw_poly(coords); if ((ropfuncs & ACCELFLAG_POLYLINE) && (accelfuncs & ACCELFLAG_SETRASTEROP)) { vga_accel(ACCEL_SETRASTEROP, ROP_COPY); } } break; case 10: if (accelfuncs & ACCELFLAG_POLYHLINE) { gl_write(x + 1, y + h + 3, "PolyHLine"); vga_accel(ACCEL_SETFGCOLOR, gl_rgbcolor(0, 255, 0)); draw_polyhli(x + 1, y + 1, w - 2, h - 2); } break; case 11: if ((accelfuncs & ACCELFLAG_POLYLINE) && (accelfuncs & ACCELFLAG_SETRASTEROP) && (accelfuncs & ACCELFLAG_SCREENCOPYMONO) && (accelfuncs & ACCELFLAG_POLYFILLMODE) && (accelfuncs & ACCELFLAG_DRAWLINE) && (ropfuncs & ACCELFLAG_DRAWLINE) && (maxy > (HEIGHT + h)) && (ropmodes & (1 << ROP_XOR))) { gl_write(x + 1, y + h + 3, "PolygonFillMode"); vga_accel(ACCEL_SETFGCOLOR, gl_rgbcolor(0, 0, 0)); vga_accel(ACCEL_FILLBOX, x + 1, HEIGHT, w - 2, h - 2); vga_accel(ACCEL_SETFGCOLOR, gl_rgbcolor(255, 255, 255)); vga_accel(ACCEL_SETRASTEROP, ROP_XOR); vga_accel(ACCEL_POLYFILLMODE, 1); draw_polygon(1, x + 1, HEIGHT, w - 2, h - 2); vga_accel(ACCEL_SETFGCOLOR, gl_rgbcolor(255, 0, 0)); vga_accel(ACCEL_SETRASTEROP, ROP_COPY); vga_accel(ACCEL_SCREENCOPYMONO, x + 1, HEIGHT, x + 1, y + 1, w - 2, h - 2); vga_accel(ACCEL_POLYFILLMODE, 0); vga_accel(ACCEL_SETFGCOLOR, gl_rgbcolor(0, 255, 0)); draw_polygon(0, x + 1, y + 1, w - 2, h - 2); } goto endtest; } } endtest: vga_getch();}void drawdisk(int x, int y, int n, int *xmin, int *xmax) { int i; int *xmin2, *xmax2; xmin2 = alloca(sizeof(int) * n); xmax2 = alloca(sizeof(int) * n); for (i = 0; i < n; i++) { xmin2[i] = xmin[i] + x; xmax2[i] = xmax[i] + x; } vga_accel(ACCEL_DRAWHLINELIST, y, n, xmin2, xmax2);}char *RopNames[] = { "Copy/Replace", "Or", "And", "Xor", "Invert" };void RopTest(void) { int x, y, i, w, h, wsq, xo, yo, red, x1, x2; int *xmin, *xmax; if (!(ropfuncs & (ACCEL_DRAWHLINELIST | ACCELFLAG_FILLBOX))) { printf("Rasteroperation test needs HLINELIST or FILLBOX\n"); return; } vga_accel(ACCEL_SETTRANSPARENCY, ENABLE_TRANSPARENCY_COLOR, gl_rgbcolor(255, 0, 0)); w = BOXES_WIDTH - 2 * BOXES_B; h = BOXES_HEIGHT - 2 * BOXES_B; wsq = min((w * 2)/3, (h * 2)/3); xmin = alloca(sizeof(int) * wsq); xmax = alloca(sizeof(int) * wsq); xo = wsq / 2; yo = xo * xo; for (i = 0; i < wsq; i++) { red = sqrt(yo - (i - xo) * (i - xo)); xmin[i] = xo - red; xmax[i] = xo + red; } yo = h - wsq - 1; xo = (w - wsq) / 2; red = gl_rgbcolor(255, 0, 0); x1 = xo - (wsq - yo)/2; if (x1 < 1) x1 = 1; x2 = w - wsq - x1; gl_write(0, 0, "Testing raster operations:"); for(y = BOXES_B + 8, i = 0; y < HEIGHT; y += BOXES_HEIGHT) for(x = BOXES_B; x < WIDTH; x += BOXES_WIDTH) { DrawFrame(x, y, x + w - 1, y + h - 1, red); if (! (ropmodes & (1 << i))) goto nextrop; if ((i == ROP_AND) || (i == ROP_XOR)) { vga_accel(ACCEL_SETFGCOLOR, gl_rgbcolor(255, 255, 255)); vga_accel(ACCEL_FILLBOX, x + 1, y + 1, w - 2, h - 2); if (accelfuncs & ACCELFLAG_DRAWHLINELIST) { vga_accel(ACCEL_SETRASTEROP, i); vga_accel(ACCEL_SETFGCOLOR, gl_rgbcolor(0, 255, 255)); drawdisk(x + x1, y + 1, wsq, xmin, xmax); vga_accel(ACCEL_SETFGCOLOR, gl_rgbcolor(255, 0, 255)); drawdisk(x + x2, y + 1, wsq, xmin, xmax); vga_accel(ACCEL_SETFGCOLOR, gl_rgbcolor(255, 255, 0)); drawdisk(x + xo, y + yo, wsq, xmin, xmax); } else { vga_accel(ACCEL_SETRASTEROP, i); vga_accel(ACCEL_SETFGCOLOR, gl_rgbcolor(0, 255, 255)); vga_accel(ACCEL_FILLBOX, x + x1, y + 1, wsq, wsq); vga_accel(ACCEL_SETFGCOLOR, gl_rgbcolor(255, 0, 255)); vga_accel(ACCEL_FILLBOX, x + x2, y + 1, wsq, wsq); vga_accel(ACCEL_SETFGCOLOR, gl_rgbcolor(255, 255, 0)); vga_accel(ACCEL_FILLBOX, x + xo, y + yo, wsq, wsq); } } else { if (accelfuncs & ACCELFLAG_DRAWHLINELIST) { vga_accel(ACCEL_SETRASTEROP, i); vga_accel(ACCEL_SETFGCOLOR, gl_rgbcolor(255, 0, 0)); drawdisk(x + x1, y + 1, wsq, xmin, xmax); vga_accel(ACCEL_SETFGCOLOR, gl_rgbcolor(0, 255, 0)); drawdisk(x + x2, y + 1, wsq, xmin, xmax); vga_accel(ACCEL_SETFGCOLOR, gl_rgbcolor(0, 0, 255)); drawdisk(x + xo, y + yo, wsq, xmin, xmax); } else { vga_accel(ACCEL_SETRASTEROP, i); vga_accel(ACCEL_SETFGCOLOR, gl_rgbcolor(255, 0, 0)); vga_accel(ACCEL_FILLBOX, x + x1, y + 1, wsq, wsq); vga_accel(ACCEL_SETFGCOLOR, gl_rgbcolor(0, 255, 0)); vga_accel(ACCEL_FILLBOX, x + x2, y + 1, wsq, wsq); vga_accel(ACCEL_SETFGCOLOR, gl_rgbcolor(0, 0, 255)); vga_accel(ACCEL_FILLBOX, x + xo, y + yo, wsq, wsq); } } vga_accel(ACCEL_SETRASTEROP, ROP_COPY); gl_write(x + 1, y + h + 3, RopNames[i]); nextrop: i++; if (i >= (sizeof(RopNames) / sizeof(char *))) goto endtest; } endtest: vga_getch();}void QixDemo(int rop, char *txt) { int current = 0, dx1, dy1, dx2, dy2, i, cols = 1, cx1, cx2, cy1, cy2; int startclock, diffclock; unsigned long pixels = 0, numlines = 0; struct { unsigned short x1; unsigned short y1; unsigned short x2; unsigned short y2; int col; int pix; } lines[QIXLINES]; if ( !(ropmodes & (1 << rop)) || !(accelfuncs & ACCELFLAG_DRAWLINE)) return; if ((rop != ROP_COPY) && !(accelfuncs & ACCELFLAG_SETRASTEROP)) return; DrawDots(); gl_write(1, 1, txt); memset(lines, 0, sizeof(lines)); cx1 = rand() % WIDTH; cy1 = rand() % HEIGHT; cx2 = rand() % WIDTH; cy2 = rand() % HEIGHT; dx1 = 5 - rand() % 10; dy1 = 5 - rand() % 10; dx2 = 5 - rand() % 10; dy2 = 5 - rand() % 10; if (rop != ROP_COPY) vga_accel(ACCEL_SETRASTEROP, rop); startclock = clock(); for(i = 0; i < 10000; i++) { diffclock = clock() - startclock; if (diffclock > 5 * CLOCKS_PER_SEC) break; if (lines[current].col) { if (rop != ROP_COPY) vga_accel(ACCEL_SETFGCOLOR, lines[current].col); else vga_accel(ACCEL_SETFGCOLOR, 0); vga_accel(ACCEL_DRAWLINE, lines[current].x1, lines[current].y1, lines[current].x2, lines[current].y2); numlines++; pixels += lines[current].pix; } cx1 += dx1; if ((cx1 < 0) || (cx1 >= WIDTH)) { dx1 = -dx1; cx1 += dx1 << 1; } cx2 += dx2; if ((cx2 < 0) || (cx2 >= WIDTH)) { dx2 = -dx2; cx2 += dx2 << 1; } cy1 += dy1; if ((cy1 < 0) || (cy1 >= HEIGHT)) { dy1 = -dy1; cy1 += dy1 << 1; } cy2 += dy2; if ((cy2 < 0) || (cy2 >= HEIGHT)) { dy2 = -dy2; cy2 += dy2 << 1; } lines[current].x1 = cx1; lines[current].x2 = cx2; lines[current].y1 = cy1; lines[current].y2 = cy2; lines[current].col = cols; vga_accel(ACCEL_SETFGCOLOR, cols++); if (cols >= COLORS) cols = 1; vga_accel(ACCEL_DRAWLINE, lines[current].x1, lines[current].y1, lines[current].x2, lines[current].y2); numlines++; pixels += lines[current].pix = max(abs(lines[current].x1 - lines[current].x2), abs(lines[current].y1 - lines[current].y2)); current++; if (current >= QIXLINES) current = 0; } if (rop != ROP_COPY) vga_accel(ACCEL_SETRASTEROP, ROP_COPY); cy1 = ((long long) numlines * CLOCKS_PER_SEC) / diffclock; cx1 = ((long long) pixels * CLOCKS_PER_SEC) / diffclock; cx2 = cx1 * BYTESPERPIXEL; printf("%s: %ld.%ld Klines/s (%ld.%ld Mpixels/s or %ld.%ld Mbytes/s)\n", txt, cy1 / 1000L, (cy1 % 1000L) / 100L, cx1 / 1000000L, (cx1 % 1000000L) / 100000L, cx2 / 1000000L, (cx2 % 1000000L) / 100000L);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -