mirror of https://github.com/odrling/Aegisub
Change PRS header, fixed some exception handling and added a (not coded) PRSFile::LoadText function
Originally committed to SVN as r297.
This commit is contained in:
parent
b973d58bee
commit
454297253c
|
@ -54,8 +54,11 @@ DrawPRS::DrawPRS (IScriptEnvironment* _env, PClip _child, const char *filename)
|
|||
}
|
||||
|
||||
// Catch exception
|
||||
catch (std::exception e) {
|
||||
env->ThrowError(e.what());
|
||||
catch (const std::exception &e) {
|
||||
env->ThrowError("Error in PRS loading: %s",e.what());
|
||||
}
|
||||
catch (...) {
|
||||
env->ThrowError("Unhandled exception in PRS loading.");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -96,11 +96,11 @@ void PRSFile::Save(std::string path) {
|
|||
|
||||
// Open file
|
||||
FILE *fp = fopen(path.c_str(),"wb");
|
||||
if (!fp) throw new std::exception("Failed to open file");
|
||||
if (!fp) throw std::exception("Failed to open file");
|
||||
|
||||
try {
|
||||
// Write the "PRS" (zero-terminated) string ID (4 bytes)
|
||||
fwrite("PRS",1,4,fp);
|
||||
fwrite("PRS-BIN",1,8,fp);
|
||||
|
||||
// Write version number (4 bytes)
|
||||
unsigned __int32 temp = 1;
|
||||
|
@ -144,19 +144,27 @@ void PRSFile::Load(std::string path, bool reset) {
|
|||
|
||||
// Open file
|
||||
FILE *fp = fopen(path.c_str(),"rb");
|
||||
if (!fp) throw new std::exception("Failed to open file");
|
||||
if (!fp) throw std::exception("Failed to open file");
|
||||
|
||||
try {
|
||||
// Read first four bytes
|
||||
char buf[5];
|
||||
buf[4] = 0;
|
||||
fread(buf,1,4,fp);
|
||||
if (strcmp(buf,"PRS") != 0) throw new std::exception("Invalid file type.");
|
||||
// Read first eight bytes
|
||||
char buf[16];
|
||||
fread(buf,1,8,fp);
|
||||
if (memcmp(buf,"PRS-BIN",8) != 0) {
|
||||
// Is actually ASCII, read as that
|
||||
if (memcmp(buf,"PRS-ASC",7) == 0) {
|
||||
LoadText(path,false);
|
||||
return;
|
||||
}
|
||||
|
||||
// Invalid
|
||||
throw std::exception("Invalid file type.");
|
||||
}
|
||||
|
||||
// Read version number
|
||||
unsigned __int32 temp = 0;
|
||||
fread(&temp,4,1,fp);
|
||||
if (temp != 1) throw new std::exception("Invalid version.");
|
||||
if (temp != 1) throw std::exception("Invalid version.");
|
||||
|
||||
// Read stream name length
|
||||
fread(&temp,4,1,fp);
|
||||
|
@ -309,11 +317,8 @@ PRSVideoFrame* PRSFile::CachedGetFrameByID(int id) {
|
|||
cached.frame = NULL;
|
||||
cacheMemSize += frame->GetSize();
|
||||
|
||||
// If memory has been exceeded, remove stuff from the back until it isn't anymore
|
||||
while (cacheMemSize > maxCache && frameCache.size() > 1) {
|
||||
cacheMemSize -= frameCache.back().frame->GetSize();
|
||||
frameCache.pop_back();
|
||||
}
|
||||
// Update cache
|
||||
EnforceCacheLimit();
|
||||
}
|
||||
|
||||
// Return it
|
||||
|
@ -321,6 +326,25 @@ PRSVideoFrame* PRSFile::CachedGetFrameByID(int id) {
|
|||
}
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////
|
||||
// Enforce the cache limit, that is, delete anything over it
|
||||
// This function will always leave at least one image on cache
|
||||
void PRSFile::EnforceCacheLimit() {
|
||||
while (cacheMemSize > maxCache && frameCache.size() > 1) {
|
||||
cacheMemSize -= frameCache.back().frame->GetSize();
|
||||
frameCache.pop_back();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////
|
||||
// Set maximum cache memory
|
||||
void PRSFile::SetCacheLimit(int bytes) {
|
||||
maxCache = bytes;
|
||||
EnforceCacheLimit();
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////
|
||||
// Finds which display blocks are at a position
|
||||
void PRSFile::GetDisplayBlocksAtFrame(int n,std::vector<PRSDisplay*> &blocks) {
|
||||
|
@ -430,3 +454,9 @@ void PRSFile::SaveText(std::string path) {
|
|||
// Close file
|
||||
file.close();
|
||||
}
|
||||
|
||||
|
||||
///////////////////
|
||||
// Load plain-text
|
||||
void PRSFile::LoadText(std::string path, bool reset) {
|
||||
}
|
||||
|
|
|
@ -60,6 +60,7 @@ private:
|
|||
int cacheMemSize;
|
||||
int maxCache;
|
||||
void Reset();
|
||||
void EnforceCacheLimit();
|
||||
|
||||
public:
|
||||
PRSFile();
|
||||
|
@ -77,8 +78,10 @@ public:
|
|||
bool HasDataAtFrame(int n);
|
||||
void DrawFrame(int n,PRSVideoFrame *frame);
|
||||
PRSImage *GetImageByID(int id);
|
||||
|
||||
PRSVideoFrame *CachedGetFrameByID(int id);
|
||||
void ClearCache();
|
||||
void SetCacheLimit(int bytes);
|
||||
|
||||
PRSImage *FindDuplicateImage(PRSImage *img);
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue