🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: comp.lang.postscript
Article #1868

Splash your graphics will metal-looking objects (example given)

#1868
From: Jonathan Monsarrat
Date: Sat, 05 Sep 1992 06:41
134 lines
4849 bytes
Hi! This is Jonathan Monsarrat again from Brown University.

As you can see, I have a lot of free time on my hands! I love hacking
PostScript.

Here's an example of how you can get any arbitrary path to be filled
in such a manner that it looks like metal. This example happens to
be centered around printing words as metal. Hope you like it.

-Jon

P.S. another short PS hack
%! Obfuscated PostScript !% /exch{cvx}def /dup /def load def setfont 10 scale
/q{dup 0 1 getinterval cvn exch cvx def}def(dup)q(scale)q(moveto)q(translate)q
(closepath)q(exec)q(rotate)q{90 r{220 25 m 0 d 220 12 172 arc c}cvx d e -1 d s
e 270 0 m 0 d 270 360 0 arcn c gsave fill grestore 0 setgray stroke}cvx 45 r
462 36 t .5 d s d e 1 setgray 2 d s d e 80 0 t .08 d s e 8 d s -90 r -190 -30 m
/Helvetica-Bold findfont 90 scalefont setfont(NO     NO-NOs) show showpage

--------------------------------------------------------------

%!PS-Adobe1.0
%%Title: metal
%%Pages:1
%%BeginProcSet:TextProcs 1.0 0
% This file demonstrates drawing metallic-looking strings. It could be
% generalized to any path. You may not be able to use this routine with Adobe
% locked fonts. If you have problems use the GNU equivalent fonts.
% 
% The basic idea is that something will look metal if there are linear
% streaks across it common to any reflective surface.
%
% The following are the rules used to generate the metal letters.
% 1. The charpath is broken into 3 sections: outline, edge, and body.
% 2. Draw the outline first in black.
% 3. Define the body as exactly one delta "in" from every edge. Don't overlap
%    deltas for very small holes! Shade the body in horizontal stripes
%    from top to bottom according to the following relation.
% V = Current - Bottom / Top - Bottom 
% From V = 0 to 7/16 falls from .8 to 0 in a sine curve
% From V = 7/16 to 9/16 rises linearly from 0 to 1
% From V = 9/16 to 1 falls from 1 to .2 in a cosine curve
%
% NOTE: I didn't spend much time optomizing this. Volunteers?

%%%%%%%%%%   string height  TextMetalShow  -   %%%%%%%%%%%%%%
%%% Prints a metal-looking string at the current position just like "show"
%% It expects the string to be printed to be on the stack as well as
%% the height of the font currently being used. WARNING! In practice
%% the actual height of the letters is not the official size of the
%% font. For example, in my demo below I use 100pt type but have a height
%% of only 60pt.
/TextMetalShow
{
  4 dict begin  % If you don't know dictionaries, you should learn them.
    /height exch def
    dup length 1 sub 0 1 3 -1 roll
    {
      1 index exch 1 getinterval
      dup stringwidth pop /width exch def
      Pattern
      stringwidth pop 0 rmoveto
    } for
    pop
  end
} bind def

%%%%%%%%%%%%%%%%%%%%%  char Pattern - %%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Displays a single character as metal
%%% It's important to break the string up into individual letters because
%%% often when I do a "charpath" on a whole word, there isn't enough
%%% memory or something and the program dies. One letter at a time is safe.
/Pattern
{
  gsave
       currentpoint translate
       dup true charpath clip
  /delta 0.02 in def  % How fine should the grayscales be?
  /bot 0 def /top height 0.4375 mul def
  bot delta top
  {
    dup bot sub top bot sub div 55 mul 55 exch sub sin setgray
    newpath 0 exch moveto
    width 0 rlineto
    0 delta rlineto
    width neg 0 rlineto
    closepath fill
  } for

  /bot top def /top height 0.5625 mul def
  bot delta top
  {
    dup bot sub top bot sub div setgray
    0 exch moveto
    width 0 rlineto
    0 delta rlineto
    width neg 0 rlineto
    closepath fill
  } for
 
  /bot top def /top height def
  bot delta top
  {
    dup bot sub top bot sub div 78 mul cos setgray
    0 exch moveto
    width 0 rlineto
    0 delta rlineto
    width neg 0 rlineto
    closepath fill
  } for
    0 0 moveto
    dup
    true charpath
       gsave
            1 setgray
            5 setlinewidth
            stroke
       grestore
       stroke
  grestore
} bind def

%%EndProcSet
%%EndProlog
%%Page: one 1
/in {72 mul} def
/Times-Bold findfont 100 scalefont setfont
0.5 in 0.5 in moveto 7.5 in 0 rlineto 0 5 in rlineto -7.5 in 0 rlineto
  closepath 0.2 setgray fill

1.8 in 3.3 in moveto (METAL) 60 TextMetalShow
1 in 2 in moveto (HACKING) 60 TextMetalShow
showpage
%%Trailer
Technical Details
Message-ID: <1992Sep5.064148.4276@cs.brown.edu>
Path: arc1-ca.pugleaf.net!sparky!uunet!brunix!brunix!jgm

Show Full Headers
Complete Article Headers
Newsgroups: comp.lang.postscript
Path: arc1-ca.pugleaf.net!sparky!uunet!brunix!brunix!jgm
From: jgm@cs.brown.edu (Jonathan Monsarrat)
Subject: Splash your graphics will metal-looking objects (example given)
Message-ID: <1992Sep5.064148.4276@cs.brown.edu>
Sender: news@cs.brown.edu
Organization: Brown University Department of Computer Science
Date: Sat, 5 Sep 1992 06:41:48 GMT
Lines: 134