content: package org.opencv.highgui;
  
  import org.opencv.core.Mat;
  import org.opencv.core.Size;
  import org.opencv.imgproc.Imgproc;
  
  import javax.swing.*;
  import java.awt.*;
  
  /**
   * This class was designed to create and manipulate
   * the Windows to be used by the HighGui class.
   */
  public final class ImageWindow {
  
      public final static int WINDOW_NORMAL = 0;
      public final static int WINDOW_AUTOSIZE = 1;
  
      public String name;
      public Mat img = null;
      public Boolean alreadyUsed = false;
      public Boolean imgToBeResized = false;
      public Boolean windowToBeResized = false;
      public Boolean positionToBeChanged = false;
      public JFrame frame = null;
      public JLabel lbl = null;
      public int flag;
      public int x = -1;
      public int y = -1;
      public int width = -1;
      public int height = -1;
  
      public ImageWindow(String name, Mat img) {
          this.name = name;
          this.img = img;
          this.flag = WINDOW_NORMAL;
      }
  
      public ImageWindow(String name, int flag) {
          this.name = name;
          this.flag = flag;
      }
  
      public static Size keepAspectRatioSize(int original_width, int original_height, int bound_width, int bound_height) {
  
          int new_width = original_width;
          int new_height = original_height;
  
          if (original_width > bound_width) {
              new_width = bound_width;
              new_height = (new_width * original_height) / original_width;
          }
  
          if (new_height > bound_height) {
              new_height = bound_height;
              new_width = (new_height * original_width) / original_height;
          }
  
          return new Size(new_width, new_height);
      }
  
      public void setMat(Mat img) {
  
          this.img = img;
          this.alreadyUsed = false;
  
          if (imgToBeResized) {
              resizeImage();
              imgToBeResized = false;
          }
  
      }
  
      public void setFrameLabelVisible(JFrame frame, JLabel lbl) {
          this.frame = frame;
          this.lbl = lbl;
  
          if (windowToBeResized) {
              lbl.setPreferredSize(new Dimension(width, height));
              windowToBeResized = false;
          }
  
          if (positionToBeChanged) {
              frame.setLocation(x, y);
              positionToBeChanged = false;
          }
  
          frame.add(lbl);
          frame.pack();
          frame.setVisible(true);
      }
  
      public void setNewDimension(int width, int height) {
  
          if (this.width != width || this.height != height) {
              this.width = width;
              this.height = height;
  
              if (img != null) {
                  resizeImage();
              } else {
                  imgToBeResized = true;
              }
  
              if (lbl != null) {
                  lbl.setPreferredSize(new Dimension(width, height));
              } else {
                  windowToBeResized = true;
              }
          }
      }
  
      public void setNewPosition(int x, int y) {
          if (this.x != x || this.y != y) {
              this.x = x;
              this.y = y;
  
              if (frame != null) {
                  frame.setLocation(x, y);
              } else {
                  positionToBeChanged = true;
              }
          }
      }
  
      private void resizeImage() {
          if (flag == WINDOW_NORMAL) {
              Size tmpSize = keepAspectRatioSize(img.width(), img.height(), width, height);
              Imgproc.resize(img, img, tmpSize, 0, 0, Imgproc.INTER_LINEAR_EXACT);
          }
      }
  }
  