mirror of
https://github.com/dmolony/DiskBrowser.git
synced 2025-02-16 23:30:52 +00:00
use icon mask
This commit is contained in:
parent
0fde2be8f7
commit
58adb51f33
@ -1,6 +1,7 @@
|
|||||||
package com.bytezone.diskbrowser.applefile;
|
package com.bytezone.diskbrowser.applefile;
|
||||||
|
|
||||||
import java.awt.AlphaComposite;
|
import java.awt.AlphaComposite;
|
||||||
|
import java.awt.Color;
|
||||||
import java.awt.Graphics2D;
|
import java.awt.Graphics2D;
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
import java.awt.image.DataBuffer;
|
import java.awt.image.DataBuffer;
|
||||||
@ -73,6 +74,7 @@ public class IconFile extends AbstractFile
|
|||||||
ptr += dataLen;
|
ptr += dataLen;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// calculate maximum width and height for every icon
|
||||||
int maxHeight = 0;
|
int maxHeight = 0;
|
||||||
int maxWidth = 0;
|
int maxWidth = 0;
|
||||||
for (Icon icon : icons)
|
for (Icon icon : icons)
|
||||||
@ -88,12 +90,17 @@ public class IconFile extends AbstractFile
|
|||||||
int x = base;
|
int x = base;
|
||||||
int y = base;
|
int y = base;
|
||||||
int gap = 5;
|
int gap = 5;
|
||||||
int columns = 4;
|
int columns = Math.min (icons.size (), 4);
|
||||||
int rows = (icons.size () - 1) / columns + 1;
|
int rows = (icons.size () - 1) / columns + 1;
|
||||||
// System.out.printf ("Rows: %d, cols: %d%n", rows, columns);
|
// System.out.printf ("Rows: %d, cols: %d%n", rows, columns);
|
||||||
|
|
||||||
image = new BufferedImage (columns * maxWidth + 2 * base + (columns - 1) * gap,
|
image = new BufferedImage (columns * maxWidth + 2 * base + (columns - 1) * gap,
|
||||||
rows * maxHeight + 2 * base + (rows - 1) * gap, BufferedImage.TYPE_INT_RGB);
|
rows * maxHeight + 2 * base + (rows - 1) * gap, BufferedImage.TYPE_INT_RGB);
|
||||||
|
|
||||||
|
Graphics2D graphics = image.createGraphics ();
|
||||||
|
graphics.setBackground (Color.WHITE);
|
||||||
|
graphics.clearRect (0, 0, image.getWidth (), image.getHeight ());
|
||||||
|
|
||||||
Graphics2D g2d = image.createGraphics ();
|
Graphics2D g2d = image.createGraphics ();
|
||||||
g2d.setComposite (AlphaComposite.getInstance (AlphaComposite.SRC_OVER, (float) 1.0));
|
g2d.setComposite (AlphaComposite.getInstance (AlphaComposite.SRC_OVER, (float) 1.0));
|
||||||
|
|
||||||
@ -185,8 +192,9 @@ public class IconFile extends AbstractFile
|
|||||||
int iconSize;
|
int iconSize;
|
||||||
int iconHeight;
|
int iconHeight;
|
||||||
int iconWidth;
|
int iconWidth;
|
||||||
byte[] main;
|
byte[] iconImage;
|
||||||
byte[] mask;
|
byte[] iconMask;
|
||||||
|
boolean colour;
|
||||||
private final BufferedImage image;
|
private final BufferedImage image;
|
||||||
|
|
||||||
public Image (byte[] buffer, int ptr)
|
public Image (byte[] buffer, int ptr)
|
||||||
@ -196,38 +204,36 @@ public class IconFile extends AbstractFile
|
|||||||
iconHeight = HexFormatter.unsignedShort (buffer, ptr + 4);
|
iconHeight = HexFormatter.unsignedShort (buffer, ptr + 4);
|
||||||
iconWidth = HexFormatter.unsignedShort (buffer, ptr + 6);
|
iconWidth = HexFormatter.unsignedShort (buffer, ptr + 6);
|
||||||
|
|
||||||
main = new byte[iconSize];
|
iconImage = new byte[iconSize];
|
||||||
mask = new byte[iconSize];
|
iconMask = new byte[iconSize];
|
||||||
|
|
||||||
System.arraycopy (buffer, ptr + 8, main, 0, iconSize);
|
colour = (iconType & 0x80) != 0;
|
||||||
System.arraycopy (buffer, ptr + 8 + iconSize, mask, 0, iconSize);
|
|
||||||
|
System.arraycopy (buffer, ptr + 8, iconImage, 0, iconSize);
|
||||||
|
System.arraycopy (buffer, ptr + 8 + iconSize, iconMask, 0, iconSize);
|
||||||
|
|
||||||
int[] colours = palette.getColours ();
|
int[] colours = palette.getColours ();
|
||||||
int gap = 5;
|
int gap = 5;
|
||||||
|
|
||||||
image = new BufferedImage (iconWidth, iconHeight, BufferedImage.TYPE_INT_RGB);
|
image = new BufferedImage (iconWidth, iconHeight, BufferedImage.TYPE_INT_RGB);
|
||||||
|
|
||||||
DataBuffer dataBuffer = image.getRaster ().getDataBuffer ();
|
DataBuffer dataBuffer = image.getRaster ().getDataBuffer ();
|
||||||
int element = 0;
|
int element = 0;
|
||||||
|
|
||||||
int rowBytes = (iconWidth - 1) / 2 + 1;
|
int rowBytes = (iconWidth - 1) / 2 + 1;
|
||||||
for (int i = 0; i < main.length; i += rowBytes)
|
if (true)
|
||||||
{
|
for (int i = 0; i < iconImage.length; i += rowBytes)
|
||||||
for (int j = i, max = i + rowBytes; j < max; j++)
|
|
||||||
{
|
{
|
||||||
int left = (byte) ((main[j] & 0xF0) >>> 4);
|
for (int j = i, max = i + rowBytes; j < max; j++)
|
||||||
int right = (byte) (main[j] & 0x0F);
|
{
|
||||||
dataBuffer.setElem (element++, colours[left]);
|
int left = (byte) ((iconImage[j] & 0xF0) >>> 4);
|
||||||
dataBuffer.setElem (element++, colours[right]);
|
int right = (byte) (iconImage[j] & 0x0F);
|
||||||
|
int maskLeft = (byte) ((iconMask[j] & 0xF0) >>> 4);
|
||||||
|
int maskRight = (byte) (iconMask[j] & 0x0F);
|
||||||
|
dataBuffer.setElem (element++, colours[left & maskLeft]);
|
||||||
|
dataBuffer.setElem (element++, colours[right & maskRight]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// element += gap;
|
|
||||||
// for (int j = i, max = i + rowBytes; j < max; j++)
|
|
||||||
// {
|
|
||||||
// int left = (byte) ((mask[j] & 0xF0) >>> 4);
|
|
||||||
// int right = (byte) (mask[j] & 0x0F);
|
|
||||||
// dataBuffer.setElem (element++, colours[left]);
|
|
||||||
// dataBuffer.setElem (element++, colours[right]);
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public int size ()
|
public int size ()
|
||||||
@ -244,9 +250,9 @@ public class IconFile extends AbstractFile
|
|||||||
text.append (String.format ("Icon size .... %d%n", iconSize));
|
text.append (String.format ("Icon size .... %d%n", iconSize));
|
||||||
text.append (String.format ("Icon height .. %d%n", iconHeight));
|
text.append (String.format ("Icon height .. %d%n", iconHeight));
|
||||||
text.append (String.format ("Icon width ... %d%n%n", iconWidth));
|
text.append (String.format ("Icon width ... %d%n%n", iconWidth));
|
||||||
appendIcon (text, main);
|
appendIcon (text, iconImage);
|
||||||
text.append ("\n\n");
|
text.append ("\n\n");
|
||||||
appendIcon (text, mask);
|
appendIcon (text, iconMask);
|
||||||
|
|
||||||
return text.toString ();
|
return text.toString ();
|
||||||
}
|
}
|
||||||
@ -291,7 +297,7 @@ public class IconFile extends AbstractFile
|
|||||||
private void appendIcon (StringBuilder text, byte[] buffer)
|
private void appendIcon (StringBuilder text, byte[] buffer)
|
||||||
{
|
{
|
||||||
int rowBytes = (iconWidth - 1) / 2 + 1;
|
int rowBytes = (iconWidth - 1) / 2 + 1;
|
||||||
for (int i = 0; i < main.length; i += rowBytes)
|
for (int i = 0; i < iconImage.length; i += rowBytes)
|
||||||
{
|
{
|
||||||
for (int ptr = i, max = i + rowBytes; ptr < max; ptr++)
|
for (int ptr = i, max = i + rowBytes; ptr < max; ptr++)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user