Иван Комиссаров schreef op 20-5-2015 om 11:06:


2015-05-20 10:05 GMT+03:00 André Somers <an...@familiesomers.nl <mailto:an...@familiesomers.nl>>:

    Иван Комиссаров schreef op 19-5-2015 om 19:43:

    ImageDocument doesn't need to inherit QObject in order to listen
    to QIODevice signals of course. First of all, it could have rather
    than be a QObject, and second of all you can connect to almost
    anything callable nowadays. I'm not saying that being a QObject is
    a bad thing per se, just that your argument for it isn't all that
    convincing to me.

    Are you sure a QString as an error() is the best choice? There are
    other places in the Qt API where an enum is used instead. I think
    an enum would probably be a better choice: it is easier to deal
    with in errorhanding (no string comparisons needed; localization
    issues).


Please, provide me an example how to handle QImageReader::DeviceError, QImageReader::UnsupportedFormatError or QImageReader::InvalidDataError.
Show different error messages for instance. Invalid data points to a corrupted file. That is not the same as just not recognizing the file format or having a network connection break in the middle of reading.

    Would it then not be better to be explicit about this, and just
    call it like that: bool readHeader()? I don't think it is a good
    idea to try to emulate the QIODevice API for something that isn't
    one. It is just confusing IMHO. What happens if the ImageDocument
    can, but the underlying QIODevice cannot write?


What happens if user forgot to call to readHeader()? In case document is not opened, it's quite easy - we reject any further operations. For now, open() checks open flags of the device and tries to reopen device in write mode if necessary. It fails if device cannot be opened.
Perhaps it should just read the header directly when opening from file/iodevice and have an isValid() method or something like that?


    So what does it actually do?


Nothing for now:) But it can write end markers of the file and close the device.
Not sure if that is a good idea. If you didn't open the device, you should not close it.

    capabilities() method returns capabilities (yep) of a format, see
    CapabilityFlag enum.
    Hmm? The capabilities of the document? Don't the capabilities
    belong to the format instead? Judging from the API you have
    presented so far, I got the impression that an ImageDocument could
    represent image containers in any format. Now, it seems like the
    capabilities of the format are leaking into the document. How do
    you construct a document from scratch then? Where do the
    capabilities come from? Can I use ImageDocument to convert between
    two different formats?


So, do you suggest move those options to ImageIoHandler? I don't think this is good idea. Right now, users are forced to use "private" class QImageIOHandler only for option flags enum. I think, that class should be used only to create new handlers and typical user of a Document shouldn't know about it.
Fair enough. But that means that an ImageDocument should have a clear type at any time. That means you either create it with that type, get the type from the image you are reading, or convert to that type.

Typicall usecase is - open document for writing, check what capabilities are present and add resources to the document. But you can add various resources first, then open for writing and call write().
Well, you can if you know the capabilities of the file you want to create, I'd say. I don't think I would allow adding resources to a file if the format can't support those resources.

Yes, this is possible to resave document in the other format, hanlder just should drop anything it doesn't support. We have no mipmap support - ok, we just save first mipmap. We have no volume texture support - ok, just save first slice.
There should be an API that will allow to access those "default" images.
Thinking about this, I think I'd make the conversion explicit. If you loaded a multipage TIFF and want to save as a normal PNG, you could either have a void convert(QMimeType type) that converts the current document to the new value (dropping unsupported features in the process) and/or have a ImageDocument converted(QMimeType type) function that creates a new ImageDocument in the requested format based on the current document. Then, save _that_ document.

Perhaps you/the user/the file format plugin could even offer different options of how to deal with the degradation. Layers might be flattened to a single image, meta data from a specific image stored in the main meta data or vise versa, pages glued together to form a single image...

    I am wondering if this is really the right slicing of the possible
    contents. Pages were already mentioned before. Do you really need
    to be able to have the document represent a 2D array of vectors of
    images (in case you are using frames, mipmaps with volumne
    textures)? Are there image formats like that that we need to
    support in Qt? It also results in an overly complicated setup for
    the simple use cases I think.


That's the best way i found.
For the simple usecase, there can be Document::image() method that simply returns a "default" image (of mipmap 0, frame/page 0, slice 0).


    Might it not be better to have ImageDocument contain a collection
    of QImages directly, that can have different kinds of
    relationships with each other and that you can somehow query for
    if you need to?


I was thinking about that. DDS can have up to mipmapCount*frameCount*6. How do you suppose to get all sides for frame 10, mipmap 5?
With something like document.images().frame(10).mipmap(5)? That would result in a list of 6 images for the requested frame and mipmap.

If images() returns a QVector<QImage>, you could use the same trick as used in QByteArrayList to add some special filtering methods on it without actually subclassing QVector<QImage>.

frame() and mipmap() (and side() and page() and layer() and whatever else one might come up with) could act as filtering functions that again return a list of images that has these methods.

There was an idea to store mipmap/frame/side in ImageMeta::options and to use something like document->filterResources(options). But there are problems - i already have Document::meta. I can write something like doc->meta.setOption(Side, PositiveX), but this makes little sense, API is confusing.
Well, I don't know how your Meta things work of course, so I cannot comment on that. To me it makes little sense to set a meta property that belongs to a specific image on a document directly, but that may be my misunderstanding of your design.


    For an application I am working on at work, I actually wrote a
    document class a bit like that. The document contains a series of
    images: images made of the left or right eye, from different
    angles, in different wave lengths (IR, green laser, color - and
    these are actually really different types of images!) in any
    combination. The set can contain any of these, but need not
    contain all. We keep them all in a single ImageCollection that you
    can simply query for things like "which eyes occur in the set" but
    also filter back using a method filtered() with overloads for all
    the different dimentions we have, returning just another image
    collection. Perhaps ImageDocument could work in a similar way to
    collapse pages, frames, layers and mipmaps into?


Too complex indexation.
I think it is actually simpler than forcing a 2D array onto image document formats that don't benefit from it.

How do i supposed to control that EACH mipmap have the same number of frames as document->frameCount(). I didn't find suitable solution.
Why would you need to control that? If an image format requires it, then that image format should impose that limit (or even auto-create the missing ones?) but I don't see why it should be a general limi Perhaps there are formats where it is possible that one page has a mipmap, while others don't? Just the first page for instance to provide a quick preview?

André

_______________________________________________
Interest mailing list
Interest@qt-project.org
http://lists.qt-project.org/mailman/listinfo/interest

Reply via email to