Article View: comp.lang.postscript
Article #1868Splash your graphics will metal-looking objects (example given)
From: Jonathan Monsarrat
Date: Sat, 05 Sep 1992 06:41
Date: Sat, 05 Sep 1992 06:41
134 lines
4849 bytes
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!jgmShow 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