\documentclass[12pt]{article}

\usepackage{times}

\let\slash=/
\catcode`\/=\active
\def/{\futurelet\next\slashswitch}
\def\slashswitch{\ifx\next/\let\next=\udblslash\else\let\next=\uslash\fi
\next}
\def\uslash{\slash\penalty\exhyphenpenalty}
\def\udblslash/{\slash\slash\penalty\exhyphenpenalty}
\def\url{\begingroup\tt}
\def\endurl{\endgroup}

\def\gimp{{\sc gimp}}
\def\gnu{{\sc gnu}}
\def\gpl{{\sc gpl}}

\newcommand{\FIXME}[1]{\emph{*** FIXME: #1 ***}}

\begin{document}

\title{GNU Image Manipulation Program\\
	Technology White Paper}
\date{}
\maketitle

\part{Introduction}

The {\bf G}NU\footnote{Please see \url http://www.gnu.org \endurl for
information on the \gnu\ Project.} {\bf I}mage {\bf M}anipulation {\bf
P}rogram (\gimp) is a powerful tool for the preparation and
manipulation of digital images.  The \gimp\ provides the user with a
wide variety of image manipulation, painting, processing, and
rendering tools.  The key to the \gimp's power lies in its flexible
core and easily extensible design.  The \gimp's open design and
extensible architecture make for a very powerful end product which can
continue to be extended to meet the needs of the photo compositor,
image retoucher, web graphics designer, or digital illustrator for a
very long time.

The \gimp's extensible plug-in architecture allows for image
manipulation procedures and other functionality to be easily added
without requiring any change to the application core.  A plug-in can
provide functionality as simple as rotating an image, or as
complicated as rendering iterated function system fractals.  There are
nearly 150 plug-ins available in version 1.0, and more are sure to
follow.

The plug-in architecture also allows the \gimp\ to support a wide
variety of file formats.  File operations are implemented by special
\emph{file plug-ins}, allowing additional file formats to be added
without modification to the core.  File formats supported in version
1.0 include the popular GIF and JPEG standards, as well as PNG, TIFF,
XPM, SGI, PCX, and Windows BMP.

An innovative tile management system allows the \gimp\ to be used to
edit images much larger than can be stored in system memory; the
user's available disk space is the only real limit to the size of the
image a user can edit.

While the \gimp's primary emphasis is on image manipulation, it also
offers a complete set of painting tools for use in image creation.
Version 1.0 offers pencil, paintbrush, eraser, airbrush, and cloning
tools, as well as a variable-strength convolver.  All of these tools
(except the eraser) can be operated in any of the \gimp's 15 painting
modes.  A powerful gradient generator, with a very versatile custom
gradient editor, makes colored blends easy.

A full battery of image manipulators are available, including
rotation, scaling, translation, color, brightness, and contrast
adjustment, and gamma correction.  In addition, a great many other
useful transformations are available as plug-ins, and the ease of
extensibility here means that new capabilities are being added all the
time.

Finally, the most impressive feature of the \gimp\ is that it is
available under the terms of the GNU General Public License
(\gpl).\footnote{Please see \url http://www.gnu.org/copyleft/gpl.html
\endurl for the full text of the \gpl.}  The entire source code is
freely available and distributed.  This openness has fostered a very
active development community and large user base, out of which a
superior product has arisen.

\part{Core architecture}

\section{Images}

The basic operating element of any digital image editor is the
\emph{image}.  In the \gimp, images are constructed out of
\emph{layers}, which are stacked on top of on another through a
process called \emph{composition} to produce a \emph{projection},
which is what is displayed to the user.  In addition to having any
number of layers, a \gimp\ image may have one or more user-defined
\emph{channels}, as well as a \emph{selection mask}.  Channels and
selection masks are discussed later.  Together, these three objects
(layers, channels, and selection masks) along with \emph{layer masks}
(also to be discussed later) are known as \emph{drawables}, because
the drawing tools work on all of them and they are the only internal
structures into which the program can paint to.\footnote{There is
presently no way to draw directly onto a selection mask using the user
interface.  However, the user can create an invisible channel, paint
there, and ask the program to turn the channel into a selection mask.}

Images in the \gimp\ are typed, and there are presently three types of
image: RGB, grayscale, and indexed.  The type of image determines the
representation of the pixels in the image.  In an RGB image, each
pixel of the composited image is represented by a 24-bit RGB tuple;
all 16 million possible colors are potentially available in the
composited image.  Grayscale images are monochromatic, and each pixel
is a single 8-bit gray value, yielding 256 shades of gray.  Indexed
images represent each pixel as an index into a color table, each entry
of which is a 24-bit RGB tuple.  The type of all layers within an
image must be compatible with the image type.

\section{Drawables}

A \emph{drawable} is a linear array of pixel data; however, the
contents of a drawable need not necessarily be used solely for
rendering as pixel data (for example, selection masks are drawables
internal to the program, and they are not directly ``paintable'' by the
user).

Each drawable contains from one to four data channels (not to be
confused with the channels spoken of elsewhere in this document),
depending on the type of the drawable.  Each data channel is eight
bits deep.

There are six types of drawables (see table \ref{tab:drawables}).

\begin{table}
\centering
\begin{tabular}{lcl}
Type & Data channels & Contents of channels \\
\hline
RGB			& 3	& red, green, blue \\
RGB w/ alpha		& 4	& red, green, blue, alpha \\
Grayscale		& 1	& intensity \\ 
Grayscale w/ alpha	& 2	& intensity, alpha \\
Indexed			& 1	& color index \\
Indexed w/ alpha	& 2	& color index, alpha \\
\end{tabular}
\caption{Drawable Types}
\label{tab:drawables}
\end{table}

\subsection{Layers}

Each \emph{layer} is a drawable.  Layers of any drawable type are
possible, but the type of a layer must be compatible with the type of
the image of which it is a part.  A layer type is compatible with an
image type if the two are the same, or if the layer type is the same
as the image type with an added alpha channel (for example, a
grayscale image cannot contain an RGB layer).  Every layer is part of
exactly one image.

The user may selectively make any layer of an invisible; invisible
layers do not contribute to the composition process.

\subsubsection{Layer masks}

Optionally, any layer with an alpha channel may have an added
\emph{layer mask}.  The layer mask is a separate channel which is
multiplied into that layer's drawable alpha channel whenever that
layer contributes to a projection.  The user can elect to temporarily
disable this effect of a layer mask for editing purposes, or cause the
layer mask to be substituted for the main drawable; these effects are
mainly for convenience in editing.  The user can also merge the layer
mask back into the layer's main drawable, or discard it.

\subsection{Channels}

The term ``channels'' actually refers to three different things in the
\gimp: layer masks, selection masks, and custom channels.  In all
three cases, a channel consists of an array of 8-bit values; the
interpretation of these values varies depending on the type of
channel.

In addition to these channel types, each image also has either one or
three ``virtual'' channels (one for grayscale and indexed images,
three for RGB).  These virtual channels (sometimes called ``color
channels'') are merely a convenience to the user and are not drawables
by themselves.  These virtual channels can be made visible or
invisible, and for images where there is more than one virtual
channel, each can be made visible or invisible independently of the
others.  Normally all the virtual channels are active, and all
painting operations modify all three the channels.  When a virtual
channel is invisible, both layer composition and layer painting
operations ignore that channel.  This is useful in two situations:
first, when the user wants to see only a subset of the color channels
(RGB); and second, when the user wants to paint on the image but only
modify a subset of the channels.

\section{Tiles}

\section{Pixel Regions}

\section{The Paint Core}

\subsection{Brushes}

All brushes in gimp are implemented as greyscale bitmap masks. They
are 8-bit greyscale and provide 256 levels of grey. 

The format for the Brush file is the .gbr format (Gimp brush). Gimp
includes a file plugin to load and save this format, so brushes can be
created and edited using GIMP itself. 

These brushes can be used by any of the paint tools (paintbrush,
airbrush, clone, etc). 

Brushes are completely customizable and are not limited to simple 
pre-made shapes. Any greyscale image can conceivibly used as a brush.

\section{Selections}

\section{Tools}

\section{xcf format}


\subsection{Gradient tool}

The gradient tool lets the user easily create color gradients.  It
supports several gradient types: linear, bilinear, radial, square,
conical, and the special ``shapeburst'' mode, which makes the gradient
follow the shape of the active selection.

Normally, the blend tool creates color gradients between the current
foreground and background colors.  It supports four blending modes:
linear interpolation between the RGB components, linear interpolation
between the HSV versions of the colors (for rainbow effects), blending
from the foreground color to transparent, and the very powerful custom
gradient feature.

Gradients are calculated with respect to a direction vector.  The user
can specify whether the gradient is to be rendered normally (only once
along the direction vector), or repeated along the direction vector
using a sawtooth or triangular wave pattern.

A unique feature of the \gimp's gradient tool is its support for
user-defined, custom color gradients.  The \gimp\ sports a
fully-featured color gradient editor that lets the user create color
gradients with an arbitrary number of color transitions.

A custom gradient is represented internally as a list of contiguous,
non overlapping segments that define a partition of the range $[0, 1]$.  
Each segment has the following properties:

\begin{itemize}

\item Left and right colors that blend smoothly inside the segment.

\item An off-center midpoint, which can be used to bias the color
blend to the left or to the right.

\item A blending function, which can be linear, curved (with an
exponent), sinuosidal, or spherical (increasing and decreasing).

\item A coloring type, which can be RGB interpolation, clockwise or
couterclockwise HSV interpolation.

\end{itemize}

The user can drag the segments' endpoints left and right.  Segments
can be inserted and deleted at any time.  The gradient editor provides
several useful functions for manipulating segments (split, flip,
replicate) that make creation of custom gradients easy and convenient.
The color segments support full transparency information, making for
even more flexible gradients.

To avoid sampling artifacts (the ``jaggies''), the gradient rendering
engine supports adaptive supersampling with customizable threshold and
recursion depth parameters.  With adaptive supersampling even the most
complex custom gradients will be rendered smoothly without
artifacting.

\FIXME{drawing or screenshot?}


\part{Plug-ins and the PDB}

\section{Procedures}

The \gimp\ core consists of 215\footnote{In version 0.99.16.  This
number tends to go up with time.} procedures which operate on images
in a great variety of ways.

The procedures register themselves in the Procedural Database (or
PDB). All plugins have access to all the procedures in the PDB, and
most of the scripting extentions provide full access to the PDB. The
PDB is basically an API for programming high level internal \gimp\
functions and procedures. 






 

\FIXME{General overview}


\end{document}




