void SvgSubprocessCharacterGenerator::run_thread( ) { RawFrame *frame; size_t svg_size; uint8_t alpha; char *svg_data; /* fork subprocess */ do_fork( ); for (;;) { /* request a SVG from the subprocess */ request( ); /* get the SVG */ svg_size = read_item_from_fd<uint32_t>(recv_fd); alpha = read_item_from_fd<uint8_t>(recv_fd); _dirty_level = read_item_from_fd<uint8_t>(recv_fd); if (svg_size > 0) { svg_data = read_svg(svg_size); /* render SVG to frame */ frame = RsvgFrame::render_svg(svg_data, svg_size); frame->set_global_alpha(alpha); free(svg_data); /* put frame down the pipe */ _output_pipe.put(frame); } else { _output_pipe.put(NULL); } } }
void SvgSubprocessCharacterGenerator::run_thread( ) { size_t svg_size; char *svg_data; /* fork subprocess */ do_fork( ); for (;;) { /* request a SVG from the subprocess */ request( ); /* get the SVG */ svg_size = read_item_from_fd<uint32_t>(recv_fd); _alpha = read_item_from_fd<uint8_t>(recv_fd); _dirty_level = read_item_from_fd<uint8_t>(recv_fd); if (svg_size > 0) { svg_data = read_svg(svg_size); /* render SVG to frame */ { MutexLock lock(mut); RawFrame* old_old_frame = _old_frame; _old_frame = _frame; _frame = RsvgFrame::render_svg(svg_data, svg_size); _frame->set_global_alpha(_alpha); delete old_old_frame; } free(svg_data); // fprintf(stderr, "frame rendered: %zx %x %x\n", // svg_size, _alpha, _dirty_level); /* put frame down the pipe */ _output_pipe.put(_frame); } else { _output_pipe.put(NULL); } } }