// work out new width for canvas. depending on whether width > height of the // image, then use the width of the image (with the specified gap) otherwise // the height > width, so scale the new width based on height ratio of // image to window function NewWidth() { w_r=im.width/(window.innerWidth*gap) h_r=im.height/(window.innerHeight*gap) if( w_r > h_r ) return window.innerWidth*gap else return im.width*gap / (im.height/window.innerHeight) } // work out new height for canvas. depending on whether height > width of the // image, then use the height of the image (with the specified gap) otherwise // the width > height, so scale the new height based on width ratio of // image to window function NewHeight() { w_r=im.width/(window.innerWidth*gap) h_r=im.height/(window.innerHeight*gap) if( h_r > w_r ) return window.innerHeight*gap else return im.height*gap / (im.width/window.innerWidth) } // This draws the image, it can be called on resize events, img.src finishing // loading or explicitly on page load. Will also deal with all state/toggles // for items like name, grayscale, etc. function DrawImg() { // another call to this func will occur on load, so skip this one if( im.width == 0 ) return canvas.width=NewWidth(im) canvas.height=NewHeight(im) // actually draw the pixel images to the canvas at the right size if( grayscale ) context.filter='grayscale(1)' context.drawImage(im, 0, 0, canvas.width, canvas.height ) // -50 is a straight up hack, no idea why this works, but its good enough for me if( throbber ) $('#throbber').attr('style', 'display:show; position:absolute; left:'+canvas.width/2+'px; top:'+(canvas.height/2-50)+'px' ) else $('#throbber').hide(); // show (or not) the whole figcaption with fname in it - based on state of fname_toggle if( $('#fname_toggle').prop('checked' ) ) { // reset fname for new image (if navigated left/right to get here) $('#fname').html(PrettyFname(objs[current].url)) $('.figcaption').show() } else $('.figcaption').hide() // if we have faces, the enable the toggles, otherwise disable them // and reset model select too if( objs[current].faces ) { $('#faces').attr('disabled', false) $('#distance').attr('disabled', false) $('#model').val( Number(objs[current].face_model) ) } else { $('#faces').attr('disabled', true) $('#distance').attr('disabled', true) // if no faces, then model is N/A (always 1st element - or 0 in select) $('#model').val(0) } // okay, we want faces drawn so lets do it if( $('#faces').prop('checked') && objs[current].faces ) { // draw rect on each face for( i=0; i= fx && x <= fx+fw && y >= fy && y <= fy+fh ) { if( objs[current].faces[i].who ) item_list['match']={ 'name': objs[current].faces[i].who, 'which_face': i } else { item_list['no_match_new_person']={ 'name': 'Add as reference image to NEW person', 'which_face': i } item_list['no_match_new_refimg']={ 'name': 'Add as reference image to EXISTING person', 'which_face': i } item_list['no_match_override_match']={ 'name': 'Manually match to existing person', 'which_face': i } item_list['no_match_no_face']={ 'name': 'Mark as not a face', 'which_face': i } item_list['no_match_too_young']={ 'name': 'Mark as face too young', 'which_face': i } item_list['no_match_ignore']={ 'name': 'Ignore this face', 'which_face': i } item_list['remove_override']={ 'name': 'Remove override for this face', 'which_face': i } } delete item_list['not_a_face'] $('#canvas').prop('menu_item', item_list ) break } } return { callback: function( key, options) { if( key == 'not_a_face' ) { return true } item=$('#canvas').prop( 'menu_item' ); FaceDBox( key, item ) }, items: item_list }; } } ) } ); function FaceDBox(key, item) { div ='

' div+='Face #' + item[key]['which_face'] div+='

' if ( key == 'no_match_new_person' ) { div+='
create new person' } if ( key == 'no_match_new_refimg' || key == 'no_match_override_match' ) { div+='
search for existing person' } if ( key == 'no_match_no_face' || key == 'no_match_too_young' || key == 'no_match_ignore' ) { div+='
just track this against face#' + item[key]['which_face'] } $('#dbox-title').html(item[key]['name']) $('#dbox-content').html(div) $('#dbox').modal('show') } // func called to show logs relating to this filename from viewer // pops results up in a dbox function JoblogSearch() { data="eid="+current $.ajax({ type: 'POST', data: data, url: '/joblog_search', success: function(res) { data = JSON.parse(res) div='
' for( i=0; i' div+='
' $('#dbox-title').html("Logs relating to this filename") $('#dbox-content').html(div) $('#dbox').modal('show') } }) }