/* * This file is a part of Winix * and is not publicly distributed * * Copyright (c) 2010, Tomasz Sowa * All rights reserved. * */ #include #include "thumb.h" #include "utf8.h" #include "log.h" #include "system.h" void Thumb::SetDb(Db * pdb) { db = pdb; } void Thumb::SetConfig(Config * pconfig) { config = pconfig; } void Thumb::SetSystem(System * psystem) { system = psystem; } // first thread (objects locked) void Thumb::CreateThumb(const Item & item, size_t cx, size_t cy, int aspect_mode) { item_temp.file = item; item_temp.cx = cx; item_temp.cy = cy; item_temp.aspect_mode = aspect_mode; thumb_tab.insert(thumb_tab.end(), item_temp); WakeUpThread(); } // second thread (objects locked) bool Thumb::SignalReceived() { return !thumb_tab.empty(); } // second thread (objects not locked) void Thumb::Do() { ThumbTab::iterator i; bool end; Lock(); i = thumb_tab.begin(); Unlock(); do { Lock(); if( i != thumb_tab.end() ) { item_work = *i; thumb_tab.erase(i++); end = false; } else { end = true; } Unlock(); if( !end ) CreateThumbnail(); } while( !end && !IsExitSignal() ); } void Thumb::EscapePath(const std::string & path) { command << '"'; for(size_t i=0 ; i Change as per widthxheight but only if an image dimension exceeds a specified dimension. widthxheight< Change dimensions only if both image dimensions exceed specified dimensions. */ void Thumb::SelectAspect() { switch( item_work.aspect_mode ) { case WINIX_THUMB_MODE_1: command << item_work.cx; break; case WINIX_THUMB_MODE_3: command << item_work.cx << "x" << item_work.cy; break; case WINIX_THUMB_MODE_4: command << '"' << item_work.cx << "x" << item_work.cy << "^\""; break; case WINIX_THUMB_MODE_5: command << '"' << item_work.cx << "x" << item_work.cy << "!\""; break; case WINIX_THUMB_MODE_6: command << '"' << item_work.cx << "x" << item_work.cy << ">\""; break; case WINIX_THUMB_MODE_7: command << '"' << item_work.cx << "x" << item_work.cy << "<\""; break; case WINIX_THUMB_MODE_2: default: command << "x" << item_work.cy; break; } } // second thread (objects are not locked) bool Thumb::CreateCommand() { bool res; command.Clear(); stream_tmp_path.Clear(); Lock(); Ezc::WideToUTF8(config->convert_cmd, tempa); command << tempa << " -quiet -strip -thumbnail "; SelectAspect(); command << " "; if( system->MakeFilePath(item_work.file, src_path) ) { Ezc::WideToUTF8(src_path, tempa); EscapePath(tempa); stream_tmp_path << config->upload_dir << L"/tmp/thumb_" << std::time(0); Ezc::WideToUTF8(stream_tmp_path.Str(), string_tmp_patha); EscapePath(string_tmp_patha); res = true; } else { log << log1 << "Thumb: cannot create a source path" << logend; res = false; } Unlock(); return res; } // second thread (objects are not locked) void Thumb::SaveTmpThumbnail() { bool moved = false; Lock(); // the file could have been changed especially when creating thumbnail lasted too long iq.SetAll(false, false); iq.sel_parent_id = true; iq.sel_file = true; iq.sel_url = true; iq.sel_type = true; iq.WhereId(item_work.file.id); if( db->GetItem(item_work.file, iq) == WINIX_ERR_OK ) { if( system->MakeFilePath(item_work.file, dst_path, true, true, config->upload_dirs_chmod) ) { if( RenameFile(stream_tmp_path.Str(), dst_path) ) { log << log3 << "Thumb: created a thumbnail: " << dst_path << logend; db->EditHasThumbById(true, item_work.file.id); moved = true; } else { log << log1 << "Thumb: cannot move a temporary file: " << stream_tmp_path.Str() << ", to: " << dst_path << logend; } } else { log << log1 << "Thumb: cannot create a destination path" << logend; } } if( !moved ) ::RemoveFile(stream_tmp_path.Str()); Unlock(); } // second thread (objects are not locked) void Thumb::CreateThumbnail() { if( !CreateCommand() ) return; int res = std::system(command.CStr()); if( res == 0 ) { SaveTmpThumbnail(); } else { Lock(); log << log3 << "Thumb: some problems with creating a thumbnail " << tempa << ", 'convert' process returned: " << res << logend; Unlock(); } } // second thread (objects are not locked) // !! there is a problem with GIF files // Bus error (core dumped) /* #include "wand/MagickWand.h" // compiler options: // include: -I/usr/local/include/ImageMagick // link with: `MagickWand-config --ldflags --libs` void Thumb::CreateThumbnail() { Ezc::WideToUTF8(item_work.source, sourcea); Ezc::WideToUTF8(item_work.dst, dsta); MagickWandGenesis(); MagickWand * wand = NewMagickWand(); if( MagickReadImage(wand, sourcea.c_str()) ) { MagickThumbnailImage(wand, item_work.cx, item_work.cy); if( MagickWriteImage(wand, dsta.c_str()) ) { Lock(); log << log3 << "Thumb: created a thumbnail: " << dsta << logend; Unlock(); } } DestroyMagickWand(wand); MagickWandTerminus(); } */