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

📄 synpolygon.h

📁 Yet another mp3 player, but this time using SVGALib under Linux. The idea was to use a 320x240 disp
💻 H
字号:
#include <string.h>template<class Pixel,int extra=0>struct Bitmap {  Pixel *data;  int width, height;  Bitmap() : data(0) { };  ~Bitmap() { delete[] data; };  void size(int w,int h) {    delete[] data;    width = w;    height = h;    data = new Pixel[w*h+extra];    clear();  }    void clear() {    memset(data,0,sizeof(Pixel)*(width*height+extra));  }};template<class Pixel, Pixel combine(Pixel a,Pixel b), int superSampleShift>struct PolygonEngine : public Bitmap<Pixel,1> {#define super (1<<superSampleShift)  void apply(Pixel *dest) {    Pixel sum=0;    int count = width*height;    Pixel *src = data;    while(count--) {      sum += *(src++);      if (sum)        *dest = combine(sum,*dest);      dest++;    }  }  void add(Pixel color,int x,int y) {    if (y < 0) return;    if (y >= height) return;    if (x < 0) x = 0;    if (x > width) x = width;    data[x+y*width] += color;  }  /* Color is char[layers] */  //  zwoosh, yknow, it goes... zwoosh an all these bars and lines and  //  crap intersect.  Pixel colorTable[2][super+1];  void pen(Pixel color) {    for(int i=0;i<super+1;i++) {      colorTable[0][i] = color*i;      colorTable[1][i] = -(color*i);    }  }    void line(int x1,int y1,int x2,int y2) {    Pixel *colors;    if (y2 < y1) {      int temp;      temp = x2; x2 = x1; x1 = temp;      temp = y2; y2 = y1; y1 = temp;      colors = colorTable[1];    } else {      if (y1 == y2) return;          colors= colorTable[0];    }    int slope = (x1-x2 << 16)/(y1-y2);    int x = x1<<16, y = y1;    while(y < y2) {      add(colors[super-((x>>16)&(super-1))],	  x>>(16+superSampleShift),y>>superSampleShift);       add(colors[(x>>16)&(super-1)],	  1+(x>>(16+superSampleShift)),y>>superSampleShift);       x += slope;      y++;    }  }  void icon(double icon[][4],Pixel color,double x,double y,            double scaleX, double scaleY) {    pen(color);    x *= super;    y *= super;    scaleX *= super;    scaleY *= super;    for(int i=0;icon[i][1] != icon[i][3];i++)      line(int(icon[i][0]*scaleX+x),int(icon[i][1]*scaleY+y),	   int(icon[i][2]*scaleX+x),int(icon[i][3]*scaleY+y));  }#undef super};

⌨️ 快捷键说明

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