Dear developpers,
I could not sleep last night so I tried as an exercise to see if lyx
could be ported easily to the fresh Qt-4.1. As you might guess it was
more difficult than I originally thought. But after much work it
compiles and loads!
There is a problem QImage which doesn't support any image format. I
suspect the Painter is not correctly started. Because of that, the
program could not load any document (more on that later). But the
menubar, the "Browse file" dialog and the about box are functional.
I don't know if this is interesting to you and if you planned already to
port to Qt4.1 sometimes in the future. If so, I am willing to help
completing this port if someone more knowledgeable than me take lead. If
not, it was fun anyway and I learned a bit about Qt4 in the process. IMO
it is much cleaner that Qt3 (Disclaimer: I knew close to nothing on
these two before yesterday). I could send my qt4 directory to anyone
interested in any case.
What I did:
1) copy "src/frontends/qt2" to "src/frontends/qt4"
2) launch qt3to4 porting tool to all .C and .h
3) replace uic with uic3 in all Makefiles
4) remove "-tr qt_" from UICFLAGS in all Makefiles
5) compile and fix...
I know nothing about the auto-tools so I just modified the Makefile,
sorry about that.
The big remaining problem is with QPicture. In order to let lyx start, I
had to comment line "src/graphics/GraphicsCacheItem.C":340
// There must be a format to load from.
BOOST_ASSERT(!formats.empty());
I have attached my modified "src/frontends/qt4/Qimage.C". Please find
below, the output of lyx -dbg graphics.
Thanks,
Abdel.
D:\msys\home\yns\src\lyx-devel\src>.\lyx-qt -dbg graphics
Setting debug level to graphics
Debugging `graphics' (Graphics conversion and loading)
LoaderQueue: priority set to 10 images at a time, 100 milliseconds
between calls
Recognised Fileformat: agr
filetools(getFormatFromContents)
Couldn't find a known format!
Ignoring obsolete use_tempdir flag.
filetools(getFormatFromContents)
Couldn't find a known format!
filetools(getFormatFromContents)
Couldn't find a known format!
filetools(getFormatFromContents)
Couldn't find a known format!
filetools(getFormatFromContents)
Couldn't find a known format!
filetools(getFormatFromContents)
Couldn't find a known format!
filetools(getFormatFromContents)
Couldn't find a known format!
filetools(getFormatFromContents)
Couldn't find a known format!
filetools(getFormatFromContents)
Couldn't find a known format!
filetools(getFormatFromContents)
Couldn't find a known format!
filetools(getFormatFromContents)
File type not recognised before EOF!
filetools(getFormatFromContents)
Couldn't find a known format!
filetools(getFormatFromContents)
Couldn't find a known format!
filetools(getFormatFromContents)
Couldn't find a known format!
Language code:C
Setting new locale for Qt:C
LoaderQueue: waking up
QPainter::begin(), paintdevice returned engine == 0, type: 3
QPainter::end: Painter is not active, aborted
QPainter::begin(), paintdevice returned engine == 0, type: 2
Painter started successfully.
QColor::setNamedColor: unknown color name 'grey40'
QPainter::end: Painter is not active, aborted
QPainter::begin(), paintdevice returned engine == 0, type: 3
QPainter::end: Painter is not active, aborted
lyx: Disabling LyX socket.
LoaderQueue: 1 items in the queue
QPainter::begin(), paintdevice returned engine == 0, type: 2
Painter started successfully.
QPainter::end: Painter is not active, aborted
Recognised Fileformat: ppm
[GrahicsCacheItem::convertToDisplayFormat]
Attempting to convert image file:
D:/msys/home/yns/src/lyx-devel/lib/images/banner.ppm
with displayed filename:
D:\msys\home\yns\src\lyx-devel\lib\images\banner.ppm
Recognised Fileformat: ppm
The file contains ppm format data.
The image loader can load the following directly:
Qt4 Problem: No Format available!
Of these, LyX recognises the following formats:
Converting it to format.
Converter c-tor:
from_file: D:/msys/home/yns/src/lyx-devel/lib/images/banner.ppm
to_file_base: C:/Documents and Settings/yns.ERC.000/Local
Settings/Temp/lyx_tmpdir2128a03208/banner2128
a03208
from_format: ppm
to_format:
build_script ... ready (edgepath.empty())
No converter defined! I use convertDefault.sh
sh
"D:/msys/home/yns/src/lyx-devel/lib/scripts/convertDefault.sh"
"ppm:D:/msys/home/yns/src/lyx-devel/l
ib/images/banner.ppm" ":C:/Documents and Settings/yns.ERC.000/Local
Settings/Temp/lyx_tmpdir2128a03208/banner21
28a03208."
ForkedCallQueue: waking up
Could not fork: No such file or directory
ForkedCallQueue: I'm going to sleep
LoaderQueue: I'm going to sleep
------------------------------------------------------------------------
------------------------------------------------------------------------
/**
* \file QLImage.C
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Angus Leeming
* \author John Levon
*
* Full author contact details are available in file CREDITS.
*/
#include <config.h>
#include "QLImage.h"
#include "qt_helpers.h"
//Added by qt3to4:
#include <Q3StrList>
#include <QPictureIO>
#include "debug.h"
#include "format.h"
#include "graphics/GraphicsParams.h"
#include "support/lstrings.h" // lowercase
#include <qimage.h>
#include <qpainter.h>
#include <boost/bind.hpp>
#include <boost/tuple/tuple.hpp>
using lyx::support::lowercase;
using boost::bind;
using std::endl;
using std::equal_to;
using std::find_if;
using std::string;
namespace lyx {
namespace graphics {
/// Access to this class is through this static method.
Image::ImagePtr QLImage::newImage()
{
ImagePtr ptr;
ptr.reset(new QLImage);
return ptr;
}
/// Return the list of loadable formats.
Image::FormatList QLImage::loadableFormats()
{
static FormatList fmts;
if (!fmts.empty())
return fmts;
// The formats recognised by LyX
Formats::const_iterator begin = formats.begin();
Formats::const_iterator end = formats.end();
lyxerr[Debug::GRAPHICS]
<< "\nThe image loader can load the following directly:\n";
QList<QByteArray> qt_formats = QPicture::inputFormats();
if (qt_formats.empty())
lyxerr[Debug::GRAPHICS]
<< "\nQt4 Problem: No Format available!" << endl;
for (QList<QByteArray>::const_iterator it =qt_formats.begin(); it !=
qt_formats.end(); ++it) {
lyxerr[Debug::GRAPHICS] << (const char *) *it << endl;
string ext = lowercase((const char *) *it);
// special case
if (ext == "jpeg")
ext = "jpg";
Formats::const_iterator fit =
find_if(begin, end,
bind(equal_to<string>(),
bind(&Format::extension, _1),
ext));
if (fit != end)
fmts.push_back(fit->name());
}
if (lyxerr.debugging()) {
lyxerr[Debug::GRAPHICS]
<< "\nOf these, LyX recognises the following
formats:\n";
FormatList::const_iterator fbegin = fmts.begin();
FormatList::const_iterator fend = fmts.end();
for (FormatList::const_iterator fit = fbegin; fit != fend;
++fit) {
if (fit != fbegin)
lyxerr[Debug::GRAPHICS] << ", ";
lyxerr[Debug::GRAPHICS] << *fit;
}
lyxerr[Debug::GRAPHICS] << '\n' << endl;
}
return fmts;
}
QLImage::QLImage()
: Image()
{
}
QLImage::QLImage(QLImage const & other)
: Image(other), original_(other.original_),
transformed_(other.transformed_),
transformed_pixmap_(other.transformed_pixmap_)
{}
Image * QLImage::clone_impl() const
{
return new QLImage(*this);
}
unsigned int QLImage::getWidth_impl() const
{
return transformed_.width();
}
unsigned int QLImage::getHeight_impl() const
{
return transformed_.height();
}
void QLImage::load_impl(string const & filename)
{
if (!original_.isNull()) {
lyxerr[Debug::GRAPHICS]
<< "Image is loaded already!" << endl;
finishedLoading(false);
return;
}
if (!original_.load(toqstr(filename))) {
lyxerr[Debug::GRAPHICS]
<< "Unable to open image" << endl;
finishedLoading(false);
return;
}
transformed_ = original_;
finishedLoading(true);
}
namespace {
// This code is taken from KImageEffect::toGray
QImage & toGray(QImage & img)
{
if (img.width() == 0 || img.height() == 0)
return img;
int const pixels = img.depth() > 8 ?
img.width() * img.height() : img.numColors();
unsigned int * const data = img.depth() > 8 ?
(unsigned int *)img.bits() :
(unsigned int *)img.jumpTable();
for(int i = 0; i < pixels; ++i){
int const val = qGray(data[i]);
data[i] = qRgba(val, val, val, qAlpha(data[i]));
}
return img;
}
} // namespace anon
bool QLImage::setPixmap_impl(Params const & params)
{
if (original_.isNull() || params.display == NoDisplay)
return false;
switch (params.display) {
case GrayscaleDisplay: {
toGray(transformed_);
break;
}
case MonochromeDisplay: {
transformed_.convertDepth(transformed_.depth(), Qt::MonoOnly);
break;
}
default:
break;
}
transformed_pixmap_ = transformed_;
return true;
}
void QLImage::clip_impl(Params const & params)
{
if (transformed_.isNull())
return;
if (params.bb.empty())
// No clipping is necessary.
return;
int const new_width = params.bb.xr - params.bb.xl;
int const new_height = params.bb.yt - params.bb.yb;
// No need to check if the width, height are > 0 because the
// Bounding Box would be empty() in this case.
if (new_width > original_.width() || new_height > original_.height()) {
// Bounds are invalid.
return;
}
if (new_width == original_.width() && new_height == original_.height())
return;
int const xoffset_l = params.bb.xl;
int const yoffset_t = (original_.height() > int(params.bb.yt) ?
original_.height() - params.bb.yt : 0);
transformed_ = original_.copy(xoffset_l, yoffset_t,
new_width, new_height);
}
void QLImage::rotate_impl(Params const & params)
{
if (transformed_.isNull())
return;
if (!params.angle)
return;
QMatrix m;
m.rotate(-params.angle);
transformed_.setAlphaBuffer(true);
transformed_ = transformed_.xForm(m);
}
void QLImage::scale_impl(Params const & params)
{
if (transformed_.isNull())
return;
unsigned int width;
unsigned int height;
boost::tie(width, height) = getScaledDimensions(params);
if (width == getWidth() && height == getHeight())
return;
QMatrix m;
m.scale(double(width) / getWidth(), double(height) / getHeight());
transformed_ = transformed_.xForm(m);
}
} // namespace graphics
} // lyx