Hello,

Judging from the absence of answer, I suppose this matter is not interesting to you :-( It's OK, I understand that you are all very busy with the release of 1.4.0. I have worked some more on the port so if there is any interest in the future, just let me know. FYI, the changes from Qt3 to Qt4 are quite big and I think it's worth keeping both version in parallel. I will try to keep my port in sync with the qt2 frontend. Right now, I am having big headache on QWorkarea and QContentpane widget dimensions... At this point I am wasting time so I think I will just give up.

Regards,
Abdel.


Abdel a écrit :
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

Reply via email to