229 lines
4.3 KiB
C++
Executable File
229 lines
4.3 KiB
C++
Executable File
/*
|
|
* 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<path.size() ; ++i)
|
|
{
|
|
if( path[i] == '"' )
|
|
command << '\\';
|
|
|
|
command << path[i];
|
|
}
|
|
|
|
command << "\" ";
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
from: http://www.imagemagick.org/script/command-line-processing.php#geometry
|
|
|
|
scale% Height and width both scaled by specified percentage.
|
|
scale-x%xscale-y% Height and width individually scaled by specified percentages. (Only one % symbol needed.)
|
|
width Width given, height automagically selected to preserve aspect ratio.
|
|
xheight Height given, width automagically selected to preserve aspect ratio.
|
|
widthxheight Maximum values of height and width given, aspect ratio preserved.
|
|
widthxheight^ Minimum values of width and height given, aspect ratio preserved.
|
|
widthxheight! Width and height emphatically given, original aspect ratio ignored.
|
|
widthxheight> 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();
|
|
}
|
|
*/
|
|
|
|
|