⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vgapix.c

📁 linux 下svgalib编的一个界面程序示例
💻 C
字号:
/* VGAlib version 1.2 - (c) 1993 Tommy Frandsen                    *//*                                                                 *//* This library is free software; you can redistribute it and/or   *//* modify it without any restrictions. This library is distributed *//* in the hope that it will be useful, but without any warranty.   *//* Multi-chipset support Copyright 1993 Harm Hanemaayer *//* partially copyrighted (C) 1993 by Hartmut Schirmer *//* HH: Added 4bpp support, and use bytesperpixel. */#include <stdio.h>#include "vga.h"#include "libvga.h"#ifdef BACKGROUND#include "vgabg.h"#endifstatic inline void read_write(unsigned long off){    gr_writeb(gr_readb(off) + 1, off);}static inline int RGB2BGR(int c){/* a bswap would do the same as the first 3 but in only ONE! cycle. *//* However bswap is not supported by 386 */    if (MODEFLAGS & RGB_MISORDERED)#ifdef __alpha__	c = ((c >> 0) & 0xff) << 16 |	    ((c >> 8) & 0xff) << 8 |	    ((c >> 16) & 0xff) << 0;#else	asm("rorw  $8, %0\n"	/* 0RGB -> 0RBG */	    "rorl $16, %0\n"	/* 0RBG -> BG0R */	    "rorw  $8, %0\n"	/* BG0R -> BGR0 */	    "shrl  $8, %0\n"	/* 0BGR -> 0BGR */      : "=q"(c):"0"(c));#endif    return c;}#ifdef BACKGROUND/* Never define ___OK___ */static int vga_drawpixel_bg(int x, int y){ unsigned long offset; int c; unsigned char tmp;      if (MODEX) {	/* select plane */#if 0	port_out(0x02, SEQ_I);	port_out(1 << (x & 3), SEQ_D);		/* write color to pixel */#endif	if (1<<(x&3)==1) __svgalib_fast_setpage(0);	if (1<<(x&3)==2) __svgalib_fast_setpage(1);	if (1<<(x&3)==4) __svgalib_fast_setpage(2);	if (1<<(x&3)==8) __svgalib_fast_setpage(3);	gr_writeb(COL, y * CI.xbytes + (x >> 2));	vga_setpage(0); /* Page must set back to 0. */	return 0;    }    switch (__svgalib_cur_info.bytesperpixel) {    case 0:			/* Must be 2 or 16 color mode. */	/* set up video page */#if 0	offset = y * CI.xbytes + (x >> 3);	vga_setpage(offset >> 16);	offset &= 0xffff;	/* select bit */	port_out(8, GRA_I);	port_out(0x80 >> (x & 7), GRA_D);	/* read into latch and write dummy back */	read_write(offset);#endif                offset = y * CI.xbytes + (x >> 3);	offset &= 0xffff;	__svgalib_fast_setpage(0);	tmp=gr_readb(offset);	tmp&=(255^(128>>(x&7)));	tmp|=(((COL&1)<<7)>>(x&7));	gr_writeb(tmp, offset);	__svgalib_fast_setpage(1);	tmp=gr_readb(offset);	tmp&=(255^(128>>(x&7)));	tmp|=(((COL&2)<<6)>>(x&7));	gr_writeb(tmp, offset);	__svgalib_fast_setpage(2);	tmp=gr_readb(offset);	tmp&=(255^(128>>(x&7)));	tmp|=(((COL&4)<<5)>>(x&7));	gr_writeb(tmp, offset);	__svgalib_fast_setpage(3);	tmp=gr_readb(offset);	tmp&=(255^(128>>(x&7)));	tmp|=(((COL&8)<<4)>>(x&7));	gr_writeb(tmp, offset);	break;    case 1:	offset = y * CI.xbytes + x;	/* select segment */	__svgalib_fast_setpage(offset >> 16);	/* write color to pixel */	gr_writeb(COL, offset & 0xffff);	break;    case 2:	offset = y * CI.xbytes + x * 2;	__svgalib_fast_setpage(offset >> 16);	gr_writew(COL, offset & 0xffff);	break;    case 3:	c = RGB2BGR(COL);	offset = y * CI.xbytes + x * 3;	__svgalib_fast_setpage(offset >> 16);	switch (offset & 0xffff) {	case 0xfffe:	    gr_writew(c, 0xfffe);	    __svgalib_fast_setpage((offset >> 16) + 1);	    gr_writeb(c >> 16, 0);	    break;	case 0xffff:	    gr_writeb(c, 0xffff);	    __svgalib_fast_setpage((offset >> 16) + 1);	    gr_writew(c >> 8, 0);	    break;	default:	    offset &= 0xffff;	    gr_writew(c, offset);	    gr_writeb(c >> 16, offset + 2);	    break;	}	break;    case 4:	offset = y * __svgalib_cur_info.xbytes + x * 4;	__svgalib_fast_setpage(offset >> 16);	gr_writel((MODEFLAGS & RGB_MISORDERED) ? (COL << 8) : COL,		  offset & 0xffff);	break;    }    return 0;  return(0);}#endif#ifndef BACKGROUNDint vga_drawpixel(int x, int y)#endif#ifdef BACKGROUNDint __svgalib_fast_drawpixel(int x, int y)#endif{    unsigned long offset;    int c;#ifdef BACKGROUND        if (!vga_oktowrite())        {	 /* Must be in background now. */	 vga_drawpixel_bg(x,y);	 return(0);	}#endif    if (MODEX) {#ifdef BACKGROUND#if 0        if (vga_oktowrite)	    {#endif#endif	     /* select plane */	     port_out(0x02, SEQ_I);	     port_out(1 << (x & 3), SEQ_D);	     /* write color to pixel */	     gr_writeb(COL, y * CI.xbytes + (x >> 2));#ifdef BACKGROUND#if 0	    }	  else	    {	     if (1<<(x&3)==1) vga_setpage(0);	     if (1<<(x&3)==2) vga_setpage(1);	     if (1<<(x&3)==4) vga_setpage(2);	     if (1<<(x&3)==8) vga_setpage(3);	     gr_writeb(COL, y * CI.xbytes + (x >> 2));	     vga_setpage(0);	    }#endif#endif	return 0;    }    switch (__svgalib_cur_info.bytesperpixel) {    case 0:			/* Must be 2 or 16 color mode. */	/* set up video page */	offset = y * CI.xbytes + (x >> 3);#ifndef BACKGROUND	vga_setpage(offset >> 16);#endif#ifdef BACKGROUND        __svgalib_fast_setpage(offset >> 16);#endif	offset &= 0xffff;	/* select bit */	port_out(8, GRA_I);	port_out(0x80 >> (x & 7), GRA_D);	/* read into latch and write dummy back */	read_write(offset);	break;    case 1:	offset = y * CI.xbytes + x;	/* select segment */#ifndef BACKGROUND	vga_setpage(offset >> 16);#endif#ifdef  BACKGROUND        __svgalib_fast_setpage(offset >> 16);        #endif	/* write color to pixel */	gr_writeb(COL, offset & 0xffff);	break;    case 2:	offset = y * CI.xbytes + x * 2;#ifndef BACKGROUND	vga_setpage(offset >> 16);#endif#ifdef  BACKGROUND        __svgalib_fast_setpage(offset >> 16);        #endif	        gr_writew(COL, offset & 0xffff);	break;    case 3:	c = RGB2BGR(COL);	offset = y * CI.xbytes + x * 3;#ifndef BACKGROUND	vga_setpage(offset >> 16);#endif#ifdef  BACKGROUND        __svgalib_fast_setpage(offset >> 16);        #endif	switch (offset & 0xffff) {	case 0xfffe:	    gr_writew(c, 0xfffe);#ifndef BACKGROUND	    vga_setpage((offset >> 16) + 1);#endif#ifdef  BACKGROUND            __svgalib_fast_setpage((offset >> 16)+1);        #endif	    gr_writeb(c >> 16, 0);	    break;	case 0xffff:	    gr_writeb(c, 0xffff);#ifndef BACKGROUND	    vga_setpage((offset >> 16) + 1);#endif#ifdef  BACKGROUND            __svgalib_fast_setpage((offset >> 16)+1);        #endif	    gr_writew(c >> 8, 0);	    break;	default:	    offset &= 0xffff;	    gr_writew(c, offset);	    gr_writeb(c >> 16, offset + 2);	    break;	}	break;    case 4:	offset = y * __svgalib_cur_info.xbytes + x * 4;#ifndef BACKGROUND	vga_setpage(offset >> 16);#endif#ifdef  BACKGROUND        __svgalib_fast_setpage(offset >> 16);        #endif	gr_writel((MODEFLAGS & RGB_MISORDERED) ? (COL << 8) : COL,		  offset & 0xffff);	break;    }    return 0;}#ifdef BACKGROUNDint vga_drawpixel(int x, int y){ __svgalib_dont_switch_vt_yet(); __svgalib_fast_drawpixel(x,y); __svgalib_is_vt_switching_needed(); return(0); }#endif#ifndef BACKGROUNDint vga_getpixel(int x, int y)#endif#ifdef BACKGROUNDint __svgalib_fast_getpixel(int x, int y)#endif{    unsigned long offset;    unsigned char mask;    int pix = 0;#ifdef BACKGROUND    int tmp;#endif     if (MODEX) {#ifdef BACKGROUND	if (vga_oktowrite())	    {#endif	     /* select plane */	     port_out(0x02, SEQ_I);	     port_out(1 << (x & 3), SEQ_D);	    #ifdef BACKGROUND             pix=gr_readb(y*CI.xbytes+(x>>2));	    }	  else	    {	     if (1<<(x&3)==1) vga_setpage(0);	     if (1<<(x&3)==2) vga_setpage(1);	     if (1<<(x&3)==4) vga_setpage(2);	     if (1<<(x&3)==8) vga_setpage(3);	     pix=gr_readb(y * CI.xbytes + (x >> 2));	     vga_setpage(0);	    }	return (pix);#endif#ifndef BACKGROUND	return gr_readb(y * CI.xbytes + (x >> 2));#endif    }    switch (__svgalib_cur_info.bytesperpixel) {    case 0:			/* Must be 2 or 16 color mode. */#ifdef BACKGROUND        if (vga_oktowrite())	    {#endif	     /* set up video page */	     offset = y * CI.xbytes + (x >> 3);	     vga_setpage(offset >> 16);	     offset &= 0xffff;	     /* select bit */	     mask = 0x80 >> (x & 7);	     pix = 0;	     port_out(4, GRA_I);	     port_out(0, GRA_D);	/* Select plane 0. */	     if (gr_readb(offset) & mask)	        pix |= 0x01;	     port_out(4, GRA_I);	     port_out(1, GRA_D);	/* Select plane 1. */	     if (gr_readb(offset) & mask)	        pix |= 0x02;	     port_out(4, GRA_I);	     port_out(2, GRA_D);	/* Select plane 2. */	     if (gr_readb(offset) & mask)	        pix |= 0x04;	     port_out(4, GRA_I);	     port_out(3, GRA_D);	/* Select plane 3. */	     if (gr_readb(offset) & mask)	        pix |= 0x08;#ifdef BACKGROUND            }	  else	    {	     offset = y * CI.xbytes + (x >> 3);	     offset &= 0xffff;	     vga_setpage(0);	     tmp=gr_readb(offset);	     if ((tmp&(128>>(x&7)))) pix=1;	     vga_setpage(1);	     tmp=gr_readb(offset);	     if ((tmp&(128>>(x&7)))) pix|=2;	     vga_setpage(2);	     tmp=gr_readb(offset);	     if ((tmp&(128>>(x&7)))) pix|=4;	     vga_setpage(3);	     tmp=gr_readb(offset);	     if (tmp&(128>>(x&7))) pix|=8;	    }	break;#endif#ifndef BACKGROUND	return pix;#endif    case 1:	offset = y * CI.xbytes + x;	/* select segment */	vga_setpage(offset >> 16);#ifdef BACKGROUND        pix=gr_readb(offset & 0xffff);	break;#endif#ifndef BACKGROUND	return gr_readb(offset & 0xffff);#endif    case 2:	offset = y * CI.xbytes + x * 2;	vga_setpage(offset >> 16);#ifdef BACKGROUND        pix=gr_readw(offset & 0xffff);	break;#endif#ifndef BACKGROUND		return gr_readw(offset & 0xffff);#endif    case 3:	offset = y * CI.xbytes + x * 3;	vga_setpage(offset >> 16);	switch (offset & 0xffff) {	case 0xfffe:	    pix = gr_readw(0xfffe);	    vga_setpage((offset >> 16) + 1);#ifdef BACKGROUND            pix=RGB2BGR(pix+(gr_readb(0)<<16));	    break;#endif#ifndef BACKGROUND		    return RGB2BGR(pix + (gr_readb(0) << 16));#endif	case 0xffff:	    pix = gr_readb(0xffff);	    vga_setpage((offset >> 16) + 1);#ifdef BACKGROUND            pix=RGB2BGR(pix+(gr_readw(0)<<8));	    break;#endif#ifndef BACKGROUND		    return RGB2BGR(pix + (gr_readw(0) << 8));#endif	default:	    offset &= 0xffff;#ifdef BACKGROUND            pix=RGB2BGR(gr_readw(offset)+(gr_readb(offset+2)<<26));	    break;#endif#ifndef BACKGROUND		    return RGB2BGR(gr_readw(offset)			   + (gr_readb(offset + 2) << 26));#endif	}	break;     case 4:	offset = y * __svgalib_cur_info.xbytes + x * 4;	vga_setpage(offset >> 16);#ifdef BACKGROUND        pix=gr_readl(offset & 0xffff);	break;#endif#ifndef BACKGROUND		return gr_readl(offset & 0xffff);#endif    }#ifdef BACKGROUND    return(pix);#endif#ifndef BACKGROUND    return 0;#endif}#ifdef BACKGROUNDint vga_getpixel(int x, int y){ int pixel;  __svgalib_dont_switch_vt_yet(); pixel=__svgalib_fast_getpixel(x,y); __svgalib_is_vt_switching_needed(); return(pixel); }#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -