processing ( papplet ) を外から使う時

に、便利なメソッドが用意されていて

appletのサイズを外から取得する時

PApplet app;

という感じで app.width とか app.height に直にアクセスしてもタイミングによって取れない。setupメソッドが呼ばれた後じゃないといけない。

で、processingにはdrawメソッドが呼ばれる前、呼ばれた後、paintされた後とかをフック出来る

class Test {
        private PApplet app;

        public Test(PApplet app) {
                this.app = app;
                app.registerPre(this);
        }

        public void pre() {
                app.unregisterPre(this);
                Dimension size = new Dimension(app.width, app.height);
        }
}

こんな感じでdrawメソッドが呼ばれる前のpreって所でサイズは取れてるのでこういう感じにする。

書き終わったpixelsに外からアクセスする時

は同じように

class Test {
        private PApplet app;

        public Test(PApplet app) {
                this.app = app;
                app.registerPost(this);
        }

        public void post() {
                //app.pixels
        }
}

のようにpostってのをフックする。でもここで重い処理をすると引きづられて描画が重くなるので

class Test {
        private PApplet app;
        private ArrayBlockingQueue<int[]> queue;

        public Test(PApplet app) {
                this.app = app;
                app.registerPost(this);
                new Thread(worker).start();
        }

        public void post() {
                queue.put(Arrays.copyOf(app.pixels, app.pixels.length));
        }

	private Runnable worker = new Runnable() {

		@Override
		public void run() {
			while (true) {
                                int[] argb = queue.take();
			}
		}

	};

}

こんな感じで別スレッドで処理した方がいい気がした。まぁこれは並列処理しないでいい時の例。

ちなみにsizeのフックの所はメソッドはあるけど、処理自体がコメントアウトされてる。