in application/org.openjdk.jmc.flightrecorder.ext.g1/src/main/java/org/openjdk/jmc/flightrecorder/ext/g1/visualizer/HeapLayout.java [268:367]
protected void drawCurve(GC gc) {
int n = closestLargerPowerOfTwo((int) Math.round(Math.sqrt(regions.size())));
int scaleY = Math.floorDiv(getClientArea().height, n);
int scaleX = Math.floorDiv(getClientArea().width, n);
int i = 0, j = 0, size = 0;
try {
size = Math.floorDiv(getClientArea().width, scaleX);
} catch (ArithmeticException ae) {
return;
}
Rectangle last = new Rectangle(0, 0, 0, 0);
boolean first = true, flip = false;
if (dirtyRegions.size() == 0 && scaleY == scalingFactorY && scaleX == scalingFactorX && !fullRedraw) {
gc.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
GC gc2 = new GC(lastDraw);
updateFocus(gc2);
gc2.dispose();
gc.drawImage(lastDraw, 0, 0);
} else if (dirtyRegions.size() > 0 && !fullRedraw) {
GC buffer = new GC(lastDraw);
for (HeapRegion region : dirtyRegions) {
buffer.setBackground(colors.getColor(region));
buffer.fillRectangle(region.getPosition());
drawPad(buffer, region.getPosition());
}
updateFocus(buffer);
gc.drawImage(lastDraw, 0, 0);
buffer.dispose();
dirtyRegions.clear();
} else if (regions.size() == 0) {
gc.setBackground(getDisplay().getSystemColor(SWT.COLOR_WHITE));
gc.fillRectangle(this.getClientArea());
} else {
scalingFactorY = (scaleY == 0) ? 1 : scaleY;
scalingFactorX = (scaleX == 0) ? 1 : scaleX;
Rectangle fullSize = new Rectangle(0, 0, 0, 0);
for (HeapRegion region : regions) {
Rectangle pos = new Rectangle(0, 0, scalingFactorX, scalingFactorY);
switch (curveType) {
case HILBERT:
Point hilbert = convertTo2D(n, i);
pos = new Rectangle(hilbert.x * scalingFactorX, hilbert.y * scalingFactorY, scalingFactorX,
scalingFactorY);
break;
case LEFT_RIGHT:
if (j < size && !first) {
pos.x = last.x + scaleX;
pos.y = last.y;
j++;
} else if (first) {
pos.x = 0;
pos.y = 0;
j++;
first = false;
} else {
j = 1;
pos.x = 0;
pos.y = last.y + scaleY;
}
last = pos;
break;
case ALTERNATING:
if (j < size && !first) {
pos.x = flip ? last.x - scaleX : last.x + scaleX;
pos.y = last.y;
j++;
} else if (first) {
pos.x = 0;
pos.y = 0;
++j;
first = false;
} else {
j = 1;
pos.x = last.x;
pos.y = last.y + scaleY;
flip = !flip;
}
last = pos;
break;
}
region.setPosition(pos);
fullSize.add(pos);
i++;
}
Image current = new Image(getDisplay(), fullSize);
GC buffer = new GC(current);
for (HeapRegion region : regions) {
buffer.setBackground(colors.getColor(region));
buffer.fillRectangle(region.getPosition());
drawPad(buffer, region.getPosition());
}
gc.drawImage(current, 0, 0);
updateFocus(buffer);
this.setBounds(current.getBounds());
this.getParent().layout(true, true);
buffer.dispose();
lastDraw = current;
fullRedraw = false;
}
}