#include "defines.h" #include "air.h" #include "powder.h" #include "graphics.h" #include "font.h" #include "misc.h" #include #include unsigned cmode = 3; SDL_Surface *sdl_scrn; int sdl_scale = 1; pixel *rescale_img(pixel *src, int sw, int sh, int *qw, int *qh, int f) { int i,j,x,y,w,h,r,g,b,c; pixel p, *q; w = (sw+f-1)/f; h = (sh+f-1)/f; q = malloc(w*h*PIXELSIZE); for(y=0; y1) { r = (r+c/2)/c; g = (g+c/2)/c; b = (b+c/2)/c; } q[y*w+x] = PIXRGB(r, g, b); } *qw = w; *qh = h; return q; } void sdl_blit_1(int x, int y, int w, int h, pixel *src, int pitch) { pixel *dst; int j; if(SDL_MUSTLOCK(sdl_scrn)) if(SDL_LockSurface(sdl_scrn)<0) return; dst=(pixel *)sdl_scrn->pixels+y*sdl_scrn->pitch/PIXELSIZE+x; for(j=0; jpitch/PIXELSIZE; src+=pitch; } if(SDL_MUSTLOCK(sdl_scrn)) SDL_UnlockSurface(sdl_scrn); SDL_UpdateRect(sdl_scrn,0,0,0,0); } void sdl_blit_2(int x, int y, int w, int h, pixel *src, int pitch) { pixel *dst; int j; int i,k; if(SDL_MUSTLOCK(sdl_scrn)) if(SDL_LockSurface(sdl_scrn)<0) return; dst=(pixel *)sdl_scrn->pixels+y*sdl_scrn->pitch/PIXELSIZE+x; for(j=0; jpitch/PIXELSIZE; } src+=pitch; } if(SDL_MUSTLOCK(sdl_scrn)) SDL_UnlockSurface(sdl_scrn); SDL_UpdateRect(sdl_scrn,0,0,0,0); } void sdl_blit(int x, int y, int w, int h, pixel *src, int pitch) { if(sdl_scale == 2) sdl_blit_2(x, y, w, h, src, pitch); else sdl_blit_1(x, y, w, h, src, pitch); } void drawblob(pixel *vid, int x, int y, unsigned char cr, unsigned char cg, unsigned char cb) { blendpixel(vid, x+1, y, cr, cg, cb, 112); blendpixel(vid, x-1, y, cr, cg, cb, 112); blendpixel(vid, x, y+1, cr, cg, cb, 112); blendpixel(vid, x, y-1, cr, cg, cb, 112); blendpixel(vid, x+1, y-1, cr, cg, cb, 64); blendpixel(vid, x-1, y-1, cr, cg, cb, 64); blendpixel(vid, x+1, y+1, cr, cg, cb, 64); blendpixel(vid, x-1, y+1, cr, cg, cb, 64); } void draw_tool(pixel *vid_buf, int b, int sl, int sr, unsigned pc, unsigned iswall) { int x, y, i, j, c; int bo = b; if(iswall==1) { b = b-100; x = (2+32*((b-22)/1)); y = YRES+2+40; switch(b) { case WL_WALLELEC: for(j=1; j<15; j++) { for(i=1; i<27; i++) { if(!(i%2) && !(j%2)) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; } else { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = PIXPACK(0x808080); } } } break; case 23: for(j=1; j<15; j++) { for(i=1; i<6+j; i++) { if(!(i&j&1)) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; } } for(; i<27; i++) { if(i&j&1) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; } } } break; case 24: for(j=1; j<15; j+=2) { for(i=1+(1&(j>>1)); i<27; i+=2) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; } } break; case 25: for(j=1; j<15; j++) { for(i=1; i<27; i++) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); drawtext(vid_buf, x+4, y+3, "\x8D", 255, 255, 255, 255); } } for(i=9; i<27; i++) { drawpixel(vid_buf, x+i, y+8+(int)(3.9f*cos(i*0.3f)), 255, 255, 255, 255); } break; case 26: for(j=1; j<15; j++) { for(i=1; i<27; i++) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); } } drawtext(vid_buf, x+9, y+3, "\xA1", 32, 64, 128, 255); drawtext(vid_buf, x+9, y+3, "\xA0", 255, 255, 255, 255); break; case 27: for(j=1; j<15; j+=2) { for(i=1+(1&(j>>1)); i<27; i+=2) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; } } break; case 28: for(j=1; j<15; j++) { for(i=1; i<27; i++) { if(!(i%2) && !(j%2)) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; } } } break; case 29: for(j=1; j<15; j+=2) { for(i=1+(1&(j>>1)); i<27; i+=2) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; } } break; case 30: for(j=1; j<15; j+=2) { for(i=1+(1&(j>>1)); i<13; i+=2) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; } } for(j=1; j<15; j++) { for(i=14; i<27; i++) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; } } break; case 32: for(j=1; j<15; j+=2) { for(i=1+(1&(j>>1)); i<27; i+=2) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; } } break; case 33: for(j=1; j<15; j+=2) { for(i=1+(1&(j>>1)); i<27; i+=2) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; } } break; case 34: for(j=1; j<15; j++) { for(i=1; i<27; i++) { if(!(i%2) && !(j%2)) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; } } } break; case 36: for(j=1; j<15; j++) { for(i=1; i<27; i++) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; } } c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); if(c<544) { c = 255; } else { c = 0; } drawtext(vid_buf, x+14-textwidth("AIR")/2, y+4, "AIR", c, c, c, 255); break; case 37: for(j=1; j<15; j++) { for(i=1; i<27; i++) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; } } c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); if(c<544) { c = 255; } else { c = 0; } drawtext(vid_buf, x+14-textwidth("HEAT")/2, y+4, "HEAT", c, c, c, 255); break; case 38: for(j=1; j<15; j++) { for(i=1; i<27; i++) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; } } c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); if(c<544) { c = 255; } else { c = 0; } drawtext(vid_buf, x+14-textwidth("COOL")/2, y+4, "COOL", c, c, c, 255); break; case 39: for(j=1; j<15; j++) { for(i=1; i<27; i++) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; } } c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); if(c<544) { c = 255; } else { c = 0; } drawtext(vid_buf, x+14-textwidth("VAC")/2, y+4, "VAC", c, c, c, 255); break; default: for(j=1; j<15; j++) { for(i=1; i<27; i++) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; } } } if(b==30) { for(j=4; j<12; j++) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); } } } else { x = 2+32*(b/2); y = YRES+2+20*(b%2); for(j=1; j<15; j++) { for(i=1; i<27; i++) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; } } if(b==0) { for(j=4; j<12; j++) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); } } c = PIXB(ptypes[b].pcolors) + 3*PIXG(ptypes[b].pcolors) + 2*PIXR(ptypes[b].pcolors); if(c<544) { c = 255; } else { c = 0; } drawtext(vid_buf, x+14-textwidth((char *)ptypes[b].name)/2, y+4, (char *)ptypes[b].name, c, c, c, 255); } if(bo==sl || bo==sr) { c = 0; if(bo==sl) c |= PIXPACK(0xFF0000); if(bo==sr) c |= PIXPACK(0x0000FF); for(i=0; i<30; i++) { vid_buf[(XRES+BARSIZE)*(y-1)+(x+i-1)] = c; vid_buf[(XRES+BARSIZE)*(y+16)+(x+i-1)] = c; } for(j=0; j<18; j++) { vid_buf[(XRES+BARSIZE)*(y+j-1)+(x-1)] = c; vid_buf[(XRES+BARSIZE)*(y+j-1)+(x+28)] = c; } } } int draw_tool_xy(pixel *vid_buf, int x, int y, int b, unsigned pc) { int i, j, c; if(b>=121) { b = b-100; //x = (2+32*((b-22)/1)); //y = YRES+2+40; switch(b) { case WL_WALLELEC: for(j=1; j<15; j++) { for(i=1; i<27; i++) { if(!(i%2) && !(j%2)) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; } else { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = PIXPACK(0x808080); } } } break; case 23: for(j=1; j<15; j++) { for(i=1; i<6+j; i++) { if(!(i&j&1)) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; } } for(; i<27; i++) { if(i&j&1) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; } } } break; case 24: for(j=1; j<15; j+=2) { for(i=1+(1&(j>>1)); i<27; i+=2) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; } } break; case 25: for(j=1; j<15; j++) { for(i=1; i<27; i++) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); drawtext(vid_buf, x+4, y+3, "\x8D", 255, 255, 255, 255); } } for(i=9; i<27; i++) { drawpixel(vid_buf, x+i, y+8+(int)(3.9f*cos(i*0.3f)), 255, 255, 255, 255); } break; case 26: for(j=1; j<15; j++) { for(i=1; i<27; i++) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = i==1||i==26||j==1||j==14 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); } } drawtext(vid_buf, x+9, y+3, "\xA1", 32, 64, 128, 255); drawtext(vid_buf, x+9, y+3, "\xA0", 255, 255, 255, 255); break; case 27: for(j=1; j<15; j+=2) { for(i=1+(1&(j>>1)); i<27; i+=2) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; } } break; case 28: for(j=1; j<15; j++) { for(i=1; i<27; i++) { if(!(i%2) && !(j%2)) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; } } } break; case 29: for(j=1; j<15; j+=2) { for(i=1+(1&(j>>1)); i<27; i+=2) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; } } break; case 30: for(j=1; j<15; j+=2) { for(i=1+(1&(j>>1)); i<13; i+=2) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; } } for(j=1; j<15; j++) { for(i=14; i<27; i++) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; } } break; case 32: for(j=1; j<15; j+=2) { for(i=1+(1&(j>>1)); i<27; i+=2) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; } } break; case 33: for(j=1; j<15; j+=2) { for(i=1+(1&(j>>1)); i<27; i+=2) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; } } break; case 34: for(j=1; j<15; j++) { for(i=1; i<27; i++) { if(!(i%2) && !(j%2)) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; } } } break; case 36: for(j=1; j<15; j++) { for(i=1; i<27; i++) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; } } c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); if(c<544) { c = 255; } else { c = 0; } drawtext(vid_buf, x+14-textwidth("AIR")/2, y+4, "AIR", c, c, c, 255); break; case 37: for(j=1; j<15; j++) { for(i=1; i<27; i++) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; } } c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); if(c<544) { c = 255; } else { c = 0; } drawtext(vid_buf, x+14-textwidth("HEAT")/2, y+4, "HEAT", c, c, c, 255); break; case 38: for(j=1; j<15; j++) { for(i=1; i<27; i++) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; } } c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); if(c<544) { c = 255; } else { c = 0; } drawtext(vid_buf, x+14-textwidth("COOL")/2, y+4, "COOL", c, c, c, 255); break; case 39: for(j=1; j<15; j++) { for(i=1; i<27; i++) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; } } c = PIXR(pc) + 3*PIXG(pc) + 2*PIXB(pc); if(c<544) { c = 255; } else { c = 0; } drawtext(vid_buf, x+14-textwidth("VAC")/2, y+4, "VAC", c, c, c, 255); break; case 40: for(j=1; j<15; j+=2) { for(i=1+(1&(j>>1)); i<27; i+=2) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; } } break; default: for(j=1; j<15; j++) { for(i=1; i<27; i++) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; } } } if(b==30) { for(j=4; j<12; j++) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); } } } else { //x = 2+32*(b/2); //y = YRES+2+20*(b%2); for(j=1; j<15; j++) { for(i=1; i<27; i++) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+i)] = pc; } } if(b==0) { for(j=4; j<12; j++) { vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+6)] = PIXPACK(0xFF0000); vid_buf[(XRES+BARSIZE)*(y+j)+(x+j+7)] = PIXPACK(0xFF0000); vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+21)] = PIXPACK(0xFF0000); vid_buf[(XRES+BARSIZE)*(y+j)+(x-j+22)] = PIXPACK(0xFF0000); } } c = PIXB(ptypes[b].pcolors) + 3*PIXG(ptypes[b].pcolors) + 2*PIXR(ptypes[b].pcolors); if(c<544) { c = 255; } else { c = 0; } drawtext(vid_buf, x+14-textwidth((char *)ptypes[b].name)/2, y+4, (char *)ptypes[b].name, c, c, c, 255); } return 26; } void draw_menu(pixel *vid_buf, int i, int hover) { drawrect(vid_buf, XRES-2, (i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16), 14, 14, 255, 255, 255, 255); if(hover==i) { fillrect(vid_buf, XRES-2, (i*16)+YRES+MENUSIZE-16-(SC_TOTAL*16), 14, 14, 255, 255, 255, 255); drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 0, 0, 0, 255); } else { drawtext(vid_buf, XRES+1, (i*16)+YRES+MENUSIZE-14-(SC_TOTAL*16), msections[i].icon, 255, 255, 255, 255); } } #ifdef WIN32 _inline void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a) #else inline void drawpixel(pixel *vid, int x, int y, int r, int g, int b, int a) #endif { pixel t; if(x<0 || y<0 || x>=XRES+BARSIZE || y>=YRES+MENUSIZE) return; if(a!=255) { t = vid[y*(XRES+BARSIZE)+x]; r = (a*r + (255-a)*PIXR(t)) >> 8; g = (a*g + (255-a)*PIXG(t)) >> 8; b = (a*b + (255-a)*PIXB(t)) >> 8; } vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); } #ifdef WIN32 _inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a) #else inline int drawchar(pixel *vid, int x, int y, int c, int r, int g, int b, int a) #endif { int i, j, w, bn = 0, ba = 0; char *rp = font_data + font_ptrs[c]; w = *(rp++); for(j=0; j>= 2; bn -= 2; } return x + w; } int drawtext(pixel *vid, int x, int y, char *s, int r, int g, int b, int a) { int sx = x; for(; *s; s++) { if(*s == '\n') { x = sx; y += FONT_H+2; } else if(*s == '\b') { switch(s[1]) { case 'w': r = g = b = 255; break; case 'g': r = g = b = 192; break; case 'o': r = 255; g = 216; b = 32; break; case 'r': r = 255; g = b = 0; break; case 'b': r = g = 0; b = 255; break; } s++; } else x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a); } return x; } void drawrect(pixel *vid, int x, int y, int w, int h, int r, int g, int b, int a) { int i; for(i=0; i<=w; i++) { drawpixel(vid, x+i, y, r, g, b, a); drawpixel(vid, x+i, y+h, r, g, b, a); } for(i=1; i=w && x+textwidth(s)>=w+5) break; x = drawchar(vid, x, y, *(unsigned char *)s, r, g, b, a); } if(*s) for(i=0; i<3; i++) x = drawchar(vid, x, y, '.', r, g, b, a); return x; } int textnwidth(char *s, int n) { int x = 0; for(; *s; s++) { if(!n) break; x += font_data[font_ptrs[(int)(*(unsigned char *)s)]]; n--; } return x-1; } int textwidthx(char *s, int w) { int x=0,n=0,cw; for(; *s; s++) { cw = font_data[font_ptrs[(int)(*(unsigned char *)s)]]; if(x+(cw/2) >= w) break; x += cw; n++; } return n; } #ifdef WIN32 _inline void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a) #else inline void blendpixel(pixel *vid, int x, int y, int r, int g, int b, int a) #endif { pixel t; if(x<0 || y<0 || x>=XRES || y>=YRES) return; if(a!=255) { t = vid[y*(XRES+BARSIZE)+x]; r = (a*r + (255-a)*PIXR(t)) >> 8; g = (a*g + (255-a)*PIXG(t)) >> 8; b = (a*b + (255-a)*PIXB(t)) >> 8; } vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); } void draw_icon(pixel *vid_buf, int x, int y, char ch, int flag) { char t[2]; t[0] = ch; t[1] = 0; if(flag) { fillrect(vid_buf, x-1, y-1, 17, 17, 255, 255, 255, 255); drawtext(vid_buf, x+3, y+2, t, 0, 0, 0, 255); } else { drawrect(vid_buf, x, y, 15, 15, 255, 255, 255, 255); drawtext(vid_buf, x+3, y+2, t, 255, 255, 255, 255); } } void draw_air(pixel *vid) { int x, y, i, j; pixel c; if(cmode == 2) return; for(y=0; y 0.0f) c = PIXRGB(clamp_flt(pv[y][x], 0.0f, 8.0f), 0, 0); else c = PIXRGB(0, 0, clamp_flt(-pv[y][x], 0.0f, 8.0f)); } else c = PIXRGB(clamp_flt(fabsf(vx[y][x]), 0.0f, 8.0f), clamp_flt(pv[y][x], 0.0f, 8.0f), clamp_flt(fabsf(vy[y][x]), 0.0f, 8.0f)); for(j=0; jdx) { dx = dx+dy; dy = dx-dy; dx = dx-dy; check = 1; } e = (dy<<2)-dx; for (i=0; i<=dx; i++) { vid[x+y*a] =PIXRGB(r, g, b); if (e>=0) { if (check==1) x = x+sx; else y = y+sy; e = e-(dx<<2); } if (check==1) y = y+sy; else x = x+sx; e = e+(dy<<2); } } void addpixel(pixel *vid, int x, int y, int r, int g, int b, int a) { pixel t; if(x<0 || y<0 || x>=XRES || y>=YRES) return; t = vid[y*(XRES+BARSIZE)+x]; r = (a*r + 255*PIXR(t)) >> 8; g = (a*g + 255*PIXG(t)) >> 8; b = (a*b + 255*PIXB(t)) >> 8; if(r>255) r = 255; if(g>255) g = 255; if(b>255) b = 255; vid[y*(XRES+BARSIZE)+x] = PIXRGB(r,g,b); } void xor_pixel(int x, int y, pixel *vid) { int c; if(x<0 || y<0 || x>=XRES || y>=YRES) return; c = vid[y*(XRES+BARSIZE)+x]; c = PIXB(c) + 3*PIXG(c) + 2*PIXR(c); if(c<512) vid[y*(XRES+BARSIZE)+x] = PIXPACK(0xC0C0C0); else vid[y*(XRES+BARSIZE)+x] = PIXPACK(0x404040); } void xor_line(int x1, int y1, int x2, int y2, pixel *vid) { int cp=abs(y2-y1)>abs(x2-x1), x, y, dx, dy, sy; float e, de; if(cp) { y = x1; x1 = y1; y1 = y; y = x2; x2 = y2; y2 = y; } if(x1 > x2) { y = x1; x1 = x2; x2 = y; y = y1; y1 = y2; y2 = y; } dx = x2 - x1; dy = abs(y2 - y1); e = 0.0f; if(dx) de = dy/(float)dx; else de = 0.0f; y = y1; sy = (y1= 0.5f) { y += sy; e -= 1.0f; } } } void xor_rect(pixel *vid, int x, int y, int w, int h) { int i; for(i=0; i