19a57b7d2SSøren Schmidt /*- 29a57b7d2SSøren Schmidt * Copyright (c) 1991-1997 S�ren Schmidt 39a57b7d2SSøren Schmidt * All rights reserved. 49a57b7d2SSøren Schmidt * 59a57b7d2SSøren Schmidt * Redistribution and use in source and binary forms, with or without 69a57b7d2SSøren Schmidt * modification, are permitted provided that the following conditions 79a57b7d2SSøren Schmidt * are met: 89a57b7d2SSøren Schmidt * 1. Redistributions of source code must retain the above copyright 99a57b7d2SSøren Schmidt * notice, this list of conditions and the following disclaimer 109a57b7d2SSøren Schmidt * in this position and unchanged. 119a57b7d2SSøren Schmidt * 2. Redistributions in binary form must reproduce the above copyright 129a57b7d2SSøren Schmidt * notice, this list of conditions and the following disclaimer in the 139a57b7d2SSøren Schmidt * documentation and/or other materials provided with the distribution. 149a57b7d2SSøren Schmidt * 3. The name of the author may not be used to endorse or promote products 159a57b7d2SSøren Schmidt * derived from this software withough specific prior written permission 169a57b7d2SSøren Schmidt * 179a57b7d2SSøren Schmidt * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 189a57b7d2SSøren Schmidt * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 199a57b7d2SSøren Schmidt * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 209a57b7d2SSøren Schmidt * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 219a57b7d2SSøren Schmidt * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 229a57b7d2SSøren Schmidt * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 239a57b7d2SSøren Schmidt * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 249a57b7d2SSøren Schmidt * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 259a57b7d2SSøren Schmidt * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 269a57b7d2SSøren Schmidt * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 279a57b7d2SSøren Schmidt * 287f3dea24SPeter Wemm * $FreeBSD$ 299a57b7d2SSøren Schmidt */ 309a57b7d2SSøren Schmidt 319a57b7d2SSøren Schmidt #include <signal.h> 3200d25f51SPoul-Henning Kamp #include <sys/fbio.h> 339a57b7d2SSøren Schmidt #include "vgl.h" 349a57b7d2SSøren Schmidt 359a57b7d2SSøren Schmidt static byte VGLSavePaletteRed[256]; 369a57b7d2SSøren Schmidt static byte VGLSavePaletteGreen[256]; 379a57b7d2SSøren Schmidt static byte VGLSavePaletteBlue[256]; 389a57b7d2SSøren Schmidt 399a57b7d2SSøren Schmidt #define ABS(a) (((a)<0) ? -(a) : (a)) 409a57b7d2SSøren Schmidt #define SGN(a) (((a)<0) ? -1 : 1) 415acf51eaSKazutaka YOKOTA #define min(x, y) (((x) < (y)) ? (x) : (y)) 425acf51eaSKazutaka YOKOTA #define max(x, y) (((x) > (y)) ? (x) : (y)) 439a57b7d2SSøren Schmidt 44933d455fSNicolas Souchu static void 45933d455fSNicolas Souchu color2mem(u_long color, byte *b, int len) 46933d455fSNicolas Souchu { 47933d455fSNicolas Souchu switch (len) { 48933d455fSNicolas Souchu case 4: 49933d455fSNicolas Souchu b[3] = (color >> 24) & 0xff; 50933d455fSNicolas Souchu /* fallthrough */ 51933d455fSNicolas Souchu case 3: 52933d455fSNicolas Souchu b[2] = (color >> 16) & 0xff; 53933d455fSNicolas Souchu /* fallthrough */ 54933d455fSNicolas Souchu case 2: 55933d455fSNicolas Souchu b[1] = (color >> 8) & 0xff; 56933d455fSNicolas Souchu /* fallthrough */ 57933d455fSNicolas Souchu case 1: 58933d455fSNicolas Souchu default: 59933d455fSNicolas Souchu b[0] = color & 0xff; 60933d455fSNicolas Souchu break; 61933d455fSNicolas Souchu } 62933d455fSNicolas Souchu 63933d455fSNicolas Souchu return; 64933d455fSNicolas Souchu } 65933d455fSNicolas Souchu 66933d455fSNicolas Souchu static u_long 67933d455fSNicolas Souchu mem2color(byte *b, int len) 68933d455fSNicolas Souchu { 69933d455fSNicolas Souchu u_long color = 0; 70933d455fSNicolas Souchu 71933d455fSNicolas Souchu switch (len) { 72933d455fSNicolas Souchu case 4: 73933d455fSNicolas Souchu color |= (b[3] & 0xff) << 24; 74933d455fSNicolas Souchu /* fallthrough */ 75933d455fSNicolas Souchu case 3: 76933d455fSNicolas Souchu color |= (b[2] & 0xff) << 16; 77933d455fSNicolas Souchu /* fallthrough */ 78933d455fSNicolas Souchu case 2: 79933d455fSNicolas Souchu color |= (b[1] & 0xff) << 8; 80933d455fSNicolas Souchu /* fallthrough */ 81933d455fSNicolas Souchu case 1: 82933d455fSNicolas Souchu default: 83933d455fSNicolas Souchu color |= (b[0] & 0xff); 84933d455fSNicolas Souchu break; 85933d455fSNicolas Souchu } 86933d455fSNicolas Souchu 87933d455fSNicolas Souchu return color; 88933d455fSNicolas Souchu } 89933d455fSNicolas Souchu 909a57b7d2SSøren Schmidt void 91933d455fSNicolas Souchu VGLSetXY(VGLBitmap *object, int x, int y, u_long color) 929a57b7d2SSøren Schmidt { 935acf51eaSKazutaka YOKOTA int offset; 94933d455fSNicolas Souchu byte b[4]; 955acf51eaSKazutaka YOKOTA 969a57b7d2SSøren Schmidt VGLCheckSwitch(); 975acf51eaSKazutaka YOKOTA if (x>=0 && x<object->VXsize && y>=0 && y<object->VYsize) { 989a57b7d2SSøren Schmidt if (!VGLMouseFreeze(x, y, 1, 1, color)) { 999a57b7d2SSøren Schmidt switch (object->Type) { 1009a57b7d2SSøren Schmidt case MEMBUF: 1019a57b7d2SSøren Schmidt case VIDBUF8: 102933d455fSNicolas Souchu object->Bitmap[y*object->VXsize+x]=((byte)color); 1035acf51eaSKazutaka YOKOTA break; 1045acf51eaSKazutaka YOKOTA case VIDBUF8S: 105933d455fSNicolas Souchu object->Bitmap[VGLSetSegment(y*object->VXsize+x)]=((byte)color); 106933d455fSNicolas Souchu break; 107933d455fSNicolas Souchu case VIDBUF16: 108933d455fSNicolas Souchu case VIDBUF24: 109933d455fSNicolas Souchu case VIDBUF32: 110933d455fSNicolas Souchu color2mem(color, b, object->PixelBytes); 111933d455fSNicolas Souchu bcopy(b, &object->Bitmap[(y*object->VXsize+x) * object->PixelBytes], 112933d455fSNicolas Souchu object->PixelBytes); 113933d455fSNicolas Souchu break; 114933d455fSNicolas Souchu case VIDBUF16S: 115933d455fSNicolas Souchu case VIDBUF24S: 116933d455fSNicolas Souchu case VIDBUF32S: 117933d455fSNicolas Souchu color2mem(color, b, object->PixelBytes); 118933d455fSNicolas Souchu offset = VGLSetSegment((y*object->VXsize+x) * object->PixelBytes); 119933d455fSNicolas Souchu bcopy(b, &object->Bitmap[offset], object->PixelBytes); 1209a57b7d2SSøren Schmidt break; 1219a57b7d2SSøren Schmidt case VIDBUF8X: 1229a57b7d2SSøren Schmidt outb(0x3c4, 0x02); 1239a57b7d2SSøren Schmidt outb(0x3c5, 0x01 << (x&0x3)); 124933d455fSNicolas Souchu object->Bitmap[(unsigned)(VGLAdpInfo.va_line_width*y)+(x/4)] = ((byte)color); 1259a57b7d2SSøren Schmidt break; 1265acf51eaSKazutaka YOKOTA case VIDBUF4S: 1275acf51eaSKazutaka YOKOTA offset = VGLSetSegment(y*VGLAdpInfo.va_line_width + x/8); 1285acf51eaSKazutaka YOKOTA goto set_planar; 1299a57b7d2SSøren Schmidt case VIDBUF4: 1305acf51eaSKazutaka YOKOTA offset = y*VGLAdpInfo.va_line_width + x/8; 1315acf51eaSKazutaka YOKOTA set_planar: 1325acf51eaSKazutaka YOKOTA outb(0x3c4, 0x02); outb(0x3c5, 0x0f); 133933d455fSNicolas Souchu outb(0x3ce, 0x00); outb(0x3cf, (byte)color & 0x0f); /* set/reset */ 1345acf51eaSKazutaka YOKOTA outb(0x3ce, 0x01); outb(0x3cf, 0x0f); /* set/reset enable */ 1355acf51eaSKazutaka YOKOTA outb(0x3ce, 0x08); outb(0x3cf, 0x80 >> (x%8)); /* bit mask */ 136933d455fSNicolas Souchu object->Bitmap[offset] |= (byte)color; 1379a57b7d2SSøren Schmidt } 1389a57b7d2SSøren Schmidt } 1399a57b7d2SSøren Schmidt VGLMouseUnFreeze(); 1409a57b7d2SSøren Schmidt } 1419a57b7d2SSøren Schmidt } 1429a57b7d2SSøren Schmidt 143933d455fSNicolas Souchu u_long 1449a57b7d2SSøren Schmidt VGLGetXY(VGLBitmap *object, int x, int y) 1459a57b7d2SSøren Schmidt { 1465acf51eaSKazutaka YOKOTA int offset; 147933d455fSNicolas Souchu byte b[4]; 1485acf51eaSKazutaka YOKOTA #if 0 1495acf51eaSKazutaka YOKOTA int i; 150933d455fSNicolas Souchu u_long color; 1515acf51eaSKazutaka YOKOTA byte mask; 1525acf51eaSKazutaka YOKOTA #endif 1535acf51eaSKazutaka YOKOTA 1549a57b7d2SSøren Schmidt VGLCheckSwitch(); 1555acf51eaSKazutaka YOKOTA if (x<0 || x>=object->VXsize || y<0 || y>=object->VYsize) 1565acf51eaSKazutaka YOKOTA return 0; 1579a57b7d2SSøren Schmidt switch (object->Type) { 1589a57b7d2SSøren Schmidt case MEMBUF: 1599a57b7d2SSøren Schmidt case VIDBUF8: 1605acf51eaSKazutaka YOKOTA return object->Bitmap[((y*object->VXsize)+x)]; 1615acf51eaSKazutaka YOKOTA case VIDBUF8S: 1625acf51eaSKazutaka YOKOTA return object->Bitmap[VGLSetSegment(y*object->VXsize+x)]; 163933d455fSNicolas Souchu case VIDBUF16: 164933d455fSNicolas Souchu case VIDBUF24: 165933d455fSNicolas Souchu case VIDBUF32: 166933d455fSNicolas Souchu bcopy(&object->Bitmap[(y*object->VXsize+x) * object->PixelBytes], 167933d455fSNicolas Souchu b, object->PixelBytes); 168933d455fSNicolas Souchu return (mem2color(b, object->PixelBytes)); 169933d455fSNicolas Souchu case VIDBUF16S: 170933d455fSNicolas Souchu case VIDBUF24S: 171933d455fSNicolas Souchu case VIDBUF32S: 172933d455fSNicolas Souchu offset = VGLSetSegment((y*object->VXsize+x) * object->PixelBytes); 173933d455fSNicolas Souchu bcopy(&object->Bitmap[offset], b, object->PixelBytes); 174933d455fSNicolas Souchu 175933d455fSNicolas Souchu return (mem2color(b, object->PixelBytes)); 1769a57b7d2SSøren Schmidt case VIDBUF8X: 1779a57b7d2SSøren Schmidt outb(0x3ce, 0x04); outb(0x3cf, x & 0x3); 1785acf51eaSKazutaka YOKOTA return object->Bitmap[(unsigned)(VGLAdpInfo.va_line_width*y)+(x/4)]; 1795acf51eaSKazutaka YOKOTA case VIDBUF4S: 1805acf51eaSKazutaka YOKOTA offset = VGLSetSegment(y*VGLAdpInfo.va_line_width + x/8); 1815acf51eaSKazutaka YOKOTA goto get_planar; 1829a57b7d2SSøren Schmidt case VIDBUF4: 1835acf51eaSKazutaka YOKOTA offset = y*VGLAdpInfo.va_line_width + x/8; 1845acf51eaSKazutaka YOKOTA get_planar: 1855acf51eaSKazutaka YOKOTA #if 1 1865acf51eaSKazutaka YOKOTA return (object->Bitmap[offset]&(0x80>>(x%8))) ? 1 : 0; /* XXX */ 1875acf51eaSKazutaka YOKOTA #else 1885acf51eaSKazutaka YOKOTA color = 0; 1895acf51eaSKazutaka YOKOTA mask = 0x80 >> (x%8); 1905acf51eaSKazutaka YOKOTA for (i = 0; i < VGLModeInfo.vi_planes; i++) { 1915acf51eaSKazutaka YOKOTA outb(0x3ce, 0x04); outb(0x3cf, i); 1925acf51eaSKazutaka YOKOTA color |= (object->Bitmap[offset] & mask) ? (1 << i) : 0; 1935acf51eaSKazutaka YOKOTA } 1945acf51eaSKazutaka YOKOTA return color; 1955acf51eaSKazutaka YOKOTA #endif 1969a57b7d2SSøren Schmidt } 197933d455fSNicolas Souchu return 0; /* XXX black? */ 1989a57b7d2SSøren Schmidt } 1999a57b7d2SSøren Schmidt 2009a57b7d2SSøren Schmidt void 201933d455fSNicolas Souchu VGLLine(VGLBitmap *object, int x1, int y1, int x2, int y2, u_long color) 2029a57b7d2SSøren Schmidt { 2039a57b7d2SSøren Schmidt int d, x, y, ax, ay, sx, sy, dx, dy; 2049a57b7d2SSøren Schmidt 2059a57b7d2SSøren Schmidt dx = x2-x1; ax = ABS(dx)<<1; sx = SGN(dx); x = x1; 2069a57b7d2SSøren Schmidt dy = y2-y1; ay = ABS(dy)<<1; sy = SGN(dy); y = y1; 2079a57b7d2SSøren Schmidt 2089a57b7d2SSøren Schmidt if (ax>ay) { /* x dominant */ 2099a57b7d2SSøren Schmidt d = ay-(ax>>1); 2109a57b7d2SSøren Schmidt for (;;) { 2119a57b7d2SSøren Schmidt VGLSetXY(object, x, y, color); 2129a57b7d2SSøren Schmidt if (x==x2) 2139a57b7d2SSøren Schmidt break; 2149a57b7d2SSøren Schmidt if (d>=0) { 2159a57b7d2SSøren Schmidt y += sy; d -= ax; 2169a57b7d2SSøren Schmidt } 2179a57b7d2SSøren Schmidt x += sx; d += ay; 2189a57b7d2SSøren Schmidt } 2199a57b7d2SSøren Schmidt } 2209a57b7d2SSøren Schmidt else { /* y dominant */ 2219a57b7d2SSøren Schmidt d = ax-(ay>>1); 2229a57b7d2SSøren Schmidt for (;;) { 2239a57b7d2SSøren Schmidt VGLSetXY(object, x, y, color); 2249a57b7d2SSøren Schmidt if (y==y2) 2259a57b7d2SSøren Schmidt break; 2269a57b7d2SSøren Schmidt if (d>=0) { 2279a57b7d2SSøren Schmidt x += sx; d -= ay; 2289a57b7d2SSøren Schmidt } 2299a57b7d2SSøren Schmidt y += sy; d += ax; 2309a57b7d2SSøren Schmidt } 2319a57b7d2SSøren Schmidt } 2329a57b7d2SSøren Schmidt } 2339a57b7d2SSøren Schmidt 2349a57b7d2SSøren Schmidt void 235933d455fSNicolas Souchu VGLBox(VGLBitmap *object, int x1, int y1, int x2, int y2, u_long color) 2369a57b7d2SSøren Schmidt { 2379a57b7d2SSøren Schmidt VGLLine(object, x1, y1, x2, y1, color); 2389a57b7d2SSøren Schmidt VGLLine(object, x2, y1, x2, y2, color); 2399a57b7d2SSøren Schmidt VGLLine(object, x2, y2, x1, y2, color); 2409a57b7d2SSøren Schmidt VGLLine(object, x1, y2, x1, y1, color); 2419a57b7d2SSøren Schmidt } 2429a57b7d2SSøren Schmidt 2439a57b7d2SSøren Schmidt void 244933d455fSNicolas Souchu VGLFilledBox(VGLBitmap *object, int x1, int y1, int x2, int y2, u_long color) 2459a57b7d2SSøren Schmidt { 2469a57b7d2SSøren Schmidt int y; 2479a57b7d2SSøren Schmidt 2489a57b7d2SSøren Schmidt for (y=y1; y<=y2; y++) VGLLine(object, x1, y, x2, y, color); 2499a57b7d2SSøren Schmidt } 2509a57b7d2SSøren Schmidt 2519a57b7d2SSøren Schmidt void 252933d455fSNicolas Souchu inline set4pixels(VGLBitmap *object, int x, int y, int xc, int yc, u_long color) 2539a57b7d2SSøren Schmidt { 2549a57b7d2SSøren Schmidt if (x!=0) { 2559a57b7d2SSøren Schmidt VGLSetXY(object, xc+x, yc+y, color); 2569a57b7d2SSøren Schmidt VGLSetXY(object, xc-x, yc+y, color); 2579a57b7d2SSøren Schmidt if (y!=0) { 2589a57b7d2SSøren Schmidt VGLSetXY(object, xc+x, yc-y, color); 2599a57b7d2SSøren Schmidt VGLSetXY(object, xc-x, yc-y, color); 2609a57b7d2SSøren Schmidt } 2619a57b7d2SSøren Schmidt } 2629a57b7d2SSøren Schmidt else { 2639a57b7d2SSøren Schmidt VGLSetXY(object, xc, yc+y, color); 2649a57b7d2SSøren Schmidt if (y!=0) 2659a57b7d2SSøren Schmidt VGLSetXY(object, xc, yc-y, color); 2669a57b7d2SSøren Schmidt } 2679a57b7d2SSøren Schmidt } 2689a57b7d2SSøren Schmidt 2699a57b7d2SSøren Schmidt void 270933d455fSNicolas Souchu VGLEllipse(VGLBitmap *object, int xc, int yc, int a, int b, u_long color) 2719a57b7d2SSøren Schmidt { 2729a57b7d2SSøren Schmidt int x = 0, y = b, asq = a*a, asq2 = a*a*2, bsq = b*b; 2739a57b7d2SSøren Schmidt int bsq2 = b*b*2, d = bsq-asq*b+asq/4, dx = 0, dy = asq2*b; 2749a57b7d2SSøren Schmidt 2759a57b7d2SSøren Schmidt while (dx<dy) { 2769a57b7d2SSøren Schmidt set4pixels(object, x, y, xc, yc, color); 2779a57b7d2SSøren Schmidt if (d>0) { 2789a57b7d2SSøren Schmidt y--; dy-=asq2; d-=dy; 2799a57b7d2SSøren Schmidt } 2809a57b7d2SSøren Schmidt x++; dx+=bsq2; d+=bsq+dx; 2819a57b7d2SSøren Schmidt } 2829a57b7d2SSøren Schmidt d+=(3*(asq-bsq)/2-(dx+dy))/2; 2839a57b7d2SSøren Schmidt while (y>=0) { 2849a57b7d2SSøren Schmidt set4pixels(object, x, y, xc, yc, color); 2859a57b7d2SSøren Schmidt if (d<0) { 2869a57b7d2SSøren Schmidt x++; dx+=bsq2; d+=dx; 2879a57b7d2SSøren Schmidt } 2889a57b7d2SSøren Schmidt y--; dy-=asq2; d+=asq-dy; 2899a57b7d2SSøren Schmidt } 2909a57b7d2SSøren Schmidt } 2919a57b7d2SSøren Schmidt 2929a57b7d2SSøren Schmidt void 293933d455fSNicolas Souchu inline set2lines(VGLBitmap *object, int x, int y, int xc, int yc, u_long color) 2949a57b7d2SSøren Schmidt { 2959a57b7d2SSøren Schmidt if (x!=0) { 2969a57b7d2SSøren Schmidt VGLLine(object, xc+x, yc+y, xc-x, yc+y, color); 2979a57b7d2SSøren Schmidt if (y!=0) 2989a57b7d2SSøren Schmidt VGLLine(object, xc+x, yc-y, xc-x, yc-y, color); 2999a57b7d2SSøren Schmidt } 3009a57b7d2SSøren Schmidt else { 3019a57b7d2SSøren Schmidt VGLLine(object, xc, yc+y, xc, yc-y, color); 3029a57b7d2SSøren Schmidt } 3039a57b7d2SSøren Schmidt } 3049a57b7d2SSøren Schmidt 3059a57b7d2SSøren Schmidt void 306933d455fSNicolas Souchu VGLFilledEllipse(VGLBitmap *object, int xc, int yc, int a, int b, u_long color) 3079a57b7d2SSøren Schmidt { 3089a57b7d2SSøren Schmidt int x = 0, y = b, asq = a*a, asq2 = a*a*2, bsq = b*b; 3099a57b7d2SSøren Schmidt int bsq2 = b*b*2, d = bsq-asq*b+asq/4, dx = 0, dy = asq2*b; 3109a57b7d2SSøren Schmidt 3119a57b7d2SSøren Schmidt while (dx<dy) { 3129a57b7d2SSøren Schmidt set2lines(object, x, y, xc, yc, color); 3139a57b7d2SSøren Schmidt if (d>0) { 3149a57b7d2SSøren Schmidt y--; dy-=asq2; d-=dy; 3159a57b7d2SSøren Schmidt } 3169a57b7d2SSøren Schmidt x++; dx+=bsq2; d+=bsq+dx; 3179a57b7d2SSøren Schmidt } 3189a57b7d2SSøren Schmidt d+=(3*(asq-bsq)/2-(dx+dy))/2; 3199a57b7d2SSøren Schmidt while (y>=0) { 3209a57b7d2SSøren Schmidt set2lines(object, x, y, xc, yc, color); 3219a57b7d2SSøren Schmidt if (d<0) { 3229a57b7d2SSøren Schmidt x++; dx+=bsq2; d+=dx; 3239a57b7d2SSøren Schmidt } 3249a57b7d2SSøren Schmidt y--; dy-=asq2; d+=asq-dy; 3259a57b7d2SSøren Schmidt } 3269a57b7d2SSøren Schmidt } 3279a57b7d2SSøren Schmidt 3289a57b7d2SSøren Schmidt void 329933d455fSNicolas Souchu VGLClear(VGLBitmap *object, u_long color) 3309a57b7d2SSøren Schmidt { 3315acf51eaSKazutaka YOKOTA int offset; 3325acf51eaSKazutaka YOKOTA int len; 333933d455fSNicolas Souchu int i, total = 0; 334933d455fSNicolas Souchu byte b[4]; 3355acf51eaSKazutaka YOKOTA 3369a57b7d2SSøren Schmidt VGLCheckSwitch(); 337933d455fSNicolas Souchu VGLMouseFreeze(0, 0, object->Xsize, object->Ysize, color); /* XXX */ 3389a57b7d2SSøren Schmidt switch (object->Type) { 3399a57b7d2SSøren Schmidt case MEMBUF: 3409a57b7d2SSøren Schmidt case VIDBUF8: 341933d455fSNicolas Souchu memset(object->Bitmap, (byte)color, object->VXsize*object->VYsize); 3429a57b7d2SSøren Schmidt break; 3435acf51eaSKazutaka YOKOTA 3445acf51eaSKazutaka YOKOTA case VIDBUF8S: 3455acf51eaSKazutaka YOKOTA for (offset = 0; offset < object->VXsize*object->VYsize; ) { 3465acf51eaSKazutaka YOKOTA VGLSetSegment(offset); 3475acf51eaSKazutaka YOKOTA len = min(object->VXsize*object->VYsize - offset, 3485acf51eaSKazutaka YOKOTA VGLAdpInfo.va_window_size); 349933d455fSNicolas Souchu memset(object->Bitmap, (byte)color, len); 350933d455fSNicolas Souchu offset += len; 351933d455fSNicolas Souchu } 352933d455fSNicolas Souchu break; 353933d455fSNicolas Souchu case VIDBUF16: 354933d455fSNicolas Souchu case VIDBUF24: 355933d455fSNicolas Souchu case VIDBUF32: 356933d455fSNicolas Souchu color2mem(color, b, object->PixelBytes); 357933d455fSNicolas Souchu total = object->VXsize*object->VYsize*object->PixelBytes; 358933d455fSNicolas Souchu for (i = 0; i < total; i += object->PixelBytes) 359933d455fSNicolas Souchu bcopy(b, object->Bitmap + i, object->PixelBytes); 360933d455fSNicolas Souchu break; 361933d455fSNicolas Souchu 362933d455fSNicolas Souchu case VIDBUF16S: 363933d455fSNicolas Souchu case VIDBUF24S: 364933d455fSNicolas Souchu case VIDBUF32S: 365933d455fSNicolas Souchu color2mem(color, b, object->PixelBytes); 366933d455fSNicolas Souchu total = object->VXsize*object->VYsize*object->PixelBytes; 367933d455fSNicolas Souchu for (offset = 0; offset < total; ) { 368933d455fSNicolas Souchu VGLSetSegment(offset); 369933d455fSNicolas Souchu len = min(total - offset, VGLAdpInfo.va_window_size); 370933d455fSNicolas Souchu for (i = 0; i < len; i += object->PixelBytes) 371933d455fSNicolas Souchu bcopy(b, object->Bitmap + offset + i, object->PixelBytes); 3725acf51eaSKazutaka YOKOTA offset += len; 3735acf51eaSKazutaka YOKOTA } 3745acf51eaSKazutaka YOKOTA break; 3755acf51eaSKazutaka YOKOTA 3769a57b7d2SSøren Schmidt case VIDBUF8X: 3779a57b7d2SSøren Schmidt /* XXX works only for Xsize % 4 = 0 */ 3785acf51eaSKazutaka YOKOTA outb(0x3c6, 0xff); 3799a57b7d2SSøren Schmidt outb(0x3c4, 0x02); outb(0x3c5, 0x0f); 380933d455fSNicolas Souchu memset(object->Bitmap, (byte)color, VGLAdpInfo.va_line_width*object->VYsize); 3819a57b7d2SSøren Schmidt break; 3829a57b7d2SSøren Schmidt 3839a57b7d2SSøren Schmidt case VIDBUF4: 3845acf51eaSKazutaka YOKOTA case VIDBUF4S: 3859a57b7d2SSøren Schmidt /* XXX works only for Xsize % 8 = 0 */ 3865acf51eaSKazutaka YOKOTA outb(0x3c4, 0x02); outb(0x3c5, 0x0f); 3875acf51eaSKazutaka YOKOTA outb(0x3ce, 0x05); outb(0x3cf, 0x02); /* mode 2 */ 3885acf51eaSKazutaka YOKOTA outb(0x3ce, 0x01); outb(0x3cf, 0x00); /* set/reset enable */ 3895acf51eaSKazutaka YOKOTA outb(0x3ce, 0x08); outb(0x3cf, 0xff); /* bit mask */ 3905acf51eaSKazutaka YOKOTA for (offset = 0; offset < VGLAdpInfo.va_line_width*object->VYsize; ) { 3915acf51eaSKazutaka YOKOTA VGLSetSegment(offset); 3925acf51eaSKazutaka YOKOTA len = min(object->VXsize*object->VYsize - offset, 3935acf51eaSKazutaka YOKOTA VGLAdpInfo.va_window_size); 394933d455fSNicolas Souchu memset(object->Bitmap, (byte)color, len); 3955acf51eaSKazutaka YOKOTA offset += len; 3965acf51eaSKazutaka YOKOTA } 3975acf51eaSKazutaka YOKOTA outb(0x3ce, 0x05); outb(0x3cf, 0x00); 3989a57b7d2SSøren Schmidt break; 3999a57b7d2SSøren Schmidt } 4009a57b7d2SSøren Schmidt VGLMouseUnFreeze(); 4019a57b7d2SSøren Schmidt } 4029a57b7d2SSøren Schmidt 4039a57b7d2SSøren Schmidt void 4049a57b7d2SSøren Schmidt VGLRestorePalette() 4059a57b7d2SSøren Schmidt { 4069a57b7d2SSøren Schmidt int i; 4079a57b7d2SSøren Schmidt 4089a57b7d2SSøren Schmidt outb(0x3C6, 0xFF); 4099a57b7d2SSøren Schmidt inb(0x3DA); 4109a57b7d2SSøren Schmidt outb(0x3C8, 0x00); 4119a57b7d2SSøren Schmidt for (i=0; i<256; i++) { 4129a57b7d2SSøren Schmidt outb(0x3C9, VGLSavePaletteRed[i]); 4139a57b7d2SSøren Schmidt inb(0x84); 4149a57b7d2SSøren Schmidt outb(0x3C9, VGLSavePaletteGreen[i]); 4159a57b7d2SSøren Schmidt inb(0x84); 4169a57b7d2SSøren Schmidt outb(0x3C9, VGLSavePaletteBlue[i]); 4179a57b7d2SSøren Schmidt inb(0x84); 4189a57b7d2SSøren Schmidt } 4199a57b7d2SSøren Schmidt inb(0x3DA); 4209a57b7d2SSøren Schmidt outb(0x3C0, 0x20); 4219a57b7d2SSøren Schmidt } 4229a57b7d2SSøren Schmidt 4239a57b7d2SSøren Schmidt void 4249a57b7d2SSøren Schmidt VGLSavePalette() 4259a57b7d2SSøren Schmidt { 4269a57b7d2SSøren Schmidt int i; 4279a57b7d2SSøren Schmidt 4289a57b7d2SSøren Schmidt outb(0x3C6, 0xFF); 4299a57b7d2SSøren Schmidt inb(0x3DA); 4309a57b7d2SSøren Schmidt outb(0x3C7, 0x00); 4319a57b7d2SSøren Schmidt for (i=0; i<256; i++) { 4329a57b7d2SSøren Schmidt VGLSavePaletteRed[i] = inb(0x3C9); 4339a57b7d2SSøren Schmidt inb(0x84); 4349a57b7d2SSøren Schmidt VGLSavePaletteGreen[i] = inb(0x3C9); 4359a57b7d2SSøren Schmidt inb(0x84); 4369a57b7d2SSøren Schmidt VGLSavePaletteBlue[i] = inb(0x3C9); 4379a57b7d2SSøren Schmidt inb(0x84); 4389a57b7d2SSøren Schmidt } 4399a57b7d2SSøren Schmidt inb(0x3DA); 4409a57b7d2SSøren Schmidt outb(0x3C0, 0x20); 4419a57b7d2SSøren Schmidt } 4429a57b7d2SSøren Schmidt 4439a57b7d2SSøren Schmidt void 4449a57b7d2SSøren Schmidt VGLSetPalette(byte *red, byte *green, byte *blue) 4459a57b7d2SSøren Schmidt { 4469a57b7d2SSøren Schmidt int i; 4479a57b7d2SSøren Schmidt 4489a57b7d2SSøren Schmidt for (i=0; i<256; i++) { 4499a57b7d2SSøren Schmidt VGLSavePaletteRed[i] = red[i]; 4509a57b7d2SSøren Schmidt VGLSavePaletteGreen[i] = green[i]; 4519a57b7d2SSøren Schmidt VGLSavePaletteBlue[i] = blue[i]; 4529a57b7d2SSøren Schmidt } 4539a57b7d2SSøren Schmidt VGLCheckSwitch(); 4549a57b7d2SSøren Schmidt outb(0x3C6, 0xFF); 4559a57b7d2SSøren Schmidt inb(0x3DA); 4569a57b7d2SSøren Schmidt outb(0x3C8, 0x00); 4579a57b7d2SSøren Schmidt for (i=0; i<256; i++) { 4589a57b7d2SSøren Schmidt outb(0x3C9, VGLSavePaletteRed[i]); 4599a57b7d2SSøren Schmidt inb(0x84); 4609a57b7d2SSøren Schmidt outb(0x3C9, VGLSavePaletteGreen[i]); 4619a57b7d2SSøren Schmidt inb(0x84); 4629a57b7d2SSøren Schmidt outb(0x3C9, VGLSavePaletteBlue[i]); 4639a57b7d2SSøren Schmidt inb(0x84); 4649a57b7d2SSøren Schmidt } 4659a57b7d2SSøren Schmidt inb(0x3DA); 4669a57b7d2SSøren Schmidt outb(0x3C0, 0x20); 4679a57b7d2SSøren Schmidt } 4689a57b7d2SSøren Schmidt 4699a57b7d2SSøren Schmidt void 4709a57b7d2SSøren Schmidt VGLSetPaletteIndex(byte color, byte red, byte green, byte blue) 4719a57b7d2SSøren Schmidt { 4729a57b7d2SSøren Schmidt VGLSavePaletteRed[color] = red; 4739a57b7d2SSøren Schmidt VGLSavePaletteGreen[color] = green; 4749a57b7d2SSøren Schmidt VGLSavePaletteBlue[color] = blue; 4759a57b7d2SSøren Schmidt VGLCheckSwitch(); 4769a57b7d2SSøren Schmidt outb(0x3C6, 0xFF); 4779a57b7d2SSøren Schmidt inb(0x3DA); 4789a57b7d2SSøren Schmidt outb(0x3C8, color); 4799a57b7d2SSøren Schmidt outb(0x3C9, red); outb(0x3C9, green); outb(0x3C9, blue); 4809a57b7d2SSøren Schmidt inb(0x3DA); 4819a57b7d2SSøren Schmidt outb(0x3C0, 0x20); 4829a57b7d2SSøren Schmidt } 4839a57b7d2SSøren Schmidt 4849a57b7d2SSøren Schmidt void 4859a57b7d2SSøren Schmidt VGLSetBorder(byte color) 4869a57b7d2SSøren Schmidt { 4879a57b7d2SSøren Schmidt VGLCheckSwitch(); 4889a57b7d2SSøren Schmidt inb(0x3DA); 4899a57b7d2SSøren Schmidt outb(0x3C0,0x11); outb(0x3C0, color); 4909a57b7d2SSøren Schmidt inb(0x3DA); 4919a57b7d2SSøren Schmidt outb(0x3C0, 0x20); 4929a57b7d2SSøren Schmidt } 4939a57b7d2SSøren Schmidt 4949a57b7d2SSøren Schmidt void 4959a57b7d2SSøren Schmidt VGLBlankDisplay(int blank) 4969a57b7d2SSøren Schmidt { 4979a57b7d2SSøren Schmidt byte val; 4989a57b7d2SSøren Schmidt 4999a57b7d2SSøren Schmidt VGLCheckSwitch(); 5009a57b7d2SSøren Schmidt outb(0x3C4, 0x01); val = inb(0x3C5); outb(0x3C4, 0x01); 5019a57b7d2SSøren Schmidt outb(0x3C5, ((blank) ? (val |= 0x20) : (val &= 0xDF))); 5029a57b7d2SSøren Schmidt } 503