import java.util.*;
import java.util.zip.*;
import java.util.List;
import java.util.regex.*;
import java.util.concurrent.*;
import java.util.concurrent.atomic.*;
import java.util.concurrent.locks.*;
import java.util.function.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;
import javax.swing.table.*;
import java.io.*;
import java.net.*;
import java.lang.reflect.*;
import java.lang.ref.*;
import java.lang.management.*;
import java.security.*;
import java.security.spec.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.awt.geom.*;
import javax.imageio.*;
import java.math.*;
import java.time.Duration;
import java.awt.geom.*;
import static x30_pkg.x30_util.DynamicObject;
import java.text.*;
import java.text.NumberFormat;
import java.util.TimeZone;
class main {
static BufferedImage testBlockOptimizedIntMatrix() { return testBlockOptimizedIntMatrix(shootScreen2()); }
static BufferedImage testBlockOptimizedIntMatrix(BufferedImage img) {
int blockShift = 3;
BlockOptimizedIntMatrix m = new BlockOptimizedIntMatrix(img.getWidth(), img.getHeight(), blockShift);
copyMatrix(imageToMatrix(img), m);
print("Size before opt=", deepObjectSize(m));
m.optimize();
print("Size after opt=", deepObjectSize(m));
assertSameImage(img, matrixToImage(m));
return img;
}
static BufferedImage shootScreen2() {
return shootScreen2(screenRectangle());
}
static BufferedImage shootScreen2(Rectangle area) { try {
ping();
return new Robot().createScreenCapture(area);
} catch (Exception __e) { throw rethrow(__e); } }
static BufferedImage shootScreen2(Rect area) {
return shootScreen2(area.getRectangle());
}
static BufferedImage shootScreen2(int x, int y, int w, int h) {
return shootScreen2(new Rectangle(x, y, w, h));
}
// internal
static > B copyMatrix(Matrix src, B dest) {
assertSameSize(src, dest);
int w = src.getWidth(), h = src.getHeight();
for (int y = 0; y < h; y++)
for (int x = 0; x < w; x++)
dest.set(x, y, src.get(x, y));
return dest;
}
static Matrix imageToMatrix(MakesBufferedImage img) { return imageToMatrix(toBufferedImage(img)); }
static Matrix imageToMatrix(BufferedImage img) {
if (img == null) return null;
int _w = img.getWidth(), _h = img.getHeight();
class ImageToMatrix extends AbstractMatrix {
ImageToMatrix() { super(_w, _h); }
public Integer get(int x, int y) {
assertPointInBounds(x, y, w, h);
return img.getRGB(x, y);
}
public void set(int x, int y, Integer val) {
assertPointInBounds(x, y, w, h);
img.setRGB(x, y, val);
}
};
return new ImageToMatrix();
}
static volatile StringBuffer local_log = new StringBuffer(); // not redirected
static boolean printAlsoToSystemOut = true;
static volatile Appendable print_log = local_log; // might be redirected, e.g. to main bot
// in bytes - will cut to half that
static volatile int print_log_max = 1024*1024;
static volatile int local_log_max = 100*1024;
static boolean print_silent = false; // total mute if set
static Object print_byThread_lock = new Object();
static volatile ThreadLocal