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

📄 graph2.c

📁 一个两碟控制的VCD的代码,两碟之间的转动及连续播放,已大量生产的CODE.
💻 C
字号:
/* SCCSID @(#)graph2.c	1.8 12/15/97 */ 

 
#include "common.h"
#include "graapi.h"
#include "palette.h"
#include "../constvar.h"
extern struct _palette rgb_palette[];

/* yuv palette structure */
typedef struct YUVQUAD 
{
    unsigned char yuvReserved;
    unsigned char yuvV;
    unsigned char yuvU;
    unsigned char yuvY;
} YUVQUAD;

long int *savemem;

extern unsigned int *rgbBuf;
extern char Change_flag[18][11];
int sav_count;

void SetPalette(YUVQUAD *pPalette, int start, int paletteSize)
{
    int i, end;
    end=start+paletteSize;
    if (end>256) end=256;
    for (i = start; i < end; i++)
    {
        rgb_palette[i].r = pPalette[i].yuvY;
        rgb_palette[i].g = pPalette[i].yuvU;
        rgb_palette[i].b = pPalette[i].yuvV;
	    asm("nop");	    asm("nop");	    asm("nop");	    asm("nop");    }
    if (end>start) WrPaletteToDM();
}

unsigned char FindNearestColorIndex(YUVQUAD color)
{
    int i;
    int y0,u0,v0, y1,u1,v1, f2, fmin=1<<30;
    unsigned char j;
    
    y0 = (char) color.yuvY;
    u0 = (char) color.yuvU;
    v0 = (char) color.yuvV;
    for (i = 0; i < 256; i++)
    {
        y1 = (int)((char) rgb_palette[i].r);
        u1 = (int)((char) rgb_palette[i].g);
        v1 = (int)((char) rgb_palette[i].b);
        f2 = (y1-y0)*(y1-y0) + (u1-u0)*(u1-u0) + (v1-v0)*(v1-v0);
        asm("nop");        asm("nop");        asm("nop");        asm("nop");        if (f2<fmin) {
	   fmin=f2; j=i;
	   /* if (fmin<5) return j; */
	}
    }
    return j;
}

void GPFramePoly(int num, int *poly, int color, int mode) {
    int i;
    FGPNT p1,p2;
    p2.fX=poly[2*num-2];
    p2.fY=poly[2*num-1];
    for (i=0;i<num;i++) {
    	p1=p2;
    	p2.fX=poly[2*i];
    	p2.fY=poly[2*i+1];
    	GPDrawLine(p1,p2, 0, color, mode);
    }
}


void Save_Rect(FGRECT rect)
{
  int *k,i,sum1,sum2;
  int x1,x2,y1,y2;
  int fBottom,fTop,fRight,fLeft;

  fBottom = rect.fC.fBottom;
  fTop = rect.fC.fTop;
  fRight = rect.fC.fRight;
  fLeft = rect.fC.fLeft;

  if (fBottom-fTop+fRight-fLeft>512) return;
  sum1=0;
  x1=fTop*88;
  x2=fBottom*88;
  sum2 = fRight>>2;

  for (i = fLeft>>2; i < fRight>>2; i++) {
    savemem[sum1]=*(long *)(rgbBuf+x1+i);
    savemem[sum2]=*(long *)(rgbBuf+x2+i);
    sum1++;
    sum2++;
  }

  y1=fLeft>>2;
  y2=fRight>>2;
  sum1=sum2; sum2+=fBottom;

  k = rgbBuf+fTop*88;
  for (i = fTop; i <= fBottom; i++){
    savemem[sum1]=*(long *)(k+y1);
    savemem[sum2]=*(long *)(k+y2);
    sum1++;
    sum2++;
    k+=88;
  }
}

void Restore_Rect(FGRECT rect)
{
  int *k,i,j,sum1,sum2;
  int x1,x2,y1,y2;
  int addr;
  int fBottom,fTop,fRight,fLeft;

  fBottom = rect.fC.fBottom;
  fTop = rect.fC.fTop;
  fRight = rect.fC.fRight;
  fLeft = rect.fC.fLeft;

  if (fBottom-fTop+fRight-fLeft>512) return;
  change_flag(fTop>>4, fBottom>>4, fLeft>>5, fRight>>5);
 
  x1=fTop*88;
  x2=fBottom*88;
  sum1=0;
  sum2=fRight>>2;
  for (i = fLeft>>2; i < fRight>>2; i++){
    *(long *)(rgbBuf+x1+i)=savemem[sum1];
    *(long *)(rgbBuf+x2+i)=savemem[sum2];
    sum1++;sum2++;
  }
  
  y1=(fLeft>>2);
  y2=(fRight>>2);
  sum1=sum2;sum2+=fBottom;
  k = rgbBuf+fTop*88;
  for (i = fTop; i <= fBottom; i++){
    *(long *)(k+y1)=savemem[sum1];
    *(long *)(k+y2)=savemem[sum2];
    sum1++; sum2++;
    k+=88;
  }
}

void polysave(int num, int *poly)
{
	int x, y;
	int i, j;
	int x0, x1, y0, y1;
	FGPNT p1,p0;

	sav_count = 0;
	x1 = poly[2*num-2];
	y1 = poly[2*num-1];
	for (i=0; i<num; i++){
	  x0 = x1;
	  y0 = y1;
	  p0.fX = x0; p0.fY = y0;
	  x1 = *(int *)(poly++);
	  y1 = *(int *)(poly++);
	  p1.fX = x1; p1.fY = y1;
	  GPDrawLine(p0,p1,1,0,1);
	}
}

void polyrestore(int num, int *poly)
{
	int x, y;
	int i, j;
	int x0, x1, y0, y1, x2, y2, x3, y3;
	int tmp0, tmp1;
	FGPNT p1,p0;

	sav_count = 0;
	x1 = poly[2*num-2];
	y1 = poly[2*num-1];
	for (i=0; i<num; i++){
	  x0 = x1;
	  y0 = y1;
	  p0.fX = x0; p0.fY = y0;
	  x1 = *(int *)(poly++);
	  y1 = *(int *)(poly++);
	  p1.fX = x1; p1.fY = y1;

	  if (x0<x1){
	    x2=x0;
	    x3=x1;
	  }
	  else{
	    x2=x1;
	    x3=x0;
	  }
	  tmp0 = y0; tmp1 = y1; 
	  if (y0>y1) {
	    tmp0 = y1; tmp1 = y0; 
	  }
          change_flag(tmp0>>4, tmp1>>4, x2>>5, x3>>5);

	  GPDrawLine(p0,p1,1,0,0);
	}
}

⌨️ 快捷键说明

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