#!/usr/bin/python

# number_bullet_scanner.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--
#       December 11, 2007       bar     spin off from camera_time.py
#       May 17, 2008            bar     email adr
#       --eodstamps--
##      \file
#
#
#       Display a number bullet screen filling window using wxWidgets.
#
#


import  threading

import  Image

import  number_bullet
import  number_bullet_wx_widget
import  tzlib
import  tz_jpg


class   a_number_bullet_file_scanner(threading.Thread) :


    def __init__(me, owner, fnames, max_wait = 0.0) :

        threading.Thread.__init__(me)

        me.owner        = owner     or  None
        me.fnames       = fnames
        me.max_wait     = max_wait  or  0.0

        me._stop        = False

        me.tcnt         = 0
        me.td_tot       = 0.0
        me.bad_fnames   = []

        me.to_do        = len(me.fnames) * 3.0
        me.done         = 0.0

        me.setDaemon(True)                              # so that we can kick out of the program while the thread is running




    def run(me) :

        class   a_td :
            def __init__(me, ii, owner) :
                me.owner    = owner
                me.ii       = ii
                me.im       = me.ii.load()
                me.d        = None
                me.tcnt     = 0

                (me._width, me._hite)   = me.ii.size


            def width(me) :
                if  me.owner._stop :                                                                            return(-1)
                if  me.owner.max_wait and (tzlib.elapsed_time() - me.owner.start_time >= me.owner.max_wait) :   return(-1)
                return(me._width)

            def hite(me) :
                if  me.owner._stop :                                                                            return(-1)
                if  me.owner.max_wait and (tzlib.elapsed_time() - me.owner.start_time >= me.owner.max_wait) :   return(-1)
                return(me._hite)

            def get_pixel(me, x, y) :
                return(me.im[x, y])

            pass


        brr             = number_bullet.a_number_bullet(number_bullet_wx_widget.BULLET_TIME)

        me.fnames.sort()

        me.tcnt         = 0
        me.td_tot       = 0

        me.to_do        = len(me.fnames) * 3.0
        me.done         = 0.0

        me.bad_fnames   = []
        for fn in me.fnames :

            if  me._stop :
                break

            try :
                fi      = tz_jpg.a_jpg(fn)
            except ValueError :
                fi      = None
            me.done    += 1

            if  me._stop :
                break

            if  not fi  :
                me.bad_fnames.append(fn)
                me.done    += 2
            else :
                try :
                    ii      = Image.open(fn)
                except IOError :
                    me.bad_fnames.append(fn)
                    ii      = None
                me.done    += 1


                if  me._stop :
                    break

                if  not ii :
                    me.done    += 1
                else :
                    ( w, h )    = ii.size
                    if  min(w, h) >= 2000 :                             # takes too long if the image is ok, but sure makes it go faster if the image is bogus
                        if  w < h :
                            ii  = ii.resize( [ 640, int(h * (640.0 / w))      ], Image.ANTIALIAS)
                        else :
                            ii  = ii.resize( [      int(h * (640.0 / h)), 640 ], Image.ANTIALIAS)
                        pass

                    me.start_time   = tzlib.elapsed_time()

                    ptr = a_td(ii, me)
                    na  = brr.scan(ptr, min_to_find = 1, max_to_find = 8)

                    del(ii)
                    na.sort()

                    if  not na :
                        me.bad_fnames.append(fn)
                    else :
                        ptime   = fi.picture_taken_time(dflt = -1)
                        if  ptime < 0 :
                            me.bad_fnames.append(fn)
                        else :
                            ptime   = ptime % (3600 * 24)

                        d       = ptime - (na[-1] / float(number_bullet_wx_widget.BULLET_FRAC))
                        me.td_tot  += d
                        # print fn, na, int(ptime * number_bullet_wx_widget.BULLET_FRAC), d

                        me.tcnt    += 1
                    me.done        += 1
                pass
            pass

        owner       = me.owner
        me.owner    = None
        if  not me._stop :
            if  owner and hasattr(owner, 'number_bullet_scanner_done') :
                owner.number_bullet_scanner_done(me.tcnt, me.td_tot, me.bad_fnames)
            pass

        pass



    def stop(me) :
        me._stop    = True



    pass            # a_number_bullet_file_scanner



if __name__ == '__main__' :
    print   "Imported from python scripts/programs."


#
#
#
# eof

