View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0008657 | Scribus | Graphics / Image Frames | public | 2009-12-20 19:05 | 2010-01-02 23:35 |
Reporter | mhx | Assigned To | fschmid | ||
Priority | normal | Severity | feature | Reproducibility | always |
Status | closed | Resolution | fixed | ||
Fixed in Version | 1.5.0svn | ||||
Summary | 0008657: [PATCH] Per-image override of PDF compression parameters | ||||
Description | A while ago I was suggesting [1] on #scribus-dev to add a feature to Scribus that allows overriding PDF image compression parameters on a per-image basis. My motivation was that I wanted to have one of the images in my document compressed as ZIP and all others as JPEG in the final PDF. The source images were all in (losslessly compressed) TIFF format, so "Automatic" compression gave me JPEG for all images. There was no way to have only one image compressed as ZIP, other than a quick hack of pdflib_core that forced ZIP compression for certain filenames... Anyway, as promised, I've just found the time for a not-so-quick hack that adds two controls to the Image Properties page that allow overriding the compression method and/or compression quality individually for each image. Patch against trunk is attached. Feedback is very welcome, as this is my first hack on Scribus and I have certainly overlooked something important... ;) Cheers, Marcus [1] <mhx> Hi! Just a quick question: is it easily possible to force ZIP compression for certain images when exporting to PDF? A quick glance at pdflib_core.cpp suggests that "Auto" merely chooses "JPEG" all the time; (If I choose ZIP, my PDF is more than 3GB; if I choose Auto, one image - a map - looks very crappy.) <christoph_s> I guess you would have to apply the ompression in an image editor <mhx> Um? <christoph_s> although I don't see why. AFAIK, ZIP is not the best method for images <mhx> My source images are all ZIP compressed TIFFs. I don't mind all of the images to be JPEG compressed in the final PDF, just *the one* image for which JPEG compression is obviously unsuitable should be ZIP compressed. <mhx> (Ideally, one should be able to override the "default" compression somewhere in the image properties.) <christoph_s> then open the file in an image editor, and save it with ZIP compression <mhx> Um, again, that's what I have *for all my images*. <christoph_s> except one, you said <mhx> No. All images I've got in the document are ZIP compressed. Regardless, Scribus recompresses them as JPEG. And actually, that's what I *want*, because I don't want to manually convert my images to JPEG before importing them in Scribus. I want to be able to choose the JPEG quality when *exporting*, not when *importing*. However, I'd like to have *one file* *exported* as ZIP instead of JPEG. <christoph_s> that's not possible, and I doubt there is enough developer time to implement such a rarely requested feature <mhx> I'm not asking for anyone to implement it. If it's rarely requested, I assume it's not easily possible. <christoph_s> it takes time, but I think you are the first person who brought this up ;) <mhx> However, I think it would absolutely make sense to have something like this. I'll probably have a look at implementing this after I'm done with my project. <christoph_s> that's a great idea :) | ||||
Tags | No tags attached. | ||||
Patch | |||||
2009-12-20 19:05
|
scribus-trunk-override-compression.diff (17,777 bytes)
diff -ruN --exclude='.*.swp' scribus-trunk-orig/scribus/pageitem.cpp scribus-trunk/scribus/pageitem.cpp --- scribus-trunk-orig/scribus/pageitem.cpp 2009-12-20 02:34:27.000000000 +0100 +++ scribus-trunk/scribus/pageitem.cpp 2009-12-20 14:31:07.000000000 +0100 @@ -123,6 +123,10 @@ UseEmbedded(other.UseEmbedded), EmProfile(other.EmProfile), IRender(other.IRender), + OverrideCompressionMethod(other.OverrideCompressionMethod), + CompressionMethodIndex(other.CompressionMethodIndex), + OverrideCompressionQuality(other.OverrideCompressionQuality), + CompressionQualityIndex(other.CompressionQualityIndex), PictureIsAvailable(other.PictureIsAvailable), OrigW(other.OrigW), @@ -322,6 +326,10 @@ // Initialize superclass(es) : QObject(pa), SingleObservable<PageItem>(pa->itemsChanged()), // Initialize member variables + OverrideCompressionMethod(false), + CompressionMethodIndex(0), + OverrideCompressionQuality(false), + CompressionQualityIndex(0), itemText(pa), undoManager(UndoManager::instance()), lineShadeVal(100), diff -ruN --exclude='.*.swp' scribus-trunk-orig/scribus/pageitem.h scribus-trunk/scribus/pageitem.h --- scribus-trunk-orig/scribus/pageitem.h 2009-12-20 02:34:27.000000000 +0100 +++ scribus-trunk/scribus/pageitem.h 2009-12-20 14:31:07.000000000 +0100 @@ -442,6 +442,11 @@ QString cmsProfile() const { return IProfile; } void setCmsProfile(QString val) { IProfile = val; } + bool OverrideCompressionMethod; + int CompressionMethodIndex; + bool OverrideCompressionQuality; + int CompressionQualityIndex; + /*! Flag to hiold image file availability */ bool PictureIsAvailable; int OrigW; diff -ruN --exclude='.*.swp' scribus-trunk-orig/scribus/pdflib_core.cpp scribus-trunk/scribus/pdflib_core.cpp --- scribus-trunk-orig/scribus/pdflib_core.cpp 2009-12-20 14:27:36.000000000 +0100 +++ scribus-trunk/scribus/pdflib_core.cpp 2009-12-20 14:31:07.000000000 +0100 @@ -501,7 +501,7 @@ return (succeed ? bytesWritten : 0); } -int PDFLibCore::WriteJPEGImageToStream(ScImage& image, const QString& fn, int ObjNum, bool cmyk, +int PDFLibCore::WriteJPEGImageToStream(ScImage& image, const QString& fn, int ObjNum, int quality, bool cmyk, bool gray, bool sameFile, bool precal) { bool succeed = true; @@ -516,7 +516,7 @@ tmpFile = QDir::convertSeparators(ScPaths::getTempFileDir() + "sc.jpg"); if ((gray) && (!precal)) image.convertToGray(); - if (image.Convert2JPG(tmpFile, Options.Quality, cmyk, gray)) + if (image.Convert2JPG(tmpFile, quality, cmyk, gray)) jpgFileName = tmpFile; } if (jpgFileName.isEmpty()) @@ -8918,6 +8918,7 @@ PutDoc("/ColorSpace /DeviceCMYK\n"); } } + enum PDFOptions::PDFCompression compress_method = Options.CompressMethod; enum PDFOptions::PDFCompression cm = Options.CompressMethod; bool exportToCMYK = false, exportToGrayscale = false, jpegUseOriginal = false; if (!Options.UseRGB && !(doc.HasCMS && Options.UseProfiles2 && !realCMYK)) @@ -8928,6 +8929,8 @@ else exportToCMYK = !Options.UseRGB; } + if (c->OverrideCompressionMethod) + compress_method = cm = (enum PDFOptions::PDFCompression) c->CompressionMethodIndex; if (extensionIndicatesJPEG(ext) && (cm != PDFOptions::Compression_None)) { if (((Options.UseRGB || Options.UseProfiles2) && (cm == PDFOptions::Compression_Auto) && (c->effectsInUse.count() == 0) && (img.imgInfo.colorspace == ColorSpaceRGB)) && (!img.imgInfo.progressive) && (!((Options.RecalcPic) && (Options.PicRes < (qMax(72.0 / c->imageXScale(), 72.0 / c->imageYScale())))))) @@ -8946,7 +8949,7 @@ }*/ else { - if (Options.CompressMethod == PDFOptions::Compression_JPEG) + if (compress_method == PDFOptions::Compression_JPEG) { if (realCMYK || !((Options.UseRGB) || (Options.UseProfiles2))) { @@ -8964,7 +8967,7 @@ } else { - if ((Options.CompressMethod == PDFOptions::Compression_JPEG) || (Options.CompressMethod == PDFOptions::Compression_Auto)) + if ((compress_method == PDFOptions::Compression_JPEG) || (compress_method == PDFOptions::Compression_Auto)) { if (realCMYK || !((Options.UseRGB) || (Options.UseProfiles2))) { @@ -8975,7 +8978,7 @@ exportToCMYK = !Options.UseRGB; } cm = PDFOptions::Compression_JPEG; - /*if (Options.CompressMethod == PDFOptions::Compression_Auto) + /*if (compress_method == PDFOptions::Compression_Auto) { QFileInfo fi(tmpFile); if (fi.size() < im.size()) @@ -9011,7 +9014,12 @@ if ((hasGrayProfile) && (doc.HasCMS) && (Options.UseProfiles2) && (!hasColorEffect)) exportToGrayscale = true; if (cm == PDFOptions::Compression_JPEG) - bytesWritten = WriteJPEGImageToStream(img, fn, imageObj, exportToCMYK, exportToGrayscale, jpegUseOriginal, (!hasColorEffect && hasGrayProfile)); + { + int quality = c->OverrideCompressionQuality ? c->CompressionQualityIndex : Options.Quality; + if (c->OverrideCompressionQuality) + jpegUseOriginal = false; + bytesWritten = WriteJPEGImageToStream(img, fn, imageObj, quality, exportToCMYK, exportToGrayscale, jpegUseOriginal, (!hasColorEffect && hasGrayProfile)); + } else if (cm == PDFOptions::Compression_ZIP) bytesWritten = WriteFlateImageToStream(img, imageObj, exportToCMYK, exportToGrayscale, (!hasColorEffect && hasGrayProfile)); else diff -ruN --exclude='.*.swp' scribus-trunk-orig/scribus/pdflib_core.h scribus-trunk/scribus/pdflib_core.h --- scribus-trunk-orig/scribus/pdflib_core.h 2009-12-20 02:34:27.000000000 +0100 +++ scribus-trunk/scribus/pdflib_core.h 2009-12-20 14:31:07.000000000 +0100 @@ -105,7 +105,7 @@ bool EncodeArrayToStream(const QByteArray& in, int ObjNum); int WriteImageToStream(ScImage& image, int ObjNum, bool cmyk, bool gray, bool precal); - int WriteJPEGImageToStream(ScImage& image, const QString& fn, int ObjNum, bool cmyk, bool gray, bool sameFile, bool precal); + int WriteJPEGImageToStream(ScImage& image, const QString& fn, int ObjNum, int quality, bool cmyk, bool gray, bool sameFile, bool precal); int WriteFlateImageToStream(ScImage& image, int ObjNum, bool cmyk, bool gray, bool precal); void CalcOwnerKey(const QString & Owner, const QString & User); diff -ruN --exclude='.*.swp' scribus-trunk-orig/scribus/plugins/fileloader/scribus150format/scribus150format.cpp scribus-trunk/scribus/plugins/fileloader/scribus150format/scribus150format.cpp --- scribus-trunk-orig/scribus/plugins/fileloader/scribus150format/scribus150format.cpp 2009-12-20 14:27:36.000000000 +0100 +++ scribus-trunk/scribus/plugins/fileloader/scribus150format/scribus150format.cpp 2009-12-20 14:31:07.000000000 +0100 @@ -2348,6 +2348,10 @@ currItem->UseEmbedded = attrs.valueAsInt("EMBEDDED", 1); currItem->pixm.imgInfo.lowResType = attrs.valueAsInt("ImageRes", 1); currItem->pixm.imgInfo.actualPageNumber = attrs.valueAsInt("Pagenumber", 0); + if ((currItem->OverrideCompressionMethod = attrs.hasAttribute("COMPRESSIONMETHOD"))) + currItem->CompressionMethodIndex = attrs.valueAsInt("COMPRESSIONMETHOD"); + if ((currItem->OverrideCompressionQuality = attrs.hasAttribute("COMPRESSIONQUALITY"))) + currItem->CompressionQualityIndex = attrs.valueAsInt("COMPRESSIONQUALITY"); if (currItem->asLatexFrame()) { currItem->setImageXYOffset(attrs.valueAsDouble("LOCALX") * scx, attrs.valueAsDouble("LOCALY") * scy); diff -ruN --exclude='.*.swp' scribus-trunk-orig/scribus/plugins/fileloader/scribus150format/scribus150format_save.cpp scribus-trunk/scribus/plugins/fileloader/scribus150format/scribus150format_save.cpp --- scribus-trunk-orig/scribus/plugins/fileloader/scribus150format/scribus150format_save.cpp 2009-12-20 02:34:29.000000000 +0100 +++ scribus-trunk/scribus/plugins/fileloader/scribus150format/scribus150format_save.cpp 2009-12-20 14:31:07.000000000 +0100 @@ -1662,6 +1662,13 @@ docu.writeAttribute("EPROF", item->EmProfile); docu.writeAttribute("IRENDER",item->IRender); docu.writeAttribute("EMBEDDED", item->UseEmbedded ? 1 : 0); + if (item->asImageFrame()) + { + if (item->OverrideCompressionMethod) + docu.writeAttribute("COMPRESSIONMETHOD", item->CompressionMethodIndex); + if (item->OverrideCompressionQuality) + docu.writeAttribute("COMPRESSIONQUALITY", item->CompressionQualityIndex); + } docu.writeAttribute("LOCK", item->locked() ? 1 : 0); docu.writeAttribute("LOCKR", item->sizeLocked() ? 1 : 0); docu.writeAttribute("REVERS", item->reversed() ? 1 : 0); diff -ruN --exclude='.*.swp' scribus-trunk-orig/scribus/scribusdoc.cpp scribus-trunk/scribus/scribusdoc.cpp --- scribus-trunk-orig/scribus/scribusdoc.cpp 2009-12-20 02:34:27.000000000 +0100 +++ scribus-trunk/scribus/scribusdoc.cpp 2009-12-20 14:31:07.000000000 +0100 @@ -11449,6 +11449,48 @@ changed(); } +void ScribusDoc::itemSelection_SetCompressionMethod(int cmIndex, Selection * customSelection) +{ + Selection* itemSelection = (customSelection!=0) ? customSelection : m_Selection; + assert(itemSelection!=0); + uint selectedItemCount=itemSelection->count(); + if (selectedItemCount == 0) + return; + //TODO Add Undo + for (uint i = 0; i < selectedItemCount; ++i) + { + PageItem *currItem = itemSelection->itemAt(i); + if (currItem && currItem->itemType() == PageItem::ImageFrame) + { + if ((currItem->OverrideCompressionMethod = cmIndex >= 0)) + { + currItem->CompressionMethodIndex = cmIndex; + } + } + } +} + +void ScribusDoc::itemSelection_SetCompressionQuality(int cqIndex, Selection * customSelection) +{ + Selection* itemSelection = (customSelection!=0) ? customSelection : m_Selection; + assert(itemSelection!=0); + uint selectedItemCount=itemSelection->count(); + if (selectedItemCount == 0) + return; + //TODO Add Undo + for (uint i = 0; i < selectedItemCount; ++i) + { + PageItem *currItem = itemSelection->itemAt(i); + if (currItem && currItem->itemType() == PageItem::ImageFrame) + { + if ((currItem->OverrideCompressionQuality = cqIndex >= 0)) + { + currItem->CompressionQualityIndex = cqIndex; + } + } + } +} + QMap<PageItem*, QString> ScribusDoc::getDocItemNames(PageItem::ItemType itemType) { QMap<PageItem*, QString> namesMap; diff -ruN --exclude='.*.swp' scribus-trunk-orig/scribus/scribusdoc.h scribus-trunk/scribus/scribusdoc.h --- scribus-trunk-orig/scribus/scribusdoc.h 2009-12-20 02:34:27.000000000 +0100 +++ scribus-trunk/scribus/scribusdoc.h 2009-12-20 14:31:07.000000000 +0100 @@ -843,6 +843,8 @@ void itemSelection_resetOpticalMargins(Selection* customSelection=0); void itemSelection_SetColorProfile(const QString& profileName, Selection* customSelection=0); void itemSelection_SetRenderIntent(int intentIndex, Selection* customSelection=0); + void itemSelection_SetCompressionMethod(int cmIndex, Selection* customSelection=0); + void itemSelection_SetCompressionQuality(int cqIndex, Selection* customSelection=0); // void chAbStyle(PageItem *currItem, int s); diff -ruN --exclude='.*.swp' scribus-trunk-orig/scribus/ui/propertiespalette.cpp scribus-trunk/scribus/ui/propertiespalette.cpp --- scribus-trunk-orig/scribus/ui/propertiespalette.cpp 2009-12-20 02:34:24.000000000 +0100 +++ scribus-trunk/scribus/ui/propertiespalette.cpp 2009-12-20 14:31:07.000000000 +0100 @@ -1381,6 +1381,23 @@ GroupBoxCMLayout->addWidget(MonitorI); pageLayout_4->addWidget(GroupBoxCM); + GroupBoxCompression = new QFrame( page_4 ); + GroupBoxCompression->setFrameShape( QFrame::NoFrame ); + GroupBoxCompression->setFrameShadow( QFrame::Plain ); + GroupBoxCompressionLayout = new QVBoxLayout( GroupBoxCompression ); + GroupBoxCompressionLayout->setSpacing( 2 ); + GroupBoxCompressionLayout->setMargin( 5 ); + GroupBoxCompressionLayout->setAlignment( Qt::AlignTop ); + TextCompressionMethod = new QLabel( GroupBoxCompression ); + GroupBoxCompressionLayout->addWidget( TextCompressionMethod ); + CompressionMethod = new ScComboBox( GroupBoxCompression ); + GroupBoxCompressionLayout->addWidget(CompressionMethod); + TextCompressionQuality = new QLabel( GroupBoxCompression ); + GroupBoxCompressionLayout->addWidget( TextCompressionQuality ); + CompressionQuality = new ScComboBox( GroupBoxCompression ); + GroupBoxCompressionLayout->addWidget( CompressionQuality ); + pageLayout_4->addWidget( GroupBoxCompression ); + QSpacerItem* spacer9 = new QSpacerItem( 0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding ); pageLayout_4->addItem( spacer9 ); idImageItem=TabStack->addItem( page_4, "&Image" ); @@ -1578,6 +1595,8 @@ connect(LineW, SIGNAL(valueChanged(double)), this, SLOT(handlePathOffs())); connect(InputP, SIGNAL(activated(const QString&)), this, SLOT(ChangeProfile(const QString&))); connect(MonitorI, SIGNAL(activated(int)), this, SLOT(ChangeIntent())); + connect(CompressionMethod, SIGNAL(activated(int)), this, SLOT(ChangeCompressionMethod())); + connect(CompressionQuality, SIGNAL(activated(int)), this, SLOT(ChangeCompressionQuality())); connect(NameEdit, SIGNAL(Leaved()), this, SLOT(NewName())); // connect(langCombo, SIGNAL(activated(int)), this, SLOT(NewLanguage())); connect( TabsButton, SIGNAL( clicked() ), this, SLOT( ManageTabs() ) ); @@ -2165,6 +2184,8 @@ imagePageNumber->setMaximum(CurItem->pixm.imgInfo.numberOfPages); imagePageNumber->setValue(CurItem->pixm.imgInfo.actualPageNumber); connect(imagePageNumber, SIGNAL(valueChanged(int)), this, SLOT(NewPage())); + CompressionMethod->setCurrentIndex(CurItem->OverrideCompressionMethod ? CurItem->CompressionMethodIndex + 1 : 0); + CompressionQuality->setCurrentIndex(CurItem->OverrideCompressionQuality ? CurItem->CompressionQualityIndex + 1 : 0); } Revert->setChecked(CurItem->reversed()); setTextFlowMode(CurItem->textFlowMode()); @@ -4951,6 +4972,20 @@ doc->itemSelection_SetRenderIntent(MonitorI->currentIndex()); } +void PropertiesPalette::ChangeCompressionMethod() +{ + if (!HaveDoc || !HaveItem || !m_ScMW || m_ScMW->ScriptRunning) + return; + doc->itemSelection_SetCompressionMethod(CompressionMethod->currentIndex() - 1); +} + +void PropertiesPalette::ChangeCompressionQuality() +{ + if (!HaveDoc || !HaveItem || !m_ScMW || m_ScMW->ScriptRunning) + return; + doc->itemSelection_SetCompressionQuality(CompressionQuality->currentIndex() - 1); +} + void PropertiesPalette::ShowCMS() { if (!m_ScMW || m_ScMW->ScriptRunning) @@ -5429,6 +5464,8 @@ EditPSDProps->setText( tr("Extended Image Properties")); TextCms1->setText( tr("Input Profile:")); TextCms2->setText( tr("Rendering Intent:")); + TextCompressionMethod->setText( tr("PDF Compression Method:")); + TextCompressionQuality->setText( tr("PDF Compression Quality:")); // QList<QAction*> actList = lineSpacingPop->actions(); // actList[0]->setText( tr("Fixed Linespacing")); // actList[1]->setText( tr("Automatic Linespacing")); @@ -5446,6 +5483,23 @@ MonitorI->addItem( tr("Saturation")); MonitorI->addItem( tr("Absolute Colorimetric")); MonitorI->setCurrentIndex(oldMonitorI); + int oldCompressionMethod=CompressionMethod->currentIndex(); + CompressionMethod->clear(); + CompressionMethod->addItem( tr( "Global" ) ); + CompressionMethod->addItem( tr( "Automatic" ) ); + CompressionMethod->addItem( tr( "Lossy - JPEG" ) ); + CompressionMethod->addItem( tr( "Lossless - Zip" ) ); + CompressionMethod->addItem( tr( "None" ) ); + CompressionMethod->setCurrentIndex(oldCompressionMethod); + int oldCompressionQuality=CompressionQuality->currentIndex(); + CompressionQuality->clear(); + CompressionQuality->addItem( tr( "Global" ) ); + CompressionQuality->addItem( tr( "Maximum" ) ); + CompressionQuality->addItem( tr( "High" ) ); + CompressionQuality->addItem( tr( "Medium" ) ); + CompressionQuality->addItem( tr( "Low" ) ); + CompressionQuality->addItem( tr( "Minimum" ) ); + CompressionQuality->setCurrentIndex(oldCompressionQuality); int oldLineStyle = LStyle->currentIndex(); LStyle->clear(); LStyle->updateList(); @@ -5732,6 +5786,8 @@ Aspect->setToolTip( tr("Use image proportions rather than those of the frame")); InputP->setToolTip( tr("Source profile of the image")); MonitorI->setToolTip( tr("Rendering intent for the image")); + CompressionMethod->setToolTip( tr("Compression method used in PDF export for the image")); + CompressionQuality->setToolTip( tr("Compression quality used in PDF export for the image")); } diff -ruN --exclude='.*.swp' scribus-trunk-orig/scribus/ui/propertiespalette.h scribus-trunk/scribus/ui/propertiespalette.h --- scribus-trunk-orig/scribus/ui/propertiespalette.h 2009-12-20 02:34:24.000000000 +0100 +++ scribus-trunk/scribus/ui/propertiespalette.h 2009-12-20 14:31:07.000000000 +0100 @@ -315,6 +315,8 @@ void handleOverprint(int); void ChangeProfile(const QString& prn); void ChangeIntent(); + void ChangeCompressionMethod(); + void ChangeCompressionQuality(); void NewName(); void NewLanguage(); void HandleTLines(); @@ -384,6 +386,7 @@ QVBoxLayout* DistanceLayout3; QGridLayout* GroupBox3aLayout; QVBoxLayout* GroupBoxCMLayout; + QVBoxLayout* GroupBoxCompressionLayout; QVBoxLayout* textFlowOptionsLayout; QVBoxLayout* textFlowOptionsLayout2; QHBoxLayout* layout23; @@ -450,6 +453,8 @@ QLabel* LineModeT; QLabel* TextCms1; QLabel* TextCms2; + QLabel* TextCompressionMethod; + QLabel* TextCompressionQuality; QLabel* edgesLabel; QLabel* ChBaseTxt; QLabel* ScaleTxt; @@ -511,6 +516,7 @@ QGroupBox* GeoGroup; QGroupBox* LayerGroup; QFrame* GroupBoxCM; + QFrame* GroupBoxCompression; QGroupBox* TLines; QGroupBox* GroupBox3a; QGroupBox* TransGroup; @@ -537,6 +543,8 @@ QComboBox* langCombo; QComboBox* InputP; QComboBox* MonitorI; + QComboBox* CompressionMethod; + QComboBox* CompressionQuality; QComboBox* LineMode; QComboBox* lineSpacingModeCombo; ColorCombo* TxStroke; |
|
Thanks! |
Date Modified | Username | Field | Change |
---|---|---|---|
2009-12-20 19:05 | mhx | New Issue | |
2009-12-20 19:05 | mhx | File Added: scribus-trunk-override-compression.diff | |
2009-12-21 02:20 | christoph_s | Status | new => assigned |
2009-12-21 02:20 | christoph_s | Assigned To | => jghali |
2009-12-21 08:02 | jghali | Assigned To | jghali => |
2009-12-21 08:02 | jghali | Status | assigned => new |
2009-12-21 13:51 | fschmid | Status | new => resolved |
2009-12-21 13:51 | fschmid | Fixed in Version | => 1.5.0svn |
2009-12-21 13:51 | fschmid | Resolution | open => fixed |
2009-12-21 13:51 | fschmid | Assigned To | => fschmid |
2010-01-02 23:35 | cbradney | Note Added: 0023018 | |
2010-01-02 23:35 | cbradney | Status | resolved => closed |
2015-09-17 20:10 | Kunda | Category | Graphics / Image Frames => Graphics/Img Frames |
2015-09-17 20:11 | Kunda | Category | Graphics/Img Frames => Graphics / Image Frames |