?
Including LibMNG [The Multiple-image Network Graphics Library] with Solaris
Stefan Teleman <Stefan.Teleman at Sun.COM>
6 November 2007
1. Summary and motivation
MNG [Multiple-image Network Graphics] [1] is a Graphics File
Format specification. [2] In addition to the canonical MNG
Format Specification, MNG defines three additional proper
subsets thereof:
- MNG-LC [Low Complexity]
- MNG-VLC [Very Low Complexity]
- JNG [JPEG Network Graphics]
The Multiple-image Network Graphics Library [MNG] [1]
" [ ... ] is a multiple-image member of the PNG
[Portable Network Graphics] [3] format family. It can contain
animations, slide shows, or complex still frames, comprised
of multiple PNG or JNG single-image datastreams. [ ... ]
[ ... ] The MNG format [but not MNG-LC or MNG-VLC] provides a
mechanism for reusing image data without having to retransmit
it. Multiple images can be composed into a 'frame' and a
group of images can be used as an animated 'sprite' that moves
from one location to another in subsequent frames.
'Palette animations' are also possible. MNG can also store
images in a highly compressible 'Delta-PNG' format, defined
herein." [2]
MNG uses Zlib [4] for compressing and decompressing MNG files.
The inclusion of LibMNG in Solaris will provide a unified
and efficient programmatic facility for encoding JPEG, GIF
and PNG files into a common wrapper graphics file format.
Given that MNG supports animations, it is suitable for
converting GIF animations, as well as for lossless conversions
of JPEG files. This latter facility is complementary to MPEG
encoding, although MNG is not intended as a replacement of
MPEG's lossy compression facilities used for video storage.
MNG is used by numerous open source projects, most notably
SDL [5], QT [6] and KDE [7].
MNG is pronounced "Ming".
This case seeks Micro/Patch release Binding.
2. Technical issues
2.1. Key objects
/usr/lib/libmng.so.1.0.0
/usr/lib/libmng.so.1 -> /usr/lib/libmng.so.1.0.0
/usr/lib/libmng.so -> /usr/lib/libmng.so.1.0.0
/usr/lib/${MACH64}/libmng.so.1.0.0
/usr/lib/${MACH64}/libmng.so.1 -> /usr/lib/${MACH64}/libmng.so.1.0.0
/usr/lib/${MACH64}/libmng.so -> /usr/lib/${MACH64}/libmng.so.1.0.0
/usr/include/mng/libmng.h
/usr/include/mng/libmng_conf.h
/usr/include/mng/libmng_types.h
/usr/share/doc/libmng/html/index.html
/usr/share/doc/libmng/html/mng-lc.html
/usr/share/doc/libmng/html/mng-vlc.html
/usr/share/doc/libmng/html/jng.html
/usr/share/doc/libmng/html/mng-1.0-20010209-pdg.html
/usr/share/doc/libmng/html/mng-1.0-20010209-pdg-h20.html
/usr/share/doc/libmng/html/mng-lc-1.0-20010209-pdg.html
/usr/share/doc/libmng/html/mng-lc-1.0-20010209-pdg-h20.html
/usr/share/doc/libmng/html/mng-vlc-1.0-20010209-pdg.html
/usr/share/doc/libmng/html/mng-vlc-1.0-20010209-pdg-h20.html
/usr/share/doc/libmng/html/jng-1.0-20010209-pdg.html
/usr/share/doc/libmng/html/jng-1.0-20010209-pdg-h20.html
/usr/share/man/man3/libmng.3
/usr/share/man/man5/jng.5
/usr/share/man/man5/mng.5
This case proposes the integration of LibMNG Version 1.0.10.
This version of LibMNG [1.0.10] is thread-safe, 64-bit clean and
largefile aware. The 64-bit LibMNG libraries will be delivered
with this Integration.
By default, LibMNG installs its header files under /usr/include.
We propose changing this default installation location to a more
suitable /usr/include/libmng, for the purpose of avoiding namespace
pollution in /usr/include.
LibMNG provides documentation in Unix man format, and HTML. The
full set of documentation provided by LibMNG will be delivered
with this Integration.
2.2. Programmatic facilities
Access to LibMNG's API is provided by one header file, libmng.h:
#include <libmng.h>
LibMNG's API makes extensive use of callback functions. This design
allows for maximum portability of LibMNG across different platforms
and architectures. The minimal set of callback functions which
must be implemented are
mng_bool mng_openstream(mng_handle hHandle);
mng_bool mng_closestream(mng_handle hHandle);
mng_bool mng_readdata(mng_handle hHandle,
mng_ptr pBuf,
mng_uint32 iBuflen,
mng_uint32p pRead);
It is expected that each callback function returns MNG_TRUE on
success, or MNG_FALSE on failure.
Although not supported directly [LibMNG does not provide an API
for JPEG encoding], LibMNG can optionally use the JPEG Library [8],
thereby allowing for inclusion and encoding of JPEG images [frames].
LibMNG can also use the LCMS [Little CMS] Library [9]. LCMS
provides a highly efficient Color Management System, which gives
LibMNG the ability to provide full color-correction, for images
containing the properly encoded color-correction information.
The planned inclusion of LCMS [9] with Solaris will be discussed
in detail in a separate Fast-Track ARC case.
2.3. Language Bindings
LibMNG is written in ANSI C. Bindings exist for several other
languages [ Perl, Python, PHP, Tcl ]. None of these bindings are
part of the canonical LibMNG release, and are not being considered
for inclusion in Solaris at this time.
2.4. Documentation
The canonical LibMNG release contains a full documentation set,
in UNIX Manual format, and HTML. The full documentation set provided
by LibMNG will be included in this Integration.
3. Interfaces
3.1. Interface stability
LibMNG's development and release schedule are controlled by a group
of developers external to SMI [1]. Although the MNG Specification [2]
is 'frozen', and LibMNG attempts to maintain API and ABI compatibility
between Major release versions, no explicit compatibility guarantees
are provided by LibMNG.
3.2. Imported interfaces
LibMNG imports interfaces from the Standard C Library, Standard
Math Library and the POSIX Threads Library. In addition, the
following library Interfaces are imported by LibMNG:
NAME STABILITY NOTES
LibPNG Evolving LSARC/2003/085
LibJPEG Evolving LSARC/2003/085
Z-Lib [ Zlib Compression Library ] Committed PSARC/2006/537
LCMS [ Little Color Management System ] Uncommitted PSARC/2007/TBD
3.3. Exported interfaces
NAME STABILITY NOTES
SUNWlibmng Uncommitted Package Name
/usr/lib/libmng.so.1.0.0 Uncommitted Shared library
/usr/lib/libmng.so.1 Uncommitted Symbolic link
/usr/lib/libmng.so Uncommitted Symbolic link
/usr/lib/${MACH64}/libmng.so.1.0.0 Uncommitted Shared library
/usr/lib/${MACH64}/libmng.so.1 Uncommitted Symbolic link
/usr/lib/${MACH64}/libmng.so Uncommitted Symbolic link
/usr/include/mng/ Uncommitted Include files
/usr/include/mng/libmng.h Uncommitted Header file
/usr/include/mng/libmng_conf.h Uncommitted Header file
/usr/include/mng/libmng_types.h Uncommitted Header files
/usr/share/doc/libmng/html/index.html Uncommitted HTML Doc
/usr/share/doc/libmng/html/mng-lc.html Uncommitted HTML Doc
/usr/share/doc/libmng/html/mng-vlc.html Uncommitted HTML Doc
/usr/share/doc/libmng/html/jng.html Uncommitted HTML Doc
/usr/share/doc/libmng/html/mng-1.0-20010209-pdg.html Uncommitted
HTML Doc
/usr/share/doc/libmng/html/mng-1.0-20010209-pdg-h20.html
Uncommitted HTML Doc
/usr/share/doc/libmng/html/mng-lc-1.0-20010209-pdg.html Uncommitted
HTML Doc
/usr/share/doc/libmng/html/mng-lc-1.0-20010209-pdg-h20.html
Uncommitted HTML Doc
/usr/share/doc/libmng/html/mng-vlc-1.0-20010209-pdg.html
Uncommitted HTML Doc
/usr/share/doc/libmng/html/mng-vlc-1.0-20010209-pdg-h20.html
Uncommitted HTML Doc
/usr/share/doc/libmng/html/jng-1.0-20010209-pdg.html Uncommitted
HTML Doc
/usr/share/doc/libmng/html/jng-1.0-20010209-pdg-h20.html
Uncommitted HTML Doc
/usr/share/man/man3/libmng.3 Uncommitted Man Page
/usr/share/man/man5/jng.5 Uncommitted Man Page
/usr/share/man/man5/mng.5 Uncommitted Man Page
6. References
[1] http://www.libmng.com/
[2] http://www.libmng.com/pub/mng/spec/mng-1.0-20010209-pdg-h20.html
[3] http://www.libpng.org/
[4] http://www.zlib.org/
[5] http://www.libsdl.org/
[6] http://www.trolltech.com/products/qt/
[7] http://www.kde.org/
[8] http://www.ijg.org/
[9] http://www.littlecms.com/
--
Stefan Teleman
Sun Microsystems, Inc.
Stefan.Teleman at Sun.COM