diff options
author | Joe Hunkeler <jhunkeler@gmail.com> | 2015-08-11 16:51:37 -0400 |
---|---|---|
committer | Joe Hunkeler <jhunkeler@gmail.com> | 2015-08-11 16:51:37 -0400 |
commit | 40e5a5811c6ffce9b0974e93cdd927cbcf60c157 (patch) | |
tree | 4464880c571602d54f6ae114729bf62a89518057 /pkg/images/tv/tvmark/mktext.x | |
download | iraf-osx-40e5a5811c6ffce9b0974e93cdd927cbcf60c157.tar.gz |
Repatch (from linux) of OSX IRAF
Diffstat (limited to 'pkg/images/tv/tvmark/mktext.x')
-rw-r--r-- | pkg/images/tv/tvmark/mktext.x | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/pkg/images/tv/tvmark/mktext.x b/pkg/images/tv/tvmark/mktext.x new file mode 100644 index 00000000..06a99b37 --- /dev/null +++ b/pkg/images/tv/tvmark/mktext.x @@ -0,0 +1,164 @@ +include <mach.h> +include <imhdr.h> + +define FONTWIDE 6 +define FONTHIGH 7 +define SZ_LOOKUP 128 +define SZ_FONT 455 +define SZ_PIXARY 5 + +# MK_TEXTIM -- Write a text string into an image using a pixel font for speed. +# Characters are made twice as big as the font by doubling in both axes. + +procedure mk_textim (im, s, x, y, xmag, ymag, value, center) + +pointer im # image to put the text in. +char s[ARB] # text to put in the image. +int x, y # x, y position in the image. +int xmag, ymag # x, y magnification values. +int value # value to use in image for text. +int center # center the string + +int numrow, numcol, numchars, fonthigh, fontwide, xinit, yinit +int i, l, ch, nchar, line, ip, pixary[SZ_PIXARY] +pointer lineget, lineput + +int strlen() +pointer imgl2s(), impl2s() +errchk imgl2s, impl2s + +begin + # Find the length of the string. + numchars = strlen (s) + if (numchars <= 0) + return + + # Calculate height and width of magnified font. + fonthigh = FONTHIGH * ymag + fontwide = FONTWIDE * xmag + + # Check for row/col out of bounds. + numcol= IM_LEN(im,1) + numrow = IM_LEN(im,2) + + # Compute the initial position of the string truncating characters + # is necessary. + if (center == YES) + xinit = x - fontwide * numchars / 2 + else + xinit = x + for (ip = 1; ip <= numchars; ip = ip + 1) { + if (xinit >= 1) + break + xinit = xinit + fontwide + } + + # Return if beginning of string is off image. + if (xinit < 1 || xinit > numcol) + return + + # Truncate the string. + if (xinit > numcol - fontwide * (numchars - ip + 1)) { + numchars = int ((numcol - xinit) / fontwide) + if (numchars <= 0) + return + } + + # Return if the text does not fit in the image. + if (center == YES) + yinit = y - fonthigh * numchars / 2 + else + yinit = y + if ((yinit <= 0) || (yinit > numrow - fonthigh)) + return + + # For each line of the text (backward). + for (i = 1; i <= 7; i = i + 1) { + + line = yinit + (i-1) * ymag + + do l = 1, ymag { + + # Get and put the line of the image. + lineput = impl2s (im, line+(l-1)) + lineget = imgl2s (im, line+(l-1)) + call amovs (Mems[lineget], Mems[lineput], numcol) + + # Put out the font. + do ch = ip, numchars { + nchar = int (s[ch]) + call mk_pixbit (nchar, 8 - i, pixary) + call mk_putpix (pixary, Mems[lineput], numcol, + xinit+(ch-1)*fontwide, value, xmag) + } + + } + } +end + + +# MK_PIXBIT -- Look up which bits should be set for this character on this line. + +procedure mk_pixbit (code, line, bitarray) + +int code # character we are writing +int line # line of the character we are writing +int bitarray[ARB] # bit-array to receive data + +int pix, i +short asciilook[SZ_LOOKUP], font[SZ_FONT] +int bitupk() + +include "pixelfont.inc" +include "asciilook.inc" + +begin + pix = font[asciilook[code+1]+line-1] + bitarray[5] = bitupk (pix, 1, 1) + bitarray[4] = bitupk (pix, 4, 1) + bitarray[3] = bitupk (pix, 7, 1) + bitarray[2] = bitupk (pix, 10, 1) + bitarray[1] = bitupk (pix, 13, 1) +end + + +# MK_PUTPIX -- Put one line of one character into the data array. + +procedure mk_putpix (pixary, array, size, position, value, xmag) + +int pixary[ARB] # array of pixels in character +int size, position # size of data array +short array[size] # data array in which to put character line +int value # value to use for character pixels +int xmag # x-magnification of text + +int i, k, x + +begin + do i = 1, 5 { + if (pixary[i] == 1) { + x = position + (i-1) * xmag + do k = 1, xmag + array[x+(k-1)] = value + } + } +end + + +# MK_TLIMITS -- Compute the column and line limits of a text string. + +procedure mk_tlimits (str, x, y, xmag, ymag, ncols, nlines, x1, x2, y1, y2) + +char str[ARB] # string to be written to the image +int x, y # starting position of the string +int xmag, ymag # magnification factor +int ncols, nlines # dimensions of the image +int x1, x2 # column limits +int y1, y2 # line limits + +begin + x1 = max (1, min (y, ncols)) + x2 = min (ncols, max (1, y + 5 * xmag)) + y1 = max (1, min (y, nlines)) + y2 = min (nlines, max (1, y + 6 * ymag)) +end |