Just thought I'd do some announcing for those not keenly following every SVN
commit.

Something that was pending a while back in discussions was the fact that Evas
uses modules to load image formats, BUT some image formats are in one or more
of the following categories:

1. There is a decoder library, but it is buggy and crashes a lot, taking down
apps with it.
2. There is a decoder library but it is GPL, thus forcing all Evas using apps
to become GPL which is not acceptable.

A little while ago i created a "generic loader" for Evas. It's been lurking in
SVN for a little while now in trunk. This is a generic "stdin/shm file/tmp file
loader". What it does is it EXECUTES (and opens a pipe) to an EXECUTABLE that
it just dumbly runs. This executable is "evas_image_loader.EXTENSION" and must
be in your $PATH. if it exists and can be run, evas runs it and reads the
standard output. For a pdf file (X.pdf or X.Pdf or X.PDF) evas tries to run
evas_image_loader.pdf (it turns the extension into lowercase always). For xcf
files it tries to run evas_image_loader.xcf. As xcf files can be gzipped (and
thus be named X.xcf.gz) it will try and run evas_image_loader.xcf.gz and so on.
If none of these extension/type specific loader executables can be run or
exist, then evas tries to run evas_image_loader (with no extension) as a last
resort, hoping that maybe there is a generic "catch all" program (or script
even) that could load something. Note that this isn't necessarily desirable,
but it's a fallback feature I put in just in case someone wants to use it.

This is just the generic "I will run whatever you stick in $PATH" loader. It
doesn't care what is there - just provide it. Thanks to some work by me,
porting over the old Imlib2 xcf loader (and making it also handle gzip xcf's)
and some excellent work by Vincent Torri, in SVN you will see a
evas_generic_loaders "app". This compile currently 2 generic binary executable
loaders. One for XCF (and XCF.GZ files) and one for PDF's. All you need to do
is compile and install this and as long as the binaries are in your $PATH...
evas can now load these file formats. PDF actually even can load selected pages
from a pdf (provide the page number as a key (in a string) to the evas image
file set api like "0" for the 0th (first) path, "3" for the 4th page, "87" for
the 88th page and so on. default is 0 if no key is given. it even supports
pre-scaling and rendering the page at a requested DPI or scale size if you use
the evas load options. XCF's will merge all visible layers into a single image
with alpha. So this is an announce that the generic loaders are now working and
beginning to get useful. Thanks to Vincent for the PDF work and thanks to CK
for the original XCF loader work for imlib2. Packagers may want to start
packaging this. Yes - it's 0.0.9 (not even 0.1) but it works. i'd want to fill
it out a bit more (support scale-down multiplies like jpeg loader does in pdf
loader, make the shmfile support shared code, add a RAW loader that uses
libraw, and add documentation).

For anyone interested in writing more loaders (eg a RAW one or a PS loader that
uses ghostscript etc.), here's how things work.

First - read the XCF and PDF loaders. very much specifically just main(). the
rest of the code is format specific. Now keep in mind how the generic loader
system works:

1. generic loader opens up a one-way pipe of stdout from the executable to the
generic loader module. That means it is parsing ALL stdout from the loader.
Don't print anything to stdout you don't want to send to the loader module. use
stderr if you have to debug.
2. the generic loader executable is passed the following parameters:
    executable /path/to/file [options]
  there is ALWAYS a filepath as the first argument and then extra options can
be one or more of:
  -key KEYNAME
    (load the file given and look for KEYNAME "key" inside the file - useful
for holding a page number for a PDF for example, or a key inside a database or
zip file etc.)
  -head
    (only load the header of the file and produce the metadata like size, alpha
channel etc. and then print "done" as evas doesn't want the image data itself
yet and this is considered the most expensive part to decode)
  -opt-scale-down-by FACTOR 
    (scale the image DOWN by a factor of FACTOR, 1 == dont scale down, 2 ==
scale down to half width and height, 4 == scale down to 1/4 width and height
and so on - loader may limit scale down to powers of 2 and to a limited range
if it wants, and it shouldn't allow scaling to produce a 0x0 image (limit to 1
pixel in each dimension as a minimum))
  -opt-dpi DPI
    (when decoding use the given DPI if it is a scalable vector graphic. DPI
is actually the real DPI multiplied by 1000 as an integer, so a DPI of 45.3
will be supplied as 45300, or a DPI of 72.0 is 72000)
  -opt-size W H
    (decode the image so it will fit WITHIN the WxH region in pixels (scale
down if needed or possible, and optionally can scale up if desired). should
retain aspect ratio. look at the PDF decoder for details on how to do this)

  note that the -opt-* options are OPTIONAL for a loader to support. it
probably should only support them *IF* it has an optimised load path (can load
as fast or faster WHILE scaling compared to evas doing post-load scaling
itself).

3. stdout carries metadata for the image like size, alpha channel state, and
how the generic loader module should read the rgba data. every command is some
text with a newline ("\n") at the end of the command. commands that the generic
loader understands (i'll use printf notation):
  size %i %i
    (declare the image size in pixels with the 2 numbers being width and height)
  alpha %i
    (declare if image has a relevant alpha channel or not - number being alpha
flag, 1 == alpha on, 0 == alpha off)
  tmpfile %s
    (mmap the file given by %s (absolute path) that contains all the ARGB pixel
data in evas's native ARGB format row by row from top left to bottom right.
file will be deleted by the loader module when evas is done)
  shmfile %s
    (declare an shm key to be used by the generic loader and shm_open() that
will be mmaped just like the tmpfile above and deleted by the loader module
when finished).
  data
    (all stdout after the data command (and its newline char) will be ARGB data
written to stdout just like the ARGB data in the tmpfile or shmfile)
  done
    (loader is done decoding - useful for when asked to decode the header only
and no actual data)

Anyway - there's some news and info for you. I hope this becomes useful to
people and others want to contribute more external loaders to fit their needs.
some ideas for loaders:

  PS (postscript) (use ghostscript libs)
  RAW (RAW photos) (use libRAW lib)
  MPG/AVI/MOV/MP4/etc. (general movie files) (use gstreamer or libxine or
libvlc but just grab 1 frame from the movie (maybe even have smart searching to
jump to the middle and find a frame that isnt boring).
  HTML (html pages) (use webkit to render complex pages to memory as images -
liable to maybe be crash prone, thus better as an executable)
  TXT (text files) (even use evas to load and render text files to a memory
buffer and provide it as an image - awesome for thumbnailing)
  DOC/PPT/PPT/XLS/etc. (office documents) (somehow harness open/libreoffice or
calligra/koffice to load documents and render to memory much like PDF's).

anyway... there you go. all the above are possible and its trivial to provide
the image data evas needs in stdout and/or tmp and shm files you mmap and it
doesn't impact application licensing or stability. so you can be much more
adventurous.

(does someone want to blog about this?)

-- 
------------- Codito, ergo sum - "I code, therefore I am" --------------
The Rasterman (Carsten Haitzler)    ras...@rasterman.com


------------------------------------------------------------------------------
Achieve unprecedented app performance and reliability
What every C/C++ and Fortran developer should know.
Learn how Intel has extended the reach of its next-generation tools
to help boost performance applications - inlcuding clusters.
http://p.sf.net/sfu/intel-dev2devmay
_______________________________________________
enlightenment-users mailing list
enlightenment-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-users

Reply via email to