/* * This file is a part of Winix * and is not publicly distributed * * Copyright (c) 2010, Tomasz Sowa * All rights reserved. * */ #include "thumb.h" #include "utf8.h" #include "log.h" void Thumb::SetConvertCmd(const std::wstring & cmd) { convert_cmd = cmd; } void Thumb::SetDb(Db * pdb) { db = pdb; } // first thread (objects locked) void Thumb::CreateThumb(long item_id, const std::wstring & source, const std::wstring & dst, size_t cx, size_t cy, int aspect_mode) { item_temp.item_id = item_id; item_temp.source = source; item_temp.dst = dst; 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 ); } 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) void Thumb::CreateThumbnail() { command.Clear(); Ezc::WideToUTF8(convert_cmd, tempa); command << tempa << " -quiet -strip -thumbnail "; SelectAspect(); command << " "; Ezc::WideToUTF8(item_work.source, tempa); EscapePath(tempa); Ezc::WideToUTF8(item_work.dst, tempa); EscapePath(tempa); if( system(command.CStr()) == 0 ) { Lock(); log << log3 << "Thumb: created a thumbnail: " << tempa << logend; db->EditHasThumbById(true, item_work.item_id); Unlock(); } else { Lock(); log << log3 << "Thumb: some problems with creating a thumbnail: " << tempa << 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(); } */