[Lazarus] Graphics changes (r15472)

Marc Weustink marc at dommelstein.net
Sat Jun 21 13:39:55 CEST 2008


Marc Weustink wrote:
> Mattias Gaertner wrote:
>> On Sat, 21 Jun 2008 03:44:08 +0200
>> Marc Weustink <marc at dommelstein.net> wrote:
>>
>>> Mattias Gaertner wrote:
>>>> On Fri, 20 Jun 2008 21:24:13 -0300
>>>> Luiz Americo Pereira Camara <luizmed at oi.com.br> wrote:
>>>>
>>>>> Marc Weustink wrote:
>>>>>> Luiz Americo Pereira Camara wrote:
>>>>>>   
>>>>>>> One old issue i have with TBitmap (not introduced now but that
>>>>>>> could be resolved with this refactoring) is that when a image is
>>>>>>> loaded with LoadFromStream or LoadFromFile a copy of the image
>>>>>>> buffer is kept in memory. This can speedup if is necessary to
>>>>>>> access the image data directly but for the more common case of
>>>>>>> loading a file to display is waste of memory.
>>>>>>>     
>>>>>> This is no error, this is by design. And is only kept once and as
>>>>>> long as the image isn't changed. Indeed, for cases where you know
>>>>>> you never want to save it, we can add an property.
>>>>>>   
>>>>> Since the most common case is not save it, just display, the
>>>>> default should be not keep a copy of the stream. This my point.
>>>> 1. Many images are only loaded, but never displayed.
>>> ow ? which ones ?
>> Sorry, maybe 'never displayed' was confusing. I meant 'often never
>> displayed'.
>> The forms not shown, but loaded hidden (e.g. via CreateForm).
> 
> 
> Ah, I was ttalking/thinking about cases after a handle was created.
> Indeed, until a handle (or now a rawimage) is created, the savestream is 
> needed.
> 
>> And formerly the images of an imagelist were created only if used.
> 
> I expected this one ;)
> 
>>>> 2. SaveStream often contains information, that is not stored in the
>>>> corresponding TGraphic class. For example header information or
>>>> higher resolution.
>>> Not anymore. Most important info is stored in a rawimage description 
>>> and/or the object itself. The stream is only kept to save an image in 
>>> its original format.
>> And what about the other attributes?
>> For example save an image in gimp and it shows for nearly any format some
>> special properties.
> 
> Yes and those extra properties are properties of the coresoponding 
> imageclass (like compressionratio for TJPegImage)
> 
>> What happens to images loaded in higher resolution than the current
>> resolution and is then saved without SaveStream?
> 
> The r15472 implementation reads the raw image data in the same (or 
> better) format. This data is also used for writing. this way no image 
> details are lost. When a BitmapHandle is created, it always gets created 
> in a format supported by the device. This may thus be of lower quality.
> With this approach, support for the PixelFormat property will be possible.
> 
> Bitmap manipulations still happen through a device based canvas, so 
> currently you cannot "draw" a bitmap of a better quality than your 
> current device. (for the far future I'm thinking of a way to make the 
> canvasclass configurable, so that we can have a device independent canvas)
> 
>>>> 3. The SaveStream is kept to make sure, that loading/saving creates
>>>> the same stream. For example the IDE uses this a lot
>>>> (TGraphics.Equals).
>>> imo, except for jpeg maybe, load and save image code should reproduce 
>>> the same image. TGraphic.Equals might get adapted to use better 
>>> comarisation based on imagedata.
>> Yes, of course, they should. But do they?
> 
> IMO yes, pixel wise.
> 
>> For example the xpm reader skips all comments and the extended
>> attributes. And there are many ways to represent the same
>> pixel/color.
> 
> I don't see that as a problem. Look at a paint application, if you load 
> an image and then save it again, it hgets saved in the format of the 
> application, not the original file.
> 
> If a streamcopy is needed, then you should take care of that, not the 
> graphic object.
> 
>> And I don't see any extra properties of TPortableNetworkGraphic. Where
>> are they stored?
> 
> To be implemented ?

Oops, hit sent to fast.

In case of the IDE, I have no opinion yet on what would be better. 
Keeping the original stream or write a "similar" one ourselves.
In this case a KeepStream property might be a good thing.


Marc



More information about the Lazarus mailing list