#!/usr/bin/python

# shadow_image.py
#       --copyright--                   Copyright 2007 (C) Tranzoa, Co. All rights reserved.    Warranty: You're free and on your own here. This code is not necessarily up-to-date or of public quality.
#       --url--                         http://www.tranzoa.net/tzpython/
#       --email--                       pycode is the name to send to. tranzoa.com is the place to send to.
#       --bodstamps--
#       February 21, 2008       bar
#       May 17, 2008            bar     email adr
#       --eodstamps--
##      \file
#
#
#       Create images that look like shadows.
#
#       Here is how they can be used:
#
#           <TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0>
#
#           <TR>
#           <TD><img src="picture.jpg"></TD>
#           <TD WIDTH=10 BACKGROUND="xx_east.png" VALIGN="TOP"><img src="xx_ne.png" WIDTH=10 HEIGHT=10></TD>
#           </TR>
#
#           <TR HEIGHT=10>
#           <TD BACKGROUND="xx_south.png" ALIGN="LEFT"><img src="xx_sw.png" WIDTH=10 HEIGHT=10></TD>
#           <TD WIDTH=10  BACKGROUND="xx_se.png"></TD>
#           </TR>
#
#           </TABLE>
#
#
#
#

import  math
import  os

have_image_module       = False
try :
    import  Image
    have_image_module   = True
except ImportError :
    pass

import  replace_file



flatness    = 3.0


def make_v_image(size, fr = 0, tr = 255, fg = 0, tg = 255, fb = 0, tb = 255) :
    ii  = Image.new("RGB", [ size, size ], 0xffffff)

    for y in xrange(size) :
        m       = 1.0 / (1.0 + math.exp(((y * 2.0) / size - 1.0) * -flatness))

        r       = ((tr - fr) * m) + fr
        g       = ((tg - fg) * m) + fg
        b       = ((tb - fb) * m) + fb

        r       = min(255, max(0, int(r)))
        g       = min(255, max(0, int(g)))
        b       = min(255, max(0, int(b)))
        for x in xrange(size) :
            ii.putpixel( (x, y), (r, g, b) )
        pass

    return(ii)



def make_h_image(size, fr = 0, tr = 255, fg = 0, tg = 255, fb = 0, tb = 255) :
    ii  = Image.new("RGB", [ size, size ], 0xffffff)

    for x in xrange(size) :
        m       = 1.0 / (1.0 + math.exp(((x * 2.0) / size - 1.0) * -flatness))

        r       = ((tr - fr) * m) + fr
        g       = ((tg - fg) * m) + fg
        b       = ((tb - fb) * m) + fb

        r       = min(255, max(0, int(r)))
        g       = min(255, max(0, int(g)))
        b       = min(255, max(0, int(b)))
        for y in xrange(size) :
            ii.putpixel( (x, y), (r, g, b) )
        pass

    return(ii)




def make_c_image(xa, ya, size, fr = 0, tr = 255, fg = 0, tg = 255, fb = 0, tb = 255) :

    ii  = Image.new("RGB", [ size, size ], 0xffffff)

    yi  = 0
    for y in ya :
        ym          = 1.0 / (1.0 + math.exp(((yi * 2.0) / size - 1.0) * -flatness))
        yi         += 1

        xr          = ((tr - fr) * ym) + fr
        xg          = ((tg - fg) * ym) + fg
        xb          = ((tb - fb) * ym) + fb

        xi          = 0
        for x in xa :
            xm      = 1.0 / (1.0 + math.exp(((xi * 2.0) / size - 1.0) * -flatness))
            xi     += 1

            r       = ((tr - xr) * xm) + xr
            g       = ((tg - xg) * xm) + xg
            b       = ((tb - xb) * xm) + xb

            r       = min(255, max(0, int(r)))
            g       = min(255, max(0, int(g)))
            b       = min(255, max(0, int(b)))

            ii.putpixel( (x, y), (r, g, b) )
        pass

    return(ii)




def make_floating_images(size = 10, red = 255, green = 255, blue = 255, m = 0.5) :

    rs      = m * red
    gs      = m * green
    bs      = m * red

    a       = range(size)
    ra      = range(size)
    ra.reverse()

    south   = make_v_image(       size, rs, red, gs, green, bs, blue)
    east    = make_h_image(       size, rs, red, gs, green, bs, blue)
    se      = make_c_image(a,  a, size, rs, red, gs, green, bs, blue)
    ne      = make_c_image(a, ra, size, rs, red, gs, green, bs, blue)
    sw      = make_c_image(ra, a, size, rs, red, gs, green, bs, blue)

    return( ( south, east, ne, se, sw ) )



def write_floating_files(output_file_name_template, iis) :

    ( ofn, ext) = os.path.splitext(output_file_name_template)

    fns         = [          "south", "east",               "ne", "se", "sw" ]

    for i in xrange(len(fns)) :
        fn  = ofn + "_"     + fns[i] + ext
        tfn = ofn + "_tmp_" + fns[i] + ext
        iis[i].save(tfn)
        replace_file.replace_file(fn, tfn, fn + ".bak")

    pass


#
#
#
if __name__ == '__main__' :

    import  sys

    import  TZCommandLineAtFile
    import  tzlib


    if  not have_image_module :
        print "Cannot find Image module!"
        sys.exit(250)



    help_str    = sys.argv[0] + """ (options)   output_file_name_template

Create output_file_name_template_bottom.ext
       output_file_name_template_bottom_right.ext
       output_file_name_template_right.ext

where "ext" is the extension of output_file_name_template.

--size              n                       Set size in pixels of the images.
--background        0xRRGGBB                Set background color.
--background_red    n                       Set background red   value (0..255)
--background_green  n                       Set background green value (0..255)
--background_blue   n                       Set background blue  value (0..255)

"""

    sys.argv.pop(0)

    TZCommandLineAtFile.expand_at_sign_command_line_files(sys.argv)


    if  tzlib.array_find(sys.argv, [ "--help", "-h", "/?" ] ) >= 0 :
        print help_str
        sys.exit(254)


    red        = 255
    green      = 255
    blue       = 255

    size        = 10

    floating    = True

    a           = 0
    while a < len(sys.argv) :
        arg = sys.argv[a]
        if  (arg == "--background") or (arg == "-b") :
            del(sys.argv[a])
            bg      = int(sys.argv.pop(a), 0)
            red    = (bg >> 16) & 0xff
            green  = (bg >>  8) & 0xff
            blue   =  bg        & 0xff

        elif (arg == "--background_red") or (arg == "-br") :
            del(sys.argv[a])
            red    = int(sys.argv.pop(a), 0)

        elif (arg == "--background_green") or (arg == "-bg") :
            del(sys.argv[a])
            green  = int(sys.argv.pop(a), 0)

        elif (arg == "--background_blue") or (arg == "-bb") :
            del(sys.argv[a])
            blue   = int(sys.argv.pop(a), 0)

        elif (arg == "--size") or (arg == "-s") :
            del(sys.argv[a])
            size    = int(sys.argv.pop(a), 0)

        elif (arg == "--float") or (arg == "-f") :
            del(sys.argv[a])
            floating    = True

        elif (arg == "--sink") or (arg == "-s") :
            del(sys.argv[a])
            floating    = False

        else :
            a      += 1

        pass


    if  len(sys.argv) != 1 :
        print "Please tell me the output file name template!"
        sys.exit(254)


    output_file_name_template   = sys.argv[0]

    iis = make_floating_images(size, red, green, blue)
    write_floating_files(output_file_name_template, iis)


#
#
#
# eof
