aspectRatioOverlay.js 3.9 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 = gradioApp().querySelector("#tab_img2img").style.display == "block";
  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('#img2img_image 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().appendChild(arPreviewRect);
  32. }
  33. var viewportOffset = targetElement.getBoundingClientRect();
  34. var viewportscale = Math.min(targetElement.clientWidth / targetElement.naturalWidth, targetElement.clientHeight / targetElement.naturalHeight);
  35. var scaledx = targetElement.naturalWidth * viewportscale;
  36. var scaledy = targetElement.naturalHeight * viewportscale;
  37. var cleintRectTop = (viewportOffset.top + window.scrollY);
  38. var cleintRectLeft = (viewportOffset.left + window.scrollX);
  39. var cleintRectCentreY = cleintRectTop + (targetElement.clientHeight / 2);
  40. var cleintRectCentreX = cleintRectLeft + (targetElement.clientWidth / 2);
  41. var arscale = Math.min(scaledx / currentWidth, scaledy / currentHeight);
  42. var arscaledx = currentWidth * arscale;
  43. var arscaledy = currentHeight * arscale;
  44. var arRectTop = cleintRectCentreY - (arscaledy / 2);
  45. var arRectLeft = cleintRectCentreX - (arscaledx / 2);
  46. var arRectWidth = arscaledx;
  47. var arRectHeight = arscaledy;
  48. arPreviewRect.style.top = arRectTop + 'px';
  49. arPreviewRect.style.left = arRectLeft + 'px';
  50. arPreviewRect.style.width = arRectWidth + 'px';
  51. arPreviewRect.style.height = arRectHeight + 'px';
  52. clearTimeout(arFrameTimeout);
  53. arFrameTimeout = setTimeout(function() {
  54. arPreviewRect.style.display = 'none';
  55. }, 2000);
  56. arPreviewRect.style.display = 'block';
  57. }
  58. }
  59. onAfterUiUpdate(function() {
  60. var arPreviewRect = gradioApp().querySelector('#imageARPreview');
  61. if (arPreviewRect) {
  62. arPreviewRect.style.display = 'none';
  63. }
  64. var tabImg2img = gradioApp().querySelector("#tab_img2img");
  65. if (tabImg2img) {
  66. var inImg2img = tabImg2img.style.display == "block";
  67. if (inImg2img) {
  68. let inputs = gradioApp().querySelectorAll('input');
  69. inputs.forEach(function(e) {
  70. var is_width = e.parentElement.id == "img2img_width";
  71. var is_height = e.parentElement.id == "img2img_height";
  72. if ((is_width || is_height) && !e.classList.contains('scrollwatch')) {
  73. e.addEventListener('input', function(e) {
  74. dimensionChange(e, is_width, is_height);
  75. });
  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. }
  87. });