From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001
From: Norbert Preining <norbert@preining.info>
Date: Mon, 2 Sep 2019 13:46:59 +0900
Subject: Initial commit

---
 macros/latex/contrib/oberdiek/bmpsize.dtx | 4097 +++++++++++++++++++++++++++++
 1 file changed, 4097 insertions(+)
 create mode 100644 macros/latex/contrib/oberdiek/bmpsize.dtx

(limited to 'macros/latex/contrib/oberdiek/bmpsize.dtx')

diff --git a/macros/latex/contrib/oberdiek/bmpsize.dtx b/macros/latex/contrib/oberdiek/bmpsize.dtx
new file mode 100644
index 0000000000..ec2013277c
--- /dev/null
+++ b/macros/latex/contrib/oberdiek/bmpsize.dtx
@@ -0,0 +1,4097 @@
+% \iffalse meta-comment
+%
+% File: bmpsize.dtx
+% Version: 2016/05/16 v1.7
+% Info: Extract size/resolution from bitmap files
+%
+% Copyright (C) 2006-2009 by
+%    Heiko Oberdiek <heiko.oberdiek at googlemail.com>
+%    2016
+%    https://github.com/ho-tex/oberdiek/issues
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either
+% version 1.3c of this license or (at your option) any later
+% version. This version of this license is in
+%    http://www.latex-project.org/lppl/lppl-1-3c.txt
+% and the latest version of this license is in
+%    http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of
+% LaTeX version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status "maintained".
+%
+% This Current Maintainer of this work is Heiko Oberdiek.
+%
+% This work consists of the main source file bmpsize.dtx
+% and the derived files
+%    bmpsize.sty, bmpsize.pdf, bmpsize.ins, bmpsize.drv,
+%    bmpsize-base.sty, bmpsize-test.tex, bmpsize-dvips.def,
+%    bmpsize-dvipdfm.def, bmpsize-dvipdfmx.def.
+%
+% Distribution:
+%    CTAN:macros/latex/contrib/oberdiek/bmpsize.dtx
+%    CTAN:macros/latex/contrib/oberdiek/bmpsize.pdf
+%
+% Unpacking:
+%    (a) If bmpsize.ins is present:
+%           tex bmpsize.ins
+%    (b) Without bmpsize.ins:
+%           tex bmpsize.dtx
+%    (c) If you insist on using LaTeX
+%           latex \let\install=y\input{bmpsize.dtx}
+%        (quote the arguments according to the demands of your shell)
+%
+% Documentation:
+%    (a) If bmpsize.drv is present:
+%           latex bmpsize.drv
+%    (b) Without bmpsize.drv:
+%           latex bmpsize.dtx; ...
+%    The class ltxdoc loads the configuration file ltxdoc.cfg
+%    if available. Here you can specify further options, e.g.
+%    use A4 as paper format:
+%       \PassOptionsToClass{a4paper}{article}
+%
+%    Programm calls to get the documentation (example):
+%       pdflatex bmpsize.dtx
+%       makeindex -s gind.ist bmpsize.idx
+%       pdflatex bmpsize.dtx
+%       makeindex -s gind.ist bmpsize.idx
+%       pdflatex bmpsize.dtx
+%
+% Installation:
+%    TDS:tex/latex/oberdiek/bmpsize.sty
+%    TDS:tex/latex/oberdiek/bmpsize-base.sty
+%    TDS:tex/latex/oberdiek/bmpsize-test.tex
+%    TDS:tex/latex/oberdiek/bmpsize-dvips.def
+%    TDS:tex/latex/oberdiek/bmpsize-dvipdfm.def
+%    TDS:tex/latex/oberdiek/bmpsize-dvipdfmx.def
+%    TDS:doc/latex/oberdiek/bmpsize.pdf
+%    TDS:source/latex/oberdiek/bmpsize.dtx
+%
+%<*ignore>
+\begingroup
+  \catcode123=1 %
+  \catcode125=2 %
+  \def\x{LaTeX2e}%
+\expandafter\endgroup
+\ifcase 0\ifx\install y1\fi\expandafter
+         \ifx\csname processbatchFile\endcsname\relax\else1\fi
+         \ifx\fmtname\x\else 1\fi\relax
+\else\csname fi\endcsname
+%</ignore>
+%<*install>
+\input docstrip.tex
+\Msg{************************************************************************}
+\Msg{* Installation}
+\Msg{* Package: bmpsize 2016/05/16 v1.7 Extract size/resolution from bitmap files (HO)}
+\Msg{************************************************************************}
+
+\keepsilent
+\askforoverwritefalse
+
+\let\MetaPrefix\relax
+\preamble
+
+This is a generated file.
+
+Project: bmpsize
+Version: 2016/05/16 v1.7
+
+Copyright (C) 2006-2009 by
+   Heiko Oberdiek <heiko.oberdiek at googlemail.com>
+
+This work may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either
+version 1.3c of this license or (at your option) any later
+version. This version of this license is in
+   http://www.latex-project.org/lppl/lppl-1-3c.txt
+and the latest version of this license is in
+   http://www.latex-project.org/lppl.txt
+and version 1.3 or later is part of all distributions of
+LaTeX version 2005/12/01 or later.
+
+This work has the LPPL maintenance status "maintained".
+
+This Current Maintainer of this work is Heiko Oberdiek.
+
+This work consists of the main source file bmpsize.dtx
+and the derived files
+   bmpsize.sty, bmpsize.pdf, bmpsize.ins, bmpsize.drv,
+   bmpsize-base.sty, bmpsize-test.tex, bmpsize-dvips.def,
+   bmpsize-dvipdfm.def, bmpsize-dvipdfmx.def.
+
+\endpreamble
+\let\MetaPrefix\DoubleperCent
+
+\generate{%
+  \file{bmpsize.ins}{\from{bmpsize.dtx}{install}}%
+  \file{bmpsize.drv}{\from{bmpsize.dtx}{driver}}%
+  \usedir{tex/latex/oberdiek}%
+  \file{bmpsize.sty}{\from{bmpsize.dtx}{package}}%
+  \file{bmpsize-base.sty}{\from{bmpsize.dtx}{base}}%
+  \file{bmpsize-test.tex}{\from{bmpsize.dtx}{test}}%
+  \file{bmpsize-dvips.def}{\from{bmpsize.dtx}{dvips}}%
+  \file{bmpsize-dvipdfm.def}{\from{bmpsize.dtx}{dvipdfm}}%
+  \file{bmpsize-dvipdfmx.def}{\from{bmpsize.dtx}{dvipdfmx}}%
+  \nopreamble
+  \nopostamble
+%  \usedir{source/latex/oberdiek/catalogue}%
+%  \file{bmpsize.xml}{\from{bmpsize.dtx}{catalogue}}%
+}
+
+\catcode32=13\relax% active space
+\let =\space%
+\Msg{************************************************************************}
+\Msg{*}
+\Msg{* To finish the installation you have to move the following}
+\Msg{* files into a directory searched by TeX:}
+\Msg{*}
+\Msg{*     bmpsize.sty, bmpsize-base.sty, bmpsize-test.tex,}
+\Msg{*     bmpsize-dvips.def, bmpsize-dvipdfm.def,}
+\Msg{*     bmpsize-dvipdfmx.def}
+\Msg{*}
+\Msg{* To produce the documentation run the file `bmpsize.drv'}
+\Msg{* through LaTeX.}
+\Msg{*}
+\Msg{* Happy TeXing!}
+\Msg{*}
+\Msg{************************************************************************}
+
+\endbatchfile
+%</install>
+%<*ignore>
+\fi
+%</ignore>
+%<*driver>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesFile{bmpsize.drv}%
+  [2016/05/16 v1.7 Extract size/resolution from bitmap files (HO)]%
+\documentclass{ltxdoc}
+\usepackage{holtxdoc}[2011/11/22]
+\begin{document}
+  \DocInput{bmpsize.dtx}%
+\end{document}
+%</driver>
+% \fi
+%
+%
+% \CharacterTable
+%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%   Digits        \0\1\2\3\4\5\6\7\8\9
+%   Exclamation   \!     Double quote  \"     Hash (number) \#
+%   Dollar        \$     Percent       \%     Ampersand     \&
+%   Acute accent  \'     Left paren    \(     Right paren   \)
+%   Asterisk      \*     Plus          \+     Comma         \,
+%   Minus         \-     Point         \.     Solidus       \/
+%   Colon         \:     Semicolon     \;     Less than     \<
+%   Equals        \=     Greater than  \>     Question mark \?
+%   Commercial at \@     Left bracket  \[     Backslash     \\
+%   Right bracket \]     Circumflex    \^     Underscore    \_
+%   Grave accent  \`     Left brace    \{     Vertical bar  \|
+%   Right brace   \}     Tilde         \~}
+%
+% \GetFileInfo{bmpsize.drv}
+%
+% \title{The \xpackage{bmpsize} package}
+% \date{2016/05/16 v1.7}
+% \author{Heiko Oberdiek\thanks
+% {Please report any issues at https://github.com/ho-tex/oberdiek/issues}\\
+% \xemail{heiko.oberdiek at googlemail.com}}
+%
+% \maketitle
+%
+% \begin{abstract}
+% Package \xpackage{bmpsize} analyzes bitmap images to extract
+% size and resolution data. It adds this feature to the graphics package
+% that now do not need separate bounding box files for bitmap images.
+% Additionally the implementation for the inclusion of bitmap images
+% in some drivers of package \xpackage{graphicx} are rewritten to support
+% options \xoption{viewport}, \xoption{trim} and \xoption{clip}.
+% \end{abstract}
+%
+% \tableofcontents
+%
+% \section{Documentation}
+%
+% \subsection{Introduction}
+%
+% The support of bitmap images in the \TeX\ world is quite poor.
+% \TeX\ can read text files and thus parse the bounding box
+% of EPS files, but it cannot read binary files. If \TeX\ reads
+% a line, it removes spaces before the line end and normalizes
+% the line end itself to get independent from the convention of
+% the operating system.
+%
+% The situation changed with \pdfTeX. It is a \TeX\ compiler,
+% where the output driver is already integrated.
+% Images of type JPEG and PNG are supported directly and
+% the size of the images are reported back to the \TeX\ language.
+% Thus it is easy for package \xpackage{graphics} to get the
+% size of the images.
+%
+% The problem remains for other drivers than \pdfTeX\ in PDF mode.
+% The size information must either be given manually by the
+% bounding box options or an additional file is used for each
+% image, where the size information is stored as EPS bounding box.
+% Program \xpackage{dvips} comes with the program \xpackage{ebb}
+% that create these \xfile{.bb} files. However it ignores the
+% natural size of the image and uses a fixed resolution of 100\,DPI.
+%
+% Since \pdfTeX\ 1.30.0 there are some new primites. Especially
+% \cs{pdffiledump} is very helpful. It reads a file in binary mode
+% and reports the selected area as hex dump. It works in both
+% DVI and PDF mode of \pdfTeX. Thus it is now possible to read
+% and parse bitmap files to get their size.
+% This project uses this feature to implement parsers for many
+% bitmap file types.
+%
+% \subsection{Bitmap image parsers}
+%
+% This project supports the following image types:
+% \begin{quote}
+%   BMP, GIF, JPEG, MSP, PAM, PCX, PNG, PNM, SGI, TGA, TIFF, WMF, XPM
+% \end{quote}
+% Consult the documentation of your \TeX\ distribution and driver
+% which types are supported by your driver. Sometimes automatically triggered
+% conversions can be configured to extend the range of supported
+% image types.
+%
+% \subsubsection{User interface}
+%
+% Package \xpackage{bmpsize} hooks into package \xpackage{graphics}.
+% If an image is included and its size is not given, then
+% \xpackage{bmpsize} investigates the image. If it could be
+% parsed as known bitmap file type, the size is reported back
+% to package \xpackage{graphics}.
+%
+% The following options are added to the options of package \xpackage{graphicx}:
+% \begin{description}
+% \item[\xoption{resolutionunit}:] Specifies the unit of the
+%   options for setting the resolution. Default is \verb|1in| that means
+%   the numbers are interpreted as dots per inch (DPI).
+% \item[\xoption{defaultresolution}:] Bitmap files do not always provide
+%   information about their resolution (density). If this information
+%   is not given, the values of this option are used to calculate the
+%   image size. Default: \verb|72 !|
+% \item[\xoption{resolution}:] This option override the resolution given
+%   in the bitmap file.
+% \item[\xoption{bmpsizefast}:] Values are \verb|true| and \verb|false|.
+%   The option is enabled by default. Then mainly \eTeX's arithmetic is
+%   used to calculate the width and height. However the dimen dimensions
+%   are limited. Therefore overflow errors can happen.
+%   Disable then this option to use the arithmetic of package \xpackage{fp}.
+%   It allows a larger range of numbers at the cost of speed.
+% \end{description}
+% Options \xoption{defaultresolution} and \xoption{resolution} expect
+% two numbers, separated by a space. The first is taken as density
+% for the horizontal x axis, the second for the vertical y axis.
+% One of the numbers may be replaced by an exclamation mark. In this
+% an aspect ratio is respected and the correct density for this axis
+% automatically calculated. If one number is given, this number is
+% used for both axes.
+% Examples:
+% \begin{quote}
+%   \def\comment#1{%
+%     \unskip\qquad\textit{\%\space#1}\\%
+%     \ignorespaces
+%   }%
+%   |defaultresolution=72 !| \comment{Default}
+%   |resolution=100| \comment{Simulates behaviour of program \xpackage{ebb}}
+% \end{quote}
+%
+% The options can be set in \cs{includegraphics} or using \cs{bmpsizesetup}.
+% \verb|\setkeys{Gin}| is equivalent to the latter case.
+% \begin{quote}
+%\begin{verbatim}
+%\bmpsizesetup{resolutionunit=1in, resolution=100}
+%\includegraphics[
+%  defaultresolution=72 !,
+%  bmpsizefast=false
+%]{image}
+%\end{verbatim}
+% \end{quote}
+%
+% \subsubsection{Hints}
+%
+% \begin{itemize}
+% \item My version of \xfile{dvips.def} 1999/02/16 v3.0i defines
+%       rules for the supported bitmap extensions, but does not
+%       include them in the list of extensions that are tried
+%       if the file name is not given with an extension.
+%       In such a case, the list of extensions can be set
+%       by \cs{DeclareGraphicsExtensions}, see \xpackage{grfguide}.
+%       The following code just extends the list:
+%       \begin{quote}
+%\begin{verbatim}
+%\makeatletter
+%\g@addto@macro\Gin@extensions{,.bmp,.pcx,.msp}
+%\makeatother
+%\end{verbatim}
+%       \end{quote}
+% \item My version of \xfile{dvipdfm.def} 1998/11/24 vx.x misses
+%       the graphics rule for PNG files. It can be added by:
+%       \begin{quote}
+%\begin{verbatim}
+%\DeclareGraphicsRule{.png}{bmp}{.bb}{#1}
+%\end{verbatim}
+%       \end{quote}
+%       See the previous issue to add the extension \xfile{.png} to the list
+%       of extensions for package \xpackage{graphics}.
+% \end{itemize}
+%
+% \subsubsection{Test program}
+%
+% There is a test program \xfile{bmpsize-test.tex}. Run it through
+% \verb|latex|, \verb|pdflatex|, or \verb|pdftex|. Then given
+% image files are inspected and the result is printed.
+%
+% \subsubsection{Interface for programmers}
+%
+% The macro names of the parsers are \verb|\bmpsize@read@|\meta{type}.
+% Example: \cs{bmpsize@read@jpg} in case of JPEG.
+%
+% A parser sets the switch \cs{ifbmpsize@ok} to true, if it
+% could successfully parse the image file.
+% The width and height are returnd in \cs{bmpsize@width} and
+% \cs{bmpsize@height}. If information about density is available,
+% it is used to calculate width and height of the image, otherwise
+% the values given by option \xoption{defaultresolution} is used.
+% \xoption{resolution} overwrites the values in the image file.
+%
+% \subsection{Improved bitmap inclusion}
+%
+% Some drivers for package \xpackage{graphics} define the graphics
+% type \xoption{bmp} for bitmap images. The code in the standard
+% drivers for \xoption{dvips}, \xoption{dvipdfm}, and \xoption{dvipdfmx}
+% is very basic and misses essential features of the
+% package \xpackage{graphicx}. Therefore the code for bitmap
+% inclusion is automatically rewritten by this package to add
+% the following features:
+% \begin{itemize}
+% \item Support for \xoption{viewport} and \xoption{trim}.
+% \item Support for \xoption{clip}.
+% \item In case of \xoption{dvipdfm} and \xoption{dvipdfmx} the
+%       bitmap images are reused and not included again if they
+%       are used more than once.
+% \end{itemize}
+% However, there is a difference between \xoption{dvipdfm} and
+% \xoption{dvipdfmx}, especially if images are reused. In the
+% former case the reused box has width and height of 1bp, in the
+% latter case its natural width. Thus the correct driver option must be given.
+% \xoption{dvipdfm} and \xoption{dvipdfmx} are not equivalent.
+%
+% Older versions of \xoption{dvipdfmx} uses a size of 1in. However I do
+% want to distinguish between versions of the same program. Therefore the
+% support of these older versions has stopped with version 1.6 of this package.
+% Use version dvipdfmx-20090708 or newer (some few versions before will
+% probably also work, but I don't want to investigate this further).
+%
+% \StopEventually{
+% }
+%
+% \section{Implementation}
+%
+% \subsection{Basic package \xpackage{bmpsize-base}}
+%
+%    Identification.
+%    \begin{macrocode}
+%<*base>
+\ProvidesPackage{bmpsize-base}%
+  [2016/05/16 v1.7 Basic part of bmpsize (HO)]%
+%    \end{macrocode}
+%    Modules of package \xpackage{fp} are used for calculations.
+%    \begin{macrocode}
+\RequirePackage{fp-basic}
+\RequirePackage{fp-snap}
+%    \end{macrocode}
+%    Package \xpackage{fp} uses nested \cs{loop} structures.
+%    That breaks with the plain-\TeX\ version of \cs{loop}.
+%    Therefore we use the \LaTeX\ variant.
+%    \begin{macro}{\@bmpsize@plain@loop}
+%    \begin{macrocode}
+\long\def\@bmpsize@plain@loop#1\repeat{%
+  \def\iterate{%
+    #1\relax
+    \expandafter\iterate\fi
+  }%
+  \iterate
+  \let\iterate\relax
+}
+%    \end{macrocode}
+%    \end{macro}
+%    \begin{macrocode}
+\RequirePackage{pdftexcmds}[2007/11/11]
+%    \end{macrocode}
+%    \begin{macrocode}
+\newif\ifbmpsize@ok
+\let\@bmpsize@ok\bmpsize@oktrue
+
+\newif\if@bmpsize@bigendian
+\newif\if@bmpsize@absnum
+\newif\if@bmpsize@user@resolution
+\newif\if@bmpsize@fast
+\@bmpsize@fasttrue
+
+\def\@bmpsize@init{%
+  \let\@bmpsize@org@plain@loop\loop
+  \let\loop\@bmpsize@plain@loop
+  \bmpsize@okfalse
+  \@bmpsize@bigendiantrue
+  \@bmpsize@absnumfalse
+  \let\bmpsize@pixelwidth\relax
+  \let\bmpsize@pixelheight\relax
+  \let\bmpsize@pixelx\relax
+  \let\bmpsize@pixely\relax
+  \let\bmpsize@unit\relax
+  \let\bmpsize@pixelxdenom\relax
+  \let\bmpsize@pixelydenom\relax
+  \let\bmpsize@orientation\relax
+}
+
+\def\@bmpsize@stop#1\@nil{}
+
+\def\@bmpsize@loop#1{%
+  #1%
+  \@bmpsize@loop{#1}%
+}
+\def\@bmpsize@break#1\@bmpsize@loop#2{}
+
+\def\@bmpsize@size#1#2#3{%
+  \edef#3{\pdf@filesize{#1}}%
+  \ifx#3\@empty
+    \expandafter\@bmpsize@stop
+  \fi
+  \ifnum#3<#2\relax
+    \expandafter\@bmpsize@stop
+  \fi
+}
+
+\def\@bmpsize@read#1#2#3{%
+  \edef\@bmpsize@buf{\pdf@filedump{#3}{#2}{#1}}%
+  \edef\@bmpsize@temp{%
+    \noexpand\@bmpsize@check@byte{#2}\@bmpsize@buf{}{}\noexpand\\%
+  }%
+  \@bmpsize@temp
+}
+\def\@bmpsize@fillbuf#1{%
+  \ifx\@bmpsize@buf\@empty
+    \expandafter\@firstofone
+  \else
+    \expandafter\@gobble
+  \fi
+  {%
+    \edef\@bmpsize@buf{%
+      \pdf@filedump{\bmpsize@offset}{\bmpsize@fillbuflength}{#1}%
+    }%
+    \ifx\@bmpsize@buf\@empty
+      \expandafter\@bmpsize@stop
+    \fi
+    \edef\bmpsize@offset{\the\numexpr\bmpsize@offset+\bmpsize@fillbuflength}%
+  }%
+}
+\def\bmpsize@fillbuflength{10}
+
+\def\@bmpsize@append#1#2#3{%
+  \edef#1{#2#3}%
+}
+\def\@bmpsize@pushback#1{%
+  \edef\@bmpsize@buf{#1\@bmpsize@buf}%
+}
+
+\def\@bmpsize@iswhite#1{%
+  \ifnum\pdf@strcmp{#1}{09}=\z@
+  \else
+    \ifnum\pdf@strcmp{#1}{0A}=\z@
+    \else
+      \ifnum\pdf@strcmp{#1}{0D}=\z@
+      \else
+        \ifnum\pdf@strcmp{#1}{20}=\z@
+        \else
+          1%
+        \fi
+      \fi
+    \fi
+  \fi
+  \space
+}
+\def\@bmpsize@isdigit#1{%
+  \ifnum\pdf@strcmp{#1}{30}<\z@
+    1%
+  \else
+    \ifnum\pdf@strcmp{#1}{39}>\z@
+      1%
+    \fi
+  \fi
+  \space
+}
+
+\def\@bmpsize@check@byte#1#2#3{%
+  \ifnum#1<\@ne
+    \csname fi\endcsname
+    \@bmpsize@cleanup@end
+  \else
+    \csname fi\endcsname
+  \ifx!#2#3!%
+    \csname fi\endcsname
+    \@bmpsize@stop
+  \else
+    \csname fi\endcsname
+    \expandafter\@bmpsize@check@byte\expandafter{\the\numexpr#1-1}%
+}
+\def\@bmpsize@cleanup@end#1\\{}
+
+\def\@bmpsize@swap@maybe#1{%
+  \if@bmpsize@bigendian
+  \else
+    \edef#1{\expandafter\@bmpsize@@swap#1\@empty\@empty\@empty\@empty}%
+  \fi
+}
+\def\@bmpsize@@swap#1#2#3#4#5#6#7#8{%
+  #7#8#5#6#3#4#1#2%
+}
+
+\def\@bmpsize@skip@one{%
+  \edef\@bmpsize@buf{\expandafter\@gobbletwo\@bmpsize@buf}%
+}
+\def\@bmpsize@skip@two{%
+  \edef\@bmpsize@buf{\expandafter\@gobblefour\@bmpsize@buf}%
+}
+\def\@bmpsize@skip@four{%
+  \edef\@bmpsize@buf{%
+    \expandafter\expandafter\expandafter\@gobblefour\expandafter
+    \@gobblefour\@bmpsize@buf
+  }%
+}
+
+\def\@bmpsize@grab#1#2{%
+  \edef#1{\noexpand\@bmpsize@grab@byte#2=\@bmpsize@buf\noexpand\\}%
+  \edef#1{#1}%
+}
+\def\@bmpsize@grab@byte#1=#2#3{%
+  #2#3%
+  \ifnum#1>\@ne
+    \expandafter\@bmpsize@grab@byte\the\numexpr#1-1\expandafter=%
+  \else
+    \expandafter\@bmpsize@cleanup@end
+  \fi
+}
+
+\def\@bmpsize@abs@maybe#1{%
+  \let\@bmpsize@temp\relax
+  \if@bmpsize@absnum
+    \ifnum"\expandafter\@car#1\@nil>7 %
+      \edef#1{\expandafter\@bmpsize@abs@byte#1\relax}%
+      \ifnum\pdf@strcmp{#1}{7FFFFFFF}=\z@
+        \let\@bmpsize@temp\@bmpsize@stop
+      \else
+        \def\@bmpsize@temp{\edef#1{\the\numexpr#1+1}}%
+      \fi
+    \fi
+  \fi
+}
+\def\@bmpsize@abs@byte#1{%
+  \ifx#1\relax
+  \else
+    \ifcase"0#1 %
+      F\or E\or D\or C\or B\or A\or 9\or 8\or
+      7\or 6\or 5\or 4\or 3\or 2\or 1\or 0%
+    \fi
+    \expandafter\@bmpsize@abs@byte
+  \fi
+}
+
+\def\@bmpsize@num@one#1{%
+  \@bmpsize@grab#11%
+  \@bmpsize@abs@maybe#1%
+  \edef#1{\number"#1}%
+  \@bmpsize@temp
+  \@bmpsize@skip@one
+}
+\def\@bmpsize@num@two#1{%
+  \@bmpsize@grab#12%
+  \@bmpsize@swap@maybe#1%
+  \@bmpsize@abs@maybe#1%
+  \edef#1{\number"#1}%
+  \@bmpsize@temp
+  \@bmpsize@skip@two
+}
+\def\@bmpsize@num@four#1{%
+  \@bmpsize@grab#14%
+  \@bmpsize@swap@maybe#1%
+  \@bmpsize@abs@maybe#1%
+  \ifnum\pdf@strcmp{#1}{7FFFFFFF}>\z@
+    \expandafter\@bmpsize@stop
+  \fi
+  \edef#1{\number"#1}%
+  \@bmpsize@temp
+  \@bmpsize@skip@four
+}
+
+\def\@bmpsize@div#1#2#3{% #1 := #2/#3
+  \FPdiv#1{#2}{#3}%
+  \@bmpsize@beautify#1%
+}
+\def\@bmpsize@beautify#1{%
+  \FPifint#1%
+    \edef#1{\expandafter\@bmpsize@trunc#1.\@nil}%
+  \else
+    \edef#1{\expandafter\@bmpsize@cleanup@frac#1.\@nil}%
+  \fi
+}
+\def\@bmpsize@trunc#1.#2\@nil{#1}
+% #1 isn't an integer, thus we should have at least one
+% necessary digit after the dot
+\def\@bmpsize@cleanup@frac#1.#2#3.#4\@nil{%
+  #1.#2%
+  \ifx\\#3\\%
+  \else
+    \@bmpsize@cleanup@fracdigits#3000000000\@nil
+  \fi
+}
+\def\@bmpsize@cleanup@fracdigits#1#2#3#4#5#6#7#8#9{%
+  \ifcase#9 %
+    \ifcase#8 %
+      \ifcase#7 %
+        \ifcase#6 %
+          \ifcase#5 %
+            \ifcase #4 %
+              \ifcase #3 %
+                \ifcase #2 %
+                  \ifcase #1 %
+                  \else
+                    #1%
+                  \fi
+                \else
+                  #1#2%
+                \fi
+              \else
+                #1#2#3%
+              \fi
+            \else
+              #1#2#3#4%
+            \fi
+          \else
+            #1#2#3#4#5%
+          \fi
+        \else
+          #1#2#3#4#5#6%
+        \fi
+      \else
+        #1#2#3#4#5#6#7%
+      \fi
+    \else
+      #1#2#3#4#5#6#7#8%
+    \fi
+  \else
+    #1#2#3#4#5#6#7#8#9%
+  \fi
+  \@bmpsize@trunc.%
+}
+
+\def\@bmpsize@end{%
+  \ifbmpsize@ok
+    \ifx\bmpsize@pixelwidth\relax
+      \bmpsize@okfalse
+    \fi
+    \ifx\bmpsize@pixelheight\relax
+      \bmpsize@okfalse
+    \fi
+  \fi
+  \ifbmpsize@ok
+    \ifnum\bmpsize@pixelwidth>\z@
+    \else
+      \bmpsize@okfalse
+    \fi
+    \ifnum\bmpsize@pixelheight>\z@
+    \else
+      \bmpsize@okfalse
+    \fi
+  \fi
+  \ifbmpsize@ok
+    \ifcase 0%
+      \ifx\bmpsize@pixelx\relax 1 \fi
+      \ifx\bmpsize@pixely\relax 1 \fi
+      \ifnum\bmpsize@pixelx>\z@\else 1 \fi
+      \ifnum\bmpsize@pixely>\z@\else 1 \fi
+      \ifx\bmpsize@pixelxdenom\relax
+         \ifx\bmpsize@pixelydenom\relax\else 1 \fi
+      \else
+        \ifnum\bmpsize@pixelxdenom>\z@\else 1 \fi
+      \fi
+      \ifx\bmpsize@pixelydenom\relax
+      \else
+        \ifnum\bmpsize@pixelydenom>\z@\else 1 \fi
+      \fi
+    \else
+      \let\bmpsize@pixelx\relax
+      \let\bmpsize@pixely\relax
+      \let\bmpsize@unit\relax
+      \let\bmpsize@pixelxdenom\relax
+      \let\bmpsize@pixelydenom\relax
+    \fi
+    \ifx\bmpsize@pixelxdenom\relax
+    \else
+      \@bmpsize@div\bmpsize@pixelx\bmpsize@pixelx\bmpsize@pixelxdenom
+      \@bmpsize@div\bmpsize@pixely\bmpsize@pixely\bmpsize@pixelydenom
+      \let\bmpsize@pixelxdenom\relax
+      \let\bmpsize@pixelydenom\relax
+    \fi
+    \ifcase 0\ifx\bmpsize@unit\relax 1\fi
+             \if@bmpsize@user@resolution 1\fi
+             \relax
+      \let\bmpsize@calc@unit\bmpsize@unit
+      \let\bmpsize@calc@pixelx\bmpsize@pixelx
+      \let\bmpsize@calc@pixely\bmpsize@pixely
+    \else
+      \let\bmpsize@calc@unit\bmpsize@unit@default
+      \let\bmpsize@calc@pixelx\bmpsize@pixelx@default
+      \let\bmpsize@calc@pixely\bmpsize@pixely@default
+      \ifx\bmpsize@calc@pixely\Gin@exclamation
+        \ifx\bmpsize@pixelx\relax
+          \let\bmpsize@calc@pixely\bmpsize@calc@pixelx
+        \else
+          \FPdiv\bmpsize@calc@pixely\bmpsize@calc@pixelx\bmpsize@pixelx
+          \FPmul\bmpsize@calc@pixely\bmpsize@calc@pixely\bmpsize@pixely
+        \fi
+      \else
+        \ifx\bmpsize@calc@pixelx\Gin@exclamation
+          \ifx\bmpsize@pixelx\relax
+            \let\bmpsize@calc@pixelx\bmpsize@calc@pixely
+          \else
+            \FPdiv\bmpsize@calc@pixelx\bmpsize@calc@pixely\bmpsize@pixely
+            \FPmul\bmpsize@calc@pixelx\bmpsize@calc@pixelx\bmpsize@pixelx
+          \fi
+        \fi
+      \fi
+    \fi
+    \FPdiv\bmpsize@width\bmpsize@pixelwidth\bmpsize@calc@pixelx
+    \FPdiv\bmpsize@height\bmpsize@pixelheight\bmpsize@calc@pixely
+    % calculation of width and height in bp for package graphics
+    % 1in = 72bp = 72.27pt, 72/72.27 = 8/8.03, 1pt = 65536sp
+    \if@bmpsize@fast
+      \edef\bmpsize@width{%
+        \strip@pt\dimexpr.99626\dimexpr
+        \bmpsize@width\dimexpr\bmpsize@calc@unit
+      }%
+      \edef\bmpsize@height{%
+        \strip@pt\dimexpr.99626\dimexpr
+        \bmpsize@height\dimexpr\bmpsize@calc@unit
+      }%
+    \else
+      \edef\@bmpsize@temp{\number\dimexpr\bmpsize@calc@unit}%
+      \ifnum\@bmpsize@temp>100000 %
+        \FPmul\@bmpsize@temp\@bmpsize@temp{0.00001}%
+        \def\@bmpsize@corr{100000}%
+      \else
+        \let\@bmpsize@corr\relax
+      \fi
+      \FPmul\bmpsize@width\bmpsize@width\@bmpsize@temp
+      \FPmul\bmpsize@height\bmpsize@height\@bmpsize@temp
+      \FPmul\bmpsize@width\bmpsize@width{8}%
+      \FPmul\bmpsize@height\bmpsize@height{8}%
+      \FPdiv\bmpsize@width\bmpsize@width{8.03}%
+      \FPdiv\bmpsize@height\bmpsize@height{8.03}%
+      \FPdiv\bmpsize@width\bmpsize@width{65536}%
+      \FPdiv\bmpsize@height\bmpsize@height{65536}%
+      \ifx\@bmpsize@corr\relax
+      \else
+        \FPmul\bmpsize@width\bmpsize@width\@bmpsize@corr
+        \FPmul\bmpsize@height\bmpsize@height\@bmpsize@corr
+      \fi
+      \FPround\bmpsize@width\bmpsize@width{5}%
+      \FPround\bmpsize@height\bmpsize@height{5}%
+      \@bmpsize@beautify\bmpsize@width
+      \@bmpsize@beautify\bmpsize@height
+    \fi
+  \fi
+  \let\loop\@bmpsize@org@plain@loop
+}
+\def\bmpsize@unit@default{72.27pt}% more accurate than 1in
+\def\bmpsize@pixelx@default{72}
+\let\bmpsize@pixely@default\Gin@exclamation
+
+\def\bmpsize@types{png,jpg,bmp,gif,tiff,pnm,pam,xpm,tga,pcx,msp,sgi}
+%</base>
+%    \end{macrocode}
+%
+% \subsection{Bitmap formats}
+%
+% \subsubsection{png}
+%
+%\iffalse
+%<*ignore>
+%\fi
+%\begin{verbatim}
+%begin png
+%big-endian
+%
+%read 24 0
+%grab 8        -> $temp
+%check streq $temp [0x89 "PNG" 0x0D 0x0A 0x1A 0x0A]
+%num 4         -> $length
+%grab 4        -> $temp
+%check streq $temp ["IHDR"]
+%num 4         -> $pixelwidth
+%num 4         -> $pixelheight
+%ok
+%assign numexpr(20 + $length) -> $offset
+%loop
+%  read 8 $offset
+%  num 4       -> $length
+%  grab 4      -> $temp
+%  if streq $temp ["IDAT"]
+%    stop
+%  fi
+%  if streq $temp ["pHYs"]
+%    read 9 numexpr($offset + 8)
+%    num 4     -> $pixelx
+%    num 4     -> $pixely
+%    grab 1     -> $temp
+%    if numeq $temp 1
+%      assign {100cm} -> $unit
+%    fi
+%    stop
+%  fi
+%  assign numexpr($offset + 12 + $length) -> $offset
+%repeat
+%end
+%\end{verbatim}
+%\iffalse
+%</ignore>
+%\fi
+%    \begin{macro}{\bmpsize@read@png}
+%    \begin{macrocode}
+%<*base>
+\def\bmpsize@read@png#1{%
+  \@bmpsize@init
+  \@bmpsize@bigendiantrue
+  \@bmpsize@read{#1}{24}{0}%
+  \@bmpsize@grab\bmpsize@temp{8}%
+  \@bmpsize@skip@four
+  \@bmpsize@skip@four
+  \ifnum\pdf@strcmp{\bmpsize@temp}{89504E470D0A1A0A}=\z@
+  \else
+    \expandafter\@bmpsize@stop
+  \fi
+  \@bmpsize@num@four\bmpsize@length
+  \@bmpsize@grab\bmpsize@temp{4}%
+  \@bmpsize@skip@four
+  \ifnum\pdf@strcmp{\bmpsize@temp}{49484452}=\z@
+  \else
+    \expandafter\@bmpsize@stop
+  \fi
+  \@bmpsize@num@four\bmpsize@pixelwidth
+  \@bmpsize@num@four\bmpsize@pixelheight
+  \@bmpsize@ok
+  \edef\bmpsize@offset{\the\numexpr20+\bmpsize@length}%
+  \@bmpsize@loop{%
+    \@bmpsize@read{#1}{8}{\bmpsize@offset}%
+    \@bmpsize@num@four\bmpsize@length
+    \@bmpsize@grab\bmpsize@temp{4}%
+    \@bmpsize@skip@four
+    \ifnum\pdf@strcmp{\bmpsize@temp}{49444154}=\z@
+      \expandafter\@firstofone
+    \else
+      \expandafter\@gobble
+    \fi
+    {%
+      \@bmpsize@stop
+    }%
+    \ifnum\pdf@strcmp{\bmpsize@temp}{70485973}=\z@
+      \expandafter\@firstofone
+    \else
+      \expandafter\@gobble
+    \fi
+    {%
+      \@bmpsize@read{#1}{9}{\numexpr\bmpsize@offset+8\relax}%
+      \@bmpsize@num@four\bmpsize@pixelx
+      \@bmpsize@num@four\bmpsize@pixely
+      \@bmpsize@grab\bmpsize@temp{1}%
+      \@bmpsize@skip@one
+      \ifnum\bmpsize@temp=1\relax
+        \expandafter\@firstofone
+      \else
+        \expandafter\@gobble
+      \fi
+      {%
+        \def\bmpsize@unit{100cm}%
+      }%
+      \@bmpsize@stop
+    }%
+    \edef\bmpsize@offset{\the\numexpr\bmpsize@offset+12+\bmpsize@length}%
+  }%
+  \@bmpsize@stop
+  \@nil
+  \@bmpsize@end
+}%
+%</base>
+%    \end{macrocode}
+%    \end{macro}
+%
+% \subsubsection{jpg}
+%
+%\iffalse
+%<*ignore>
+%\fi
+%\begin{verbatim}
+%begin jpg
+%
+%read 3 0
+%grab 3      -> $temp % SOI and 0xFF
+%check streq $temp [0xFF 0xD8 0xFF]
+%assign {2} -> $offset
+%assign {0} -> $exifdensity
+%loop
+%  read 4 $offset
+%  grab 1    -> $temp
+%  check streq $temp [0xFF]
+%  num 1    -> $temp
+%  if numeq $temp 0xDA % SOS
+%    stop
+%  fi
+%  % look for JFIF APP0 segment
+%  if numeq $temp 0xE0 % APP0
+%    num 2       -> $length
+%    if numeq $exifdensity 0
+%      if numge $length 16 % a JFIF segment has 16 bytes at least
+%        read 12 numexpr($offset + 4)
+%        grab 5      -> $temp % identifier
+%        if streq $temp ["JFIF" 0x0]
+%          check numge $length 16
+%          skip 2 % version
+%          num 1       -> $temp % units
+%          if numeq $temp 1
+%            assign {72.27pt} -> $unit
+%          else
+%            if numeq $temp 2
+%              assign {1cm} -> $unit
+%            fi
+%          fi
+%          num 2    -> $pixelx
+%          num 2    -> $pixely
+%        fi
+%      fi
+%    fi
+%  else
+%    if numeq $temp 0xE1 % APP1
+%      % look for Exif APP1 segment
+%      num 2 -> $length
+%      if numge $length 20 % identifier (6) + Tiff header (8) + first IFD (>=6)
+%        read 20 numexpr($offset + 4)
+%        grab 6 -> $temp
+%        if streq $temp ["Exif" 0x0 0x0]
+%          assign numexpr($offset + 10) -> $exifoffset
+%          % read TIFF header
+%          grab 2 -> $temp
+%          if streq $temp ["II"]
+%            little-endian
+%          else
+%            check streq $temp ["MM"]
+%            % big-endian
+%          fi
+%          num 2 -> $temp
+%          check numeq $temp 42
+%          num 4 -> $temp % offset of first IFD
+%          check numgt $temp 0
+%          % read first IFD
+%          assign numexpr($temp + $exifoffset) -> $off
+%          read 2 $off
+%          num 2 -> $entries
+%          assign numexpr($off + 2) -> $off
+%          loop
+%            if numeq $entries 0
+%              break
+%            fi
+%            assign numexpr($entries - 1) -> $entries
+%            % entry format:
+%            % 2 tag
+%            % 2 field type
+%            % 4 count
+%            % 4 value/offset
+%            read 12 $off
+%            assign numexpr($off + 12) -> $off
+%            num 2 -> $tag
+%            if numeq $tag 296 % ResolutionUnit
+%              skip 6 % type: 3 (short), count: 1
+%              num 2 -> $temp
+%              ifcase $temp
+%              or % 1
+%                clear $unit
+%              or % 2
+%                assign {72.27pt} -> $unit
+%              or % 3
+%                assign {1cm} -> $unit
+%              else
+%                clear $unit % unknown
+%              fi
+%              ifcase $temp
+%              or % 1
+%              or % 2
+%                assign {1} -> $exifdensity
+%              or % 3
+%                assign {1} -> $exifdensity
+%              else
+%                assign $exifdensity -> $exifdensity
+%              fi
+%            fi
+%            % 256 ImageWidth (use width of JPG part)
+%            % 257 ImageHeight (use height of JPG part)
+%            if numeq $tag 274 % Orientation
+%              skip 6 % type: 3 (short), count: 1
+%              num 2 -> $temp
+%              if numge $temp 0 
+%                if numle $temp 8
+%                  assign $temp -> $orientation
+%                fi
+%              fi
+%            fi
+%            if numeq $tag 282 % XResolution
+%              skip 6
+%              num 4 -> $temp
+%              read 8 numexpr($temp + $exifoffset)
+%              num 4 -> $pixelx
+%              num 4 -> $temp
+%              if numeq $temp 1
+%              else
+%                assign numexpr($temp) -> $pixelxdenom
+%                % div $pixelx $temp -> $pixelx
+%              fi
+%            fi
+%            if numeq $tag 283 % YResolution
+%              skip 6
+%              num 4 -> $temp
+%              read 8 numexpr($temp + $exifoffset)
+%              num 4 -> $pixely
+%              num 4 -> $temp
+%              if numeq $temp 1
+%              else
+%                assign numexpr($temp) -> $pixelydenom
+%                % div $pixely $temp -> $pixely
+%              fi
+%            fi
+%          repeat
+%          big-endian
+%        fi
+%      fi
+%    else
+%      assign numexpr($temp - 0xC0) -> $temp
+%      ifcase $temp % SOF_0
+%      or % SOF_1
+%      or % SOF_2
+%      or % SOF_3
+%      or % DHT
+%        assign {-1} -> $temp
+%      or % SOF_5
+%      or % SOF_6
+%      or % SOF_7
+%      or % JPG
+%        assign {-1} -> $temp
+%      or % SOF_9
+%      or % SOF_10
+%      or % SOF_11
+%      or % DAC
+%        assign {-1} -> $temp
+%      or % SOF_13
+%      or % SOF_14
+%      or % SOF_15
+%      else
+%        assign {-1} -> $temp
+%      fi
+%      if numeq $temp -1
+%      else
+%        read 4 numexpr($offset + 5)
+%        num 2  -> $pixelheight
+%        num 2  -> $pixelwidth
+%        if numeq $pixelheight 0
+%          clear $pixelheight
+%          stop
+%        fi
+%        ok
+%        stop
+%      fi
+%      num 2 -> $length
+%    fi
+%  fi
+%  assign numexpr($offset + $length + 2) -> $offset
+%repeat
+%end
+%\end{verbatim}
+%\iffalse
+%</ignore>
+%\fi
+%    \begin{macro}{\bmpsize@read@jpg}
+%    \begin{macrocode}
+%<*base>
+\def\bmpsize@read@jpg#1{%
+  \@bmpsize@init
+  \@bmpsize@read{#1}{3}{0}%
+  \@bmpsize@grab\bmpsize@temp{3}%
+  \@bmpsize@skip@two
+  \@bmpsize@skip@one
+  \ifnum\pdf@strcmp{\bmpsize@temp}{FFD8FF}=\z@
+  \else
+    \expandafter\@bmpsize@stop
+  \fi
+  \def\bmpsize@offset{2}%
+  \def\bmpsize@exifdensity{0}%
+  \@bmpsize@loop{%
+    \@bmpsize@read{#1}{4}{\bmpsize@offset}%
+    \@bmpsize@grab\bmpsize@temp{1}%
+    \@bmpsize@skip@one
+    \ifnum\pdf@strcmp{\bmpsize@temp}{FF}=\z@
+    \else
+      \expandafter\@bmpsize@stop
+    \fi
+    \@bmpsize@num@one\bmpsize@temp
+    \ifnum\bmpsize@temp=218\relax
+      \expandafter\@firstofone
+    \else
+      \expandafter\@gobble
+    \fi
+    {%
+      \@bmpsize@stop
+    }%
+    \ifnum\bmpsize@temp=224\relax
+      \expandafter\@firstoftwo
+    \else
+      \expandafter\@secondoftwo
+    \fi
+    {%
+      \@bmpsize@num@two\bmpsize@length
+      \ifnum\bmpsize@exifdensity=0\relax
+        \expandafter\@firstofone
+      \else
+        \expandafter\@gobble
+      \fi
+      {%
+        \unless\ifnum\bmpsize@length<16\relax
+          \expandafter\@firstofone
+        \else
+          \expandafter\@gobble
+        \fi
+        {%
+          \@bmpsize@read{#1}{12}{\numexpr\bmpsize@offset+4\relax}%
+          \@bmpsize@grab\bmpsize@temp{5}%
+          \@bmpsize@skip@four
+          \@bmpsize@skip@one
+          \ifnum\pdf@strcmp{\bmpsize@temp}{4A46494600}=\z@
+            \expandafter\@firstofone
+          \else
+            \expandafter\@gobble
+          \fi
+          {%
+            \ifnum\bmpsize@length<16\relax
+              \expandafter\@bmpsize@stop
+            \fi
+            \@bmpsize@skip@two
+            \@bmpsize@num@one\bmpsize@temp
+            \ifnum\bmpsize@temp=1\relax
+              \expandafter\@firstoftwo
+            \else
+              \expandafter\@secondoftwo
+            \fi
+            {%
+              \def\bmpsize@unit{72.27pt}%
+            }{%
+              \ifnum\bmpsize@temp=2\relax
+                \expandafter\@firstofone
+              \else
+                \expandafter\@gobble
+              \fi
+              {%
+                \def\bmpsize@unit{1cm}%
+              }%
+            }%
+            \@bmpsize@num@two\bmpsize@pixelx
+            \@bmpsize@num@two\bmpsize@pixely
+          }%
+        }%
+      }%
+    }{%
+      \ifnum\bmpsize@temp=225\relax
+        \expandafter\@firstoftwo
+      \else
+        \expandafter\@secondoftwo
+      \fi
+      {%
+        \@bmpsize@num@two\bmpsize@length
+        \unless\ifnum\bmpsize@length<20\relax
+          \expandafter\@firstofone
+        \else
+          \expandafter\@gobble
+        \fi
+        {%
+          \@bmpsize@read{#1}{20}{\numexpr\bmpsize@offset+4\relax}%
+          \@bmpsize@grab\bmpsize@temp{6}%
+          \@bmpsize@skip@four
+          \@bmpsize@skip@two
+          \ifnum\pdf@strcmp{\bmpsize@temp}{457869660000}=\z@
+            \expandafter\@firstofone
+          \else
+            \expandafter\@gobble
+          \fi
+          {%
+            \edef\bmpsize@exifoffset{\the\numexpr\bmpsize@offset+10}%
+            \@bmpsize@grab\bmpsize@temp{2}%
+            \@bmpsize@skip@two
+            \ifnum\pdf@strcmp{\bmpsize@temp}{4949}=\z@
+              \expandafter\@firstoftwo
+            \else
+              \expandafter\@secondoftwo
+            \fi
+            {%
+              \@bmpsize@bigendianfalse
+            }{%
+              \ifnum\pdf@strcmp{\bmpsize@temp}{4D4D}=\z@
+              \else
+                \expandafter\@bmpsize@stop
+              \fi
+            }%
+            \@bmpsize@num@two\bmpsize@temp
+            \ifnum\bmpsize@temp=42\relax
+            \else
+              \expandafter\@bmpsize@stop
+            \fi
+            \@bmpsize@num@four\bmpsize@temp
+            \ifnum\bmpsize@temp>0\relax
+            \else
+              \expandafter\@bmpsize@stop
+            \fi
+            \edef\bmpsize@off{\the\numexpr\bmpsize@temp+\bmpsize@exifoffset}%
+            \@bmpsize@read{#1}{2}{\bmpsize@off}%
+            \@bmpsize@num@two\bmpsize@entries
+            \edef\bmpsize@off{\the\numexpr\bmpsize@off+2}%
+            \@bmpsize@loop{%
+              \ifnum\bmpsize@entries=0\relax
+                \expandafter\@firstofone
+              \else
+                \expandafter\@gobble
+              \fi
+              {%
+                \@bmpsize@break
+              }%
+              \edef\bmpsize@entries{\the\numexpr\bmpsize@entries-1}%
+              \@bmpsize@read{#1}{12}{\bmpsize@off}%
+              \edef\bmpsize@off{\the\numexpr\bmpsize@off+12}%
+              \@bmpsize@num@two\bmpsize@tag
+              \ifnum\bmpsize@tag=296\relax
+                \expandafter\@firstofone
+              \else
+                \expandafter\@gobble
+              \fi
+              {%
+                \@bmpsize@skip@four
+                \@bmpsize@skip@two
+                \@bmpsize@num@two\bmpsize@temp
+                \ifcase\bmpsize@temp\relax
+                \or
+                  \let\bmpsize@unit\relax
+                \or
+                  \def\bmpsize@unit{72.27pt}%
+                \or
+                  \def\bmpsize@unit{1cm}%
+                \else
+                  \let\bmpsize@unit\relax
+                \fi
+                \ifcase\bmpsize@temp\relax
+                \or
+                \or
+                  \def\bmpsize@exifdensity{1}%
+                \or
+                  \def\bmpsize@exifdensity{1}%
+                \else
+                  \let\bmpsize@exifdensity\bmpsize@exifdensity
+                \fi
+              }%
+              \ifnum\bmpsize@tag=274\relax
+                \expandafter\@firstofone
+              \else
+                \expandafter\@gobble
+              \fi
+              {%
+                \@bmpsize@skip@four
+                \@bmpsize@skip@two
+                \@bmpsize@num@two\bmpsize@temp
+                \unless\ifnum\bmpsize@temp<0\relax
+                  \expandafter\@firstofone
+                \else
+                  \expandafter\@gobble
+                \fi
+                {%
+                  \unless\ifnum\bmpsize@temp>8\relax
+                    \expandafter\@firstofone
+                  \else
+                    \expandafter\@gobble
+                  \fi
+                  {%
+                    \let\bmpsize@orientation\bmpsize@temp
+                  }%
+                }%
+              }%
+              \ifnum\bmpsize@tag=282\relax
+                \expandafter\@firstofone
+              \else
+                \expandafter\@gobble
+              \fi
+              {%
+                \@bmpsize@skip@four
+                \@bmpsize@skip@two
+                \@bmpsize@num@four\bmpsize@temp
+                \@bmpsize@read{#1}{8}{\numexpr\bmpsize@temp+\bmpsize@exifoffset\relax}%
+                \@bmpsize@num@four\bmpsize@pixelx
+                \@bmpsize@num@four\bmpsize@temp
+                \ifnum\bmpsize@temp=1\relax
+                  \expandafter\@gobble
+                \else
+                  \expandafter\@firstofone
+                \fi
+                {%
+                  \edef\bmpsize@pixelxdenom{\the\numexpr\bmpsize@temp}%
+                }%
+              }%
+              \ifnum\bmpsize@tag=283\relax
+                \expandafter\@firstofone
+              \else
+                \expandafter\@gobble
+              \fi
+              {%
+                \@bmpsize@skip@four
+                \@bmpsize@skip@two
+                \@bmpsize@num@four\bmpsize@temp
+                \@bmpsize@read{#1}{8}{\numexpr\bmpsize@temp+\bmpsize@exifoffset\relax}%
+                \@bmpsize@num@four\bmpsize@pixely
+                \@bmpsize@num@four\bmpsize@temp
+                \ifnum\bmpsize@temp=1\relax
+                  \expandafter\@gobble
+                \else
+                  \expandafter\@firstofone
+                \fi
+                {%
+                  \edef\bmpsize@pixelydenom{\the\numexpr\bmpsize@temp}%
+                }%
+              }%
+            }%
+            \@bmpsize@bigendiantrue
+          }%
+        }%
+      }{%
+        \edef\bmpsize@temp{\the\numexpr\bmpsize@temp-192}%
+        \ifcase\bmpsize@temp\relax
+        \or
+        \or
+        \or
+        \or
+          \def\bmpsize@temp{-1}%
+        \or
+        \or
+        \or
+        \or
+          \def\bmpsize@temp{-1}%
+        \or
+        \or
+        \or
+        \or
+          \def\bmpsize@temp{-1}%
+        \or
+        \or
+        \or
+        \else
+          \def\bmpsize@temp{-1}%
+        \fi
+        \ifnum\bmpsize@temp=-1\relax
+          \expandafter\@gobble
+        \else
+          \expandafter\@firstofone
+        \fi
+        {%
+          \@bmpsize@read{#1}{4}{\numexpr\bmpsize@offset+5\relax}%
+          \@bmpsize@num@two\bmpsize@pixelheight
+          \@bmpsize@num@two\bmpsize@pixelwidth
+          \ifnum\bmpsize@pixelheight=0\relax
+            \expandafter\@firstofone
+          \else
+            \expandafter\@gobble
+          \fi
+          {%
+            \let\bmpsize@pixelheight\relax
+            \@bmpsize@stop
+          }%
+          \@bmpsize@ok
+          \@bmpsize@stop
+        }%
+        \@bmpsize@num@two\bmpsize@length
+      }%
+    }%
+    \edef\bmpsize@offset{\the\numexpr\bmpsize@offset+\bmpsize@length+2}%
+  }%
+  \@bmpsize@stop
+  \@nil
+  \@bmpsize@end
+}%
+%</base>
+%    \end{macrocode}
+%    \end{macro}
+%
+% \subsubsection{bmp}
+%
+%\iffalse
+%<*ignore>
+%\fi
+%\begin{verbatim}
+%begin bmp
+%little-endian
+%
+%read 26 0
+%grab 2 -> $temp
+%check streq $temp ["BM"]
+%skip 12
+%% header size is 4 bytes in V3+, unknown for V1, V2,
+%% known header sizes fit in 2 bytes
+%num 2   -> $temp
+%if numeq $temp 12 % V1
+%  skip 2
+%  num 2 -> $pixelwidth
+%  num 2 -> $pixelheight
+%  % no resolution entries
+%  ok
+%  stop
+%fi
+%if numeq $temp 64 % V2
+%  skip 2
+%  num 2 -> $pixelwidth
+%  num 2 -> $pixelheight
+%  % missing specification for resolution
+%  ok
+%  stop
+%fi
+%% V3, V4, V5
+%skip 2
+%num 4 -> $pixelwidth
+%absnum 4 -> $pixelheight
+%ok
+%read 8 38
+%num 4 -> $pixelx
+%num 4 -> $pixely
+%assign {100cm} -> $unit
+%end
+%\end{verbatim}
+%\iffalse
+%</ignore>
+%\fi
+%    \begin{macro}{\bmpsize@read@bmp}
+%    \begin{macrocode}
+%<*base>
+\def\bmpsize@read@bmp#1{%
+  \@bmpsize@init
+  \@bmpsize@bigendianfalse
+  \@bmpsize@read{#1}{26}{0}%
+  \@bmpsize@grab\bmpsize@temp{2}%
+  \@bmpsize@skip@two
+  \ifnum\pdf@strcmp{\bmpsize@temp}{424D}=\z@
+  \else
+    \expandafter\@bmpsize@stop
+  \fi
+  \@bmpsize@skip@four
+  \@bmpsize@skip@four
+  \@bmpsize@skip@four
+  \@bmpsize@num@two\bmpsize@temp
+  \ifnum\bmpsize@temp=12\relax
+    \expandafter\@firstofone
+  \else
+    \expandafter\@gobble
+  \fi
+  {%
+    \@bmpsize@skip@two
+    \@bmpsize@num@two\bmpsize@pixelwidth
+    \@bmpsize@num@two\bmpsize@pixelheight
+    \@bmpsize@ok
+    \@bmpsize@stop
+  }%
+  \ifnum\bmpsize@temp=64\relax
+    \expandafter\@firstofone
+  \else
+    \expandafter\@gobble
+  \fi
+  {%
+    \@bmpsize@skip@two
+    \@bmpsize@num@two\bmpsize@pixelwidth
+    \@bmpsize@num@two\bmpsize@pixelheight
+    \@bmpsize@ok
+    \@bmpsize@stop
+  }%
+  \@bmpsize@skip@two
+  \@bmpsize@num@four\bmpsize@pixelwidth
+  \@bmpsize@absnumtrue
+  \@bmpsize@num@four\bmpsize@pixelheight
+  \@bmpsize@absnumfalse
+  \@bmpsize@ok
+  \@bmpsize@read{#1}{8}{38}%
+  \@bmpsize@num@four\bmpsize@pixelx
+  \@bmpsize@num@four\bmpsize@pixely
+  \def\bmpsize@unit{100cm}%
+  \@bmpsize@stop
+  \@nil
+  \@bmpsize@end
+}%
+%</base>
+%    \end{macrocode}
+%    \end{macro}
+%
+% \subsubsection{gif}
+%
+%\iffalse
+%<*ignore>
+%\fi
+%\begin{verbatim}
+%begin gif
+%little-endian
+%
+%% Header
+%read 13 0
+%grab 3      -> $temp
+%check streq $temp ["GIF"]
+%skip 3      % version
+%
+%% Logical Screen Descriptor
+%num 2       -> $pixelwidth
+%num 2       -> $pixelheight
+%skip 2
+%num 1       -> $temp % Pixel Aspect Ratio
+%if numeq $temp 0
+%else
+%  assign numexpr($temp + 15) -> $pixelx
+%  assign {64}     -> $pixely
+%fi
+%ok
+%end
+%\end{verbatim}
+%\iffalse
+%</ignore>
+%\fi
+%    \begin{macro}{\bmpsize@read@gif}
+%    \begin{macrocode}
+%<*base>
+\def\bmpsize@read@gif#1{%
+  \@bmpsize@init
+  \@bmpsize@bigendianfalse
+  \@bmpsize@read{#1}{13}{0}%
+  \@bmpsize@grab\bmpsize@temp{3}%
+  \@bmpsize@skip@two
+  \@bmpsize@skip@one
+  \ifnum\pdf@strcmp{\bmpsize@temp}{474946}=\z@
+  \else
+    \expandafter\@bmpsize@stop
+  \fi
+  \@bmpsize@skip@two
+  \@bmpsize@skip@one
+  \@bmpsize@num@two\bmpsize@pixelwidth
+  \@bmpsize@num@two\bmpsize@pixelheight
+  \@bmpsize@skip@two
+  \@bmpsize@num@one\bmpsize@temp
+  \ifnum\bmpsize@temp=0\relax
+    \expandafter\@gobble
+  \else
+    \expandafter\@firstofone
+  \fi
+  {%
+    \edef\bmpsize@pixelx{\the\numexpr\bmpsize@temp+15}%
+    \def\bmpsize@pixely{64}%
+  }%
+  \@bmpsize@ok
+  \@bmpsize@stop
+  \@nil
+  \@bmpsize@end
+}%
+%</base>
+%    \end{macrocode}
+%    \end{macro}
+%
+% \subsubsection{tiff}
+%
+%\iffalse
+%<*ignore>
+%\fi
+%\begin{verbatim}
+%begin tiff
+%% defaults
+%assign {72.27pt} -> $unit
+%
+%% Image File Header
+%read 8 0
+%grab 2 -> $temp
+%if streq $temp ["II"]
+%  little-endian
+%else
+%  check streq $temp ["MM"]
+%  big-endian
+%fi
+%num 2 -> $temp
+%check numeq $temp 42
+%num 4 -> $offset % first IFD (Image File Directory)
+%
+%% First IFD
+%read 2 $offset
+%assign numexpr($offset + 2) -> $offset
+%num 2 -> $entries
+%ok % must rely on checks at the end
+%loop
+%  if numeq $entries 0
+%    stop
+%  fi
+%  assign numexpr($entries - 1) -> $entries
+%  % entry format:
+%  % 2 tag
+%  % 2 field type
+%  % 4 count
+%  % 4 value/offset
+%  read 12 $offset
+%  assign numexpr($offset + 12) -> $offset
+%  num 2 -> $tag % tag
+%  if numeq $temp 296 % ResolutionUnit
+%    skip 6 % type: 3 (short), count: 1
+%    num 2 -> $temp
+%    ifcase $temp
+%    or % 1
+%      clear $unit
+%    or % 2
+%      assign {72.27pt} -> $unit
+%    or % 3
+%      assign {1cm} -> $unit
+%    else
+%      clear $unit
+%    fi
+%  fi
+%  if numeq $tag 256 % ImageWidth
+%    skip 6
+%    num 4 -> $pixelwidth
+%  fi
+%  if numeq $tag 257 % ImageLength
+%    skip 6
+%    num 4 -> $pixelheight
+%  fi
+%  if numeq $tag 282 % XResolution
+%    skip 6
+%    num 4 -> $temp
+%    read 8 $temp
+%    num 4 -> $pixelx
+%    num 4 -> $temp
+%    if numeq $temp 1
+%    else
+%      assign numexpr($temp) -> $pixelxdenom
+%      % div $pixelx $temp -> $pixelx
+%    fi
+%  fi
+%  if numeq $tag 283 % YResolution
+%    skip 6
+%    num 4 -> $temp
+%    read 8 $temp
+%    num 4 -> $pixely
+%    num 4 -> $temp
+%    if numeq $temp 1
+%    else
+%      assign numexpr($temp) -> $pixelydenom
+%      % div $pixely $temp -> $pixely
+%    fi
+%  fi
+%repeat
+%end
+%\end{verbatim}
+%\iffalse
+%</ignore>
+%\fi
+%    \begin{macro}{\bmpsize@read@tiff}
+%    \begin{macrocode}
+%<*base>
+\def\bmpsize@read@tiff#1{%
+  \@bmpsize@init
+  \def\bmpsize@unit{72.27pt}%
+  \@bmpsize@read{#1}{8}{0}%
+  \@bmpsize@grab\bmpsize@temp{2}%
+  \@bmpsize@skip@two
+  \ifnum\pdf@strcmp{\bmpsize@temp}{4949}=\z@
+    \expandafter\@firstoftwo
+  \else
+    \expandafter\@secondoftwo
+  \fi
+  {%
+    \@bmpsize@bigendianfalse
+  }{%
+    \ifnum\pdf@strcmp{\bmpsize@temp}{4D4D}=\z@
+    \else
+      \expandafter\@bmpsize@stop
+    \fi
+    \@bmpsize@bigendiantrue
+  }%
+  \@bmpsize@num@two\bmpsize@temp
+  \ifnum\bmpsize@temp=42\relax
+  \else
+    \expandafter\@bmpsize@stop
+  \fi
+  \@bmpsize@num@four\bmpsize@offset
+  \@bmpsize@read{#1}{2}{\bmpsize@offset}%
+  \edef\bmpsize@offset{\the\numexpr\bmpsize@offset+2}%
+  \@bmpsize@num@two\bmpsize@entries
+  \@bmpsize@ok
+  \@bmpsize@loop{%
+    \ifnum\bmpsize@entries=0\relax
+      \expandafter\@firstofone
+    \else
+      \expandafter\@gobble
+    \fi
+    {%
+      \@bmpsize@stop
+    }%
+    \edef\bmpsize@entries{\the\numexpr\bmpsize@entries-1}%
+    \@bmpsize@read{#1}{12}{\bmpsize@offset}%
+    \edef\bmpsize@offset{\the\numexpr\bmpsize@offset+12}%
+    \@bmpsize@num@two\bmpsize@tag
+    \ifnum\bmpsize@temp=296\relax
+      \expandafter\@firstofone
+    \else
+      \expandafter\@gobble
+    \fi
+    {%
+      \@bmpsize@skip@four
+      \@bmpsize@skip@two
+      \@bmpsize@num@two\bmpsize@temp
+      \ifcase\bmpsize@temp\relax
+      \or
+        \let\bmpsize@unit\relax
+      \or
+        \def\bmpsize@unit{72.27pt}%
+      \or
+        \def\bmpsize@unit{1cm}%
+      \else
+        \let\bmpsize@unit\relax
+      \fi
+    }%
+    \ifnum\bmpsize@tag=256\relax
+      \expandafter\@firstofone
+    \else
+      \expandafter\@gobble
+    \fi
+    {%
+      \@bmpsize@skip@four
+      \@bmpsize@skip@two
+      \@bmpsize@num@four\bmpsize@pixelwidth
+    }%
+    \ifnum\bmpsize@tag=257\relax
+      \expandafter\@firstofone
+    \else
+      \expandafter\@gobble
+    \fi
+    {%
+      \@bmpsize@skip@four
+      \@bmpsize@skip@two
+      \@bmpsize@num@four\bmpsize@pixelheight
+    }%
+    \ifnum\bmpsize@tag=282\relax
+      \expandafter\@firstofone
+    \else
+      \expandafter\@gobble
+    \fi
+    {%
+      \@bmpsize@skip@four
+      \@bmpsize@skip@two
+      \@bmpsize@num@four\bmpsize@temp
+      \@bmpsize@read{#1}{8}{\bmpsize@temp}%
+      \@bmpsize@num@four\bmpsize@pixelx
+      \@bmpsize@num@four\bmpsize@temp
+      \ifnum\bmpsize@temp=1\relax
+        \expandafter\@gobble
+      \else
+        \expandafter\@firstofone
+      \fi
+      {%
+        \edef\bmpsize@pixelxdenom{\the\numexpr\bmpsize@temp}%
+      }%
+    }%
+    \ifnum\bmpsize@tag=283\relax
+      \expandafter\@firstofone
+    \else
+      \expandafter\@gobble
+    \fi
+    {%
+      \@bmpsize@skip@four
+      \@bmpsize@skip@two
+      \@bmpsize@num@four\bmpsize@temp
+      \@bmpsize@read{#1}{8}{\bmpsize@temp}%
+      \@bmpsize@num@four\bmpsize@pixely
+      \@bmpsize@num@four\bmpsize@temp
+      \ifnum\bmpsize@temp=1\relax
+        \expandafter\@gobble
+      \else
+        \expandafter\@firstofone
+      \fi
+      {%
+        \edef\bmpsize@pixelydenom{\the\numexpr\bmpsize@temp}%
+      }%
+    }%
+  }%
+  \@bmpsize@stop
+  \@nil
+  \@bmpsize@end
+}%
+%</base>
+%    \end{macrocode}
+%    \end{macro}
+%
+% \subsubsection{pnm}
+%
+%\iffalse
+%<*ignore>
+%\fi
+%\begin{verbatim}
+%begin pnm
+%assign {0} -> $offset
+%read 3 $offset
+%assign {3} -> $offset
+%grab 1 -> $temp
+%check streq $temp ["P"]
+%grab 1 -> $temp
+%check strge $temp ["1"]
+%check strle $temp ["6"]
+%% ensure one white space
+%grab 1 -> $temp
+%if iswhite $temp
+%else
+%  stop
+%fi
+%loop
+%  % skip white space
+%  fillbuf
+%  grab 1 -> $temp
+%  if iswhite $temp
+%  else
+%    if streq $temp ["#"]
+%      % ignore comments
+%      loop
+%        fillbuf
+%        grab 1 -> $temp
+%        if streq $temp [0x0A]
+%          break
+%        else
+%          if streq $temp [0x0D]
+%            break
+%          fi
+%        fi
+%      repeat
+%    else
+%      pushback $temp
+%      break
+%    fi
+%  fi
+%repeat
+%assign {} -> $tempnum
+%loop
+%  fillbuf
+%  grab 1 -> $temp
+%  if isdigit $temp
+%    append $tempnum $temp -> $tempnum
+%  else
+%    if iswhite $temp
+%      break
+%    else
+%      stop
+%    fi
+%  fi
+%repeat
+%assign unescapehex($tempnum) -> $pixelwidth
+%loop
+%  fillbuf
+%  grab 1 -> $temp
+%  if iswhite $temp
+%  else
+%    pushback $temp
+%    break
+%  fi
+%repeat
+%assign {} -> $tempnum
+%loop
+%  fillbuf
+%  grab 1 -> $temp
+%  if isdigit $temp
+%    append $tempnum $temp -> $tempnum
+%  else
+%    if iswhite $temp
+%      break
+%    else
+%      stop
+%    fi
+%  fi
+%repeat
+%assign unescapehex($tempnum) -> $pixelheight
+%ok
+%end
+%\end{verbatim}
+%\iffalse
+%</ignore>
+%\fi
+%    \begin{macro}{\bmpsize@read@pnm}
+%    \begin{macrocode}
+%<*base>
+\def\bmpsize@read@pnm#1{%
+  \@bmpsize@init
+  \def\bmpsize@offset{0}%
+  \@bmpsize@read{#1}{3}{\bmpsize@offset}%
+  \def\bmpsize@offset{3}%
+  \@bmpsize@grab\bmpsize@temp{1}%
+  \@bmpsize@skip@one
+  \ifnum\pdf@strcmp{\bmpsize@temp}{50}=\z@
+  \else
+    \expandafter\@bmpsize@stop
+  \fi
+  \@bmpsize@grab\bmpsize@temp{1}%
+  \@bmpsize@skip@one
+  \ifnum\pdf@strcmp{\bmpsize@temp}{31}<\z@
+    \expandafter\@bmpsize@stop
+  \fi
+  \ifnum\pdf@strcmp{\bmpsize@temp}{36}>\z@
+    \expandafter\@bmpsize@stop
+  \fi
+  \@bmpsize@grab\bmpsize@temp{1}%
+  \@bmpsize@skip@one
+  \ifcase 0\@bmpsize@iswhite\bmpsize@temp
+    \expandafter\@gobble
+  \else
+    \expandafter\@firstofone
+  \fi
+  {%
+    \@bmpsize@stop
+  }%
+  \@bmpsize@loop{%
+    \@bmpsize@fillbuf{#1}%
+    \@bmpsize@grab\bmpsize@temp{1}%
+    \@bmpsize@skip@one
+    \ifcase 0\@bmpsize@iswhite\bmpsize@temp
+      \expandafter\@gobble
+    \else
+      \expandafter\@firstofone
+    \fi
+    {%
+      \ifnum\pdf@strcmp{\bmpsize@temp}{23}=\z@
+        \expandafter\@firstoftwo
+      \else
+        \expandafter\@secondoftwo
+      \fi
+      {%
+        \@bmpsize@loop{%
+          \@bmpsize@fillbuf{#1}%
+          \@bmpsize@grab\bmpsize@temp{1}%
+          \@bmpsize@skip@one
+          \ifnum\pdf@strcmp{\bmpsize@temp}{0A}=\z@
+            \expandafter\@firstoftwo
+          \else
+            \expandafter\@secondoftwo
+          \fi
+          {%
+            \@bmpsize@break
+          }{%
+            \ifnum\pdf@strcmp{\bmpsize@temp}{0D}=\z@
+              \expandafter\@firstofone
+            \else
+              \expandafter\@gobble
+            \fi
+            {%
+              \@bmpsize@break
+            }%
+          }%
+        }%
+      }{%
+        \@bmpsize@pushback\bmpsize@temp
+        \@bmpsize@break
+      }%
+    }%
+  }%
+  \def\bmpsize@tempnum{}%
+  \@bmpsize@loop{%
+    \@bmpsize@fillbuf{#1}%
+    \@bmpsize@grab\bmpsize@temp{1}%
+    \@bmpsize@skip@one
+    \ifcase 0\@bmpsize@isdigit\bmpsize@temp
+      \expandafter\@firstoftwo
+    \else
+      \expandafter\@secondoftwo
+    \fi
+    {%
+      \@bmpsize@append\bmpsize@tempnum\bmpsize@tempnum\bmpsize@temp
+    }{%
+      \ifcase 0\@bmpsize@iswhite\bmpsize@temp
+        \expandafter\@firstoftwo
+      \else
+        \expandafter\@secondoftwo
+      \fi
+      {%
+        \@bmpsize@break
+      }{%
+        \@bmpsize@stop
+      }%
+    }%
+  }%
+  \edef\bmpsize@pixelwidth{\pdf@unescapehex{\bmpsize@tempnum}}%
+  \@bmpsize@loop{%
+    \@bmpsize@fillbuf{#1}%
+    \@bmpsize@grab\bmpsize@temp{1}%
+    \@bmpsize@skip@one
+    \ifcase 0\@bmpsize@iswhite\bmpsize@temp
+      \expandafter\@gobble
+    \else
+      \expandafter\@firstofone
+    \fi
+    {%
+      \@bmpsize@pushback\bmpsize@temp
+      \@bmpsize@break
+    }%
+  }%
+  \def\bmpsize@tempnum{}%
+  \@bmpsize@loop{%
+    \@bmpsize@fillbuf{#1}%
+    \@bmpsize@grab\bmpsize@temp{1}%
+    \@bmpsize@skip@one
+    \ifcase 0\@bmpsize@isdigit\bmpsize@temp
+      \expandafter\@firstoftwo
+    \else
+      \expandafter\@secondoftwo
+    \fi
+    {%
+      \@bmpsize@append\bmpsize@tempnum\bmpsize@tempnum\bmpsize@temp
+    }{%
+      \ifcase 0\@bmpsize@iswhite\bmpsize@temp
+        \expandafter\@firstoftwo
+      \else
+        \expandafter\@secondoftwo
+      \fi
+      {%
+        \@bmpsize@break
+      }{%
+        \@bmpsize@stop
+      }%
+    }%
+  }%
+  \edef\bmpsize@pixelheight{\pdf@unescapehex{\bmpsize@tempnum}}%
+  \@bmpsize@ok
+  \@bmpsize@stop
+  \@nil
+  \@bmpsize@end
+}%
+%</base>
+%    \end{macrocode}
+%    \end{macro}
+%
+% \subsubsection{pam}
+%
+%\iffalse
+%<*ignore>
+%\fi
+%\begin{verbatim}
+%begin pam
+%read 3 0
+%assign {3} -> $offset
+%assign $offset -> $off
+%grab 3 -> $temp
+%check streq $temp ["P7" 0x0A]
+%loop
+%  fillbuf
+%  grab 1 -> $temp
+%  if iswhite $temp
+%    % ignore white space
+%    assign numexpr($off + 1) -> $off
+%  else
+%    if streq $temp ["#"]
+%      % ignore comment line
+%      assign numexpr($off + 1) -> $off
+%      loop
+%        fillbuf
+%        grab 1 -> $temp
+%        assign numexpr($off + 1) -> $off
+%        if streq $temp [0x0A]
+%          break
+%        fi
+%      repeat
+%    else
+%      read 6 $off
+%      assign numexpr($off + 6) -> $offset
+%      grab 5 -> $head
+%      if streq $head ["WIDTH"]
+%        assign numexpr($off + 5) -> $off
+%        % skip white space
+%        loop
+%          fillbuf
+%          grab 1 -> $temp
+%          if iswhite $temp
+%            assign numexpr($off + 1) -> $off
+%          else
+%            if isdigit $temp
+%              assign numexpr($off + 1) -> $off
+%              break
+%            else
+%              % error
+%              stop
+%            fi
+%          fi
+%        repeat
+%        % read number
+%        assign $temp -> $tempnum
+%        loop
+%          fillbuf
+%          grab 1 -> $temp
+%          if isdigit $temp
+%            assign numexpr($off + 1) -> $off
+%            append $tempnum $temp -> $tempnum
+%          else
+%            pushback $temp
+%            break
+%          fi
+%        repeat
+%        % skip to end of line
+%        loop
+%          fillbuf
+%          grab 1 -> $temp
+%          assign numexpr($off + 1) -> $off
+%          if streq $temp [0x0A]
+%            break
+%          fi
+%        repeat
+%        assign unescapehex($tempnum) -> $pixelwidth
+%      else
+%        grab 1 -> $temp
+%        append $head $temp -> $head
+%        if streq $head ["ENDHDR"]
+%          % last header line
+%          ok
+%          stop
+%        else
+%          if streq $head ["HEIGHT"]
+%            assign numexpr($off + 6) -> $off
+%            % skip white space
+%            loop
+%              fillbuf
+%              grab 1 -> $temp
+%              if iswhite $temp
+%                assign numexpr($off + 1) -> $off
+%              else
+%                if isdigit $temp
+%                  assign numexpr($off + 1) -> $off
+%                  break
+%                else
+%                  % error
+%                  stop
+%                fi
+%              fi
+%            repeat
+%            % read number
+%            assign $temp -> $tempnum
+%            loop
+%              fillbuf
+%              grab 1 -> $temp
+%              if isdigit $temp
+%                assign numexpr($off + 1) -> $off
+%                append $tempnum $temp -> $tempnum
+%              else
+%                pushback $temp
+%                break
+%              fi
+%            repeat
+%            % skip to end of line
+%            loop
+%              fillbuf
+%              grab 1 -> $temp
+%              assign numexpr($off + 1) -> $off
+%              if streq $temp [0x0A]
+%                break
+%              fi
+%            repeat
+%            assign unescapehex($tempnum) -> $pixelheight
+%          else
+%            % ignore unknown header line
+%            pushback $head
+%            loop
+%              fillbuf
+%              grab 1 -> $temp
+%              assign numexpr($off + 1) -> $off
+%              if streq $temp [0x0A]
+%                break
+%              fi
+%            repeat
+%          fi
+%        fi
+%      fi
+%    fi
+%  fi
+%repeat
+%end
+%\end{verbatim}
+%\iffalse
+%</ignore>
+%\fi
+%    \begin{macro}{\bmpsize@read@pam}
+%    \begin{macrocode}
+%<*base>
+\def\bmpsize@read@pam#1{%
+  \@bmpsize@init
+  \@bmpsize@read{#1}{3}{0}%
+  \def\bmpsize@offset{3}%
+  \let\bmpsize@off\bmpsize@offset
+  \@bmpsize@grab\bmpsize@temp{3}%
+  \@bmpsize@skip@two
+  \@bmpsize@skip@one
+  \ifnum\pdf@strcmp{\bmpsize@temp}{50370A}=\z@
+  \else
+    \expandafter\@bmpsize@stop
+  \fi
+  \@bmpsize@loop{%
+    \@bmpsize@fillbuf{#1}%
+    \@bmpsize@grab\bmpsize@temp{1}%
+    \@bmpsize@skip@one
+    \ifcase 0\@bmpsize@iswhite\bmpsize@temp
+      \expandafter\@firstoftwo
+    \else
+      \expandafter\@secondoftwo
+    \fi
+    {%
+      \edef\bmpsize@off{\the\numexpr\bmpsize@off+1}%
+    }{%
+      \ifnum\pdf@strcmp{\bmpsize@temp}{23}=\z@
+        \expandafter\@firstoftwo
+      \else
+        \expandafter\@secondoftwo
+      \fi
+      {%
+        \edef\bmpsize@off{\the\numexpr\bmpsize@off+1}%
+        \@bmpsize@loop{%
+          \@bmpsize@fillbuf{#1}%
+          \@bmpsize@grab\bmpsize@temp{1}%
+          \@bmpsize@skip@one
+          \edef\bmpsize@off{\the\numexpr\bmpsize@off+1}%
+          \ifnum\pdf@strcmp{\bmpsize@temp}{0A}=\z@
+            \expandafter\@firstofone
+          \else
+            \expandafter\@gobble
+          \fi
+          {%
+            \@bmpsize@break
+          }%
+        }%
+      }{%
+        \@bmpsize@read{#1}{6}{\bmpsize@off}%
+        \edef\bmpsize@offset{\the\numexpr\bmpsize@off+6}%
+        \@bmpsize@grab\bmpsize@head{5}%
+        \@bmpsize@skip@four
+        \@bmpsize@skip@one
+        \ifnum\pdf@strcmp{\bmpsize@head}{5749445448}=\z@
+          \expandafter\@firstoftwo
+        \else
+          \expandafter\@secondoftwo
+        \fi
+        {%
+          \edef\bmpsize@off{\the\numexpr\bmpsize@off+5}%
+          \@bmpsize@loop{%
+            \@bmpsize@fillbuf{#1}%
+            \@bmpsize@grab\bmpsize@temp{1}%
+            \@bmpsize@skip@one
+            \ifcase 0\@bmpsize@iswhite\bmpsize@temp
+              \expandafter\@firstoftwo
+            \else
+              \expandafter\@secondoftwo
+            \fi
+            {%
+              \edef\bmpsize@off{\the\numexpr\bmpsize@off+1}%
+            }{%
+              \ifcase 0\@bmpsize@isdigit\bmpsize@temp
+                \expandafter\@firstoftwo
+              \else
+                \expandafter\@secondoftwo
+              \fi
+              {%
+                \edef\bmpsize@off{\the\numexpr\bmpsize@off+1}%
+                \@bmpsize@break
+              }{%
+                \@bmpsize@stop
+              }%
+            }%
+          }%
+          \let\bmpsize@tempnum\bmpsize@temp
+          \@bmpsize@loop{%
+            \@bmpsize@fillbuf{#1}%
+            \@bmpsize@grab\bmpsize@temp{1}%
+            \@bmpsize@skip@one
+            \ifcase 0\@bmpsize@isdigit\bmpsize@temp
+              \expandafter\@firstoftwo
+            \else
+              \expandafter\@secondoftwo
+            \fi
+            {%
+              \edef\bmpsize@off{\the\numexpr\bmpsize@off+1}%
+              \@bmpsize@append\bmpsize@tempnum\bmpsize@tempnum\bmpsize@temp
+            }{%
+              \@bmpsize@pushback\bmpsize@temp
+              \@bmpsize@break
+            }%
+          }%
+          \@bmpsize@loop{%
+            \@bmpsize@fillbuf{#1}%
+            \@bmpsize@grab\bmpsize@temp{1}%
+            \@bmpsize@skip@one
+            \edef\bmpsize@off{\the\numexpr\bmpsize@off+1}%
+            \ifnum\pdf@strcmp{\bmpsize@temp}{0A}=\z@
+              \expandafter\@firstofone
+            \else
+              \expandafter\@gobble
+            \fi
+            {%
+              \@bmpsize@break
+            }%
+          }%
+          \edef\bmpsize@pixelwidth{\pdf@unescapehex{\bmpsize@tempnum}}%
+        }{%
+          \@bmpsize@grab\bmpsize@temp{1}%
+          \@bmpsize@skip@one
+          \@bmpsize@append\bmpsize@head\bmpsize@head\bmpsize@temp
+          \ifnum\pdf@strcmp{\bmpsize@head}{454E44484452}=\z@
+            \expandafter\@firstoftwo
+          \else
+            \expandafter\@secondoftwo
+          \fi
+          {%
+            \@bmpsize@ok
+            \@bmpsize@stop
+          }{%
+            \ifnum\pdf@strcmp{\bmpsize@head}{484549474854}=\z@
+              \expandafter\@firstoftwo
+            \else
+              \expandafter\@secondoftwo
+            \fi
+            {%
+              \edef\bmpsize@off{\the\numexpr\bmpsize@off+6}%
+              \@bmpsize@loop{%
+                \@bmpsize@fillbuf{#1}%
+                \@bmpsize@grab\bmpsize@temp{1}%
+                \@bmpsize@skip@one
+                \ifcase 0\@bmpsize@iswhite\bmpsize@temp
+                  \expandafter\@firstoftwo
+                \else
+                  \expandafter\@secondoftwo
+                \fi
+                {%
+                  \edef\bmpsize@off{\the\numexpr\bmpsize@off+1}%
+                }{%
+                  \ifcase 0\@bmpsize@isdigit\bmpsize@temp
+                    \expandafter\@firstoftwo
+                  \else
+                    \expandafter\@secondoftwo
+                  \fi
+                  {%
+                    \edef\bmpsize@off{\the\numexpr\bmpsize@off+1}%
+                    \@bmpsize@break
+                  }{%
+                    \@bmpsize@stop
+                  }%
+                }%
+              }%
+              \let\bmpsize@tempnum\bmpsize@temp
+              \@bmpsize@loop{%
+                \@bmpsize@fillbuf{#1}%
+                \@bmpsize@grab\bmpsize@temp{1}%
+                \@bmpsize@skip@one
+                \ifcase 0\@bmpsize@isdigit\bmpsize@temp
+                  \expandafter\@firstoftwo
+                \else
+                  \expandafter\@secondoftwo
+                \fi
+                {%
+                  \edef\bmpsize@off{\the\numexpr\bmpsize@off+1}%
+                  \@bmpsize@append\bmpsize@tempnum\bmpsize@tempnum\bmpsize@temp
+                }{%
+                  \@bmpsize@pushback\bmpsize@temp
+                  \@bmpsize@break
+                }%
+              }%
+              \@bmpsize@loop{%
+                \@bmpsize@fillbuf{#1}%
+                \@bmpsize@grab\bmpsize@temp{1}%
+                \@bmpsize@skip@one
+                \edef\bmpsize@off{\the\numexpr\bmpsize@off+1}%
+                \ifnum\pdf@strcmp{\bmpsize@temp}{0A}=\z@
+                  \expandafter\@firstofone
+                \else
+                  \expandafter\@gobble
+                \fi
+                {%
+                  \@bmpsize@break
+                }%
+              }%
+              \edef\bmpsize@pixelheight{\pdf@unescapehex{\bmpsize@tempnum}}%
+            }{%
+              \@bmpsize@pushback\bmpsize@head
+              \@bmpsize@loop{%
+                \@bmpsize@fillbuf{#1}%
+                \@bmpsize@grab\bmpsize@temp{1}%
+                \@bmpsize@skip@one
+                \edef\bmpsize@off{\the\numexpr\bmpsize@off+1}%
+                \ifnum\pdf@strcmp{\bmpsize@temp}{0A}=\z@
+                  \expandafter\@firstofone
+                \else
+                  \expandafter\@gobble
+                \fi
+                {%
+                  \@bmpsize@break
+                }%
+              }%
+            }%
+          }%
+        }%
+      }%
+    }%
+  }%
+  \@bmpsize@stop
+  \@nil
+  \@bmpsize@end
+}%
+%</base>
+%    \end{macrocode}
+%    \end{macro}
+%
+% \subsubsection{xpm}
+%
+%\iffalse
+%<*ignore>
+%\fi
+%\begin{verbatim}
+%begin xpm
+%read 9 0
+%grab 9 -> $temp
+%assign {9} -> $offset
+%check streq $temp ["/* XPM */"]
+%loop
+%  fillbuf
+%  grab 1 -> $temp
+%  if streq $temp [0x22] % "
+%    break
+%  fi
+%  if streq $temp ["/"]
+%    fillbuf
+%    grab 1 -> $temp
+%    if streq $temp ["*"]
+%      % look for end of C comment
+%      loop
+%        fillbuf
+%        grab 1 -> $temp
+%        if streq $temp ["*"]
+%          loop
+%            fillbuf
+%            grab 1 -> $temp
+%            if streq $temp ["/"]
+%              break
+%            fi
+%            if streq $temp ["*"]
+%            else
+%              break
+%            fi
+%          repeat
+%          if streq $temp ["/"]
+%            break
+%          fi
+%        fi
+%      repeat
+%    fi
+%  fi
+%repeat
+%% width
+%assign {} -> $tempnum
+%loop
+%  fillbuf
+%  grab 1 -> $temp
+%  if iswhite $temp
+%  else
+%    if isdigit $temp
+%      append $tempnum $temp -> $tempnum
+%      break
+%    else
+%      stop
+%    fi
+%  fi
+%repeat
+%loop
+%  fillbuf
+%  grab 1 -> $temp
+%  if isdigit $temp
+%    append $tempnum $temp -> $tempnum
+%  else
+%    if iswhite $temp
+%      break
+%    else
+%      stop
+%    fi
+%  fi
+%repeat
+%assign unescapehex($tempnum) -> $pixelwidth
+%% height
+%assign {} -> $tempnum
+%loop
+%  fillbuf
+%  grab 1 -> $temp
+%  if iswhite $temp
+%  else
+%    if isdigit $temp
+%      append $tempnum $temp -> $tempnum
+%      break
+%    else
+%      stop
+%    fi
+%  fi
+%repeat
+%loop
+%  fillbuf
+%  grab 1 -> $temp
+%  if isdigit $temp
+%    append $tempnum $temp -> $tempnum
+%  else
+%    if iswhite $temp
+%      break
+%    else
+%      stop
+%    fi
+%  fi
+%repeat
+%assign unescapehex($tempnum) -> $pixelheight
+%ok
+%end
+%\end{verbatim}
+%\iffalse
+%</ignore>
+%\fi
+%    \begin{macro}{\bmpsize@read@xpm}
+%    \begin{macrocode}
+%<*base>
+\def\bmpsize@read@xpm#1{%
+  \@bmpsize@init
+  \@bmpsize@read{#1}{9}{0}%
+  \@bmpsize@grab\bmpsize@temp{9}%
+  \@bmpsize@skip@four
+  \@bmpsize@skip@four
+  \@bmpsize@skip@one
+  \def\bmpsize@offset{9}%
+  \ifnum\pdf@strcmp{\bmpsize@temp}{2F2A2058504D202A2F}=\z@
+  \else
+    \expandafter\@bmpsize@stop
+  \fi
+  \@bmpsize@loop{%
+    \@bmpsize@fillbuf{#1}%
+    \@bmpsize@grab\bmpsize@temp{1}%
+    \@bmpsize@skip@one
+    \ifnum\pdf@strcmp{\bmpsize@temp}{22}=\z@
+      \expandafter\@firstofone
+    \else
+      \expandafter\@gobble
+    \fi
+    {%
+      \@bmpsize@break
+    }%
+    \ifnum\pdf@strcmp{\bmpsize@temp}{2F}=\z@
+      \expandafter\@firstofone
+    \else
+      \expandafter\@gobble
+    \fi
+    {%
+      \@bmpsize@fillbuf{#1}%
+      \@bmpsize@grab\bmpsize@temp{1}%
+      \@bmpsize@skip@one
+      \ifnum\pdf@strcmp{\bmpsize@temp}{2A}=\z@
+        \expandafter\@firstofone
+      \else
+        \expandafter\@gobble
+      \fi
+      {%
+        \@bmpsize@loop{%
+          \@bmpsize@fillbuf{#1}%
+          \@bmpsize@grab\bmpsize@temp{1}%
+          \@bmpsize@skip@one
+          \ifnum\pdf@strcmp{\bmpsize@temp}{2A}=\z@
+            \expandafter\@firstofone
+          \else
+            \expandafter\@gobble
+          \fi
+          {%
+            \@bmpsize@loop{%
+              \@bmpsize@fillbuf{#1}%
+              \@bmpsize@grab\bmpsize@temp{1}%
+              \@bmpsize@skip@one
+              \ifnum\pdf@strcmp{\bmpsize@temp}{2F}=\z@
+                \expandafter\@firstofone
+              \else
+                \expandafter\@gobble
+              \fi
+              {%
+                \@bmpsize@break
+              }%
+              \ifnum\pdf@strcmp{\bmpsize@temp}{2A}=\z@
+                \expandafter\@gobble
+              \else
+                \expandafter\@firstofone
+              \fi
+              {%
+                \@bmpsize@break
+              }%
+            }%
+            \ifnum\pdf@strcmp{\bmpsize@temp}{2F}=\z@
+              \expandafter\@firstofone
+            \else
+              \expandafter\@gobble
+            \fi
+            {%
+              \@bmpsize@break
+            }%
+          }%
+        }%
+      }%
+    }%
+  }%
+  \def\bmpsize@tempnum{}%
+  \@bmpsize@loop{%
+    \@bmpsize@fillbuf{#1}%
+    \@bmpsize@grab\bmpsize@temp{1}%
+    \@bmpsize@skip@one
+    \ifcase 0\@bmpsize@iswhite\bmpsize@temp
+      \expandafter\@gobble
+    \else
+      \expandafter\@firstofone
+    \fi
+    {%
+      \ifcase 0\@bmpsize@isdigit\bmpsize@temp
+        \expandafter\@firstoftwo
+      \else
+        \expandafter\@secondoftwo
+      \fi
+      {%
+        \@bmpsize@append\bmpsize@tempnum\bmpsize@tempnum\bmpsize@temp
+        \@bmpsize@break
+      }{%
+        \@bmpsize@stop
+      }%
+    }%
+  }%
+  \@bmpsize@loop{%
+    \@bmpsize@fillbuf{#1}%
+    \@bmpsize@grab\bmpsize@temp{1}%
+    \@bmpsize@skip@one
+    \ifcase 0\@bmpsize@isdigit\bmpsize@temp
+      \expandafter\@firstoftwo
+    \else
+      \expandafter\@secondoftwo
+    \fi
+    {%
+      \@bmpsize@append\bmpsize@tempnum\bmpsize@tempnum\bmpsize@temp
+    }{%
+      \ifcase 0\@bmpsize@iswhite\bmpsize@temp
+        \expandafter\@firstoftwo
+      \else
+        \expandafter\@secondoftwo
+      \fi
+      {%
+        \@bmpsize@break
+      }{%
+        \@bmpsize@stop
+      }%
+    }%
+  }%
+  \edef\bmpsize@pixelwidth{\pdf@unescapehex{\bmpsize@tempnum}}%
+  \def\bmpsize@tempnum{}%
+  \@bmpsize@loop{%
+    \@bmpsize@fillbuf{#1}%
+    \@bmpsize@grab\bmpsize@temp{1}%
+    \@bmpsize@skip@one
+    \ifcase 0\@bmpsize@iswhite\bmpsize@temp
+      \expandafter\@gobble
+    \else
+      \expandafter\@firstofone
+    \fi
+    {%
+      \ifcase 0\@bmpsize@isdigit\bmpsize@temp
+        \expandafter\@firstoftwo
+      \else
+        \expandafter\@secondoftwo
+      \fi
+      {%
+        \@bmpsize@append\bmpsize@tempnum\bmpsize@tempnum\bmpsize@temp
+        \@bmpsize@break
+      }{%
+        \@bmpsize@stop
+      }%
+    }%
+  }%
+  \@bmpsize@loop{%
+    \@bmpsize@fillbuf{#1}%
+    \@bmpsize@grab\bmpsize@temp{1}%
+    \@bmpsize@skip@one
+    \ifcase 0\@bmpsize@isdigit\bmpsize@temp
+      \expandafter\@firstoftwo
+    \else
+      \expandafter\@secondoftwo
+    \fi
+    {%
+      \@bmpsize@append\bmpsize@tempnum\bmpsize@tempnum\bmpsize@temp
+    }{%
+      \ifcase 0\@bmpsize@iswhite\bmpsize@temp
+        \expandafter\@firstoftwo
+      \else
+        \expandafter\@secondoftwo
+      \fi
+      {%
+        \@bmpsize@break
+      }{%
+        \@bmpsize@stop
+      }%
+    }%
+  }%
+  \edef\bmpsize@pixelheight{\pdf@unescapehex{\bmpsize@tempnum}}%
+  \@bmpsize@ok
+  \@bmpsize@stop
+  \@nil
+  \@bmpsize@end
+}%
+%</base>
+%    \end{macrocode}
+%    \end{macro}
+%
+% \subsubsection{tga}
+%
+%\iffalse
+%<*ignore>
+%\fi
+%\begin{verbatim}
+%begin tga
+%little-endian
+%                              % id length (1 byte)
+%read 16 1
+%grab 1 -> $temp               % color map type (1 byte), values: 0, 1
+%if streq $temp [0x00]
+%else
+%  if streq $temp [0x01]
+%  else
+%    stop
+%  fi
+%fi
+%skip 10                       % image type (1 byte)
+%                              % color map specification (5 bytes)
+%                              % x origin (2 bytes)
+%                              % y origin (2 bytes)
+%num 2 -> $pixelwidth          % image width
+%num 2 -> $pixelheight         % image height
+%ok
+%% TGA File Footer
+%size 26 -> $temp
+%read 26 numexpr($temp - 26)
+%num 4 -> $offset              % the extension area offset
+%skip 4                        % the developer directory offset
+%grab 18 -> $temp              % the signature, ".", 0x00
+%if streq $temp ["TRUEVISION-XFILE." 0x00]
+%else
+%  stop
+%fi
+%if numeq $offset 0
+%  stop                        % no extension area
+%fi
+%read 4 numexpr($offset + 474) % pixel aspect ratio (4 bytes)
+%num 2 -> $pixelx              % pixel ratio numerator (pixel width)
+%num 2 -> $pixely              % pixel ratio denominator (pixel height)
+%if numeq $pixely 0            % no pixel aspect ratio
+%  clear $pixelx
+%  clear $pixely
+%fi
+%end
+%\end{verbatim}
+%\iffalse
+%</ignore>
+%\fi
+%    \begin{macro}{\bmpsize@read@tga}
+%    \begin{macrocode}
+%<*base>
+\def\bmpsize@read@tga#1{%
+  \@bmpsize@init
+  \@bmpsize@bigendianfalse
+  \@bmpsize@read{#1}{16}{1}%
+  \@bmpsize@grab\bmpsize@temp{1}%
+  \@bmpsize@skip@one
+  \ifnum\pdf@strcmp{\bmpsize@temp}{00}=\z@
+    \expandafter\@gobble
+  \else
+    \expandafter\@firstofone
+  \fi
+  {%
+    \ifnum\pdf@strcmp{\bmpsize@temp}{01}=\z@
+      \expandafter\@gobble
+    \else
+      \expandafter\@firstofone
+    \fi
+    {%
+      \@bmpsize@stop
+    }%
+  }%
+  \@bmpsize@skip@four
+  \@bmpsize@skip@four
+  \@bmpsize@skip@two
+  \@bmpsize@num@two\bmpsize@pixelwidth
+  \@bmpsize@num@two\bmpsize@pixelheight
+  \@bmpsize@ok
+  \@bmpsize@size{#1}{26}\bmpsize@temp  \@bmpsize@read{#1}{26}{\numexpr\bmpsize@temp-26\relax}%
+  \@bmpsize@num@four\bmpsize@offset
+  \@bmpsize@skip@four
+  \@bmpsize@grab\bmpsize@temp{18}%
+  \@bmpsize@skip@four
+  \@bmpsize@skip@four
+  \@bmpsize@skip@four
+  \@bmpsize@skip@four
+  \@bmpsize@skip@two
+  \ifnum\pdf@strcmp{\bmpsize@temp}{54525545564953494F4E2D5846494C452E00}=\z@
+    \expandafter\@gobble
+  \else
+    \expandafter\@firstofone
+  \fi
+  {%
+    \@bmpsize@stop
+  }%
+  \ifnum\bmpsize@offset=0\relax
+    \expandafter\@firstofone
+  \else
+    \expandafter\@gobble
+  \fi
+  {%
+    \@bmpsize@stop
+  }%
+  \@bmpsize@read{#1}{4}{\numexpr\bmpsize@offset+474\relax}%
+  \@bmpsize@num@two\bmpsize@pixelx
+  \@bmpsize@num@two\bmpsize@pixely
+  \ifnum\bmpsize@pixely=0\relax
+    \expandafter\@firstofone
+  \else
+    \expandafter\@gobble
+  \fi
+  {%
+    \let\bmpsize@pixelx\relax
+    \let\bmpsize@pixely\relax
+  }%
+  \@bmpsize@stop
+  \@nil
+  \@bmpsize@end
+}%
+%</base>
+%    \end{macrocode}
+%    \end{macro}
+%
+% \subsubsection{pcx}
+%
+%\iffalse
+%<*ignore>
+%\fi
+%\begin{verbatim}
+%begin pcx
+%little-endian
+%read 16 0
+%grab 1 -> $temp             % manufacturer
+%check streq $temp [0x0A]
+%skip 1                      % version
+%num 1 -> $temp              % encoding
+%check numeq $temp 1
+%skip 1                      % bits per pixel
+%num 2 -> $pixelwidth        % x_min
+%num 2 -> $pixelheight       % y_min
+%num 2 -> $temp              % x_max
+%assign numexpr($temp - $pixelwidth + 1) -> $pixelwidth
+%num 2 -> $temp              % y_max
+%assign numexpr($temp - $pixelheight + 1) -> $pixelheight
+%check numgt $pixelwidth 0
+%check numgt $pixelheight 0
+%ok
+%num 2 -> $pixelx            % horizontal resolution in DPI
+%num 2 -> $pixely            % vertical resolution in DPI
+%assign {72.27pt} -> $unit
+%end
+%\end{verbatim}
+%\iffalse
+%</ignore>
+%\fi
+%    \begin{macro}{\bmpsize@read@pcx}
+%    \begin{macrocode}
+%<*base>
+\def\bmpsize@read@pcx#1{%
+  \@bmpsize@init
+  \@bmpsize@bigendianfalse
+  \@bmpsize@read{#1}{16}{0}%
+  \@bmpsize@grab\bmpsize@temp{1}%
+  \@bmpsize@skip@one
+  \ifnum\pdf@strcmp{\bmpsize@temp}{0A}=\z@
+  \else
+    \expandafter\@bmpsize@stop
+  \fi
+  \@bmpsize@skip@one
+  \@bmpsize@num@one\bmpsize@temp
+  \ifnum\bmpsize@temp=1\relax
+  \else
+    \expandafter\@bmpsize@stop
+  \fi
+  \@bmpsize@skip@one
+  \@bmpsize@num@two\bmpsize@pixelwidth
+  \@bmpsize@num@two\bmpsize@pixelheight
+  \@bmpsize@num@two\bmpsize@temp
+  \edef\bmpsize@pixelwidth{\the\numexpr\bmpsize@temp-\bmpsize@pixelwidth+1}%
+  \@bmpsize@num@two\bmpsize@temp
+  \edef\bmpsize@pixelheight{\the\numexpr\bmpsize@temp-\bmpsize@pixelheight+1}%
+  \ifnum\bmpsize@pixelwidth>0\relax
+  \else
+    \expandafter\@bmpsize@stop
+  \fi
+  \ifnum\bmpsize@pixelheight>0\relax
+  \else
+    \expandafter\@bmpsize@stop
+  \fi
+  \@bmpsize@ok
+  \@bmpsize@num@two\bmpsize@pixelx
+  \@bmpsize@num@two\bmpsize@pixely
+  \def\bmpsize@unit{72.27pt}%
+  \@bmpsize@stop
+  \@nil
+  \@bmpsize@end
+}%
+%</base>
+%    \end{macrocode}
+%    \end{macro}
+%
+% \subsubsection{msp}
+%
+%\iffalse
+%<*ignore>
+%\fi
+%\begin{verbatim}
+%begin msp
+%little-endian
+%
+%read 16 0
+%
+%% header 4
+%grab 4 -> $temp
+%if streq $temp ["DanM"]
+%else
+%  check streq $temp ["LinS"]
+%fi
+%num 2 -> $pixelwidth
+%num 2 -> $pixelheight
+%ok
+%num 2 -> $pixelx % x_asp
+%num 2 -> $pixely % y_asp
+%assign {72.27pt} -> $unit % guessing
+%if numeq $pixelx 0
+%  num 2 -> $pixelx % x_asp_prn
+%  num 2 -> $pixely % y_asp_prn
+%fi
+%% num 2 % width_prn
+%% num 2 % height_prn
+%end
+%\end{verbatim}
+%\iffalse
+%</ignore>
+%\fi
+%    \begin{macro}{\bmpsize@read@msp}
+%    \begin{macrocode}
+%<*base>
+\def\bmpsize@read@msp#1{%
+  \@bmpsize@init
+  \@bmpsize@bigendianfalse
+  \@bmpsize@read{#1}{16}{0}%
+  \@bmpsize@grab\bmpsize@temp{4}%
+  \@bmpsize@skip@four
+  \ifnum\pdf@strcmp{\bmpsize@temp}{44616E4D}=\z@
+    \expandafter\@gobble
+  \else
+    \expandafter\@firstofone
+  \fi
+  {%
+    \ifnum\pdf@strcmp{\bmpsize@temp}{4C696E53}=\z@
+    \else
+      \expandafter\@bmpsize@stop
+    \fi
+  }%
+  \@bmpsize@num@two\bmpsize@pixelwidth
+  \@bmpsize@num@two\bmpsize@pixelheight
+  \@bmpsize@ok
+  \@bmpsize@num@two\bmpsize@pixelx
+  \@bmpsize@num@two\bmpsize@pixely
+  \def\bmpsize@unit{72.27pt}%
+  \ifnum\bmpsize@pixelx=0\relax
+    \expandafter\@firstofone
+  \else
+    \expandafter\@gobble
+  \fi
+  {%
+    \@bmpsize@num@two\bmpsize@pixelx
+    \@bmpsize@num@two\bmpsize@pixely
+  }%
+  \@bmpsize@stop
+  \@nil
+  \@bmpsize@end
+}%
+%</base>
+%    \end{macrocode}
+%    \end{macro}
+%
+% \subsubsection{sgi}
+%
+%\iffalse
+%<*ignore>
+%\fi
+%\begin{verbatim}
+%begin sgi
+%big-endian
+%read 10 0
+%grab 2 -> $temp
+%check streq $temp [0x01 0xDA] % magic: 474 decimal
+%grab 1 -> $temp               % storage: 0 or 1
+%check numge $temp 0
+%check numle $temp 1
+%skip 2                        % bpc, dimension
+%num 2 -> $pixelwidth
+%num 2 -> $pixelheight
+%ok
+%end
+%\end{verbatim}
+%\iffalse
+%</ignore>
+%\fi
+%    \begin{macro}{\bmpsize@read@sgi}
+%    \begin{macrocode}
+%<*base>
+\def\bmpsize@read@sgi#1{%
+  \@bmpsize@init
+  \@bmpsize@bigendiantrue
+  \@bmpsize@read{#1}{10}{0}%
+  \@bmpsize@grab\bmpsize@temp{2}%
+  \@bmpsize@skip@two
+  \ifnum\pdf@strcmp{\bmpsize@temp}{01DA}=\z@
+  \else
+    \expandafter\@bmpsize@stop
+  \fi
+  \@bmpsize@grab\bmpsize@temp{1}%
+  \@bmpsize@skip@one
+  \ifnum\bmpsize@temp<0\relax
+    \expandafter\@bmpsize@stop
+  \fi
+  \ifnum\bmpsize@temp>1\relax
+    \expandafter\@bmpsize@stop
+  \fi
+  \@bmpsize@skip@two
+  \@bmpsize@num@two\bmpsize@pixelwidth
+  \@bmpsize@num@two\bmpsize@pixelheight
+  \@bmpsize@ok
+  \@bmpsize@stop
+  \@nil
+  \@bmpsize@end
+}%
+%</base>
+%    \end{macrocode}
+%    \end{macro}
+%
+% \subsection{Package \xpackage{bmpsize}}
+%
+%    \begin{macrocode}
+%<*package>
+\ProvidesPackage{bmpsize}%
+  [2016/05/16 v1.7 Extract size/resolution from bitmap files (HO)]%
+\RequirePackage{ifpdf}
+\ifpdf
+  \PackageInfo{bmpsize}{Superseded by pdfTeX in PDF mode}%
+  \expandafter\endinput
+\fi
+\RequirePackage{pdftexcmds}[2007/11/11]
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname pdf@filedump\endcsname\relax
+  \PackageError{bmpsize}{%
+    You need pdfTeX 1.30.0 or newer%
+  }{Package loading is aborted.}%
+  \expandafter\endinput
+\fi
+
+\RequirePackage{infwarerr}[2007/09/09]
+\RequirePackage{graphics}
+%    \end{macrocode}
+%    In case of \plainTeX\ options are not executed
+%    and \cs{KV@err} and \cs{KV@errx} are undefined.
+%    \begin{macrocode}
+\RequirePackage{keyval}\relax
+\expandafter\ifx\csname KV@errx\endcsname\relax
+  \def\KV@errx#1{%
+    \@PackageError{keyval}{#1}\@ehc
+  }%
+\fi
+\expandafter\ifx\csname KV@err\endcsname\relax
+  \let\KV@err\KV@errx
+\fi
+%    \end{macrocode}
+%    \begin{macrocode}
+\RequirePackage{bmpsize-base}
+
+\InputIfFileExists{bmpsize-\Gin@driver}{}{}
+
+\define@key{Gin}{bmpsizefast}[true]{%
+  \expandafter\ifx\csname if#1\expandafter\endcsname\csname iftrue\endcsname
+    \@bmpsize@fasttrue
+  \else
+    \@bmpsize@fastfalse
+  \fi
+}
+\define@key{Gin}{resolutionunit}{%
+  \def\bmpsize@unit@default{#1}%
+}
+\begingroup
+  \def\x#1{\endgroup
+    \define@key{Gin}{resolution}{%
+      \@bmpsize@read@resolution\@bmpsize@user@resolutiontrue##1#1#1\@nil
+    }%
+    \define@key{Gin}{defaultresolution}{%
+      \@bmpsize@read@resolution\@bmpsize@user@resolutionfalse##1#1#1\@nil
+    }%
+  }%
+\x{ }
+\def\@bmpsize@read@resolution#1#2 #3 #4\@nil{%
+  \ifcase 0\ifx\\#2\\1\fi
+           \ifnum\pdf@strcmp{#2}{\Gin@exclamation}=\z@
+             \ifx\\#3\\1\fi
+             \ifnum\pdf@strcmp{#3}{\Gin@exclamation}=\z@
+               1%
+             \fi
+           \fi
+    \ifcase\pdf@strcmp{#2}{\Gin@exclamation}\relax
+      \let\bmpsize@pixelx@default\Gin@exclamation
+    \else
+      \edef\bmpsize@pixelx@default{#2}%
+    \fi
+    \ifcase\pdf@strcmp{#3}{\Gin@exclamation}\relax
+      \let\bmpsize@pixely@default\Gin@exclamation
+    \else
+      \ifx\\#3\\%
+        \let\bmpsize@pixely@default\bmpsize@pixelx@default
+      \else
+        \edef\bmpsize@pixely@default{#3}%
+      \fi
+    \fi
+    #1%
+  \else
+    \PackageError{bmpsize}{%
+      Wrong syntax for key (default)resolution%
+    }{%
+      See package documentation for correct syntax.%
+    }%
+  \fi
+}
+\newcommand*{\bmpsizesetup}{\setkeys{Gin}}
+
+\let\@bmpsize@org@setfile\Gin@setfile
+\def\Gin@setfile#1#2#3{%
+  \ifcase\pdf@strcmp{#1}{bmp}\relax
+    \expandafter\@firstofone
+  \else
+    \expandafter\@gobble
+  \fi
+  {%
+    \bmpsize@okfalse
+    \edef\bmpsize@ext{\ifx\Gin@ext\relax\Gin@eext\else\Gin@ext\fi}%
+    \edef\bmpsize@file{\Gin@base\bmpsize@ext}%
+    \edef\@bmpsize@temp{\bmpsize@ext}%
+    \@ifundefined{bmpsize@read@\@bmpsize@temp}{%
+      \@ifundefined{bmpsize@map@\@bmpsize@temp}{}{%
+        \expandafter\let\expandafter\@bmpsize@temp
+        \csname bmpsize@map@\@bmpsize@temp\endcsname
+      }%
+    }{}%
+    \@ifundefined{bmpsize@read@\@bmpsize@temp}{%
+    }{%
+      \csname bmpsize@read@\@bmpsize@temp\endcsname\bmpsize@file
+    }%
+    \ifbmpsize@ok
+    \else
+      \@for\@bmpsize@temp:=\bmpsize@types\do{%
+        \ifbmpsize@ok
+        \else
+          \csname bmpsize@read@\@bmpsize@temp\endcsname\bmpsize@file
+        \fi
+      }%
+    \fi
+    \ifbmpsize@ok
+      \ifGin@bbox
+        \@ifundefined{Gin@vllx}{%
+          \@PackageWarning{bmpsize}{Explicit bounding box is ignored}%
+        }{%
+          \ifx\Gin@viewport@code\relax
+            \def\Gin@ollx{0}%
+            \let\Gin@olly\Gin@ollx
+            \let\Gin@ourx\bmpsize@width
+            \let\Gin@oury\bmpsize@height
+            \let\Gin@vllx\Gin@llx
+            \let\Gin@vlly\Gin@lly
+            \let\Gin@vurx\Gin@urx
+            \let\Gin@vury\Gin@ury
+            \let\Gin@viewport@code\Gin@viewport
+            \@PackageWarning{bmpsize}{%
+              Explicit bounding box replaced by\MessageBreak
+              viewport setting%
+            }%
+          \else
+            \@PackageWarning{bmpsize}{Explicit bounding box is ignored}%
+          \fi
+        }%
+      \fi
+      \def\Gin@llx{0}%
+      \def\Gin@lly{0}%
+      \let\Gin@urx\bmpsize@width
+      \let\Gin@ury\bmpsize@height
+      \Gin@bboxtrue
+    \else
+      \PackageInfo{bmpsize}{Unknown image type of \bmpsize@file}%
+    \fi
+  }%
+  \@bmpsize@org@setfile{#1}{#2}{#3}%
+}
+\newcommand*{\bmpsize@ext@type}[1]{%
+  \@namedef{bmpsize@map@#1}%
+}
+\bmpsize@ext@type{.jpg}{jpg}
+\bmpsize@ext@type{.jpe}{jpg}
+\bmpsize@ext@type{.jfif}{jpg}
+\bmpsize@ext@type{.jpeg}{jpg}
+\bmpsize@ext@type{.tif}{tiff}
+\bmpsize@ext@type{.tiff}{tiff}
+\bmpsize@ext@type{.pcx}{pcx}
+\bmpsize@ext@type{.msp}{msp}
+\bmpsize@ext@type{.bmp}{bmp}
+\bmpsize@ext@type{.png}{png}
+\bmpsize@ext@type{.pnm}{pnm}
+\bmpsize@ext@type{.pbm}{pnm}
+\bmpsize@ext@type{.pgm}{pnm}
+\bmpsize@ext@type{.ppm}{pnm}
+\bmpsize@ext@type{.pam}{pam}
+\bmpsize@ext@type{.xpm}{xpm}
+\bmpsize@ext@type{.gif}{gif}
+\bmpsize@ext@type{.tga}{tga}
+\bmpsize@ext@type{.sgi}{sgi}
+%</package>
+%    \end{macrocode}
+%
+% \subsection{Drivers}
+%
+% \subsubsection{dvips}
+%
+%    Identification.
+%    \begin{macrocode}
+%<*dvips>
+\ProvidesFile{bmpsize-dvips.def}%
+  [2016/05/16 v1.7 Graphics bitmap driver for dvips (HO)]%
+%    \end{macrocode}
+%    Ensure correct catcodes.
+%    \begin{macrocode}
+\expandafter\edef\csname @bmpsize@driver@catcodes\endcsname{%
+  \catcode44 \the\catcode44 % ,
+  \catcode58 \the\catcode58 % :
+  \catcode60 \the\catcode60 % <
+  \catcode61 \the\catcode61 % =
+  \catcode62 \the\catcode62 % >
+  \catcode64 \the\catcode64 % @
+}
+\catcode64 11 %
+\@makeother\,
+\@makeother\:
+\@makeother\<
+\@makeother\=
+\@makeother\>
+%    \end{macrocode}
+%    \begin{macro}{\Ginclude@bmp}
+%    Added features: support for viewport/trim and clip.
+%    \begin{macrocode}
+\def\Ginclude@bmp#1{%
+  \message{<#1>}%
+  \raise\Gin@req@height
+  \hbox to\Gin@req@width{%
+%    \end{macrocode}
+%    Clipping support.
+%    \begin{macrocode}
+    \ifGin@clip
+      \vbox to\z@{%
+        \special{ps:gsave currentpoint}%
+        \kern\Gin@req@height
+        \hbox to\z@{%
+          \kern\Gin@req@width
+          \special{ps:%
+            currentpoint %
+            newpath %
+            3 index 3 index moveto %
+            1 index 3 index lineto %
+            2 copy lineto %
+            exch pop exch pop %
+            lineto %
+            closepath %
+            clip %
+          }%
+          \hss
+        }%
+        \vss
+      }%
+    \fi
+%    \end{macrocode}
+%    Support for viewport/trim. The original bounding box is
+%    `0 0 width height'. If package \xpackage{bmpsize} is used
+%    and the image has been recognized, then the original width
+%    and height are known (\cs{bmpsize@width}, \cs{bmpsize@height}).
+%    Otherwise we try the saved values \cs{Gin@ourx} and \cs{Gin@oury}.
+%    This guessing will fail, if options viewport and trim are used
+%    both or several times. This is a deficiency of package {graphicx}.
+%    One of options viewport and trim should be used at most once.
+%    \begin{macrocode}
+    \@ifundefined{Gin@ollx}{%
+      \dimen@\z@
+    }{%
+      \ifx\Gin@scalex\Gin@exclamation
+        \let\Gin@scalex\Gin@scaley
+      \fi
+      \ifx\Gin@scaley\Gin@exclamation
+        \let\Gin@scaley\Gin@scalex
+      \fi
+      \@ifundefined{bmpsize@width}{%
+        \let\bmpsize@width\Gin@ourx
+        \let\bmpsize@height\Gin@oury
+      }{}%
+      \dimen@=\Gin@llx bp\relax
+      \dimen@=\Gin@scalex\dimen@
+      \kern-\dimen@
+      \advance\Gin@req@width\dimen@
+      \dimen@=\bmpsize@width bp\relax
+      \advance\dimen@ by -\Gin@urx bp\relax
+      \dimen@=\Gin@scalex\dimen@
+      \advance\Gin@req@width\dimen@
+      \dimen@=\Gin@lly bp\relax
+      \dimen@=\Gin@scaley\dimen@
+      \advance\Gin@req@height\dimen@
+      \dimen@=\bmpsize@height bp\relax
+      \advance\dimen@ by -\Gin@ury bp\relax
+      \dimen@=\Gin@scaley\dimen@
+      \advance\Gin@req@height\dimen@
+    }%
+    \ifdim\dimen@=\z@
+    \else
+      \vbox to\z@\bgroup
+        \kern-\dimen@
+    \fi
+%    \end{macrocode}
+%    The special for the image.
+%    \begin{macrocode}
+    \special{em:graph #1,\the\Gin@req@width,\the\Gin@req@height}%
+    \ifdim\dimen@=\z@
+    \else
+        \vss
+      \egroup
+    \fi
+    \ifGin@clip
+      \special{ps::grestore}%
+    \fi
+    \hss
+  }%
+}
+%    \end{macrocode}
+%    \end{macro}
+%    \begin{macrocode}
+\@bmpsize@driver@catcodes
+%</dvips>
+%    \end{macrocode}
+%
+% \subsubsection{dvipdfm and dvipdfmx}
+%
+%    Identification.
+%    \begin{macrocode}
+%<*dvipdfm>
+\ProvidesFile{bmpsize-dvipdfm.def}%
+  [2016/05/16 v1.7 Graphics bitmap driver for dvipdfm (HO)]%
+%</dvipdfm>
+%<*dvipdfmx>
+\ProvidesFile{bmpsize-dvipdfmx.def}%
+  [2016/05/16 v1.7 Graphics bitmap driver for dvipdfmx (HO)]%
+%</dvipdfmx>
+%<*dvipdfm|dvipdfmx>
+%    \end{macrocode}
+%    Ensure correct catcodes.
+%    \begin{macrocode}
+\expandafter\edef\csname @bmpsize@driver@catcodes\endcsname{%
+  \catcode44 \the\catcode44 % ,
+  \catcode46 \the\catcode46 % .
+  \catcode58 \the\catcode58 % :
+  \catcode60 \the\catcode60 % <
+  \catcode61 \the\catcode61 % =
+  \catcode62 \the\catcode62 % >
+  \catcode64 \the\catcode64 % @
+}
+\catcode64 11 %
+\@makeother\,
+\@makeother\.
+\@makeother\:
+\@makeother\<
+\@makeother\=
+\@makeother\>
+%    \end{macrocode}
+%    Counter resource to generate unique names for xform objects.
+%    \begin{macrocode}
+\@ifundefined{@bmpsize@count}{%
+  \csname newcount\endcsname\@bmpsize@count
+  \@bmpsize@count=\z@
+}{}
+%    \end{macrocode}
+%    The file name is given as PDF string in the image special.
+%    If we have \pdfTeX\ with \cs{pdfescapestring} we use it.
+%    \begin{macro}{\@bmpsize@pdfescapestring}
+%    \begin{macrocode}
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname pdf@escapestring\endcsname\relax
+  \def\@bmpsize@pdfescapestring#1{#1}%
+\else
+  \let\@bmpsize@pdfescapestring\pdf@escapestring
+\fi
+%    \end{macrocode}
+%    \end{macro}
+%    The size of reused images of dvipdfm 0.13.2c is 1bp. It is
+%    the default size of an image object in user space.
+%    Thus the reused image must be scaled to the requested
+%    width and height. The factor is just the conversion
+%    from pt to bp (72/72.27).
+%    \begin{macro}{\bmpsize@dvipdfm@factor}
+%    \begin{macrocode}
+%<dvipdfm>\def\bmpsize@dvipdfm@factor{.99626}
+%    \end{macrocode}
+%    Unhappily dvipdfmx behaves differently. It remembers the
+%    size assuming a resolution of 100 dots per inch and additionally
+%    scales the reused image to this size. Thus the scaling factor
+%    also depends on the pixel sizes of the image:
+%    \begin{itemize}
+%    \item width: (72 / 72.27) * (100 / 72) / pixelwidth =\\
+%          \mbox{}\hphantom{width:} 100 / 72.27 / pixelwidth
+%    \item height: 100 / 72.27 / pixelheight
+%    \end{itemize}
+%    Recent versions however use the natural size of the reused image.
+%    Thus the factor is the difference between the requested size and
+%    the natural size.
+%    \end{macro}
+%    \begin{macro}{\Ginclude@bmp}
+%    Added features: support for viewport/trim, clip, and image reuse.
+%    \begin{macrocode}
+\def\Ginclude@bmp#1{%
+  \message{<#1>}%
+%    \end{macrocode}
+%    Clip support is achieved by putting the image inside
+%    a xform object. These xform objects are automatically clipped
+%    when they are used.
+%    \begin{macrocode}
+  \ifGin@clip
+    \global\advance\@bmpsize@count\@ne
+    \edef\@bmpsize@clip@name{@CLIP@\the\@bmpsize@count}%
+    \special{%
+      pdf:bxobj \@bmpsize@clip@name\space
+      width \the\Gin@req@width\space
+      height \the\Gin@req@height
+    }%
+  \fi
+%    \end{macrocode}
+%    Support for viewport/trim.
+%    \begin{macrocode}
+  \hbox to \z@{%
+    \@ifundefined{Gin@ollx}{%
+      \dimen@\z@
+    }{%
+      \ifx\Gin@scalex\Gin@exclamation
+        \let\Gin@scalex\Gin@scaley
+      \fi
+      \ifx\Gin@scaley\Gin@exclamation
+        \let\Gin@scaley\Gin@scalex
+      \fi
+      \@ifundefined{bmpsize@width}{%
+        \let\bmpsize@width\Gin@ourx
+        \let\bmpsize@height\Gin@oury
+      }{}%
+      \dimen@=\Gin@llx bp\relax
+      \dimen@=\Gin@scalex\dimen@
+      \kern-\dimen@
+      \advance\Gin@req@width\dimen@
+      \dimen@=\bmpsize@width bp\relax
+      \advance\dimen@ by -\Gin@urx bp\relax
+      \dimen@=\Gin@scalex\dimen@
+      \advance\Gin@req@width\dimen@
+      \dimen@=\bmpsize@height bp\relax
+      \advance\dimen@ by -\Gin@ury bp\relax
+      \dimen@=\Gin@scaley\dimen@
+      \advance\Gin@req@height\dimen@
+      \dimen@=\Gin@lly bp\relax
+      \dimen@=\Gin@scaley\dimen@
+      \advance\Gin@req@height\dimen@
+    }%
+    \ifdim\dimen@=\z@
+    \else
+      \vbox to\z@\bgroup
+        \kern\dimen@
+    \fi
+%    \end{macrocode}
+%    Reuse support, dvipdfm just remember the image. The requested
+%    sizes, clipping, \dots do not matter. In case of dvipdfmx
+%    we also must remember the natural size.
+%    \begin{macrocode}
+    \edef\@bmpsize@temp{@IMG@\@bmpsize@pdfescapestring{#1}}%
+    \@ifundefined{\@bmpsize@temp}{%
+      \global\advance\@bmpsize@count\@ne
+%<*dvipdfm>
+      \expandafter\xdef\csname\@bmpsize@temp\endcsname{%
+        \the\@bmpsize@count
+      }%
+%</dvipdfm>
+%<*dvipdfmx>
+      \expandafter\ifx\csname bmpsize@pixelwidth\endcsname\relax
+      \else
+        \expandafter\xdef\csname\@bmpsize@temp\endcsname{%
+          \the\@bmpsize@count:\bmpsize@width:\bmpsize@height
+        }%
+      \fi
+%</dvipdfmx>
+      \special{%
+        pdf:image @IMG\the\@bmpsize@count\space
+        width \the\Gin@req@width\space
+        height \the\Gin@req@height\space
+        depth 0pt (\@bmpsize@pdfescapestring{#1})%
+      }%
+    }{%
+%<*dvipdfm>
+      \special{%
+        pdf:bt %
+        xscale \strip@pt\dimexpr
+          \bmpsize@dvipdfm@factor\Gin@req@width\relax\space
+        yscale \strip@pt\dimexpr
+          \bmpsize@dvipdfm@factor\Gin@req@height\relax
+      }%
+      \special{pdf:uxobj @IMG\csname\@bmpsize@temp\endcsname}%
+      \special{pdf:et}%
+%</dvipdfm>
+%<*dvipdfmx>
+      \expandafter\expandafter\expandafter\@bmpsize@extract
+          \csname\@bmpsize@temp\endcsname\@nil
+      \edef\@bmpsize@xscale{\strip@pt\Gin@req@width}%
+      \edef\@bmpsize@temp{\strip@pt\dimexpr\@bmpsize@width bp}%
+      \@bmpsize@div\@bmpsize@xscale\@bmpsize@xscale\@bmpsize@temp
+      \edef\@bmpsize@yscale{\strip@pt\Gin@req@height}%
+      \edef\@bmpsize@temp{\strip@pt\dimexpr\@bmpsize@height bp}%
+      \@bmpsize@div\@bmpsize@yscale\@bmpsize@yscale\@bmpsize@temp
+      \special{%
+        pdf:bt %
+        xscale \@bmpsize@xscale\space
+        yscale \@bmpsize@yscale
+      }%
+      \special{pdf:uxobj @IMG\@bmpsize@imgnum}%
+      \special{pdf:et}%
+%</dvipdfmx>
+    }%
+    \ifdim\dimen@=\z@
+    \else
+        \vss
+      \egroup
+    \fi
+    \hss
+  }%
+  \ifGin@clip
+    \special{pdf:exobj}%
+    \special{pdf:uxobj \@bmpsize@clip@name}%
+  \fi
+}
+%    \end{macrocode}
+%    \begin{macrocode}
+%<*dvipdfmx>
+\def\@bmpsize@extract#1:#2:#3\@nil{%
+  \def\@bmpsize@imgnum{#1}%
+  \def\@bmpsize@width{#2}%
+  \def\@bmpsize@height{#3}%
+}
+%</dvipdfmx>
+%    \end{macrocode}
+%    \end{macro}
+%    \begin{macrocode}
+\@bmpsize@driver@catcodes
+%</dvipdfm|dvipdfmx>
+%    \end{macrocode}
+%
+% \subsection{Test program \xpackage{bmpsize-test.tex}}
+%
+%    \begin{macrocode}
+%<*test>
+\expandafter\ifx\csname NeedsTeXFormat\endcsname\relax
+  \input miniltx\relax
+\fi
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname pdfoutput\endcsname\relax
+\else
+  \pdfoutput=0 %
+\fi
+\RequirePackage{bmpsize}
+
+\endlinechar=-1
+\catcode`\@=11
+\def\msg#{\immediate\write16}
+
+\def\init{%
+  \msg{}%
+  \msg{File name menu}%
+  \msg{==============}%
+  \msg{* Option menu: use `opt' as file name}%
+  \msg{* Quit program: <return>}%
+  \msg{}%
+  \message{Image file name = }%
+  \read-1 to \imagename
+  \ifx\imagename\@empty
+    \expandafter\@firstoftwo
+  \else
+    \expandafter\@secondoftwo
+  \fi
+  {%
+    \csname @@end\endcsname
+    \end
+  }{%
+    \ifnum\pdf@strcmp{\imagename}{opt}=\z@
+      \expandafter\optionmenu
+    \else
+      \startimg
+      \expandafter\init
+    \fi
+  }%
+}
+\def\optionmenu{%
+  \msg{}%
+  \msg{Option menu}%
+  \msg{===========}%
+  \msg{Current setting:}%
+  \msg{* bmpsizefast = \if@bmpsize@fast true\else false\fi}%
+  \msg{* \if@bmpsize@user@resolution\else default\fi resolution = %
+    \bmpsize@pixelx@default
+    \space
+    \bmpsize@pixely@default
+  }%
+  \msg{* \if@bmpsize@user@resolution default\fi resolution: not set}%
+  \msg{* resolutionunit = \bmpsize@unit@default}%
+  \msg{* Quit option menu: <return>}%
+  \msg{}%
+  \message{Options = }%
+  \read-1 to \options
+  \ifx\options\empty
+    \expandafter\init
+  \else
+    \edef\@bmpsize@temp{%
+      \noexpand\setkeys{Gin}{\options}%
+    }%
+    \@bmpsize@temp
+    \expandafter\optionmenu
+  \fi
+}
+
+\def\startimg{%
+  \let\@found\@empty
+  \msg{}%
+  \msg{* File [\imagename]}%
+  \@for\@type:=\bmpsize@types\do{%
+    \ifx\@found\@empty
+      \csname bmpsize@read@\@type\endcsname\imagename
+      \ifbmpsize@ok
+        \let\@found\@type
+        \msg{\space\space Type: \@type}%
+        \msg{\space\space Pixel width: \bmpsize@pixelwidth\space px}%
+        \msg{\space\space Pixel height: \bmpsize@pixelheight\space px}%
+        \ifx\bmpsize@pixelx\relax
+        \else
+          \ifx\bmpsize@unit\relax
+            \let\@unit@spec\@empty
+            \def\@ratio@name{Ratio }%
+          \else
+            \def\@unit@spec{\space dots per \bmpsize@unit}%
+            \def\@ratio@name{Density }%
+          \fi
+          \msg{\space\space \@ratio@name x: \bmpsize@pixelx\@unit@spec}%
+          \msg{\space\space \@ratio@name y: \bmpsize@pixely\@unit@spec}%
+        \fi
+        \msg{\space\space Width: \bmpsize@width\space bp}%
+        \msg{\space\space Height: \bmpsize@height\space bp}%
+        \ifx\bmpsize@orientation\relax
+        \else
+          \msg{\space\space Orientation: \bmpsize@orientation}%
+        \fi
+      \fi
+    \fi
+  }%
+  \ifx\@found\@empty
+    \edef\@file@date{\pdf@filemoddate{\imagename}}%
+    \ifx\@file@date\@empty
+      \msg{\space\space --> File not found <--}%
+    \else
+      \msg{\space\space --> Unknown image type <--}%
+    \fi
+  \fi
+}
+
+\ifx\noinit!\else\expandafter\init\fi
+%</test>
+%    \end{macrocode}
+%
+%
+% \section{Installation}
+%
+% \subsection{Download}
+%
+% \paragraph{Package.} This package is available on
+% CTAN\footnote{\url{http://ctan.org/pkg/bmpsize}}:
+% \begin{description}
+% \item[\CTAN{macros/latex/contrib/oberdiek/bmpsize.dtx}] The source file.
+% \item[\CTAN{macros/latex/contrib/oberdiek/bmpsize.pdf}] Documentation.
+% \end{description}
+%
+%
+% \paragraph{Bundle.} All the packages of the bundle `oberdiek'
+% are also available in a TDS compliant ZIP archive. There
+% the packages are already unpacked and the documentation files
+% are generated. The files and directories obey the TDS standard.
+% \begin{description}
+% \item[\CTAN{install/macros/latex/contrib/oberdiek.tds.zip}]
+% \end{description}
+% \emph{TDS} refers to the standard ``A Directory Structure
+% for \TeX\ Files'' (\CTAN{tds/tds.pdf}). Directories
+% with \xfile{texmf} in their name are usually organized this way.
+%
+% \subsection{Bundle installation}
+%
+% \paragraph{Unpacking.} Unpack the \xfile{oberdiek.tds.zip} in the
+% TDS tree (also known as \xfile{texmf} tree) of your choice.
+% Example (linux):
+% \begin{quote}
+%   |unzip oberdiek.tds.zip -d ~/texmf|
+% \end{quote}
+%
+% \paragraph{Script installation.}
+% Check the directory \xfile{TDS:scripts/oberdiek/} for
+% scripts that need further installation steps.
+% Package \xpackage{attachfile2} comes with the Perl script
+% \xfile{pdfatfi.pl} that should be installed in such a way
+% that it can be called as \texttt{pdfatfi}.
+% Example (linux):
+% \begin{quote}
+%   |chmod +x scripts/oberdiek/pdfatfi.pl|\\
+%   |cp scripts/oberdiek/pdfatfi.pl /usr/local/bin/|
+% \end{quote}
+%
+% \subsection{Package installation}
+%
+% \paragraph{Unpacking.} The \xfile{.dtx} file is a self-extracting
+% \docstrip\ archive. The files are extracted by running the
+% \xfile{.dtx} through \plainTeX:
+% \begin{quote}
+%   \verb|tex bmpsize.dtx|
+% \end{quote}
+%
+% \paragraph{TDS.} Now the different files must be moved into
+% the different directories in your installation TDS tree
+% (also known as \xfile{texmf} tree):
+% \begin{quote}
+% \def\t{^^A
+% \begin{tabular}{@{}>{\ttfamily}l@{ $\rightarrow$ }>{\ttfamily}l@{}}
+%   bmpsize.sty & tex/latex/oberdiek/bmpsize.sty\\
+%   bmpsize-base.sty & tex/latex/oberdiek/bmpsize-base.sty\\
+%   bmpsize-test.tex & tex/latex/oberdiek/bmpsize-test.tex\\
+%   bmpsize-dvips.def & tex/latex/oberdiek/bmpsize-dvips.def\\
+%   bmpsize-dvipdfm.def & tex/latex/oberdiek/bmpsize-dvipdfm.def\\
+%   bmpsize-dvipdfmx.def & tex/latex/oberdiek/bmpsize-dvipdfmx.def\\
+%   bmpsize.pdf & doc/latex/oberdiek/bmpsize.pdf\\
+%   bmpsize.dtx & source/latex/oberdiek/bmpsize.dtx\\
+% \end{tabular}^^A
+% }^^A
+% \sbox0{\t}^^A
+% \ifdim\wd0>\linewidth
+%   \begingroup
+%     \advance\linewidth by\leftmargin
+%     \advance\linewidth by\rightmargin
+%   \edef\x{\endgroup
+%     \def\noexpand\lw{\the\linewidth}^^A
+%   }\x
+%   \def\lwbox{^^A
+%     \leavevmode
+%     \hbox to \linewidth{^^A
+%       \kern-\leftmargin\relax
+%       \hss
+%       \usebox0
+%       \hss
+%       \kern-\rightmargin\relax
+%     }^^A
+%   }^^A
+%   \ifdim\wd0>\lw
+%     \sbox0{\small\t}^^A
+%     \ifdim\wd0>\linewidth
+%       \ifdim\wd0>\lw
+%         \sbox0{\footnotesize\t}^^A
+%         \ifdim\wd0>\linewidth
+%           \ifdim\wd0>\lw
+%             \sbox0{\scriptsize\t}^^A
+%             \ifdim\wd0>\linewidth
+%               \ifdim\wd0>\lw
+%                 \sbox0{\tiny\t}^^A
+%                 \ifdim\wd0>\linewidth
+%                   \lwbox
+%                 \else
+%                   \usebox0
+%                 \fi
+%               \else
+%                 \lwbox
+%               \fi
+%             \else
+%               \usebox0
+%             \fi
+%           \else
+%             \lwbox
+%           \fi
+%         \else
+%           \usebox0
+%         \fi
+%       \else
+%         \lwbox
+%       \fi
+%     \else
+%       \usebox0
+%     \fi
+%   \else
+%     \lwbox
+%   \fi
+% \else
+%   \usebox0
+% \fi
+% \end{quote}
+% If you have a \xfile{docstrip.cfg} that configures and enables \docstrip's
+% TDS installing feature, then some files can already be in the right
+% place, see the documentation of \docstrip.
+%
+% \subsection{Refresh file name databases}
+%
+% If your \TeX~distribution
+% (\teTeX, \mikTeX, \dots) relies on file name databases, you must refresh
+% these. For example, \teTeX\ users run \verb|texhash| or
+% \verb|mktexlsr|.
+%
+% \subsection{Some details for the interested}
+%
+% \paragraph{Attached source.}
+%
+% The PDF documentation on CTAN also includes the
+% \xfile{.dtx} source file. It can be extracted by
+% AcrobatReader 6 or higher. Another option is \textsf{pdftk},
+% e.g. unpack the file into the current directory:
+% \begin{quote}
+%   \verb|pdftk bmpsize.pdf unpack_files output .|
+% \end{quote}
+%
+% \paragraph{Unpacking with \LaTeX.}
+% The \xfile{.dtx} chooses its action depending on the format:
+% \begin{description}
+% \item[\plainTeX:] Run \docstrip\ and extract the files.
+% \item[\LaTeX:] Generate the documentation.
+% \end{description}
+% If you insist on using \LaTeX\ for \docstrip\ (really,
+% \docstrip\ does not need \LaTeX), then inform the autodetect routine
+% about your intention:
+% \begin{quote}
+%   \verb|latex \let\install=y\input{bmpsize.dtx}|
+% \end{quote}
+% Do not forget to quote the argument according to the demands
+% of your shell.
+%
+% \paragraph{Generating the documentation.}
+% You can use both the \xfile{.dtx} or the \xfile{.drv} to generate
+% the documentation. The process can be configured by the
+% configuration file \xfile{ltxdoc.cfg}. For instance, put this
+% line into this file, if you want to have A4 as paper format:
+% \begin{quote}
+%   \verb|\PassOptionsToClass{a4paper}{article}|
+% \end{quote}
+% An example follows how to generate the
+% documentation with pdf\LaTeX:
+% \begin{quote}
+%\begin{verbatim}
+%pdflatex bmpsize.dtx
+%makeindex -s gind.ist bmpsize.idx
+%pdflatex bmpsize.dtx
+%makeindex -s gind.ist bmpsize.idx
+%pdflatex bmpsize.dtx
+%\end{verbatim}
+% \end{quote}
+%
+% \section{Catalogue}
+%
+% The following XML file can be used as source for the
+% \href{http://mirror.ctan.org/help/Catalogue/catalogue.html}{\TeX\ Catalogue}.
+% The elements \texttt{caption} and \texttt{description} are imported
+% from the original XML file from the Catalogue.
+% The name of the XML file in the Catalogue is \xfile{bmpsize.xml}.
+%    \begin{macrocode}
+%<*catalogue>
+<?xml version='1.0' encoding='us-ascii'?>
+<!DOCTYPE entry SYSTEM 'catalogue.dtd'>
+<entry datestamp='$Date$' modifier='$Author$' id='bmpsize'>
+  <name>bmpsize</name>
+  <caption>Extract size and resolution data from bitmap files.</caption>
+  <authorref id='auth:oberdiek'/>
+  <copyright owner='Heiko Oberdiek' year='2006-2009'/>
+  <license type='lppl1.3'/>
+  <version number='1.7'/>
+  <description>
+    This package analyzes bitmap images to extract size and resolution
+    data.  It adds this feature to the graphics package so it is no
+    longer necessary to provide a separate bounding box files for
+    bitmap images.  dditionally the implementation for the inclusion
+    of bitmap images in some drivers of package
+    <xref refid='graphicx'>graphicx</xref> are rewritten to support
+    options viewport, trim and clip.  The package requires
+    <xref refid='pdftex'>pdfTeX</xref> version 1.30.0 or later (the
+    relevant pdfTeX primitive operates in both DVI and PDF output
+    modes).
+    <p/>
+    The package is part of the <xref refid='oberdiek'>oberdiek</xref>
+    bundle.
+  </description>
+  <documentation details='Package documentation'
+      href='ctan:/macros/latex/contrib/oberdiek/bmpsize.pdf'/>
+  <ctan file='true' path='/macros/latex/contrib/oberdiek/bmpsize.dtx'/>
+  <miktex location='oberdiek'/>
+  <texlive location='oberdiek'/>
+  <install path='/macros/latex/contrib/oberdiek/oberdiek.tds.zip'/>
+</entry>
+%</catalogue>
+%    \end{macrocode}
+%
+% \begin{thebibliography}{9}
+% \bibitem{grfguide}
+%   D.\,P.\,Carlisle, The \LaTeX\ Project:
+%   \textit{Packages in the `graphics' bundle},
+%   2005/11/14;
+%   \CTAN{macros/latex/required/graphics/grfguide.pdf}.
+%
+% \subsection{URLs for bitmap format descriptions}
+%
+% \subsubsection{JPEG}
+% \begin{itemize}
+% \item \url{http://www.w3.org/Graphics/JPEG/jfif3.pdf}
+% \item \url{http://exif.org/Exif2-2.PDF}
+% \end{itemize}
+%
+% \subsubsection{PNG}
+% \begin{itemize}
+% \item \url{http://en.wikipedia.org/wiki/PNG}
+% \item \url{http://www.w3.org/TR/PNG/}
+% \end{itemize}
+%
+% \subsubsection{GIF}
+% \begin{itemize}
+% \item \url{http://www.w3.org/Graphics/GIF/spec-gif89a.txt}
+% \end{itemize}
+%
+% \subsubsection{BMP}
+% \begin{itemize}
+% \item \url{http://en.wikipedia.org/wiki/Windows_bitmap}
+% \item \url{http://de.wikipedia.org/wiki/Windows_bitmap}
+% \item \url{http://msdn.microsoft.com/en-us/library/ms532311.aspx}
+% \item \url{http://msdn.microsoft.com/en-us/library/ms532321.aspx}
+% \end{itemize}
+%
+% \subsubsection{PCX}
+% \begin{itemize}
+% \item \url{http://en.wikipedia.org/wiki/PCX}
+% \item \url{http://de.wikipedia.org/wiki/PCX}
+% \item \url{http://www.qzx.com/pc-gpe/pcx.txt}
+% \end{itemize}
+%
+% \subsubsection{MSP}
+% \begin{itemize}
+% \item \url{http://en.wikipedia.org/wiki/Microsoft_Paint}
+% \item Sources of \xpackage{dvips}.
+% \end{itemize}
+%
+% \subsubsection{TIFF}
+% \begin{itemize}
+% \item \url{http://en.wikipedia.org/wiki/TIFF}
+% \item \url{http://partners.adobe.com/public/developer/en/tiff/TIFF6.pdf}
+% \end{itemize}
+%
+% \subsubsection{TGA}
+% \begin{itemize}
+% \item \url{http://de.wikipedia.org/wiki/Targa_Image_File}
+% \item \url{http://en.wikipedia.org/wiki/Truevision_TGA}
+% \item \url{http://www.dca.fee.unicamp.br/~martino/disciplinas/ea978/tgaffs.pdf}
+% \end{itemize}
+%
+% \subsubsection{SGI}
+% \begin{itemize}
+% \item \url{http://en.wikipedia.org/wiki/Silicon_Graphics_Image}
+% \item \url{ftp://ftp.sgi.com/graphics/SGIIMAGESPEC}
+% \end{itemize}
+%
+% \subsubsection{WMF}
+% \begin{itemize}
+% \item \url{http://www.fileformat.info/format/wmf/}
+% \end{itemize}
+%
+% \subsubsection{XPM}
+% \begin{itemize}
+% \item \url{http://en.wikipedia.org/wiki/XPM_%28image_format%29}
+% \item \url{http://de.wikipedia.org/wiki/Xpm}
+% \item \url{http://koala.ilog.fr/ftp/pub/xpm/xpm-README.html}
+% \end{itemize}
+%
+% \end{thebibliography}
+%
+% \begin{History}
+%   \begin{Version}{2006/08/24 v1.0}
+%   \item
+%     First version.
+%   \end{Version}
+%   \begin{Version}{2007/02/18 v1.1}
+%   \item
+%     1in replaced by 72.27pt, because TeX is inaccurate if 1in is given.
+%   \end{Version}
+%   \begin{Version}{2007/04/11 v1.2}
+%   \item
+%     Line ends sanitized.
+%   \end{Version}
+%   \begin{Version}{2007/05/01 v1.3}
+%   \item
+%     Uses package \xpackage{infwarerr}.
+%   \item
+%     Image reuse algorithm fixed for dvipdfmx.
+%   \item
+%     Some support for Exif's orientation tag.
+%   \end{Version}
+%   \begin{Version}{2007/11/11 v1.4}
+%   \item
+%     Use of package \xpackage{pdftexcmds} for \LuaTeX\ support.
+%   \item
+%     Fix of bug of package \xpackage{keyval}: \cs{KV@err} and \cs{KV@errx}
+%     are used, but undefined if loaded by \plainTeX.
+%   \end{Version}
+%   \begin{Version}{2008/08/11 v1.5}
+%   \item
+%     Code is not changed.
+%   \item
+%     Update of URLs.
+%   \end{Version}
+%   \begin{Version}{2009/09/04 v1.6}
+%   \item
+%     Fixes for reusing objects with dvipdfmx-20090708.
+%     Older versions of dvipdfmx are no longer supported.
+%   \end{Version}
+%   \begin{Version}{2016/05/16 v1.7}
+%   \item
+%     Documentation updates.
+%   \end{Version}
+% \end{History}
+%
+% \PrintIndex
+%
+% \Finale
+\endinput
-- 
cgit v1.2.3

