void draw_background_tiled(int back, gs_scalar x, gs_scalar y, int color, gs_scalar alpha) { alpha=clamp_alpha(alpha); get_background(bck2d,back); x = (x<0?0:bck2d->width)-fmod(x,bck2d->width); y = (y<0?0:bck2d->height)-fmod(y,bck2d->height); const gs_scalar tbx = bck2d->texturex, tby = bck2d->texturey, tbw = bck2d->texturew, tbh = bck2d->textureh; const int hortil = int (ceil((gs_scalar)room_width/((gs_scalar)bck2d->width))) + 1, vertil = int (ceil((gs_scalar)room_height/((gs_scalar)bck2d->height))) + 1; gs_scalar xvert1 = -x, xvert2 = xvert1 + bck2d->width, yvert1, yvert2; for (int i=0; i<hortil; ++i) { yvert1 = -y; yvert2 = yvert1 + bck2d->height; for (int c=0; c<vertil; ++c) { draw_primitive_begin_texture(pr_trianglestrip, bck2d->texture); draw_vertex_texture_color(xvert1,yvert1,tbx,tby,color,alpha); draw_vertex_texture_color(xvert2,yvert1,tbx+tbw,tby,color,alpha); draw_vertex_texture_color(xvert1,yvert2,tbx,tby+tbh,color,alpha); draw_vertex_texture_color(xvert2,yvert2,tbx+tbw,tby+tbh,color,alpha); draw_primitive_end(); yvert1 = yvert2; yvert2 += bck2d->height; } xvert1 = xvert2; xvert2 += bck2d->width; } }
void draw_background_general(int back, gs_scalar left, gs_scalar top, gs_scalar width, gs_scalar height, gs_scalar x, gs_scalar y, gs_scalar xscale, gs_scalar yscale, double rot, int c1, int c2, int c3, int c4, gs_scalar alpha) { alpha=clamp_alpha(alpha); get_background(bck2d, back); const gs_scalar tbx = bck2d->texturex, tby = bck2d->texturey, tbw = bck2d->texturew, tbh = bck2d->textureh, ttbw = bck2d->width/tbw, ttbh = bck2d->height/tbh, tbx1 = tbx+left/ttbw, tby1 = tby+top/ttbh, tbx2 = tbx+(left+width)/ttbw, tby2 = tby+(top+height)/ttbh, w = width*xscale, h = height*yscale; rot *= M_PI/180; const gs_scalar wcosrot = w*cos(rot), wsinrot = w*sin(rot); gs_scalar ulcx = x + xscale * cos(M_PI+rot) + yscale * cos(M_PI/2+rot), ulcy = y - yscale * sin(M_PI+rot) - yscale * sin(M_PI/2+rot); draw_primitive_begin_texture(pr_trianglestrip, bck2d->texture); draw_vertex_texture_color(ulcx, ulcy, tbx1, tby1,c1,alpha); draw_vertex_texture_color((ulcx + wcosrot), (ulcy - wsinrot), tbx2,tby1, c2, alpha); ulcx += h * cos(3*M_PI/2 + rot); ulcy -= h * sin(3*M_PI/2 + rot); draw_vertex_texture_color(ulcx, ulcy, tbx1, tby2,c3,alpha); draw_vertex_texture_color((ulcx + wcosrot), (ulcy - wsinrot), tbx2, tby2,c4,alpha); draw_primitive_end(); }
void draw_background_ext(int back, gs_scalar x, gs_scalar y, gs_scalar xscale, gs_scalar yscale, double rot, int color, gs_scalar alpha) { alpha=clamp_alpha(alpha); get_background(bck2d,back); rot *= M_PI/180; const gs_scalar tbw = bck2d->texturew, tbh = bck2d->textureh, tbx = bck2d->texturex, tby = bck2d->texturey, w = bck2d->width*xscale, h = bck2d->height*yscale, wsinrot = w*sin(rot), wcosrot = w*cos(rot); draw_primitive_begin_texture(pr_trianglestrip, bck2d->texture); gs_scalar ulcx = x + xscale * cos(M_PI+rot) + yscale * cos(M_PI/2+rot), ulcy = y - yscale * sin(M_PI+rot) - yscale * sin(M_PI/2+rot); draw_vertex_texture_color(ulcx, ulcy, tbx, tby,color,alpha); draw_vertex_texture_color(ulcx + wcosrot, ulcy - wsinrot, tbx+tbw, tby,color,alpha); const double mpr = 3*M_PI/2 + rot; ulcx += h * cos(mpr); ulcy -= h * sin(mpr); draw_vertex_texture_color(ulcx, ulcy, tbx, tby+tbh,color,alpha); draw_vertex_texture_color(ulcx + wcosrot, ulcy - wsinrot, tbx+tbw, tby+tbh,color,alpha); draw_primitive_end(); }
pixel_t sub_layer_mode_fun::operator()( const pixel_t& back, const pixel_t& front) const { __m128 b = _mm_load_ps( reinterpret_cast<const float*>( &back)); __m128 f = _mm_load_ps( reinterpret_cast<const float*>( &front)); f = _mm_mul_ps( f, opacity_); f = _mm_sub_ps( b, f); f = clamp_alpha( f); float *p = reinterpret_cast<float*>( &f); return pixel_t( p[0], p[1], p[2], p[3]);}
void draw_background_stretched(int back, gs_scalar x, gs_scalar y, gs_scalar width, gs_scalar height, int color, gs_scalar alpha) { alpha=clamp_alpha(alpha); get_background(bck2d, back); const gs_scalar tbx=bck2d->texturex,tby=bck2d->texturey, tbw=bck2d->texturew,tbh=bck2d->textureh; draw_primitive_begin_texture(pr_trianglestrip, bck2d->texture); draw_vertex_texture_color(x,y,tbx,tby,color,alpha); draw_vertex_texture_color(x+width,y,tbx+tbw,tby,color,alpha); draw_vertex_texture_color(x,y+height, tbx,tby+tbh,color,alpha); draw_vertex_texture_color(x+width,y+height, tbx+tbw,tby+tbh,color,alpha); draw_primitive_end(); }
void draw_background_tiled_area_ext(int back, gs_scalar x, gs_scalar y, gs_scalar x1, gs_scalar y1, gs_scalar x2, gs_scalar y2, gs_scalar xscale, gs_scalar yscale, int color, gs_scalar alpha) { alpha=clamp_alpha(alpha); get_background(bck2d,back); const gs_scalar tbx=bck2d->texturex,tby=bck2d->texturey, tbw=bck2d->texturew,tbh=bck2d->textureh; gs_scalar sw,sh,i,j,jj,left,top,width,height,X,Y, tbx1, tbx2, tby1, tby2; sw = bck2d->width*xscale; sh = bck2d->height*yscale; i = x1-(fmod(x1,sw) - fmod(x,sw)) - sw*(fmod(x1,sw)<fmod(x,sw)); j = y1-(fmod(y1,sh) - fmod(y,sh)) - sh*(fmod(y1,sh)<fmod(y,sh)); jj = j; for(; i<=x2; i+=sw) { for(; j<=y2; j+=sh) { if(i <= x1) left = x1-i; else left = 0; X = i+left; if(j <= y1) top = y1-j; else top = 0; Y = j+top; if(x2 <= i+sw) width = ((sw)-(i+sw-x2)+1)-left; else width = sw-left; if(y2 <= j+sh) height = ((sh)-(j+sh-y2)+1)-top; else height = sh-top; tbx1 = tbx+left/sw*tbw, tby1 = tby+top/sh*tbh, tbx2 = tbx+(left+width)/sw*tbw, tby2 = tby+(top+height)/sh*tbh; draw_primitive_begin_texture(pr_trianglestrip, bck2d->texture); draw_vertex_texture_color(X,Y,tbx1,tby1,color,alpha); draw_vertex_texture_color(X+width,Y,tbx2,tby1,color,alpha); draw_vertex_texture_color(X,Y+height,tbx1,tby2,color,alpha); draw_vertex_texture_color(X+width,Y+height,tbx2,tby2,color,alpha); draw_primitive_end(); } j = jj; } }
void draw_background_part(int back, gs_scalar left, gs_scalar top, gs_scalar width, gs_scalar height, gs_scalar x, gs_scalar y, int color, gs_scalar alpha) { alpha=clamp_alpha(alpha); get_background(bck2d, back); const gs_scalar tbw = bck2d->width/(gs_scalar)bck2d->texturew, tbh = bck2d->height/(gs_scalar)bck2d->textureh, tbx = bck2d->texturex,tby = bck2d->texturey, tbx1 = tbx + left/tbw, tbx2 = tbx + tbx1 + width/tbw, tby1 = tby + top/tbh, tby2 = tby + tby1 + height/tbh; draw_primitive_begin_texture(pr_trianglestrip, bck2d->texture); draw_vertex_texture_color(x,y,tbx1,tby1,color,alpha); draw_vertex_texture_color(x+width,y,tbx2,tby1,color,alpha); draw_vertex_texture_color(x,y+height,tbx1,tby2,color,alpha); draw_vertex_texture_color(x+width,y+height,tbx2,tby2,color,alpha); draw_primitive_end(); }
void draw_background_tiled_ext(int back, gs_scalar x, gs_scalar y, gs_scalar xscale, gs_scalar yscale, int color, gs_scalar alpha, bool htiled, bool vtiled) { alpha=clamp_alpha(alpha); get_background(bck2d,back); const gs_scalar tbx = bck2d->texturex, tby = bck2d->texturey, tbw = bck2d->texturew, tbh = bck2d->textureh, width_scaled = bck2d->width*xscale, height_scaled = bck2d->height*yscale; int hortil, vertil; if (htiled) { hortil = int(ceil((gs_scalar)room_width/((gs_scalar)width_scaled*tbw))) + 1; x = -((x<0?0:width_scaled)-fmod(x,width_scaled)); } else { hortil = 1; } if (vtiled) { vertil = int(ceil((gs_scalar)room_height/((gs_scalar)height_scaled*tbh))) + 1; y = -((y<0?0:height_scaled)-fmod(y,height_scaled)); } else { vertil = 1; } gs_scalar xvert1 = x, xvert2 = xvert1 + width_scaled, yvert1, yvert2; for (int i=0; i<hortil; ++i) { yvert1 = y; yvert2 = yvert1 + height_scaled; for (int c=0; c<vertil; ++c) { draw_primitive_begin_texture(pr_trianglestrip, bck2d->texture); draw_vertex_texture_color(xvert1,yvert1,tbx,tby,color,alpha); draw_vertex_texture_color(xvert2,yvert1,tbx+tbw,tby,color,alpha); draw_vertex_texture_color(xvert1,yvert2,tbx,tby+tbh,color,alpha); draw_vertex_texture_color(xvert2,yvert2,tbx+tbw,tby+tbh,color,alpha); draw_primitive_end(); yvert1 = yvert2; yvert2 += height_scaled; } xvert1 = xvert2; xvert2 += width_scaled; } }
pixel_t over_layer_mode_fun::operator()( const pixel_t& back, const pixel_t& front) const { __m128 b = _mm_load_ps( reinterpret_cast<const float*>( &back)); __m128 f = _mm_load_ps( reinterpret_cast<const float*>( &front)); f = _mm_mul_ps( f, opacity_); float *p = reinterpret_cast<float*>( &f); float alpha = p[3]; float alpha_inv = 1.0f - alpha; __m128 a = _mm_set_ps( 1.0f, alpha_inv, alpha_inv, alpha_inv); b = _mm_mul_ps( b, a); f = _mm_add_ps( f, b); f = clamp_alpha( f); p = reinterpret_cast<float*>( &f); return pixel_t( p[0], p[1], p[2], p[3]); }