trs80ify.frink

Download or view trs80ify.frink in plain text format



// This program takes an image and turns it into something that could display
// on a TRS-80 Model I,III,or 4.  128x48, black and white, baby.
//
// If passed an argument on the command-line, it will display the specified
// file or URL.

// You'll need the background image available at:
//
//   https://futureboy.us/frinksamp/trs80iiib.jpg
//
bg = new image["file:trs80iiib.jpg"]

if (length[ARGS] > 0)
   if (ARGS@0 =~ %r/^http/)
      i = new image[ARGS@0]
   else
      i = new image["file:" + ARGS@0]
else
   i = new image["https://futureboy.us/images/futureboydomethumb4.gif"]

w = i.getWidth[]
h = i.getHeight[]

pw = 128
ph = 48

xstep = w/pw
ystep = h/ph

ni = new image[pw,ph]

// Create a grayscale version of the image.
xx = 0
for x=0 to w-xstep step xstep
{
   yy = 0
   for y = 0 to h-ystep step ystep
   {
      [r,g,b,a] = i.averagePixels[x,y,x+xstep, y+ystep]
      gray = (r+g+b)/3
      ni.setPixel[xx,yy,gray,gray,gray,a]
      yy = yy + 1
   }
   xx = xx + 1
}

rerror = 0
gerror = 0
berror = 0
gr = new graphics
gr.draw[bg, -75, -65, 364, 275]
gr.backgroundColor[0,0,0]

// Floyd-Steinberg dither.
for x = 0 to pw-1
   for y = 0 to ph-1
   {
      [r,g,b,a] = ni.getPixel[x,y]
      gray = (r+g+b) / 3
      if gray > 1/2
      {
         c = 1
         gr.color[1,1,1,.7]
         gr.fillRectCenter[x,y*2,1,2]
      } else
         c = 0

      ni.setPixel[x,y,c,c,c,a]
      err = gray - c
      addError[ni, x+1, y, 7/16, err]
      addError[ni, x-1, y+1, 3/16, err]
      addError[ni, x, y+1, 5/16, err]
      addError[ni, x+1, y+1, 1/16, err]
   }

   
gr.show[]
   
// Adds the error term to an existing pixel.
addError[image, x, y, mult, err] :=
{
   if (x<0) || (y<0) || (x>=image.getWidth[]) || (y>=image.getHeight[])
      return
   
   [r,g,b,a] = image.getPixel[x,y]
   r = clamp[r+mult*err]
   g = clamp[g+mult*err]
   b = clamp[b+mult*err]
   image.setPixel[x,y,r,g,b,a]
}

clamp[v, min=0, max=1] :=
{
   if v < min
      min
   else
      if v > max
         max
      else
         v
}


Download or view trs80ify.frink in plain text format


This is a program written in the programming language Frink.
For more information, view the Frink Documentation or see More Sample Frink Programs.

Alan Eliasen was born 19966 days, 15 hours, 9 minutes ago.