RFC 401 UNKNOWN GRAPHICS · ARITHMETIC

Conversion of NGP-0 Coordinates to Device Specific Coordinates

An integer method for mapping NGP-0 fractions to device screen coordinates.

On rfc-editor.org ↗
PUBLISHED
October 1972
AUTHORS
J. Hansen
STREAM
Legacy
BUILDS ON
RFC 387 — Some experiences in implementing Network Graphics Protocol Level 0
INITIAL NGP IMPLEMENTATION
N=15
TYPICAL SCALE FACTOR
M/2
INTEGER CONVERSION STEPS
4
DOI
10.17487/RFC0401

RFC text

Original text · RFC Editor View on rfc-editor.org ↗
Network Working Group                                 Jim Hansen
Request for Comment #401                              Center for Advanced
NIC #11923                                              Computation
Category:  D.6                                        University of Illinois
Updates:  RFC #387                                    October 23, 1972
Obsoletes: None


               Conversion of NGP-0 Coordinates to Device
               -----------------------------------------
                          Specific Coordinates
                          --------------------

Conversion of NGP-0 coordinates to floating point PDP-10 coordinates
was discussed in RFC #387.  In general, however, it is undesirable to
convert NGP coordinates to floating point coordinates because real
devices require integer addressing.  To this end, a means is described
to convert NGP coordi- nates to integer coordinates in the range zero
to M, where M is the maximum address of the device screen on a machine
using 2's complement arithmetic.  It would not, however, be difficult
to modify this algorithm to operate on machines using one's complement
or sign-magnitude arithmetic.

First consider the NGP coordinate format:

                   +--+-----------+
                   |  |   n       |
                   +--+-----------+
                    s ^  FRACTION
                    i
                    g
                    n

Where the sign occupies the most significant bit of the coordinate
followed by bits of numerical information (initial implementation of
NGP requires N=15).  Negative numbers are represented by 2's
complement.  Conversion to device coordinates is accomplished by:

                    D = S * f + S

Where D =>integer device coordinate
      S =>scaling factor (typically M/2)
      f =>NGP fractional coordinate

Let us rewrite this as:

                            n     n
                    D = S*(2 *f)/2 +S

Now factor S into two terms:

                            I
                    S= Q * 2

Where Q is an odd integer and I is an integer.

When:                        I   n     n
                    D = Q * 2 *(2 *f)/2  +S

                             I-n   n
                      = Q * 2   *(2 *f)  +S
             n
The factor (2 *f) is represented in 2's complement form simply by
extending the sign bit of f into the upper portion of the computer
word, If Q = 1 (as it would be with many devices), it can be ignored.
If Q >< 1, we may console ourselves that an integer multiply is faster
on most machines than a floating point multiply.  In fact, on a
PDP-10, this multiply can usually be performed with no access to
memory since Q is usually small.

                          I-n
We are now left with the 2    factor.  This can be accomplished with an
arithmetic shift left by (I-n) or an arithmetic shift right by (n-I)
as is appropriate.  The offset factor, S, may now be added using an
integer add.

The procedure for converting NGP coordinates to integer device
coordinates is then:

               1.   move coordinate to a register and extend sign
               2.   integer multiply by Q (if necessary)
               3.   arithmetic shift left by (I-n)
               4.   integer add S


This procedure would generally be much faster than:

               1.   move coordinate to register and extend sign
               2.   float fractional coordinate
               3.   floating point multiply
               4.   floating point add
               5.   conversion to fixed point

       [ This RFC was put into machine readable form for entry ]
       [ into the online RFC archives by BBN Corp. under the   ]
       [ direction of Alex McKenzie.                      1/97 ]

ISO Plain Language

On this page
PROBLEMReal display devices use integer addresses, while NGP-0 coordinates are fractional values.
MECHANISMThe RFC describes sign extension, an optional integer multiply, an arithmetic shift and an offset addition to compute a device coordinate.
WHY THE METHOD MATTERSThe author says this integer procedure is generally faster than floating-point conversion and updates RFC 387.

§1From Graphics Fraction to Screen Address

RFC 387 discussed converting NGP-0 coordinates to floating-point PDP-10 coordinates. RFC 401 says floating-point conversion is generally undesirable because actual devices require integer addresses.

The method maps a coordinate to an integer from zero to M, the maximum address of the device screen. The described version assumes a machine using two's-complement arithmetic.

The drawing protocol uses fractional positions, but a display needs whole-number addresses. This note describes how to turn one into the other.

§2Coordinate Format and Scaling

An NGP coordinate has a sign in its most significant bit followed by n bits of fractional information. The initial NGP implementation requires N=15, and negative numbers use two's-complement representation.

The RFC gives the conversion as D = S * f + S, where D is the integer device coordinate, S is a scaling factor, typically M/2, and f is the NGP fractional coordinate.

The coordinate stores a signed fraction. Scaling it and adding an offset maps the fraction into the display's integer coordinate range.

§3Integer Conversion Steps

The RFC factors S as Q * 2^I, where Q is odd and I is an integer. The coordinate is sign-extended, multiplied by Q if necessary, shifted by I-n bits in the appropriate direction, and then offset by adding S.

  1. Move the coordinate to a register and extend its sign.
  2. Multiply by Q if necessary.
  3. Shift arithmetically by I-n.
  4. Add S.

The procedure preserves the sign, optionally multiplies by Q, shifts the value and adds the screen offset. If Q is 1, the multiply can be skipped.

§4Comparison with Floating Point

The alternative procedure floats the fraction, multiplies and adds in floating point, then converts the result to fixed point. The RFC says the integer procedure would generally be much faster.

It adds that integer multiplication is faster on most machines and that a PDP-10 can usually perform the multiply without memory access when Q is small.

The author compares the integer steps with floating-point operations followed by conversion. The RFC says the integer method is generally faster.

§5References