void TCOD_console_set_char_background_wrapper(TCOD_console_t con,int x, int y, colornum_t col, TCOD_bkgnd_flag_t flag) { TCOD_console_set_char_background (con, x, y, int_to_color(col), flag); }
/* renders the textfield */ void TCOD_text_render (TCOD_text_t txt, TCOD_console_t con) { text_t * data = (text_t*)txt; uint32 time; bool cursor_on; char back=0; int curx,cury,cursorx,cursory, curpos; char *ptr; TCOD_IFNOT(data && data->con ) return; time = TCOD_sys_elapsed_milli(); cursor_on = (int)( time % data->interval ) > data->halfinterval; TCOD_console_set_default_background(data->con, data->back); TCOD_console_set_default_foreground(data->con, data->fore); TCOD_console_clear(data->con); /* compute cursor position */ get_cursor_coords(data,&cursorx,&cursory); if ( cursor_on && data->ascii_cursor) { /* save the character under cursor position */ back = data->text[data->cursor_pos]; data->text[data->cursor_pos] = data->ascii_cursor; } /* render prompt */ if (data->prompt) TCOD_console_print_rect_ex(data->con,0,0,data->w,data->h,TCOD_BKGND_SET,TCOD_LEFT,"%s",data->prompt); /* render text */ curx=data->textx; cury=data->texty; ptr=data->text; curpos=0; while (*ptr) { if ( *ptr == '\n') { if ( (curx == 0 || curpos == 0 ) && curpos >= data->sel_start && curpos < data->sel_end ) { /* inverted colors for selected empty lines */ TCOD_console_set_char_background(data->con, curx, cury, data->fore, TCOD_BKGND_SET); TCOD_console_set_char_foreground(data->con, curx, cury, data->back); } curx=0; cury++; } else { if ( curpos >= data->sel_start && curpos < data->sel_end ) { /* inverted colors for selection */ TCOD_console_set_char_background(data->con, curx, cury, data->fore, TCOD_BKGND_SET); TCOD_console_set_char_foreground(data->con, curx, cury, data->back); } TCOD_console_set_char(data->con,curx,cury,*ptr); curx++; if ( curx == data->w ) { curx=0; cury++; } } ptr++; curpos++; } if ( cursor_on ) { if ( data->ascii_cursor) { /* restore the character under cursor */ data->text[data->cursor_pos] = back; } else { /* invert colors at cursor position */ TCOD_console_set_char_background(data->con,cursorx,cursory,data->fore,TCOD_BKGND_SET); TCOD_console_set_char_foreground(data->con,cursorx,cursory,data->back); } } else if (! cursor_on && ! data->ascii_cursor && data->multiline ) { /* normal colors for cursor ( might be inside selection ) */ TCOD_console_set_char_background(data->con,cursorx,cursory,data->back,TCOD_BKGND_SET); TCOD_console_set_char_foreground(data->con,cursorx,cursory,data->fore); } TCOD_console_blit(data->con,0,0,data->w,data->h,con,data->x,data->y,1.0f,data->transparency); }
void TCOD_image_blit(TCOD_image_t image, TCOD_console_t console, float x, float y, TCOD_bkgnd_flag_t bkgnd_flag, float scalex, float scaley, float angle) { int width,height; image_data_t *img=(image_data_t *)image; if ( scalex == 0.0f || scaley == 0.0f || bkgnd_flag == TCOD_BKGND_NONE ) return; TCOD_image_get_size(image,&width,&height); if ( scalex == 1.0f && scaley == 1.0f && angle == 0.0f && x-((int)x) == 0.0f && y-((int)y)==0.0f) { /* clip the image */ int ix = (int)(x - width*0.5f); int iy = (int)(y - height*0.5f); int minx=MAX(ix,0); int miny=MAX(iy,0); int maxx=MIN(ix+width,TCOD_console_get_width(console)); int maxy=MIN(iy+height,TCOD_console_get_height(console)); int offx=0,offy=0; int cx,cy; if ( ix < 0 ) offx=-ix; if ( iy < 0 ) offy=-iy; for (cx=minx; cx < maxx; cx ++) { for (cy=miny; cy < maxy; cy ++) { TCOD_color_t col=TCOD_image_get_pixel(image,cx-minx+offx,cy-miny+offy); if ( !img->has_key_color || img->key_color.r != col.r || img->key_color.g != col.g || img->key_color.b != col.b ) { TCOD_console_set_char_background(console,cx,cy,col,bkgnd_flag); } } } } else { float iw=width/2*scalex; float ih=height/2*scaley; /* get the coordinates of the image corners in the console */ float newx_x = (float)cos(angle); float newx_y = -(float)sin(angle); float newy_x = newx_y; float newy_y = -newx_x; float x0,y0,x1,y1,x2,y2,x3,y3; /* image corners coordinates */ int rx,ry,rw,rh; /* rectangular area in the console */ int cx,cy; int minx,miny,maxx,maxy; float invscalex,invscaley; /* 0 = P - w/2 x' +h/2 y' */ x0 = x-iw*newx_x+ih*newy_x; y0 = y-iw*newx_y+ih*newy_y; /* 1 = P + w/2 x' + h/2 y' */ x1 = x+iw*newx_x+ih*newy_x; y1 = y+iw*newx_y+ih*newy_y; /* 2 = P + w/2 x' - h/2 y' */ x2 = x+iw*newx_x-ih*newy_x; y2 = y+iw*newx_y-ih*newy_y; /* 3 = P - w/2 x' - h/2 y' */ x3 = x-iw*newx_x-ih*newy_x; y3 = y-iw*newx_y-ih*newy_y; /* get the affected rectangular area in the console */ rx=(int)(MIN(MIN(x0,x1),MIN(x2,x3))); ry=(int)(MIN(MIN(y0,y1),MIN(y2,y3))); rw=(int)(MAX(MAX(x0,x1),MAX(x2,x3))) - rx; rh=(int)(MAX(MAX(y0,y1),MAX(y2,y3))) - ry; /* clip it */ minx=MAX(rx,0); miny=MAX(ry,0); maxx=MIN(rx+rw,TCOD_console_get_width(console)); maxy=MIN(ry+rh,TCOD_console_get_height(console)); invscalex=1.0f / scalex; invscaley=1.0f / scaley; for (cx=minx; cx < maxx; cx ++) { for (cy=miny; cy < maxy; cy ++) { float ix,iy; TCOD_color_t col; /* map the console pixel to the image world */ ix = (iw+ (cx-x) * newx_x + (cy-y) *(-newy_x))*invscalex; iy = (ih + (cx-x) * (newx_y) - (cy-y)*newy_y)*invscaley; col = TCOD_image_get_pixel(image,(int)(ix),(int)(iy)); if ( !img->has_key_color || img->key_color.r != col.r || img->key_color.g != col.g || img->key_color.b != col.b ) { if ( scalex < 1.0f || scaley < 1.0f ) { col = TCOD_image_get_mipmap_pixel(image,ix,iy,ix+1.0f,iy+1.0f); } TCOD_console_set_char_background(console,cx,cy,col,bkgnd_flag); } } } } }
void TCOD_image_blit_2x(TCOD_image_t image, TCOD_console_t con, int dx, int dy, int sx, int sy, int w, int h) { TCOD_color_t grid[4]; TCOD_color_t cols[2]; int nbCols; int width,height,ascii,cx,cy; TCOD_console_data_t *dat = con ? (TCOD_console_data_t *)(con) : TCOD_ctx.root; image_data_t *img=(image_data_t *)image; int maxx,maxy; TCOD_IFNOT(image != NULL && dat != NULL) return; TCOD_image_get_size(image,&width,&height); if ( w == -1 ) w=width; if ( h == -1 ) h=height; /* check that the sx,sy/w,h rectangle is inside the image */ TCOD_ASSERT(sx >= 0 && sy >= 0 && sx+w <= width && sy+h <= height); TCOD_IFNOT(w > 0 && h > 0) return; sx=MAX(0,sx); sy=MAX(0,sy); w = MIN(w,width-sx); h = MIN(h,height-sy); maxx=dx+w/2 <= dat->w ? w : (dat->w-dx)*2; maxy=dy+h/2 <= dat->h ? h : (dat->h-dy)*2; /* check that the image is not blitted outside the console */ TCOD_IFNOT(dx+maxx/2 >= 0 && dy+maxy/2 >= 0 && dx < dat->w && dy < dat->h) return; maxx+=sx; maxy+=sy; for (cx=sx; cx < maxx; cx += 2) { for (cy=sy; cy < maxy; cy += 2) { /* get the 2x2 super pixel colors from the image */ int conx=dx+(cx-sx)/2; int cony=dy+(cy-sy)/2; TCOD_color_t consoleBack=TCOD_console_get_char_background(con,conx,cony); grid[0]=TCOD_image_get_pixel(image,cx,cy); if ( img->has_key_color && grid[0].r == img->key_color.r && grid[0].g == img->key_color.g && grid[0].b == img->key_color.b) grid[0]=consoleBack; if ( cx < maxx-1 ) { grid[1]=TCOD_image_get_pixel(image,cx+1,cy); if ( img->has_key_color && grid[1].r == img->key_color.r && grid[1].g == img->key_color.g && grid[1].b == img->key_color.b) grid[1]=consoleBack; } else grid[1]=consoleBack; if ( cy < maxy-1 ) { grid[2]=TCOD_image_get_pixel(image,cx,cy+1); if ( img->has_key_color && grid[2].r == img->key_color.r && grid[2].g == img->key_color.g && grid[2].b == img->key_color.b) grid[2]=consoleBack; } else grid[2]=consoleBack; if ( cx < maxx-1 && cy < maxy-1 ) { grid[3]=TCOD_image_get_pixel(image,cx+1,cy+1); if ( img->has_key_color && grid[3].r == img->key_color.r && grid[3].g == img->key_color.g && grid[3].b == img->key_color.b) grid[3]=consoleBack; } else grid[3]=consoleBack; /* analyse color, posterize, get pattern */ getPattern(grid,cols,&nbCols,&ascii); if ( nbCols == 1 ) { /* single color */ TCOD_console_set_char_background(con,conx,cony,cols[0],TCOD_BKGND_SET); TCOD_console_set_char(con,conx,cony,' '); } else { if ( ascii >= 0 ) { TCOD_console_set_default_background(con,cols[0]); TCOD_console_set_default_foreground(con,cols[1]); TCOD_console_put_char(con,conx,cony,ascii,TCOD_BKGND_SET); } else { /* negative ascii code means we need to invert back/fore colors */ TCOD_console_set_default_background(con,cols[1]); TCOD_console_set_default_foreground(con,cols[0]); TCOD_console_put_char(con,conx,cony,-ascii,TCOD_BKGND_SET); } } } } }
void TCODConsole::setCharBackground(int x, int y, const TCODColor &col, TCOD_bkgnd_flag_t flag) { TCOD_color_t c={col.r,col.g,col.b}; TCOD_console_set_char_background(data,x,y,c,flag); }