//0,200,200 is nice cyan //draws an open rectangle void rect_open (iImage * dest, int x, int y, int end_x, int end_y, int r, int g, int b) { int i, j; //top bar j = y; for (i = x; i < end_x + 1; i++) { setred (dest, i, j, r); setgreen (dest, i, j, g); setblue (dest, i, j, b); setalpha (dest, i, j, 255); } //bottom bar j = end_y; for (i = x; i < end_x + 1; i++) { setred (dest, i, j, r); setgreen (dest, i, j, g); setblue (dest, i, j, b); setalpha (dest, i, j, 255); } i = x; for (j = y; j < end_y + 1; j++) { setred (dest, i, j, r); setgreen (dest, i, j, g); setblue (dest, i, j, b); setalpha (dest, i, j, 255); } i = end_x; for (j = y; j < end_y + 1; j++) { setred (dest, i, j, r); setgreen (dest, i, j, g); setblue (dest, i, j, b); setalpha (dest, i, j, 255); } }
//This Blit conserves the alpha, Blit_merge blends the alphaed color in with background. void blit (iImage * source, iImage * dest, int source_startx, int source_starty, int destx, int desty, int source_endx, int source_endy) { int x; int y; int r, g, b; int i, j; int a; x = dest->GetWidth (); y = dest->GetHeight (); if (source_endx + destx - source_startx >= x) source_endx = x - destx + source_startx; if (source_endy + desty - source_starty >= y) source_endy = y - desty + source_starty; i = 0; j = 0; for (x = source_startx; x < source_endx; x++) { for (y = source_starty; y < source_endy; y++) { r = getred (source, x, y); g = getgreen (source, x, y); b = getblue (source, x, y); a = getalpha (source, x, y); setred (dest, i + destx, j + desty, r); setgreen (dest, i + destx, j + desty, g); setblue (dest, i + destx, j + desty, b); setalpha (dest, i + destx, j + desty, a); j++; } j = 0; i++; } }
void allocimages(void) { Rectangle one = Rect(0, 0, 1, 1); selected = eallocimage(one, 1, RGBA32, setalpha(DPalebluegreen, 0x5f)); litbrdr = eallocimage(one, 1, RGBA32, DGreen); img = eallocimage(Rect(0, 0, Sizex, Sizey), 0, defchan? defchan: screen->chan, DBlack); textcol = eallocimage(one, 1, RGBA32, DWhite); background = eloadfile(defbackgr); replclipr(background, 1, img->r); mask = eloadfile(Mask); gameover = eloadfile(Gameover); tileset = eloadfile(deftileset); }
void clear_image (iImage * dest) { int i, j; for (i = 0; i < dest->GetWidth (); i++) for (j = 0; j < dest->GetHeight (); j++) { setred (dest, i, j, 0); setgreen (dest, i, j, 0); setblue (dest, i, j, 0); setalpha (dest, i, j, 0); } }
//draws a rectangle_filled with colors r,g,b void rect (iImage * dest, int x, int y, int end_x, int end_y, int r, int g, int b) { int i, j; //float bright; //int r3,g3,b3; for (i = x; i < end_x + 1; i++) for (j = y; j < end_y + 1; j++) { setred (dest, i, j, r); setgreen (dest, i, j, g); setblue (dest, i, j, b); setalpha (dest, i, j, 255); } }
ulong tkrgba(int r, int g, int b, int a) { ulong p; if(r < 0) r = 0; else if(r > 255) r = 255; if(g < 0) g = 0; else if(g > 255) g = 255; if(b < 0) b = 0; else if(b > 255) b = 255; p = (r<<24)|(g<<16)|(b<<8)|0xFF; if(a == 255) return p; return setalpha(p, a); }
void blit_transparent (iImage * source, iImage * dest, int source_startx, int source_starty, int destx, int desty, int source_endx, int source_endy, int r0, int g0, int b0, int range) { int x; int y; int r, g, b; int i, j; int r2, g2, b2; x = dest->GetWidth (); y = dest->GetHeight (); if (source_endx + destx - source_startx >= x) source_endx = x - destx + source_startx; if (source_endy + desty - source_starty >= y) source_endy = y - desty + source_starty; i = 0; j = 0; for (x = source_startx; x < source_endx; x++) { for (y = source_starty; y < source_endy; y++) { r = getred (source, x, y); g = getgreen (source, x, y); b = getblue (source, x, y); r2 = abs (r0 - r); g2 = abs (g0 - g); b2 = abs (b0 - b); if (r2 < range && g2 < range && b2 < range) { r = r0; setalpha (dest, i + destx, j + desty, 0); } else { setred (dest, i + destx, j + desty, r); setgreen (dest, i + destx, j + desty, g); setblue (dest, i + destx, j + desty, b); setalpha (dest, i + destx, j + desty, 255); } j++; } j = 0; i++; } }