📄 imageanalyzer.java
字号:
try {
// Cache the new image and imageData.
image = new Image(display, newImageData);
imageData = newImageData;
} catch (SWTException e) {
showErrorDialog(bundle.getString("Creating_from") + " ", currentName, e);
image = null;
return;
}
// Update the widgets with the new image info.
String string = createMsg(bundle.getString("Analyzer_on"), currentName);
shell.setText(string);
if (imageDataArray.length > 1) {
string = createMsg(bundle.getString("Type_index"),
new Object[] {fileTypeString(imageData.type),
new Integer(imageDataIndex + 1),
new Integer(imageDataArray.length)});
} else {
string = createMsg(bundle.getString("Type_string"), fileTypeString(imageData.type));
}
typeLabel.setText(string);
string = createMsg(bundle.getString("Size_value"),
new Object[] {new Integer(imageData.width),
new Integer(imageData.height)});
sizeLabel.setText(string);
string = createMsg(bundle.getString("Depth_value"), new Integer(imageData.depth));
depthLabel.setText(string);
string = createMsg(bundle.getString("Transparent_pixel_value"), pixelInfo(imageData.transparentPixel));
transparentPixelLabel.setText(string);
string = createMsg(bundle.getString("Time_to_load_value"), new Long(loadTime));
timeToLoadLabel.setText(string);
string = createMsg(bundle.getString("Animation_size_value"),
new Object[] {new Integer(loader.logicalScreenWidth),
new Integer(loader.logicalScreenHeight)});
screenSizeLabel.setText(string);
string = createMsg(bundle.getString("Background_pixel_value"), pixelInfo(loader.backgroundPixel));
backgroundPixelLabel.setText(string);
string = createMsg(bundle.getString("Image_location_value"),
new Object[] {new Integer(imageData.x), new Integer(imageData.y)});
locationLabel.setText(string);
string = createMsg(bundle.getString("Disposal_value"),
new Object[] {new Integer(imageData.disposalMethod),
disposalString(imageData.disposalMethod)});
disposalMethodLabel.setText(string);
int delay = imageData.delayTime * 10;
int delayUsed = visibleDelay(delay);
if (delay != delayUsed) {
string = createMsg(bundle.getString("Delay_value"),
new Object[] {new Integer(delay), new Integer(delayUsed)});
} else {
string = createMsg(bundle.getString("Delay_used"), new Integer(delay));
}
delayTimeLabel.setText(string);
if (loader.repeatCount == 0) {
string = createMsg( bundle.getString("Repeats_forever"), new Integer(loader.repeatCount));
} else {
string = createMsg(bundle.getString("Repeats_value"), new Integer(loader.repeatCount));
}
repeatCountLabel.setText(string);
if (imageData.palette.isDirect) {
string = bundle.getString("Palette_direct");
} else {
string = createMsg(bundle.getString("Palette_value"), new Integer(imageData.palette.getRGBs().length));
}
paletteLabel.setText(string);
string = createMsg(bundle.getString("Pixel_data_value"),
new Object[] {new Integer(imageData.bytesPerLine),
new Integer(imageData.scanlinePad),
depthInfo(imageData.depth)});
dataLabel.setText(string);
String data = dataHexDump(dataText.getLineDelimiter());
dataText.setText(data);
// bold the first column all the way down
int index = 0;
while((index = data.indexOf(':', index+1)) != -1)
dataText.setStyleRange(new StyleRange(index - INDEX_DIGITS, INDEX_DIGITS, dataText.getForeground(), dataText.getBackground(), SWT.BOLD));
statusLabel.setText("");
// Redraw both canvases.
paletteCanvas.redraw();
imageCanvas.redraw();
}
void paintImage(PaintEvent event) {
Image paintImage = image;
int transparentPixel = imageData.transparentPixel;
if (transparentPixel != -1 && !transparent) {
imageData.transparentPixel = -1;
paintImage = new Image(display, imageData);
}
int w = Math.round(imageData.width * xscale);
int h = Math.round(imageData.height * yscale);
event.gc.drawImage(
paintImage,
0,
0,
imageData.width,
imageData.height,
ix + imageData.x,
iy + imageData.y,
w,
h);
if (showMask && (imageData.getTransparencyType() != SWT.TRANSPARENCY_NONE)) {
ImageData maskImageData = imageData.getTransparencyMask();
Image maskImage = new Image(display, maskImageData);
event.gc.drawImage(
maskImage,
0,
0,
imageData.width,
imageData.height,
w + 10 + ix + imageData.x,
iy + imageData.y,
w,
h);
maskImage.dispose();
}
if (transparentPixel != -1 && !transparent) {
imageData.transparentPixel = transparentPixel;
paintImage.dispose();
}
}
void paintPalette(PaintEvent event) {
GC gc = event.gc;
gc.fillRectangle(paletteCanvas.getClientArea());
if (imageData.palette.isDirect) {
// For a direct palette, display the masks.
int y = py + 10;
int xTab = 50;
gc.drawString("rMsk", 10, y, true);
gc.drawString(toHex4ByteString(imageData.palette.redMask), xTab, y, true);
gc.drawString("gMsk", 10, y+=12, true);
gc.drawString(toHex4ByteString(imageData.palette.greenMask), xTab, y, true);
gc.drawString("bMsk", 10, y+=12, true);
gc.drawString(toHex4ByteString(imageData.palette.blueMask), xTab, y, true);
gc.drawString("rShf", 10, y+=12, true);
gc.drawString(Integer.toString(imageData.palette.redShift), xTab, y, true);
gc.drawString("gShf", 10, y+=12, true);
gc.drawString(Integer.toString(imageData.palette.greenShift), xTab, y, true);
gc.drawString("bShf", 10, y+=12, true);
gc.drawString(Integer.toString(imageData.palette.blueShift), xTab, y, true);
} else {
// For an indexed palette, display the palette colors and indices.
RGB[] rgbs = imageData.palette.getRGBs();
if (rgbs != null) {
int xTab1 = 40, xTab2 = 100;
for (int i = 0; i < rgbs.length; i++) {
int y = (i+1) * 10 + py;
gc.drawString(String.valueOf(i), 10, y, true);
gc.drawString(toHexByteString(rgbs[i].red) + toHexByteString(rgbs[i].green) + toHexByteString(rgbs[i].blue), xTab1, y, true);
Color color = new Color(display, rgbs[i]);
gc.setBackground(color);
gc.fillRectangle(xTab2, y+2, 10, 10);
color.dispose();
}
}
}
}
void resizeShell(ControlEvent event) {
if (image == null || shell.isDisposed())
return;
resizeScrollBars();
}
// Reset the scale combos to 1.
void resetScaleCombos() {
xscale = 1; yscale = 1;
scaleXCombo.select(scaleXCombo.indexOf("1"));
scaleYCombo.select(scaleYCombo.indexOf("1"));
}
// Reset the scroll bars to 0.
void resetScrollBars() {
if (image == null) return;
ix = 0; iy = 0; py = 0;
resizeScrollBars();
imageCanvas.getHorizontalBar().setSelection(0);
imageCanvas.getVerticalBar().setSelection(0);
paletteCanvas.getVerticalBar().setSelection(0);
}
void resizeScrollBars() {
// Set the max and thumb for the image canvas scroll bars.
ScrollBar horizontal = imageCanvas.getHorizontalBar();
ScrollBar vertical = imageCanvas.getVerticalBar();
Rectangle canvasBounds = imageCanvas.getClientArea();
int width = Math.round(imageData.width * xscale);
if (width > canvasBounds.width) {
// The image is wider than the canvas.
horizontal.setEnabled(true);
horizontal.setMaximum(width);
horizontal.setThumb(canvasBounds.width);
horizontal.setPageIncrement(canvasBounds.width);
} else {
// The canvas is wider than the image.
horizontal.setEnabled(false);
if (ix != 0) {
// Make sure the image is completely visible.
ix = 0;
imageCanvas.redraw();
}
}
int height = Math.round(imageData.height * yscale);
if (height > canvasBounds.height) {
// The image is taller than the canvas.
vertical.setEnabled(true);
vertical.setMaximum(height);
vertical.setThumb(canvasBounds.height);
vertical.setPageIncrement(canvasBounds.height);
} else {
// The canvas is taller than the image.
vertical.setEnabled(false);
if (iy != 0) {
// Make sure the image is completely visible.
iy = 0;
imageCanvas.redraw();
}
}
// Set the max and thumb for the palette canvas scroll bar.
vertical = paletteCanvas.getVerticalBar();
if (imageData.palette.isDirect) {
vertical.setEnabled(false);
} else { // indexed palette
canvasBounds = paletteCanvas.getClientArea();
int paletteHeight = imageData.palette.getRGBs().length * 10 + 20; // 10 pixels each index + 20 for margins.
vertical.setEnabled(true);
vertical.setMaximum(paletteHeight);
vertical.setThumb(canvasBounds.height);
vertical.setPageIncrement(canvasBounds.height);
}
}
/*
* Called when the image canvas' horizontal scrollbar is selected.
*/
void scrollHorizontally(ScrollBar scrollBar) {
if (image == null) return;
Rectangle canvasBounds = imageCanvas.getClientArea();
int width = Math.round(imageData.width * xscale);
int height = Math.round(imageData.height * yscale);
if (width > canvasBounds.width) {
// Only scroll if the image is bigger than the canvas.
int x = -scrollBar.getSelection();
if (x + width < canvasBounds.width) {
// Don't scroll past the end of the image.
x = canvasBounds.width - width;
}
imageCanvas.scroll(x, iy, ix, iy, width, height, false);
ix = x;
}
}
/*
* Called when the image canvas' vertical scrollbar is selected.
*/
void scrollVertically(ScrollBar scrollBar) {
if (image == null) return;
Rectangle canvasBounds = imageCanvas.getClientArea();
int width = Math.round(imageData.width * xscale);
int height = Math.round(imageData.height * yscale);
if (height > canvasBounds.height) {
// Only scroll if the image is bigger than the canvas.
int y = -scrollBar.getSelection();
if (y + height < canvasBounds.height) {
// Don't scroll past the end of the image.
y = canvasBounds.height - height;
}
imageCanvas.scroll(ix, y, ix, iy, width, height, false);
iy = y;
}
}
/*
* Called when the palette canvas' vertical scrollbar is selected.
*/
void scrollPalette(ScrollBar scrollBar) {
if (image == null) return;
Rectangle canvasBounds = paletteCanvas.getClientArea();
int paletteHeight = imageData.palette.getRGBs().length * 10 + 20;
if (paletteHeight > canvasBounds.height) {
// Only scroll if the palette is bigger than the canvas.
int y = -scrollBar.getSelection();
if (y + paletteHeight < canvasBounds.height) {
// Don't scroll past the end of the palette.
y = canvasBounds.height - paletteHeight;
}
paletteCanvas.scroll(0, y, 0, py, paletteWidth, paletteHeight, false);
py = y;
}
}
/*
* Return a String containing a line-by-line dump of
* the data in the current imageData. The lineDelimiter
* parameter must be a string of length 1 or 2.
*/
String dataHexDump(String lineDelimiter) {
if (image == null) return "";
char[] dump = new char[imageData.height * (6 + 3 * imageData.bytesPerLine + lineDelimiter.length())];
int index = 0;
for (int i = 0; i < imageData.data.length; i++) {
if (i % imageData.bytesPerLine == 0) {
int line = i / imageData.bytesPerLine;
dump[index++] = Character.forDigit(line / 1000 % 10, 10);
dump[index++] = Character.forDigit(line / 100 % 10, 10);
dump[index++] = Character.forDigit(line / 10 % 10, 10);
dump[index++] = Character.forDigit(line % 10, 10);
dump[index++] = ':';
dump[index++] = ' ';
}
byte b = imageData.data[i];
dump[index++] = Character.forDigit((b & 0xF0) >> 4, 16);
dump[index++] = Character.forDigit(b & 0x0F, 16);
dump[index++] = ' ';
if ((i + 1) % imageData.bytesPerLine == 0) {
dump[index++] = lineDelimiter.charAt(0);
if (lineDelimiter.length() > 1)
dump[index++] = lineDelimiter.charAt(1);
}
}
return new String(dump);
}
/*
* Open an error dialog displaying the specified information.
*/
void showErrorDialog(String operation, String filename, Exception e) {
MessageBox box = new MessageBox(shell, SWT.ICON_ERROR);
String message = createMsg(bundle.getString("Error"), new String[] {operation, filename});
String errorMessage = "";
if (e != null) {
if (e instanceof SWTException) {
SWTException swte = (SWTException) e;
errorMessage = swte.getMessage();
if (swte.throwable != null) {
errorMessage += ":\n" + swte.throwable.toString();
}
} else {
errorMessage = e.toString();
}
}
box.setMessage(message + errorMessage);
box.open();
}
/*
* Return a String describing how to analyze the bytes
* in the hex dump.
*/
static String depthInfo(int depth) {
Object[] args = {new Integer(depth), ""};
switch (depth) {
case 1:
args[1] = createMsg(bundle.getString("Multi_pixels"),
new Object[] {new Integer(8), " [01234567]"});
break;
case 2:
args[1] = createMsg(bundle.getString("Multi_pixels"),
new Object[] {new Integer(4), "[00112233]"});
break;
case 4:
args[1] = createMsg(bundle.getString("Multi_pixels"),
new Object[] {new Integer(2), "[00001111]"});
break;
case 8:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -