aspectRatioOverlay.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. let currentWidth = null;
  2. let currentHeight = null;
  3. let arFrameTimeout = setTimeout(function(){},0);
  4. function dimensionChange(e, is_width, is_height){
  5. if(is_width){
  6. currentWidth = e.target.value*1.0
  7. }
  8. if(is_height){
  9. currentHeight = e.target.value*1.0
  10. }
  11. var inImg2img = Boolean(gradioApp().querySelector("button.rounded-t-lg.border-gray-200"))
  12. if(!inImg2img){
  13. return;
  14. }
  15. var targetElement = null;
  16. var tabIndex = get_tab_index('mode_img2img')
  17. if(tabIndex == 0){ // img2img
  18. targetElement = gradioApp().querySelector('div[data-testid=image] img');
  19. } else if(tabIndex == 1){ //Sketch
  20. targetElement = gradioApp().querySelector('#img2img_sketch div[data-testid=image] img');
  21. } else if(tabIndex == 2){ // Inpaint
  22. targetElement = gradioApp().querySelector('#img2maskimg div[data-testid=image] img');
  23. } else if(tabIndex == 3){ // Inpaint sketch
  24. targetElement = gradioApp().querySelector('#inpaint_sketch div[data-testid=image] img');
  25. }
  26. if(targetElement){
  27. var arPreviewRect = gradioApp().querySelector('#imageARPreview');
  28. if(!arPreviewRect){
  29. arPreviewRect = document.createElement('div')
  30. arPreviewRect.id = "imageARPreview";
  31. gradioApp().getRootNode().appendChild(arPreviewRect)
  32. }
  33. var viewportOffset = targetElement.getBoundingClientRect();
  34. viewportscale = Math.min( targetElement.clientWidth/targetElement.naturalWidth, targetElement.clientHeight/targetElement.naturalHeight )
  35. scaledx = targetElement.naturalWidth*viewportscale
  36. scaledy = targetElement.naturalHeight*viewportscale
  37. cleintRectTop = (viewportOffset.top+window.scrollY)
  38. cleintRectLeft = (viewportOffset.left+window.scrollX)
  39. cleintRectCentreY = cleintRectTop + (targetElement.clientHeight/2)
  40. cleintRectCentreX = cleintRectLeft + (targetElement.clientWidth/2)
  41. viewRectTop = cleintRectCentreY-(scaledy/2)
  42. viewRectLeft = cleintRectCentreX-(scaledx/2)
  43. arRectWidth = scaledx
  44. arRectHeight = scaledy
  45. arscale = Math.min( arRectWidth/currentWidth, arRectHeight/currentHeight )
  46. arscaledx = currentWidth*arscale
  47. arscaledy = currentHeight*arscale
  48. arRectTop = cleintRectCentreY-(arscaledy/2)
  49. arRectLeft = cleintRectCentreX-(arscaledx/2)
  50. arRectWidth = arscaledx
  51. arRectHeight = arscaledy
  52. arPreviewRect.style.top = arRectTop+'px';
  53. arPreviewRect.style.left = arRectLeft+'px';
  54. arPreviewRect.style.width = arRectWidth+'px';
  55. arPreviewRect.style.height = arRectHeight+'px';
  56. clearTimeout(arFrameTimeout);
  57. arFrameTimeout = setTimeout(function(){
  58. arPreviewRect.style.display = 'none';
  59. },2000);
  60. arPreviewRect.style.display = 'block';
  61. }
  62. }
  63. onUiUpdate(function(){
  64. var arPreviewRect = gradioApp().querySelector('#imageARPreview');
  65. if(arPreviewRect){
  66. arPreviewRect.style.display = 'none';
  67. }
  68. var inImg2img = Boolean(gradioApp().querySelector("button.rounded-t-lg.border-gray-200"))
  69. if(inImg2img){
  70. let inputs = gradioApp().querySelectorAll('input');
  71. inputs.forEach(function(e){
  72. var is_width = e.parentElement.id == "img2img_width"
  73. var is_height = e.parentElement.id == "img2img_height"
  74. if((is_width || is_height) && !e.classList.contains('scrollwatch')){
  75. e.addEventListener('input', function(e){dimensionChange(e, is_width, is_height)} )
  76. e.classList.add('scrollwatch')
  77. }
  78. if(is_width){
  79. currentWidth = e.value*1.0
  80. }
  81. if(is_height){
  82. currentHeight = e.value*1.0
  83. }
  84. })
  85. }
  86. });