.PS
# Shadow.m4
gen_init
NeedDpicTools
s_init(HSV)

divert(-1)
                               `shadowellipse(options,text)
                                Draws a shadowed ellipse
                                with gradient from white at the top to
                                hsv-specified color at the bottom
                                Default is uniform lightgray shade
                                Arg 2 is a text label written at the center'
define(`shadowellipse',`[ Orig: Here
 m4shadow_keys(`$1')
 [
   ellipse wid m4wid ht m4ht invis shaded m4shadow ] wid 0 ht 0 \
     at (m4shadowthick+m4thick bp__/2,-(m4shadowthick+m4thick bp__/2))
#    at ((m4shadowthick)/2,-(m4shadowthick)/2)
ifelse(m4hue,,,`
 define pElBshade { v = m4ht*($`'1)
   if v < m4rad then { h = (m4wid/2-m4rad)+sqrt(m4rad^2-(m4rad-v)^2) } \
   else { if v < m4ht-m4rad then { h = m4wid/2 } \
   else { h = (m4wid/2-m4rad)+sqrt(m4rad^2-(m4rad-(m4ht-v))^2) } }
   line from (-h,v) to (h,v) thick m4thick outlined rgbstring($`'2,$`'3,$`'4)
   }
 nsteps = rnd(m4ht/(m4thick bp__)*1.1)
 hsvtorgb(m4hue,m4sat,m4val,r,g,b)
 ShadeObject(pElBshade,nsteps,
   0,   r, g, b,
   1,   1, 1, 1) with .c at Orig ')
  Ellipse: ellipse ht m4ht wid m4wid thick m4thick outline m4outlined \
   at Orig ifelse(m4hue,,shaded m4shaded)
  ifelse(`$2',,,`m4lstring(`$2',"`$2'") at Ellipse')
 `$3']')
                               `shadowbox(options,text) Draws a shadowed box
                                with gradient from white at the top to
                                hsv-specified color at the bottom
                                Default is uniform lightgray shade
                                Arg 2 is a text label written at the center'
define(`shadowbox',`[ Orig: Here
 m4shadow_keys(`$1')
 [
   box invis rad m4rad ht m4ht wid m4wid shaded m4shadow ] wid 0 ht 0 \
     at (m4shadowthick+m4thick bp__/2,-(m4shadowthick+m4thick bp__/2))
#  box rad m4rad+m4thick bp__/2+m4shadowthick/2 ht m4ht wid m4wid \
#    thick m4shadowthick/(1bp__) outlined m4shadow ] wid 0 ht 0 \
#    at ((m4shadowthick+m4thick bp__)/2,-(m4shadowthick+m4thick bp__)/2)
ifelse(m4hue,,,`
 define pBxBshade { v = m4ht*($`'1)
   if v < m4rad then { h = (m4wid/2-m4rad)+sqrt(m4rad^2-(m4rad-v)^2) } \
   else { if v < m4ht-m4rad then { h = m4wid/2 } \
   else { h = (m4wid/2-m4rad)+sqrt(m4rad^2-(m4rad-(m4ht-v))^2) } }
   line from (-h,v) to (h,v) thick m4thick outlined rgbstring($`'2,$`'3,$`'4)
   }
 nsteps = rnd(m4ht/(m4thick bp__)*1.1)
 hsvtorgb(m4hue,m4sat,m4val,r,g,b)
 ShadeObject(pBxBshade,nsteps,
   0,   r, g, b,
   1,   1, 1, 1) with .c at Orig ')
  Box: box rad m4rad ht m4ht wid m4wid thick m4thick outline m4outlined \
   at Orig ifelse(m4hue,,shaded m4shaded)
  ifelse(`$2',,,`m4lstring(`$2',"`$2'") at Box')
 `$3']')
define(`m4shadow_keys',
# Box size parameters
`setkey_(`$1',ht,boxht)dnl
 setkey_(`$1',wid,boxwid)dnl
 setkey_(`$1',rad,boxht/8)dnl
 setkey_(`$1',thick,linethick)dnl
# Shadow thickness
 setkey_(`$1',shadowthick,2*lthick)dnl
# HSV color for gradient shading
 setkey_(`$1',hue)dnl Default is blank for a shade fill;
 setkey_(`$1',sat,1)dnl
 setkey_(`$1',val,1)dnl
# Named colors
 setkey_(`$1',shaded,"lightgray",N)dnl
 setkey_(`$1',outlined,"gray",N)dnl
 setkey_(`$1',shadow,"lightgray",N)dnl
')

divert(0)dnl

w = 0.3
boxwid = w
dh = 30
# Hue from 0 to 360
T:[ for i=0 to 361 by dh do { shadowbox(hue=i) } ]
  { s_box(hue=0) at T.w rjust; s_box(hue=360) at T.e ljust }
  { for i=0 to 361 by dh do { s_box("%g",i) at T.nw+(w/2+i/dh*w,0) above } }
  { s_box(hue) at T.n+(0,12bp__) above }

# Hue from 0 to 360; sat=0.5; val=0.5
Ta:[ for i=0 to 361 by dh do { shadowbox(hue=i;sat=0.5;val=0.5) } ] \
   with .nw at last [].sw
  { s_box(`\shortstack[r]{sat=0.5\\val=0.5}') at Ta.w rjust }

# Hue = 0; sat=0 to 1
U:[ for i=0 to 361 by dh do { shadowbox(hue=0;sat=i/360) } ] \
   with .nw at last [].sw
  { s_box(`\shortstack[r]{hue=0\\sat=0}') at U.w rjust
    s_box(sat=1) at U.e ljust }

# Hue = 0; val=0 to 1
V:[ for i=0 to 361 by dh do { shadowbox(hue=0;val=i/360) } ] \
   with .nw at last [].sw
  { s_box(`\shortstack[r]{hue=0\\val=0}') at V.w rjust
    s_box(val=1) at V.e ljust }

# Miscellaneous
W:[
   shadowbox
   DefineRGBColor(verylight,0.95,0.95,0.95); shadowbox(shaded=verylight)
   shadowbox(hue=0;val=0)
   DefineHSVColor(cx,110,0.5,0.5); shadowbox(shaded=cx)
   shadowbox(shaded="yellow")
   DefineHSVColor(lx,120,0.4,0.5); shadowbox(hue=120;sat=0.3;val=0.2;shadow=lx)
 ] with .nw at last [].sw

ellipsewid = w
#linethick = 5
X:[
   shadowellipse(shadowthick=lthick)
   ellipse thick 5
   ellipse thick 5 shaded "gray"
 ] with .nw at last [].sw+(0,-0.1)

.PE