aboutsummaryrefslogtreecommitdiffstats
path: root/hierarchyviewer
diff options
context:
space:
mode:
authorRomain Guy <romainguy@android.com>2010-03-16 13:44:30 -0700
committerRomain Guy <romainguy@android.com>2010-03-16 13:44:30 -0700
commitad24b8b22527a67a1eb0b64517101335dc5529fd (patch)
treed781680b9e290a7fe32e1e472df2cd85448749c3 /hierarchyviewer
parent6845b5679bbd6480eac600d56458517bcbbad609 (diff)
downloadsdk-ad24b8b22527a67a1eb0b64517101335dc5529fd.zip
sdk-ad24b8b22527a67a1eb0b64517101335dc5529fd.tar.gz
sdk-ad24b8b22527a67a1eb0b64517101335dc5529fd.tar.bz2
Fix HierarchyViewer's loupe mode. It was displaying black with 2.0+ devices.
Change-Id: I645520ec8063efd522a5fecf3b0e204e8b94056e
Diffstat (limited to 'hierarchyviewer')
-rw-r--r--hierarchyviewer/src/com/android/hierarchyviewer/ui/ScreenViewer.java127
1 files changed, 105 insertions, 22 deletions
diff --git a/hierarchyviewer/src/com/android/hierarchyviewer/ui/ScreenViewer.java b/hierarchyviewer/src/com/android/hierarchyviewer/ui/ScreenViewer.java
index 7c17c90..3b0662f 100644
--- a/hierarchyviewer/src/com/android/hierarchyviewer/ui/ScreenViewer.java
+++ b/hierarchyviewer/src/com/android/hierarchyviewer/ui/ScreenViewer.java
@@ -8,6 +8,7 @@ import com.android.hierarchyviewer.ui.util.PngFileFilter;
import com.android.hierarchyviewer.ui.util.IconLoader;
import javax.swing.JComponent;
+import javax.swing.JScrollPane;
import javax.swing.Timer;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
@@ -74,7 +75,7 @@ class ScreenViewer extends JPanel implements ActionListener {
private JSlider zoomSlider;
ScreenViewer(Workspace workspace, IDevice device, int spacing) {
- setLayout(new BorderLayout());
+ setLayout(new GridBagLayout());
setOpaque(false);
this.workspace = workspace;
@@ -85,10 +86,14 @@ class ScreenViewer extends JPanel implements ActionListener {
timer.setRepeats(true);
JPanel panel = buildViewerAndControls();
- add(panel, BorderLayout.WEST);
+ add(panel, new GridBagConstraints(0, 0, 1, 1, 0.3f, 1.0f,
+ GridBagConstraints.FIRST_LINE_START, GridBagConstraints.BOTH,
+ new Insets(0, 0, 0, 0), 0, 0));
JPanel loupePanel = buildLoupePanel(spacing);
- add(loupePanel, BorderLayout.CENTER);
+ add(loupePanel, new GridBagConstraints(1, 0, 1, 1, 0.7f, 1.0f,
+ GridBagConstraints.FIRST_LINE_START, GridBagConstraints.BOTH,
+ new Insets(0, 0, 0, 0), 0, 0));
SwingUtilities.invokeLater(new Runnable() {
public void run() {
@@ -125,9 +130,12 @@ class ScreenViewer extends JPanel implements ActionListener {
JPanel panel = new JPanel(new GridBagLayout());
crosshair = new Crosshair(new ScreenshotViewer());
crosshair.addMouseWheelListener(new WheelZoomListener());
- panel.add(crosshair,
- new GridBagConstraints(0, y++, 2, 1, 1.0f, 0.0f,
- GridBagConstraints.FIRST_LINE_START, GridBagConstraints.NONE,
+ JScrollPane scroller = new JScrollPane(crosshair);
+ scroller.setPreferredSize(new Dimension(320, 480));
+ scroller.setBorder(null);
+ panel.add(scroller,
+ new GridBagConstraints(0, y++, 2, 1, 1.0f, 1.0f,
+ GridBagConstraints.FIRST_LINE_START, GridBagConstraints.BOTH,
new Insets(0, 0, 0, 0), 0, 0));
buildSlider(panel, "Overlay:", "0%", "100%", 0, 100, 30, 1).addChangeListener(
new ChangeListener() {
@@ -474,8 +482,10 @@ class ScreenViewer extends JPanel implements ActionListener {
Point crosshair = new Point();
private int width;
private int height;
+ private final ScreenshotViewer screenshotViewer;
Crosshair(ScreenshotViewer screenshotViewer) {
+ this.screenshotViewer = screenshotViewer;
setOpaque(true);
setLayout(new BorderLayout());
add(screenshotViewer);
@@ -510,6 +520,16 @@ class ScreenViewer extends JPanel implements ActionListener {
}
@Override
+ public Dimension getPreferredSize() {
+ return screenshotViewer.getPreferredSize();
+ }
+
+ @Override
+ public Dimension getMaximumSize() {
+ return screenshotViewer.getPreferredSize();
+ }
+
+ @Override
public void paint(Graphics g) {
super.paint(g);
@@ -660,7 +680,7 @@ class ScreenViewer extends JPanel implements ActionListener {
boolean resize = false;
isLoading = true;
try {
- if (rawImage != null && rawImage.bpp == 16) {
+ if (rawImage != null) {
if (image == null || rawImage.width != image.getWidth() ||
rawImage.height != image.getHeight()) {
image = new BufferedImage(rawImage.width, rawImage.height,
@@ -669,21 +689,13 @@ class ScreenViewer extends JPanel implements ActionListener {
resize = true;
}
- byte[] buffer = rawImage.data;
- int index = 0;
- for (int y = 0 ; y < rawImage.height ; y++) {
- for (int x = 0 ; x < rawImage.width ; x++) {
- int value = buffer[index++] & 0x00FF;
- value |= (buffer[index++] << 8) & 0x0FF00;
-
- int r = ((value >> 11) & 0x01F) << 3;
- int g = ((value >> 5) & 0x03F) << 2;
- int b = ((value ) & 0x01F) << 3;
-
- scanline[x] = 0xFF << 24 | r << 16 | g << 8 | b;
- }
- image.setRGB(0, y, rawImage.width, 1, scanline,
- 0, rawImage.width);
+ switch (rawImage.bpp) {
+ case 16:
+ rawImage16toARGB(rawImage);
+ break;
+ case 32:
+ rawImage32toARGB(rawImage);
+ break;
}
}
} finally {
@@ -692,6 +704,77 @@ class ScreenViewer extends JPanel implements ActionListener {
return resize;
}
+
+ private int getMask(int length) {
+ int res = 0;
+ for (int i = 0 ; i < length ; i++) {
+ res = (res << 1) + 1;
+ }
+
+ return res;
+ }
+
+ private void rawImage32toARGB(RawImage rawImage) {
+ byte[] buffer = rawImage.data;
+ int index = 0;
+
+ final int redOffset = rawImage.red_offset;
+ final int redLength = rawImage.red_length;
+ final int redMask = getMask(redLength);
+ final int greenOffset = rawImage.green_offset;
+ final int greenLength = rawImage.green_length;
+ final int greenMask = getMask(greenLength);
+ final int blueOffset = rawImage.blue_offset;
+ final int blueLength = rawImage.blue_length;
+ final int blueMask = getMask(blueLength);
+ final int alphaLength = rawImage.alpha_length;
+ final int alphaOffset = rawImage.alpha_offset;
+ final int alphaMask = getMask(alphaLength);
+
+ for (int y = 0 ; y < rawImage.height ; y++) {
+ for (int x = 0 ; x < rawImage.width ; x++) {
+ int value = buffer[index++] & 0x00FF;
+ value |= (buffer[index++] & 0x00FF) << 8;
+ value |= (buffer[index++] & 0x00FF) << 16;
+ value |= (buffer[index++] & 0x00FF) << 24;
+
+ int r = ((value >>> redOffset) & redMask) << (8 - redLength);
+ int g = ((value >>> greenOffset) & greenMask) << (8 - greenLength);
+ int b = ((value >>> blueOffset) & blueMask) << (8 - blueLength);
+ int a = 0xFF;
+
+ if (alphaLength != 0) {
+ a = ((value >>> alphaOffset) & alphaMask) << (8 - alphaLength);
+ }
+
+ scanline[x] = a << 24 | r << 16 | g << 8 | b;
+ }
+
+ image.setRGB(0, y, rawImage.width, 1, scanline,
+ 0, rawImage.width);
+ }
+ }
+
+ private void rawImage16toARGB(RawImage rawImage) {
+ byte[] buffer = rawImage.data;
+ int index = 0;
+
+ for (int y = 0 ; y < rawImage.height ; y++) {
+ for (int x = 0 ; x < rawImage.width ; x++) {
+ int value = buffer[index++] & 0x00FF;
+ value |= (buffer[index++] << 8) & 0x0FF00;
+
+ int r = ((value >> 11) & 0x01F) << 3;
+ int g = ((value >> 5) & 0x03F) << 2;
+ int b = ((value ) & 0x01F) << 3;
+
+ scanline[x] = 0xFF << 24 | r << 16 | g << 8 | b;
+ }
+
+ image.setRGB(0, y, rawImage.width, 1, scanline,
+ 0, rawImage.width);
+ }
+ }
@Override
protected void done() {