public float generate(CA c, int start, int end, boolean stopOnSame, boolean over, Updater u) { if (_b == null || _b.getWidth() != c.getWidth() || _b.getHeight() != c.getHeight()) { _b = new CA(c.getWidth(), c.getHeight()); } int times = end - start; CA b1 = c, b2 = _b; // double buffer // int[] sur = new int[_len*_len]; int[] sur = new int[_len - 1]; int dim = _len; int offset = (dim - 1) / 2; Selector sel = selector(); for (int t = 0; t < times; t++) { for (int x = 0; x < b1.getWidth(); x++) { for (int y = 0; y < b1.getHeight(); y++) { int idx = 0; int dx = x - offset; int dy = y - offset; if (false && dx >= 0 && dy >= 0 && dx + dim < b1.getWidth() && dy + dim < b1.getHeight()) { b1.getBlock(sur, dx, dy, _len); } else { for (int i = x - 1; i <= x + 1; i++) { for (int j = y - 1; j <= y + 1; j++) { sur[idx++] = get(b1, i, j); } } } int n = sel.next(sur, 0); if (n != -1) { b2.set(x, y, _colors[n]); if (_interceptor != null) { _interceptor.set(x, y, _colors[n]); } // System.err.print(" "+n); } /* int dx = x - offset; int dy = y - offset; if(dx>=0&&dy>=0&&dx+dim<b1.getWidth()&&dy+dim<b1.getHeight()) { b1.getBlock(sur, dx, dy, _len); } int n = sel.next(sur, 0); if(n!=-1) { b2.set(x, y, n); } */ } } // swap CA temp = b1; b1 = b2; b2 = temp; } c.setData(b1.getData()); // System.err.print("."); return 0f; }