Progress bar and stuff

Originally committed to SVN as r269.
This commit is contained in:
Rodrigo Braz Monteiro 2006-03-31 12:01:40 +00:00
parent 149f6ced1e
commit f6b9862ea3
2 changed files with 37 additions and 9 deletions

View file

@ -53,6 +53,7 @@
#include "vfr.h" #include "vfr.h"
#include "utils.h" #include "utils.h"
#include "md5.h" #include "md5.h"
#include "dialog_progress.h"
#include "../prs/prs_file.h" #include "../prs/prs_file.h"
#include "../prs/prs_image.h" #include "../prs/prs_image.h"
#include "../prs/prs_display.h" #include "../prs/prs_display.h"
@ -110,12 +111,22 @@ void PRSSubtitleFormat::WriteFile(wxString filename,wxString encoding) {
int totalFrames = frames.size(); int totalFrames = frames.size();
id = 0; id = 0;
lastDisplay = NULL; lastDisplay = NULL;
optimizer = 0; // 0 = none, 1 = optipng, 2 = pngout
// Progress
DialogProgress *progress = new DialogProgress(NULL,_("Exporting PRS"),NULL,_("Writing file"),0,totalFrames);
progress->Show();
progress->SetProgress(0,totalFrames);
// Render all frames that were detected to contain subtitles // Render all frames that were detected to contain subtitles
for (int framen=0;framen<totalFrames;framen++) { for (int framen=0;framen<totalFrames;framen++) {
// Is this frame supposed to be rendered? // Is this frame supposed to be rendered?
if (frames[framen] == 0) continue; if (frames[framen] == 0) continue;
// Update progress
progress->SetProgress(framen,totalFrames);
progress->SetText(wxString::Format(_T("Writing PRS file. Line: %i/%i"),framen,totalFrames));
// Read the frame image // Read the frame image
PVideoFrame frame1 = clip1->GetFrame(framen,env1); PVideoFrame frame1 = clip1->GetFrame(framen,env1);
PVideoFrame frame2 = clip2->GetFrame(framen,env2); PVideoFrame frame2 = clip2->GetFrame(framen,env2);
@ -132,6 +143,9 @@ void PRSSubtitleFormat::WriteFile(wxString filename,wxString encoding) {
InsertFrame(file,framen,frames,bmp,x,y,maxalpha); InsertFrame(file,framen,frames,bmp,x,y,maxalpha);
} }
// Destroy progress bar
progress->Destroy();
// Save file // Save file
file.Save((const char*)filename.mb_str(wxConvLocal)); file.Save((const char*)filename.mb_str(wxConvLocal));
#endif #endif
@ -142,23 +156,30 @@ void PRSSubtitleFormat::WriteFile(wxString filename,wxString encoding) {
// Insert frame into file // Insert frame into file
void PRSSubtitleFormat::InsertFrame(PRSFile &file,int &framen,std::vector<int> &frames,wxImage &bmp,int x,int y,int maxalpha) { void PRSSubtitleFormat::InsertFrame(PRSFile &file,int &framen,std::vector<int> &frames,wxImage &bmp,int x,int y,int maxalpha) {
// Generic data holder // Generic data holder
//bmp.SaveFile(wxString::Format(_T("test_%i.png"),id),wxBITMAP_TYPE_PNG);
bool pngout = true;
size_t datasize = 0; size_t datasize = 0;
char *rawData = NULL; char *rawData = NULL;
std::vector<char> data; std::vector<char> data;
//bmp.SaveFile(wxString::Format(_T("test_%i.png"),id),wxBITMAP_TYPE_PNG);
// PNGout optimize // pngout/optipng optimize
if (pngout) { if (optimizer) {
// Save temporary PNG // Get temporary filename
wxString tempFile = wxFileName::CreateTempFileName(_T("aegiprs")); wxString tempFile = wxFileName::CreateTempFileName(_T("aegiprs"));
wxString tempOut = tempFile + _T("out.png"); wxString tempOut = tempFile + _T("out.png");
bmp.SaveFile(tempFile,wxBITMAP_TYPE_PNG);
// Run PNGcrush on it // Prepare arrays to capture output
wxArrayString output; wxArrayString output;
wxArrayString errors; wxArrayString errors;
wxExecute(_T("pngout.exe ") + tempFile + _T(" ") + tempOut + _T(" /f0 /y /v"),output,errors);
// Generate the temporary PNG and run the optimizer program on it
if (optimizer == 1) {
bmp.SaveFile(tempOut,wxBITMAP_TYPE_PNG);
wxExecute(AegisubApp::folderName + _T("optipng.exe -zc9 -zm8 -zs0-3 -f0 ") + tempOut,output,errors);
}
if (optimizer == 2) {
bmp.SaveFile(tempFile,wxBITMAP_TYPE_PNG);
wxExecute(AegisubApp::folderName + _T("pngout.exe ") + tempFile + _T(" ") + tempOut + _T(" /f0 /y /q"),output,errors);
}
// Read file back // Read file back
FILE *fp = fopen(tempOut.mb_str(wxConvLocal),"rb"); FILE *fp = fopen(tempOut.mb_str(wxConvLocal),"rb");
@ -434,7 +455,13 @@ wxImage PRSSubtitleFormat::CalculateAlpha(const unsigned char* frame1, const uns
if (dsty) *dsty = miny; if (dsty) *dsty = miny;
int width = maxx-minx+1; int width = maxx-minx+1;
int height = maxy-miny+1; int height = maxy-miny+1;
if (width <= 0 || height <= 0) return wxImage();
// 100% transparent image; clean up and return an empty one
if (width <= 0 || height <= 0) {
delete [] data;
delete [] alpha;
return wxImage();
}
// Create the actual image // Create the actual image
wxImage img(w/4,h,data,false); wxImage img(w/4,h,data,false);

View file

@ -56,6 +56,7 @@ class PRSSubtitleFormat : public SubtitleFormat {
private: private:
PRSDisplay *lastDisplay; PRSDisplay *lastDisplay;
int id; int id;
int optimizer;
void InsertFrame(PRSFile &file,int &framen,std::vector<int> &frames,wxImage &bmp,int x,int y,int maxalpha); void InsertFrame(PRSFile &file,int &framen,std::vector<int> &frames,wxImage &bmp,int x,int y,int maxalpha);
wxImage SubImageWithAlpha(wxImage src,const wxRect &area); wxImage SubImageWithAlpha(wxImage src,const wxRect &area);