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 1521dc7d4fSJens Schweikhardt * derived from this software without 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 */ 289a57b7d2SSøren Schmidt 29e67f5b9fSMatthew Dillon #include <sys/cdefs.h> 30e67f5b9fSMatthew Dillon __FBSDID("$FreeBSD$"); 31e67f5b9fSMatthew Dillon 329a57b7d2SSøren Schmidt #include <signal.h> 3300d25f51SPoul-Henning Kamp #include <sys/fbio.h> 349a57b7d2SSøren Schmidt #include "vgl.h" 359a57b7d2SSøren Schmidt 369a57b7d2SSøren Schmidt static byte VGLSavePaletteRed[256]; 379a57b7d2SSøren Schmidt static byte VGLSavePaletteGreen[256]; 389a57b7d2SSøren Schmidt static byte VGLSavePaletteBlue[256]; 399a57b7d2SSøren Schmidt 409a57b7d2SSøren Schmidt #define ABS(a) (((a)<0) ? -(a) : (a)) 419a57b7d2SSøren Schmidt #define SGN(a) (((a)<0) ? -1 : 1) 425acf51eaSKazutaka YOKOTA #define min(x, y) (((x) < (y)) ? (x) : (y)) 435acf51eaSKazutaka YOKOTA #define max(x, y) (((x) > (y)) ? (x) : (y)) 449a57b7d2SSøren Schmidt 45933d455fSNicolas Souchu static void 46933d455fSNicolas Souchu color2mem(u_long color, byte *b, int len) 47933d455fSNicolas Souchu { 48933d455fSNicolas Souchu switch (len) { 49933d455fSNicolas Souchu case 4: 50933d455fSNicolas Souchu b[3] = (color >> 24) & 0xff; 51933d455fSNicolas Souchu /* fallthrough */ 52933d455fSNicolas Souchu case 3: 53933d455fSNicolas Souchu b[2] = (color >> 16) & 0xff; 54933d455fSNicolas Souchu /* fallthrough */ 55933d455fSNicolas Souchu case 2: 56933d455fSNicolas Souchu b[1] = (color >> 8) & 0xff; 57933d455fSNicolas Souchu /* fallthrough */ 58933d455fSNicolas Souchu case 1: 59933d455fSNicolas Souchu default: 60933d455fSNicolas Souchu b[0] = color & 0xff; 61933d455fSNicolas Souchu break; 62933d455fSNicolas Souchu } 63933d455fSNicolas Souchu 64933d455fSNicolas Souchu return; 65933d455fSNicolas Souchu } 66933d455fSNicolas Souchu 67933d455fSNicolas Souchu static u_long 68933d455fSNicolas Souchu mem2color(byte *b, int len) 69933d455fSNicolas Souchu { 70933d455fSNicolas Souchu u_long color = 0; 71933d455fSNicolas Souchu 72933d455fSNicolas Souchu switch (len) { 73933d455fSNicolas Souchu case 4: 74933d455fSNicolas Souchu color |= (b[3] & 0xff) << 24; 75933d455fSNicolas Souchu /* fallthrough */ 76933d455fSNicolas Souchu case 3: 77933d455fSNicolas Souchu color |= (b[2] & 0xff) << 16; 78933d455fSNicolas Souchu /* fallthrough */ 79933d455fSNicolas Souchu case 2: 80933d455fSNicolas Souchu color |= (b[1] & 0xff) << 8; 81933d455fSNicolas Souchu /* fallthrough */ 82933d455fSNicolas Souchu case 1: 83933d455fSNicolas Souchu default: 84933d455fSNicolas Souchu color |= (b[0] & 0xff); 85933d455fSNicolas Souchu break; 86933d455fSNicolas Souchu } 87933d455fSNicolas Souchu 88933d455fSNicolas Souchu return color; 89933d455fSNicolas Souchu } 90933d455fSNicolas Souchu 919a57b7d2SSøren Schmidt void 92933d455fSNicolas Souchu VGLSetXY(VGLBitmap *object, int x, int y, u_long color) 939a57b7d2SSøren Schmidt { 945acf51eaSKazutaka YOKOTA int offset; 95933d455fSNicolas Souchu byte b[4]; 965acf51eaSKazutaka YOKOTA 979a57b7d2SSøren Schmidt VGLCheckSwitch(); 985acf51eaSKazutaka YOKOTA if (x>=0 && x<object->VXsize && y>=0 && y<object->VYsize) { 999a57b7d2SSøren Schmidt if (!VGLMouseFreeze(x, y, 1, 1, color)) { 1009a57b7d2SSøren Schmidt switch (object->Type) { 1019a57b7d2SSøren Schmidt case MEMBUF: 1029a57b7d2SSøren Schmidt case VIDBUF8: 103933d455fSNicolas Souchu object->Bitmap[y*object->VXsize+x]=((byte)color); 1045acf51eaSKazutaka YOKOTA break; 1055acf51eaSKazutaka YOKOTA case VIDBUF8S: 106933d455fSNicolas Souchu object->Bitmap[VGLSetSegment(y*object->VXsize+x)]=((byte)color); 107933d455fSNicolas Souchu break; 108933d455fSNicolas Souchu case VIDBUF16: 109933d455fSNicolas Souchu case VIDBUF24: 110933d455fSNicolas Souchu case VIDBUF32: 111933d455fSNicolas Souchu color2mem(color, b, object->PixelBytes); 112933d455fSNicolas Souchu bcopy(b, &object->Bitmap[(y*object->VXsize+x) * object->PixelBytes], 113933d455fSNicolas Souchu object->PixelBytes); 114933d455fSNicolas Souchu break; 115933d455fSNicolas Souchu case VIDBUF16S: 116933d455fSNicolas Souchu case VIDBUF24S: 117933d455fSNicolas Souchu case VIDBUF32S: 118933d455fSNicolas Souchu color2mem(color, b, object->PixelBytes); 119933d455fSNicolas Souchu offset = VGLSetSegment((y*object->VXsize+x) * object->PixelBytes); 120933d455fSNicolas Souchu bcopy(b, &object->Bitmap[offset], object->PixelBytes); 1219a57b7d2SSøren Schmidt break; 1229a57b7d2SSøren Schmidt case VIDBUF8X: 1239a57b7d2SSøren Schmidt outb(0x3c4, 0x02); 1249a57b7d2SSøren Schmidt outb(0x3c5, 0x01 << (x&0x3)); 125933d455fSNicolas Souchu object->Bitmap[(unsigned)(VGLAdpInfo.va_line_width*y)+(x/4)] = ((byte)color); 1269a57b7d2SSøren Schmidt break; 1275acf51eaSKazutaka YOKOTA case VIDBUF4S: 1285acf51eaSKazutaka YOKOTA offset = VGLSetSegment(y*VGLAdpInfo.va_line_width + x/8); 1295acf51eaSKazutaka YOKOTA goto set_planar; 1309a57b7d2SSøren Schmidt case VIDBUF4: 1315acf51eaSKazutaka YOKOTA offset = y*VGLAdpInfo.va_line_width + x/8; 1325acf51eaSKazutaka YOKOTA set_planar: 1335acf51eaSKazutaka YOKOTA outb(0x3c4, 0x02); outb(0x3c5, 0x0f); 134933d455fSNicolas Souchu outb(0x3ce, 0x00); outb(0x3cf, (byte)color & 0x0f); /* set/reset */ 1355acf51eaSKazutaka YOKOTA outb(0x3ce, 0x01); outb(0x3cf, 0x0f); /* set/reset enable */ 1365acf51eaSKazutaka YOKOTA outb(0x3ce, 0x08); outb(0x3cf, 0x80 >> (x%8)); /* bit mask */ 137933d455fSNicolas Souchu object->Bitmap[offset] |= (byte)color; 1389a57b7d2SSøren Schmidt } 1399a57b7d2SSøren Schmidt } 1409a57b7d2SSøren Schmidt VGLMouseUnFreeze(); 1419a57b7d2SSøren Schmidt } 1429a57b7d2SSøren Schmidt } 1439a57b7d2SSøren Schmidt 144933d455fSNicolas Souchu u_long 1459a57b7d2SSøren Schmidt VGLGetXY(VGLBitmap *object, int x, int y) 1469a57b7d2SSøren Schmidt { 1475acf51eaSKazutaka YOKOTA int offset; 148933d455fSNicolas Souchu byte b[4]; 1495acf51eaSKazutaka YOKOTA #if 0 1505acf51eaSKazutaka YOKOTA int i; 151933d455fSNicolas Souchu u_long color; 1525acf51eaSKazutaka YOKOTA byte mask; 1535acf51eaSKazutaka YOKOTA #endif 1545acf51eaSKazutaka YOKOTA 1559a57b7d2SSøren Schmidt VGLCheckSwitch(); 1565acf51eaSKazutaka YOKOTA if (x<0 || x>=object->VXsize || y<0 || y>=object->VYsize) 1575acf51eaSKazutaka YOKOTA return 0; 1589a57b7d2SSøren Schmidt switch (object->Type) { 1599a57b7d2SSøren Schmidt case MEMBUF: 1609a57b7d2SSøren Schmidt case VIDBUF8: 1615acf51eaSKazutaka YOKOTA return object->Bitmap[((y*object->VXsize)+x)]; 1625acf51eaSKazutaka YOKOTA case VIDBUF8S: 1635acf51eaSKazutaka YOKOTA return object->Bitmap[VGLSetSegment(y*object->VXsize+x)]; 164933d455fSNicolas Souchu case VIDBUF16: 165933d455fSNicolas Souchu case VIDBUF24: 166933d455fSNicolas Souchu case VIDBUF32: 167933d455fSNicolas Souchu bcopy(&object->Bitmap[(y*object->VXsize+x) * object->PixelBytes], 168933d455fSNicolas Souchu b, object->PixelBytes); 169933d455fSNicolas Souchu return (mem2color(b, object->PixelBytes)); 170933d455fSNicolas Souchu case VIDBUF16S: 171933d455fSNicolas Souchu case VIDBUF24S: 172933d455fSNicolas Souchu case VIDBUF32S: 173933d455fSNicolas Souchu offset = VGLSetSegment((y*object->VXsize+x) * object->PixelBytes); 174933d455fSNicolas Souchu bcopy(&object->Bitmap[offset], b, object->PixelBytes); 175933d455fSNicolas Souchu 176933d455fSNicolas Souchu return (mem2color(b, object->PixelBytes)); 1779a57b7d2SSøren Schmidt case VIDBUF8X: 1789a57b7d2SSøren Schmidt outb(0x3ce, 0x04); outb(0x3cf, x & 0x3); 1795acf51eaSKazutaka YOKOTA return object->Bitmap[(unsigned)(VGLAdpInfo.va_line_width*y)+(x/4)]; 1805acf51eaSKazutaka YOKOTA case VIDBUF4S: 1815acf51eaSKazutaka YOKOTA offset = VGLSetSegment(y*VGLAdpInfo.va_line_width + x/8); 1825acf51eaSKazutaka YOKOTA goto get_planar; 1839a57b7d2SSøren Schmidt case VIDBUF4: 1845acf51eaSKazutaka YOKOTA offset = y*VGLAdpInfo.va_line_width + x/8; 1855acf51eaSKazutaka YOKOTA get_planar: 1865acf51eaSKazutaka YOKOTA #if 1 1875acf51eaSKazutaka YOKOTA return (object->Bitmap[offset]&(0x80>>(x%8))) ? 1 : 0; /* XXX */ 1885acf51eaSKazutaka YOKOTA #else 1895acf51eaSKazutaka YOKOTA color = 0; 1905acf51eaSKazutaka YOKOTA mask = 0x80 >> (x%8); 1915acf51eaSKazutaka YOKOTA for (i = 0; i < VGLModeInfo.vi_planes; i++) { 1925acf51eaSKazutaka YOKOTA outb(0x3ce, 0x04); outb(0x3cf, i); 1935acf51eaSKazutaka YOKOTA color |= (object->Bitmap[offset] & mask) ? (1 << i) : 0; 1945acf51eaSKazutaka YOKOTA } 1955acf51eaSKazutaka YOKOTA return color; 1965acf51eaSKazutaka YOKOTA #endif 1979a57b7d2SSøren Schmidt } 198933d455fSNicolas Souchu return 0; /* XXX black? */ 1999a57b7d2SSøren Schmidt } 2009a57b7d2SSøren Schmidt 2019a57b7d2SSøren Schmidt void 202933d455fSNicolas Souchu VGLLine(VGLBitmap *object, int x1, int y1, int x2, int y2, u_long color) 2039a57b7d2SSøren Schmidt { 2049a57b7d2SSøren Schmidt int d, x, y, ax, ay, sx, sy, dx, dy; 2059a57b7d2SSøren Schmidt 2069a57b7d2SSøren Schmidt dx = x2-x1; ax = ABS(dx)<<1; sx = SGN(dx); x = x1; 2079a57b7d2SSøren Schmidt dy = y2-y1; ay = ABS(dy)<<1; sy = SGN(dy); y = y1; 2089a57b7d2SSøren Schmidt 2099a57b7d2SSøren Schmidt if (ax>ay) { /* x dominant */ 2109a57b7d2SSøren Schmidt d = ay-(ax>>1); 2119a57b7d2SSøren Schmidt for (;;) { 2129a57b7d2SSøren Schmidt VGLSetXY(object, x, y, color); 2139a57b7d2SSøren Schmidt if (x==x2) 2149a57b7d2SSøren Schmidt break; 2159a57b7d2SSøren Schmidt if (d>=0) { 2169a57b7d2SSøren Schmidt y += sy; d -= ax; 2179a57b7d2SSøren Schmidt } 2189a57b7d2SSøren Schmidt x += sx; d += ay; 2199a57b7d2SSøren Schmidt } 2209a57b7d2SSøren Schmidt } 2219a57b7d2SSøren Schmidt else { /* y dominant */ 2229a57b7d2SSøren Schmidt d = ax-(ay>>1); 2239a57b7d2SSøren Schmidt for (;;) { 2249a57b7d2SSøren Schmidt VGLSetXY(object, x, y, color); 2259a57b7d2SSøren Schmidt if (y==y2) 2269a57b7d2SSøren Schmidt break; 2279a57b7d2SSøren Schmidt if (d>=0) { 2289a57b7d2SSøren Schmidt x += sx; d -= ay; 2299a57b7d2SSøren Schmidt } 2309a57b7d2SSøren Schmidt y += sy; d += ax; 2319a57b7d2SSøren Schmidt } 2329a57b7d2SSøren Schmidt } 2339a57b7d2SSøren Schmidt } 2349a57b7d2SSøren Schmidt 2359a57b7d2SSøren Schmidt void 236933d455fSNicolas Souchu VGLBox(VGLBitmap *object, int x1, int y1, int x2, int y2, u_long color) 2379a57b7d2SSøren Schmidt { 2389a57b7d2SSøren Schmidt VGLLine(object, x1, y1, x2, y1, color); 2399a57b7d2SSøren Schmidt VGLLine(object, x2, y1, x2, y2, color); 2409a57b7d2SSøren Schmidt VGLLine(object, x2, y2, x1, y2, color); 2419a57b7d2SSøren Schmidt VGLLine(object, x1, y2, x1, y1, color); 2429a57b7d2SSøren Schmidt } 2439a57b7d2SSøren Schmidt 2449a57b7d2SSøren Schmidt void 245933d455fSNicolas Souchu VGLFilledBox(VGLBitmap *object, int x1, int y1, int x2, int y2, u_long color) 2469a57b7d2SSøren Schmidt { 2479a57b7d2SSøren Schmidt int y; 2489a57b7d2SSøren Schmidt 2499a57b7d2SSøren Schmidt for (y=y1; y<=y2; y++) VGLLine(object, x1, y, x2, y, color); 2509a57b7d2SSøren Schmidt } 2519a57b7d2SSøren Schmidt 252*e7032b4cSDimitry Andric static inline void 253*e7032b4cSDimitry Andric set4pixels(VGLBitmap *object, int x, int y, int xc, int yc, u_long color) 2549a57b7d2SSøren Schmidt { 2559a57b7d2SSøren Schmidt if (x!=0) { 2569a57b7d2SSøren Schmidt VGLSetXY(object, xc+x, yc+y, color); 2579a57b7d2SSøren Schmidt VGLSetXY(object, xc-x, yc+y, color); 2589a57b7d2SSøren Schmidt if (y!=0) { 2599a57b7d2SSøren Schmidt VGLSetXY(object, xc+x, yc-y, color); 2609a57b7d2SSøren Schmidt VGLSetXY(object, xc-x, yc-y, color); 2619a57b7d2SSøren Schmidt } 2629a57b7d2SSøren Schmidt } 2639a57b7d2SSøren Schmidt else { 2649a57b7d2SSøren Schmidt VGLSetXY(object, xc, yc+y, color); 2659a57b7d2SSøren Schmidt if (y!=0) 2669a57b7d2SSøren Schmidt VGLSetXY(object, xc, yc-y, color); 2679a57b7d2SSøren Schmidt } 2689a57b7d2SSøren Schmidt } 2699a57b7d2SSøren Schmidt 2709a57b7d2SSøren Schmidt void 271933d455fSNicolas Souchu VGLEllipse(VGLBitmap *object, int xc, int yc, int a, int b, u_long color) 2729a57b7d2SSøren Schmidt { 2739a57b7d2SSøren Schmidt int x = 0, y = b, asq = a*a, asq2 = a*a*2, bsq = b*b; 2749a57b7d2SSøren Schmidt int bsq2 = b*b*2, d = bsq-asq*b+asq/4, dx = 0, dy = asq2*b; 2759a57b7d2SSøren Schmidt 2769a57b7d2SSøren Schmidt while (dx<dy) { 2779a57b7d2SSøren Schmidt set4pixels(object, x, y, xc, yc, color); 2789a57b7d2SSøren Schmidt if (d>0) { 2799a57b7d2SSøren Schmidt y--; dy-=asq2; d-=dy; 2809a57b7d2SSøren Schmidt } 2819a57b7d2SSøren Schmidt x++; dx+=bsq2; d+=bsq+dx; 2829a57b7d2SSøren Schmidt } 2839a57b7d2SSøren Schmidt d+=(3*(asq-bsq)/2-(dx+dy))/2; 2849a57b7d2SSøren Schmidt while (y>=0) { 2859a57b7d2SSøren Schmidt set4pixels(object, x, y, xc, yc, color); 2869a57b7d2SSøren Schmidt if (d<0) { 2879a57b7d2SSøren Schmidt x++; dx+=bsq2; d+=dx; 2889a57b7d2SSøren Schmidt } 2899a57b7d2SSøren Schmidt y--; dy-=asq2; d+=asq-dy; 2909a57b7d2SSøren Schmidt } 2919a57b7d2SSøren Schmidt } 2929a57b7d2SSøren Schmidt 293*e7032b4cSDimitry Andric static inline void 294*e7032b4cSDimitry Andric set2lines(VGLBitmap *object, int x, int y, int xc, int yc, u_long color) 2959a57b7d2SSøren Schmidt { 2969a57b7d2SSøren Schmidt if (x!=0) { 2979a57b7d2SSøren Schmidt VGLLine(object, xc+x, yc+y, xc-x, yc+y, color); 2989a57b7d2SSøren Schmidt if (y!=0) 2999a57b7d2SSøren Schmidt VGLLine(object, xc+x, yc-y, xc-x, yc-y, color); 3009a57b7d2SSøren Schmidt } 3019a57b7d2SSøren Schmidt else { 3029a57b7d2SSøren Schmidt VGLLine(object, xc, yc+y, xc, yc-y, color); 3039a57b7d2SSøren Schmidt } 3049a57b7d2SSøren Schmidt } 3059a57b7d2SSøren Schmidt 3069a57b7d2SSøren Schmidt void 307933d455fSNicolas Souchu VGLFilledEllipse(VGLBitmap *object, int xc, int yc, int a, int b, u_long color) 3089a57b7d2SSøren Schmidt { 3099a57b7d2SSøren Schmidt int x = 0, y = b, asq = a*a, asq2 = a*a*2, bsq = b*b; 3109a57b7d2SSøren Schmidt int bsq2 = b*b*2, d = bsq-asq*b+asq/4, dx = 0, dy = asq2*b; 3119a57b7d2SSøren Schmidt 3129a57b7d2SSøren Schmidt while (dx<dy) { 3139a57b7d2SSøren Schmidt set2lines(object, x, y, xc, yc, color); 3149a57b7d2SSøren Schmidt if (d>0) { 3159a57b7d2SSøren Schmidt y--; dy-=asq2; d-=dy; 3169a57b7d2SSøren Schmidt } 3179a57b7d2SSøren Schmidt x++; dx+=bsq2; d+=bsq+dx; 3189a57b7d2SSøren Schmidt } 3199a57b7d2SSøren Schmidt d+=(3*(asq-bsq)/2-(dx+dy))/2; 3209a57b7d2SSøren Schmidt while (y>=0) { 3219a57b7d2SSøren Schmidt set2lines(object, x, y, xc, yc, color); 3229a57b7d2SSøren Schmidt if (d<0) { 3239a57b7d2SSøren Schmidt x++; dx+=bsq2; d+=dx; 3249a57b7d2SSøren Schmidt } 3259a57b7d2SSøren Schmidt y--; dy-=asq2; d+=asq-dy; 3269a57b7d2SSøren Schmidt } 3279a57b7d2SSøren Schmidt } 3289a57b7d2SSøren Schmidt 3299a57b7d2SSøren Schmidt void 330933d455fSNicolas Souchu VGLClear(VGLBitmap *object, u_long color) 3319a57b7d2SSøren Schmidt { 3325acf51eaSKazutaka YOKOTA int offset; 3335acf51eaSKazutaka YOKOTA int len; 334933d455fSNicolas Souchu int i, total = 0; 335933d455fSNicolas Souchu byte b[4]; 3365acf51eaSKazutaka YOKOTA 3379a57b7d2SSøren Schmidt VGLCheckSwitch(); 338933d455fSNicolas Souchu VGLMouseFreeze(0, 0, object->Xsize, object->Ysize, color); /* XXX */ 3399a57b7d2SSøren Schmidt switch (object->Type) { 3409a57b7d2SSøren Schmidt case MEMBUF: 3419a57b7d2SSøren Schmidt case VIDBUF8: 342933d455fSNicolas Souchu memset(object->Bitmap, (byte)color, object->VXsize*object->VYsize); 3439a57b7d2SSøren Schmidt break; 3445acf51eaSKazutaka YOKOTA 3455acf51eaSKazutaka YOKOTA case VIDBUF8S: 3465acf51eaSKazutaka YOKOTA for (offset = 0; offset < object->VXsize*object->VYsize; ) { 3475acf51eaSKazutaka YOKOTA VGLSetSegment(offset); 3485acf51eaSKazutaka YOKOTA len = min(object->VXsize*object->VYsize - offset, 3495acf51eaSKazutaka YOKOTA VGLAdpInfo.va_window_size); 350933d455fSNicolas Souchu memset(object->Bitmap, (byte)color, len); 351933d455fSNicolas Souchu offset += len; 352933d455fSNicolas Souchu } 353933d455fSNicolas Souchu break; 354933d455fSNicolas Souchu case VIDBUF16: 355933d455fSNicolas Souchu case VIDBUF24: 356933d455fSNicolas Souchu case VIDBUF32: 357933d455fSNicolas Souchu color2mem(color, b, object->PixelBytes); 358933d455fSNicolas Souchu total = object->VXsize*object->VYsize*object->PixelBytes; 359933d455fSNicolas Souchu for (i = 0; i < total; i += object->PixelBytes) 360933d455fSNicolas Souchu bcopy(b, object->Bitmap + i, object->PixelBytes); 361933d455fSNicolas Souchu break; 362933d455fSNicolas Souchu 363933d455fSNicolas Souchu case VIDBUF16S: 364933d455fSNicolas Souchu case VIDBUF24S: 365933d455fSNicolas Souchu case VIDBUF32S: 366933d455fSNicolas Souchu color2mem(color, b, object->PixelBytes); 367933d455fSNicolas Souchu total = object->VXsize*object->VYsize*object->PixelBytes; 368933d455fSNicolas Souchu for (offset = 0; offset < total; ) { 369933d455fSNicolas Souchu VGLSetSegment(offset); 370933d455fSNicolas Souchu len = min(total - offset, VGLAdpInfo.va_window_size); 371933d455fSNicolas Souchu for (i = 0; i < len; i += object->PixelBytes) 372933d455fSNicolas Souchu bcopy(b, object->Bitmap + offset + i, object->PixelBytes); 3735acf51eaSKazutaka YOKOTA offset += len; 3745acf51eaSKazutaka YOKOTA } 3755acf51eaSKazutaka YOKOTA break; 3765acf51eaSKazutaka YOKOTA 3779a57b7d2SSøren Schmidt case VIDBUF8X: 3789a57b7d2SSøren Schmidt /* XXX works only for Xsize % 4 = 0 */ 3795acf51eaSKazutaka YOKOTA outb(0x3c6, 0xff); 3809a57b7d2SSøren Schmidt outb(0x3c4, 0x02); outb(0x3c5, 0x0f); 381933d455fSNicolas Souchu memset(object->Bitmap, (byte)color, VGLAdpInfo.va_line_width*object->VYsize); 3829a57b7d2SSøren Schmidt break; 3839a57b7d2SSøren Schmidt 3849a57b7d2SSøren Schmidt case VIDBUF4: 3855acf51eaSKazutaka YOKOTA case VIDBUF4S: 3869a57b7d2SSøren Schmidt /* XXX works only for Xsize % 8 = 0 */ 3875acf51eaSKazutaka YOKOTA outb(0x3c4, 0x02); outb(0x3c5, 0x0f); 3885acf51eaSKazutaka YOKOTA outb(0x3ce, 0x05); outb(0x3cf, 0x02); /* mode 2 */ 3895acf51eaSKazutaka YOKOTA outb(0x3ce, 0x01); outb(0x3cf, 0x00); /* set/reset enable */ 3905acf51eaSKazutaka YOKOTA outb(0x3ce, 0x08); outb(0x3cf, 0xff); /* bit mask */ 3915acf51eaSKazutaka YOKOTA for (offset = 0; offset < VGLAdpInfo.va_line_width*object->VYsize; ) { 3925acf51eaSKazutaka YOKOTA VGLSetSegment(offset); 3935acf51eaSKazutaka YOKOTA len = min(object->VXsize*object->VYsize - offset, 3945acf51eaSKazutaka YOKOTA VGLAdpInfo.va_window_size); 395933d455fSNicolas Souchu memset(object->Bitmap, (byte)color, len); 3965acf51eaSKazutaka YOKOTA offset += len; 3975acf51eaSKazutaka YOKOTA } 3985acf51eaSKazutaka YOKOTA outb(0x3ce, 0x05); outb(0x3cf, 0x00); 3999a57b7d2SSøren Schmidt break; 4009a57b7d2SSøren Schmidt } 4019a57b7d2SSøren Schmidt VGLMouseUnFreeze(); 4029a57b7d2SSøren Schmidt } 4039a57b7d2SSøren Schmidt 4049a57b7d2SSøren Schmidt void 4059a57b7d2SSøren Schmidt VGLRestorePalette() 4069a57b7d2SSøren Schmidt { 4079a57b7d2SSøren Schmidt int i; 4089a57b7d2SSøren Schmidt 4099a57b7d2SSøren Schmidt outb(0x3C6, 0xFF); 4109a57b7d2SSøren Schmidt inb(0x3DA); 4119a57b7d2SSøren Schmidt outb(0x3C8, 0x00); 4129a57b7d2SSøren Schmidt for (i=0; i<256; i++) { 4139a57b7d2SSøren Schmidt outb(0x3C9, VGLSavePaletteRed[i]); 4149a57b7d2SSøren Schmidt inb(0x84); 4159a57b7d2SSøren Schmidt outb(0x3C9, VGLSavePaletteGreen[i]); 4169a57b7d2SSøren Schmidt inb(0x84); 4179a57b7d2SSøren Schmidt outb(0x3C9, VGLSavePaletteBlue[i]); 4189a57b7d2SSøren Schmidt inb(0x84); 4199a57b7d2SSøren Schmidt } 4209a57b7d2SSøren Schmidt inb(0x3DA); 4219a57b7d2SSøren Schmidt outb(0x3C0, 0x20); 4229a57b7d2SSøren Schmidt } 4239a57b7d2SSøren Schmidt 4249a57b7d2SSøren Schmidt void 4259a57b7d2SSøren Schmidt VGLSavePalette() 4269a57b7d2SSøren Schmidt { 4279a57b7d2SSøren Schmidt int i; 4289a57b7d2SSøren Schmidt 4299a57b7d2SSøren Schmidt outb(0x3C6, 0xFF); 4309a57b7d2SSøren Schmidt inb(0x3DA); 4319a57b7d2SSøren Schmidt outb(0x3C7, 0x00); 4329a57b7d2SSøren Schmidt for (i=0; i<256; i++) { 4339a57b7d2SSøren Schmidt VGLSavePaletteRed[i] = inb(0x3C9); 4349a57b7d2SSøren Schmidt inb(0x84); 4359a57b7d2SSøren Schmidt VGLSavePaletteGreen[i] = inb(0x3C9); 4369a57b7d2SSøren Schmidt inb(0x84); 4379a57b7d2SSøren Schmidt VGLSavePaletteBlue[i] = inb(0x3C9); 4389a57b7d2SSøren Schmidt inb(0x84); 4399a57b7d2SSøren Schmidt } 4409a57b7d2SSøren Schmidt inb(0x3DA); 4419a57b7d2SSøren Schmidt outb(0x3C0, 0x20); 4429a57b7d2SSøren Schmidt } 4439a57b7d2SSøren Schmidt 4449a57b7d2SSøren Schmidt void 4459a57b7d2SSøren Schmidt VGLSetPalette(byte *red, byte *green, byte *blue) 4469a57b7d2SSøren Schmidt { 4479a57b7d2SSøren Schmidt int i; 4489a57b7d2SSøren Schmidt 4499a57b7d2SSøren Schmidt for (i=0; i<256; i++) { 4509a57b7d2SSøren Schmidt VGLSavePaletteRed[i] = red[i]; 4519a57b7d2SSøren Schmidt VGLSavePaletteGreen[i] = green[i]; 4529a57b7d2SSøren Schmidt VGLSavePaletteBlue[i] = blue[i]; 4539a57b7d2SSøren Schmidt } 4549a57b7d2SSøren Schmidt VGLCheckSwitch(); 4559a57b7d2SSøren Schmidt outb(0x3C6, 0xFF); 4569a57b7d2SSøren Schmidt inb(0x3DA); 4579a57b7d2SSøren Schmidt outb(0x3C8, 0x00); 4589a57b7d2SSøren Schmidt for (i=0; i<256; i++) { 4599a57b7d2SSøren Schmidt outb(0x3C9, VGLSavePaletteRed[i]); 4609a57b7d2SSøren Schmidt inb(0x84); 4619a57b7d2SSøren Schmidt outb(0x3C9, VGLSavePaletteGreen[i]); 4629a57b7d2SSøren Schmidt inb(0x84); 4639a57b7d2SSøren Schmidt outb(0x3C9, VGLSavePaletteBlue[i]); 4649a57b7d2SSøren Schmidt inb(0x84); 4659a57b7d2SSøren Schmidt } 4669a57b7d2SSøren Schmidt inb(0x3DA); 4679a57b7d2SSøren Schmidt outb(0x3C0, 0x20); 4689a57b7d2SSøren Schmidt } 4699a57b7d2SSøren Schmidt 4709a57b7d2SSøren Schmidt void 4719a57b7d2SSøren Schmidt VGLSetPaletteIndex(byte color, byte red, byte green, byte blue) 4729a57b7d2SSøren Schmidt { 4739a57b7d2SSøren Schmidt VGLSavePaletteRed[color] = red; 4749a57b7d2SSøren Schmidt VGLSavePaletteGreen[color] = green; 4759a57b7d2SSøren Schmidt VGLSavePaletteBlue[color] = blue; 4769a57b7d2SSøren Schmidt VGLCheckSwitch(); 4779a57b7d2SSøren Schmidt outb(0x3C6, 0xFF); 4789a57b7d2SSøren Schmidt inb(0x3DA); 4799a57b7d2SSøren Schmidt outb(0x3C8, color); 4809a57b7d2SSøren Schmidt outb(0x3C9, red); outb(0x3C9, green); outb(0x3C9, blue); 4819a57b7d2SSøren Schmidt inb(0x3DA); 4829a57b7d2SSøren Schmidt outb(0x3C0, 0x20); 4839a57b7d2SSøren Schmidt } 4849a57b7d2SSøren Schmidt 4859a57b7d2SSøren Schmidt void 4869a57b7d2SSøren Schmidt VGLSetBorder(byte color) 4879a57b7d2SSøren Schmidt { 4889a57b7d2SSøren Schmidt VGLCheckSwitch(); 4899a57b7d2SSøren Schmidt inb(0x3DA); 4909a57b7d2SSøren Schmidt outb(0x3C0,0x11); outb(0x3C0, color); 4919a57b7d2SSøren Schmidt inb(0x3DA); 4929a57b7d2SSøren Schmidt outb(0x3C0, 0x20); 4939a57b7d2SSøren Schmidt } 4949a57b7d2SSøren Schmidt 4959a57b7d2SSøren Schmidt void 4969a57b7d2SSøren Schmidt VGLBlankDisplay(int blank) 4979a57b7d2SSøren Schmidt { 4989a57b7d2SSøren Schmidt byte val; 4999a57b7d2SSøren Schmidt 5009a57b7d2SSøren Schmidt VGLCheckSwitch(); 5019a57b7d2SSøren Schmidt outb(0x3C4, 0x01); val = inb(0x3C5); outb(0x3C4, 0x01); 5029a57b7d2SSøren Schmidt outb(0x3C5, ((blank) ? (val |= 0x20) : (val &= 0xDF))); 5039a57b7d2SSøren Schmidt } 504