X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fguicast%2Fvframe.C;h=63c36f06b4ee0d86c914e82a267a0c133bc17d70;hp=6f0dfbb18e754e8afeed54fb846628a4df0e14e6;hb=230f4fdce9d4b62d8780702bb406a1f5f629a3c3;hpb=d66d68b9a5228a2f5894ea39e852df19036af800 diff --git a/cinelerra-5.1/guicast/vframe.C b/cinelerra-5.1/guicast/vframe.C index 6f0dfbb1..63c36f06 100644 --- a/cinelerra-5.1/guicast/vframe.C +++ b/cinelerra-5.1/guicast/vframe.C @@ -44,7 +44,7 @@ class PngReadFunction { public: static void png_read_function(png_structp png_ptr, - png_bytep data, png_size_t length) + png_bytep data, png_size_t length) { VFrame *frame = (VFrame*)png_get_io_ptr(png_ptr); if(frame->image_size - frame->image_offset < (long)length) @@ -390,10 +390,11 @@ int VFrame::get_keyframe() void VFrame::get_temp(VFrame *&vfrm, int w, int h, int color_model) { - if( vfrm && ( vfrm->get_w() != w || vfrm->get_h() != h ) ) { - delete vfrm; vfrm = 0; - } - if( !vfrm ) vfrm = new VFrame(w, h, color_model, 0); + if( vfrm && ( vfrm->color_model != color_model || + vfrm->get_w() != w || vfrm->get_h() != h ) ) { + delete vfrm; vfrm = 0; + } + if( !vfrm ) vfrm = new VFrame(w, h, color_model, 0); } @@ -828,7 +829,7 @@ int VFramePng::read_png(const unsigned char *data, long sz, double xscale, doubl int ww = w * xscale, hh = h * yscale; if( ww != w || hh != h ) { VFrame vframe(*this); - reallocate(NULL, -1, 0, 0, 0, ww, hh, color_model, -1); + reallocate(NULL, -1, 0, 0, 0, ww, hh, color_model, -1); transfer_from(&vframe); } return 0; @@ -874,6 +875,28 @@ int VFrame::write_png(const char *path) return 0; } +void VFrame::write_ppm(VFrame *vfrm, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + char fn[BCTEXTLEN]; + vsnprintf(fn, sizeof(fn), fmt, ap); + va_end(ap); + FILE *fp = fopen(fn,"w"); + if( !fp ) { perror("write_ppm"); return; } + VFrame *frm = vfrm; + if( frm->get_color_model() != BC_RGB888 ) { + frm = new VFrame(frm->get_w(), frm->get_h(), BC_RGB888); + frm->transfer_from(vfrm); + } + int w = frm->get_w(), h = frm->get_h(); + fprintf(fp,"P6\n%d %d\n255\n",w,h); + unsigned char **rows = frm->get_rows(); + for( int i=0; i> 24); + pixel_rgb = (rgb&0xffffff) | ~a<<24; int ir = 0xff & (pixel_rgb >> 16); int ig = 0xff & (pixel_rgb >> 8); int ib = 0xff & (pixel_rgb >> 0); YUV::yuv.rgb_to_yuv_8(ir, ig, ib); - pixel_yuv = (ia<<24) | (ir<<16) | (ig<<8) | (ib<<0); + pixel_yuv = (~a<<24) | (ir<<16) | (ig<<8) | (ib<<0); } void VFrame::set_stiple(int mask) @@ -1397,6 +1419,7 @@ int VFrame::draw_pixel(int x, int y) case BC_A8: DRAW_PIXEL(uint8_t, ib, 0, 0, 1, 0); break; + case BC_RGB888: case BC_YUV888: DRAW_PIXEL(uint8_t, ir, ig, ib, 3, 0); break;