/*! @brief 旗を描画する @param g 描画先 */ void mine_tile::draw_flag(Graphics* g){ static const int A = 0xFFFFFFFF; static const int B = 0xFF000000; static const int C = 0xFFFF0000; static const int flag_dot[16][16] = { {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,C,C,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,C,C,C,A,A,A,A,A,A}, {A,A,A,A,A,A,A,C,C,C,C,C,A,A,A,A}, {A,A,A,A,A,A,A,C,C,C,C,C,A,A,A,A}, {A,A,A,A,A,A,A,C,C,C,A,A,A,A,A,A}, {A,A,A,A,A,A,A,C,C,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,B,B,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,B,B,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,B,B,A,A,A,A,A,A,A}, {A,A,A,A,A,A,B,B,B,B,A,A,A,A,A,A}, {A,A,A,A,A,B,B,B,B,B,B,A,A,A,A,A}, {A,A,A,A,B,B,B,B,B,B,B,B,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A}, }; bit_blt(g, &flag_dot[0][0]); }
/*! @biref 赤色の×を描画する @param g 描画先 */ void mine_tile::draw_cross(Graphics* g){ static const int A = 0xFFFFFFFF; static const int B = 0xFFFF0000; static const int cross_dot[16][16] = { {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A}, {A,A,B,A,A,A,A,A,A,A,A,A,A,B,A,A}, {A,A,A,B,A,A,A,A,A,A,A,A,B,A,A,A}, {A,A,A,A,B,A,A,A,A,A,A,B,A,A,A,A}, {A,A,A,A,A,B,A,A,A,A,B,A,A,A,A,A}, {A,A,A,A,A,A,B,A,A,B,A,A,A,A,A,A}, {A,A,A,A,A,A,A,B,B,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,B,B,A,A,A,A,A,A,A}, {A,A,A,A,A,A,B,A,A,B,A,A,A,A,A,A}, {A,A,A,A,A,B,A,A,A,A,B,A,A,A,A,A}, {A,A,A,A,B,A,A,A,A,A,A,B,A,A,A,A}, {A,A,A,B,A,A,A,A,A,A,A,A,B,A,A,A}, {A,A,B,A,A,A,A,A,A,A,A,A,A,B,A,A}, {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A} }; bit_blt(g, &cross_dot[0][0]); }
/*! @brief タイルが押された後の、グリッドを描画する @param g 描画先 */ void mine_tile::draw_grid(Graphics* g){ static const int A = 0xFF444444; static const int B = 0xFF888888; static const int grid_dot[16][16] = { {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A}, {A,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B}, {A,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B}, {A,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B}, {A,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B}, {A,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B}, {A,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B}, {A,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B}, {A,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B}, {A,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B}, {A,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B}, {A,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B}, {A,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B}, {A,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B}, {A,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B}, {A,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B} }; bit_blt(g, &grid_dot[0][0]); }
/*! @brief 爆弾を描画する @param g 描画先 */ void mine_tile::draw_bomb(Graphics* g){ static const int A = 0xFFFFFFFF; static const int B = 0xFF000000; static const int C = 0xFFFF0000; static const int bomb_dot[16][16] = { {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A}, {A,A,A,A,C,A,C,C,A,C,C,A,C,A,A,A}, {A,A,A,A,A,C,A,A,C,A,A,C,A,A,A,A}, {A,A,A,A,A,A,C,C,C,C,C,A,A,A,A,A}, {A,A,A,A,A,A,B,B,B,B,A,A,A,A,A,A}, {A,A,A,A,A,B,B,B,B,B,B,A,A,A,A,A}, {A,A,A,A,B,B,B,B,B,B,B,B,A,A,A,A}, {A,A,A,A,B,B,B,B,B,B,B,B,A,A,A,A}, {A,A,A,A,B,B,B,B,B,B,B,B,A,A,A,A}, {A,A,A,A,B,B,B,B,B,B,B,B,A,A,A,A}, {A,A,A,A,A,B,B,B,B,B,B,A,A,A,A,A}, {A,A,A,A,A,A,B,B,B,B,A,A,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A} }; bit_blt(g, &bomb_dot[0][0]); }
static void make_frame_planar_yuv ( AVPicture *av_picture, int width, int height, const component_reorder_t *component_reorder, VSFrameRef *vs_frame, VSFrameContext *frame_ctx, const VSAPI *vsapi ) { const VSFormat *vs_format = vsapi->getFrameFormat( vs_frame ); int av_row_size_y = vs_format->bytesPerSample * width; for( int i = 0; i < 3; i++ ) { int vs_frame_linesize = vsapi->getStride ( vs_frame, i ); uint8_t *vs_frame_data = vsapi->getWritePtr( vs_frame, i ); int av_plane = component_reorder[i]; int av_frame_linesize = av_picture->linesize[av_plane]; uint8_t *av_frame_data = av_picture->data [av_plane]; int av_row_size = av_row_size_y >> (i ? vs_format->subSamplingW : 0); int av_height = height >> (i ? vs_format->subSamplingH : 0); bit_blt( vs_frame_data, vs_frame_linesize, av_frame_data, av_frame_linesize, av_row_size, av_height ); } }
static void VS_CC write_planar(img_hnd_t *ih, int n, VSFrameRef **dst, VSCore *core, const VSAPI *vsapi) { uint8_t *srcp = ih->image_buff; for (int i = 0, num = ih->src[n].format->numPlanes; i < num; i++) { int row_size = vsapi->getFrameWidth(dst[0], i) * ih->src[n].format->bytesPerSample; row_size = (row_size + ih->row_adjust) & (~ih->row_adjust); int height = vsapi->getFrameHeight(dst[0], i); bit_blt(dst[0], i, vsapi, srcp, row_size, height); srcp += row_size * height; } if (ih->enable_alpha) { set_dummy_alpha(ih, n, dst[1], core, vsapi); } }
/*! @brief まだ押されていないタイルを描画する @param g 描画先 */ void mine_tile::draw_frame(Graphics* g){ static const int A = 0xFFAAAAAA; static const int B = 0xFF888888; static const int C = 0xFF444444; static const int frame_dot[16][16] = { {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,C}, {A,A,A,A,A,A,A,A,A,A,A,A,A,A,C,C}, {A,A,A,A,A,A,A,A,A,A,A,A,A,C,C,C}, {A,A,A,B,B,B,B,B,B,B,B,B,B,C,C,C}, {A,A,A,B,B,B,B,B,B,B,B,B,B,C,C,C}, {A,A,A,B,B,B,B,B,B,B,B,B,B,C,C,C}, {A,A,A,B,B,B,B,B,B,B,B,B,B,C,C,C}, {A,A,A,B,B,B,B,B,B,B,B,B,B,C,C,C}, {A,A,A,B,B,B,B,B,B,B,B,B,B,C,C,C}, {A,A,A,B,B,B,B,B,B,B,B,B,B,C,C,C}, {A,A,A,B,B,B,B,B,B,B,B,B,B,C,C,C}, {A,A,A,B,B,B,B,B,B,B,B,B,B,C,C,C}, {A,A,A,B,B,B,B,B,B,B,B,B,B,C,C,C}, {A,A,A,C,C,C,C,C,C,C,C,C,C,C,C,C}, {A,A,C,C,C,C,C,C,C,C,C,C,C,C,C,C}, {A,C,C,C,C,C,C,C,C,C,C,C,C,C,C,C} }; bit_blt(g, &frame_dot[0][0]); }
/*! @brief 数字(1〜8)を描画する。 @param g 描画先 */ void mine_tile::draw_number(Graphics* g){ if(value == 0){ //数字無し return; } static const int A = 0xFFFFFFFF; static const int B = 0xFF0000FF; static const int C = 0xFF00FF00; static const int D = 0xFFFF0000; static const int E = 0xFF00CCCC; static const int F = 0xFFCCCC00; static const int G = 0xFFCC00CC; static const int H = 0xFF00AAAA; static const int I = 0xFFAA00AA; static const int number_dot[8][16][16] = { { /* 1 */ {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,A,B,B,A,A,A,A,A,A}, {A,A,A,A,A,A,A,B,B,B,A,A,A,A,A,A}, {A,A,A,A,A,A,B,B,B,B,A,A,A,A,A,A}, {A,A,A,A,A,B,A,B,B,B,A,A,A,A,A,A}, {A,A,A,A,A,A,A,B,B,B,A,A,A,A,A,A}, {A,A,A,A,A,A,A,B,B,B,A,A,A,A,A,A}, {A,A,A,A,A,A,A,B,B,B,A,A,A,A,A,A}, {A,A,A,A,A,A,A,B,B,B,A,A,A,A,A,A}, {A,A,A,A,A,A,A,B,B,B,A,A,A,A,A,A}, {A,A,A,A,A,A,A,B,B,B,A,A,A,A,A,A}, {A,A,A,A,A,B,B,B,B,B,B,B,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A} }, { /* 2 */ {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A}, {A,A,A,A,A,A,C,C,C,C,A,A,A,A,A,A}, {A,A,A,A,A,C,C,A,A,C,C,A,A,A,A,A}, {A,A,A,A,A,C,C,A,A,A,C,C,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,C,C,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,C,C,A,A,A,A}, {A,A,A,A,A,A,A,A,A,C,C,A,A,A,A,A}, {A,A,A,A,A,A,A,A,C,C,A,A,A,A,A,A}, {A,A,A,A,A,A,A,C,C,A,A,A,A,A,A,A}, {A,A,A,A,A,A,C,C,A,A,A,A,A,A,A,A}, {A,A,A,A,A,C,C,C,C,C,C,C,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A} }, { /* 3 */ {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A}, {A,A,A,A,A,D,D,D,D,D,A,A,A,A,A,A}, {A,A,A,A,A,A,A,D,D,D,D,A,A,A,A,A}, {A,A,A,A,A,A,A,A,A,D,D,D,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,D,D,D,A,A,A}, {A,A,A,A,A,A,A,A,A,A,D,D,D,A,A,A}, {A,A,A,A,A,A,A,A,A,A,D,D,A,A,A,A}, {A,A,A,A,A,A,A,D,D,D,A,A,A,A,A,A}, {A,A,A,A,A,A,A,A,A,D,D,A,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,D,D,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,D,D,D,A,A,A}, {A,A,A,A,A,A,A,A,A,A,D,D,D,A,A,A}, {A,A,A,A,A,A,A,A,D,D,D,D,A,A,A,A}, {A,A,A,A,A,D,D,D,D,D,A,A,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A} }, { /* 4 */ {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,A,E,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,E,E,A,A,A,A,A,A,A}, {A,A,A,A,A,A,E,E,E,A,A,A,A,A,A,A}, {A,A,A,A,A,E,E,E,E,A,A,A,A,A,A,A}, {A,A,A,A,E,E,A,E,E,A,A,A,A,A,A,A}, {A,A,A,E,E,A,A,E,E,A,A,A,A,A,A,A}, {A,A,A,A,E,A,A,E,E,A,A,A,A,A,A,A}, {A,A,A,A,A,E,E,E,E,E,E,E,A,A,A,A}, {A,A,A,A,A,A,A,E,E,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,E,E,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,E,E,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,E,E,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A} }, { /* 5 */ {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A}, {A,A,A,A,F,F,F,F,F,F,F,F,A,A,A,A}, {A,A,A,A,F,F,A,A,A,A,A,A,A,A,A,A}, {A,A,A,A,F,F,A,A,A,A,A,A,A,A,A,A}, {A,A,A,A,F,F,A,A,A,A,A,A,A,A,A,A}, {A,A,A,A,A,F,F,A,A,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,F,F,F,A,A,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,F,F,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,A,F,F,A,A,A}, {A,A,A,A,A,A,A,A,A,A,A,F,F,A,A,A}, {A,A,A,A,A,A,A,A,A,A,F,F,A,A,A,A}, {A,A,A,A,A,A,A,A,A,F,F,A,A,A,A,A}, {A,A,A,A,A,F,F,F,F,F,A,A,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A} }, { /* 6 */ {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,G,G,A,A,A,A,A,A,A}, {A,A,A,A,A,A,G,G,A,A,A,A,A,A,A,A}, {A,A,A,A,A,G,G,A,A,A,A,A,A,A,A,A}, {A,A,A,A,G,G,A,A,A,A,A,A,A,A,A,A}, {A,A,A,A,G,G,A,A,A,A,A,A,A,A,A,A}, {A,A,A,A,G,A,A,A,G,G,G,A,A,A,A,A}, {A,A,A,A,G,A,G,G,A,A,A,G,A,A,A,A}, {A,A,A,A,G,G,A,A,A,A,A,G,A,A,A,A}, {A,A,A,A,G,G,A,A,A,A,A,G,A,A,A,A}, {A,A,A,A,A,G,G,A,A,G,G,A,A,A,A,A}, {A,A,A,A,A,A,G,G,G,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A} }, { /* 7 */ {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A}, {A,A,A,A,A,H,H,H,H,H,H,H,A,A,A,A}, {A,A,A,A,A,H,H,H,H,H,H,H,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,H,H,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,H,H,A,A,A,A}, {A,A,A,A,A,A,A,A,A,H,H,A,A,A,A,A}, {A,A,A,A,A,A,A,A,A,H,H,A,A,A,A,A}, {A,A,A,A,A,A,A,A,A,H,H,A,A,A,A,A}, {A,A,A,A,A,A,A,A,H,H,A,A,A,A,A,A}, {A,A,A,A,A,A,A,A,H,H,A,A,A,A,A,A}, {A,A,A,A,A,A,A,A,H,H,A,A,A,A,A,A}, {A,A,A,A,A,A,A,H,H,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,H,H,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A} }, { /* 8 */ {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A}, {A,A,A,A,A,A,I,I,I,I,A,A,A,A,A,A}, {A,A,A,A,I,I,A,A,A,A,I,I,A,A,A,A}, {A,A,A,A,I,A,A,A,A,A,A,I,A,A,A,A}, {A,A,A,A,I,A,A,A,A,A,A,I,A,A,A,A}, {A,A,A,A,I,I,A,A,A,A,I,I,A,A,A,A}, {A,A,A,A,A,A,I,I,I,I,A,A,A,A,A,A}, {A,A,A,A,I,I,A,A,A,A,I,I,A,A,A,A}, {A,A,A,A,I,A,A,A,A,A,A,I,A,A,A,A}, {A,A,A,A,I,A,A,A,A,A,A,I,A,A,A,A}, {A,A,A,A,I,I,A,A,A,A,I,I,A,A,A,A}, {A,A,A,A,A,A,I,I,I,I,A,A,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A}, {A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A} }, }; bit_blt(g, &number_dot[value-1][0][0]); }
/**************************************************************************** * * ROUTINE : xprintf * * INPUTS : const PB_INSTANCE *ppbi : Pointer to decoder instance. * long n_pixel : Offset into buffer to write text. * const char *format : Format string for print. * ... : Variable length argument list. * * OUTPUTS : None. * * RETURNS : int: Size (in bytes) of the formatted text. * * FUNCTION : Display a printf style message on the current video frame. * * SPECIAL NOTES : None. * ****************************************************************************/ int onyx_xprintf(unsigned char *ppbuffer, long n_pixel, long n_size, long n_stride, const char *format, ...) { BOOL b_rc; va_list arglist; HFONT hfont, hfonto; int rc = 0; char sz_formatted[256] = ""; unsigned char *p_dest = &ppbuffer[n_pixel]; #ifdef _WIN32_WCE // Set up temporary bitmap HDC hdc_memory = NULL; HBITMAP hbm_temp = NULL; HBITMAP hbm_orig = NULL; RECT rect; // Copy bitmap to video frame long x; long y; // Format text va_start(arglist, format); _vsnprintf(sz_formatted, sizeof(sz_formatted), format, arglist); va_end(arglist); rect.left = 0; rect.top = 0; rect.right = 8 * strlen(sz_formatted); rect.bottom = 8; hdc_memory = create_compatible_dc(NULL); if (hdc_memory == NULL) goto Exit; hbm_temp = create_bitmap(rect.right, rect.bottom, 1, 1, NULL); if (hbm_temp == NULL) goto Exit; hbm_orig = (HBITMAP)(select_object(hdc_memory, hbm_temp)); if (!hbm_orig) goto Exit; // Write text into bitmap // font? hfont = create_font(8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, VARIABLE_PITCH | FF_SWISS, ""); if (hfont == NULL) goto Exit; hfonto = (HFONT)(select_object(hdc_memory, hbm_temp)); if (!hfonto) goto Exit; select_object(hdc_memory, hfont); set_text_color(hdc_memory, 1); set_bk_color(hdc_memory, 0); set_bk_mode(hdc_memory, TRANSPARENT); b_rc = bit_blt(hdc_memory, rect.left, rect.top, rect.right, rect.bottom, hdc_memory, rect.left, rect.top, BLACKNESS); if (!b_rc) goto Exit; b_rc = ext_text_out(hdc_memory, 0, 0, ETO_CLIPPED, &rect, sz_formatted, strlen(sz_formatted), NULL); if (!b_rc) goto Exit; for (y = rect.top; y < rect.bottom; ++y) { for (x = rect.left; x < rect.right; ++x) { if (get_pixel(hdc_memory, x, rect.bottom - 1 - y)) p_dest[x] = 255; } p_dest += n_stride; } rc = strlen(sz_formatted); Exit: if (hbm_temp != NULL) { if (hbm_orig != NULL) { select_object(hdc_memory, hbm_orig); } delete_object(hbm_temp); } if (hfont != NULL) { if (hfonto != NULL) select_object(hdc_memory, hfonto); delete_object(hfont); } if (hdc_memory != NULL) delete_dc(hdc_memory); hdc_memory = 0; #endif return rc; }
static RSFilterResponse * get_image(RSFilter *filter, const RSFilterRequest *request) { RSDcp *dcp = RS_DCP(filter); RSDcpClass *klass = RS_DCP_GET_CLASS(dcp); GdkRectangle *roi; RSFilterResponse *previous_response; RSFilterResponse *response; RS_IMAGE16 *input; RS_IMAGE16 *output; RS_IMAGE16 *tmp; gint j; RSFilterRequest *request_clone = rs_filter_request_clone(request); if (!dcp->use_profile) { gfloat premul[4] = {dcp->pre_mul.x, dcp->pre_mul.y, dcp->pre_mul.z, 1.0}; rs_filter_param_set_float4(RS_FILTER_PARAM(request_clone), "premul", premul); } rs_filter_param_set_object(RS_FILTER_PARAM(request_clone), "colorspace", klass->prophoto); previous_response = rs_filter_get_image(filter->previous, request_clone); g_object_unref(request_clone); if (!RS_IS_FILTER(filter->previous)) return previous_response; input = rs_filter_response_get_image(previous_response); if (!input) return previous_response; response = rs_filter_response_clone(previous_response); /* We always deliver in ProPhoto */ rs_filter_param_set_object(RS_FILTER_PARAM(response), "colorspace", klass->prophoto); g_object_unref(previous_response); if ((roi = rs_filter_request_get_roi(request))) { /* Align so we start at even pixel counts */ roi->width += (roi->x&1); roi->x -= (roi->x&1); roi->width = MIN(input->w - roi->x, roi->width); output = rs_image16_copy(input, FALSE); tmp = rs_image16_new_subframe(output, roi); bit_blt((char*)GET_PIXEL(tmp,0,0), tmp->rowstride * 2, (const char*)GET_PIXEL(input,roi->x,roi->y), input->rowstride * 2, tmp->w * tmp->pixelsize * 2, tmp->h); } else { output = rs_image16_copy(input, TRUE); tmp = g_object_ref(output); } g_object_unref(input); rs_filter_response_set_image(response, output); g_object_unref(output); g_static_rec_mutex_lock(&dcp_mutex); init_exposure(dcp); guint i, y_offset, y_per_thread, threaded_h; guint threads = rs_get_number_of_processor_cores(); if (tmp->h * tmp->w < 200*200) threads = 1; ThreadInfo *t = g_new(ThreadInfo, threads); threaded_h = tmp->h; y_per_thread = (threaded_h + threads-1)/threads; y_offset = 0; for (i = 0; i < threads; i++) { t[i].tmp = tmp; t[i].start_y = y_offset; t[i].start_x = 0; t[i].dcp = dcp; y_offset += y_per_thread; y_offset = MIN(tmp->h, y_offset); t[i].end_y = y_offset; for(j = 0; j < 256; j++) t[i].curve_input_values[j] = 0; t[i].single_thread = (threads == 1); if (threads == 1) start_single_dcp_thread(&t[0]); else t[i].threadid = g_thread_create(start_single_dcp_thread, &t[i], TRUE, NULL); } /* Wait for threads to finish */ for(i = 0; threads > 1 && i < threads; i++) g_thread_join(t[i].threadid); /* Settings can change now */ g_static_rec_mutex_unlock(&dcp_mutex); /* If we must deliver histogram data, do it now */ if (dcp->read_out_curve) { gint *values = g_malloc0(256*sizeof(gint)); for(i = 0; i < threads; i++) for(j = 0; j < 256; j++) values[j] += t[i].curve_input_values[j]; rs_curve_set_histogram_data(RS_CURVE_WIDGET(dcp->read_out_curve), values); g_free(values); } g_free(t); g_object_unref(tmp); return response; }