int process_lines() { if (!ftfont) return 0; vsx_string<>deli = "\n"; vsx_nw_vector< vsx_string<> > t_lines; vsx_string_helper::explode(text_in->get(), deli, t_lines); lines.clear(); for (unsigned long i = 0; i < t_lines.size(); ++i) { float x1, y1, z1, x2, y2, z2; lines[i].string = t_lines[i]; ftfont->BBox(t_lines[i].c_str(), x1, y1, z1, x2, y2, z2); lines[i].size_x = x2 - x1; lines[i].size_y = y2 - y1; } return 1; }
int load_avi_file() { bitm.valid=false; const char *avifilename = filename->get().c_str(); HRESULT res = AVIFileOpen(&m_aviFile, avifilename, OF_READ, NULL); if (res!=AVIERR_OK) { printf("Couldn't open avi file %s\n",filename->get().c_str()); return 0; } res = AVIFileGetStream(m_aviFile, &streamVid, streamtypeVIDEO, 0); if (res!=AVIERR_OK) { AVIFileRelease(m_aviFile); m_aviFile = NULL; streamVid = NULL; printf("Couldn't get stream"); return 0; } LONG format_length = 0; AVIStreamReadFormat(streamVid,0,NULL,&format_length); //if format_data is not a reasonable size, fail if (format_length>128) { printf("Format data too big"); return 0; } //make room for at least 128 bytes, sizeof(int) aligned int format_data[(128/sizeof(int)) + 1]; AVIStreamReadFormat(streamVid,0,format_data,&format_length); BITMAPINFOHEADER *bi = (BITMAPINFOHEADER *)format_data; //only 24 bit output is supported if (bi->biBitCount!=24) { printf("Bitcount %d not supported",bi->biBitCount); return 0; } // Create the PGETFRAME getFrame = AVIStreamGetFrameOpen(streamVid,NULL); //unable to decode the .avi? if (getFrame==NULL) { printf("AVIStreamGetFrameOpen returned NULL"); return 0; } // Define the length of the video (necessary for loop reading) // and its size. num_frames = AVIStreamLength(streamVid); if (num_frames<1) { printf("Zero frames"); return 0; } AVISTREAMINFO psi; AVIStreamInfo(streamVid, &psi, sizeof(AVISTREAMINFO)); width = psi.rcFrame.right - psi.rcFrame.left; height = psi.rcFrame.bottom - psi.rcFrame.top; dwRate = psi.dwRate; dwScale = psi.dwScale; bitm.bpp=(int)(bi->biBitCount/8); bitm.bformat=GL_BGR; bitm.size_x=width; bitm.size_y=height; bitm.valid=true; return 1; }
void output(vsx_module_param_abs* param) { VSX_UNUSED(param); if (text_in->updates) { if (process_lines()) text_in->updates = 0; } if (text_alpha->get() <= 0) return; if (!ftfont) { user_message = "module||error loading font "+cur_font; return; } if (text_in->get() == "_") return; float obj_size = size->get(); gl_state->matrix_mode (VSX_GL_MODELVIEW_MATRIX ); gl_state->matrix_push(); gl_state->matrix_rotate_f( (float)angle->get()*360, rotation_axis->get(0), rotation_axis->get(1), rotation_axis->get(2) ); if (obj_size < 0) obj_size = 0; gl_state->matrix_scale_f( obj_size*0.8*0.01, obj_size*0.01, obj_size*0.01 ); int l_align = align->get(); float l_leading = leading->get(); float ypos = 0; if (cur_render_type == 0) glEnable(GL_TEXTURE_2D); glColor4f(red->get(),green->get(),blue->get(),text_alpha->get()); for (unsigned long i = 0; i < lines.size(); ++i) { float ll = limit_line->get(); if (ll != -1.0f) { if (trunc(ll) != i) continue; } gl_state->matrix_push(); if (l_align == 0) { gl_state->matrix_translate_f( 0, ypos, 0 ); } else if (l_align == 1) { gl_state->matrix_translate_f( -lines[i].size_x*0.5f,ypos,0 ); } if (l_align == 2) { gl_state->matrix_translate_f( -lines[i].size_x,ypos,0 ); } if (cur_render_type == 1) { if (outline_alpha->get() > 0.0f && ftfont2) { float pre_linew; pre_linew = gl_state->line_width_get(); gl_state->line_width_set( outline_thickness->get() ); glColor4f(outline_color->get(0),outline_color->get(1),outline_color->get(2),outline_alpha->get()*outline_color->get(3)); ftfont2->Render(lines[i].string.c_str()); gl_state->line_width_set( pre_linew ); } glColor4f(red->get(),green->get(),blue->get(),text_alpha->get()); } ftfont->Render(lines[i].string.c_str()); gl_state->matrix_pop(); ypos += l_leading; } if (cur_render_type == 0) glDisable(GL_TEXTURE_2D); gl_state->matrix_pop(); render_result->set(1); loading_done = true; }