On 2017-03-10 11:01, Kostas Michalopoulos via Lazarus wrote:
You can check yourself easily: Ctrl+Click on the p.Width to go to the
definition of the property, then Ctrl+Click on the GetWidth getter,
Ctrl+Shift+Down arrow to see the code for the getter and see that it
simply gets FGraphic's property.

You can check the current sources but that does not mean it will stay that way, or that the current sources do not have a bug in them... the documentation would tell you how it is supposed to act, and, the source is one particular implementation, which could not match up with what the doc says, in that case it is buggy ;-)

But thanks very much for explaining it: indeed I figured any call to .jpeg.someproperty would immediately automagically do the work for you

 So what is FGraphic? Ctrl+Home to
move at the top of the source code (you'd be in picture.inc) and
search for "FGraphic :=" to see where it is assigned (the source code
style in that file seems to put a space before := in assignments). You
can see that it is used in a bunch of places, so you can see where
those uses are. ForceType is the first one and if you search for that
one, you'll find that it is used wherever a type-specific property
(p.Jpeg, p.Bitmap, etc) is used - presumably to convert the underlying
graphic to the requested type. So the FGraphic object is actually an
instance of the TBitmap, TPortableNetworkGraphic, TJpegImage, etc
(depending what you loaded and/or accessed last).


This is very useful - I thought maybe it would be in a wiki or docs somewhere.. It may be...

So what p.Width gives you is the FGraphic's width or 0 if there is no
FGraphic loaded (because a picture may have nothing loaded until you
either load it directly or try to access any of the Bitmap, Jpeg, PNG,
etc properties). So if you already have a picture loaded from a PNG
file, p.Width, p.Graphic.Width and p.PNG.Width will give you the same
number. If your picture doesn't have a graphic (e.g. it is a newly
constructed object) then p.Width gives you 0, p.Graphic.Width will
crash your program (FGraphic is nil) and p.PNG.Width will give you
zero (because accessing the PNG property will call the ForceType
function which will create a TPortableNetworkGraphic object that by
default is undefined and gives you zero width).

Question for the readers: what happens to the image if you load a PNG
file with alpha values using TPicture's LoadFromFile, access the
TPicture.Jpeg.Width property and then save the picture as a PNG file
using TPicture's SaveToFile? Is the alpha component preserved? Do you
get jpeg artifacts? Why?

Bonus question: why is R := Rect(0, 0, p.Jpeg.Width, p.PNG.Height)
worse than R := Rect(0, 0, p.Jpeg.Width, p.PNG.Height)? Why is R :=
Rect(0, 0, p.Width, p.Height) better than either of them?

You can find the answers to those (and many more) using Ctrl+Click,
Ctrl+Shift+Up/Down Arrow, Search and back and forward buttons (helps
to have a mouse with those). Considering how big and complex LCL is,
it helps to be able to navigate and familiarize yourself with its
source code :-).

IMO the docs should always describe the theory of an object/procedure, and therefore if any time the source code is buggy, the docs are the official sources to what a function does.. :-)

Thanks much for documenting it in this mailing list !

Some of your comments, IMO should be uploaded to wiki/docs somewhere
But I'm unfamiliar with how the docs updating process works
--
_______________________________________________
Lazarus mailing list
Lazarus@lists.lazarus-ide.org
http://lists.lazarus-ide.org/listinfo/lazarus

Reply via email to