Skip to content
This repository has been archived by the owner on Jul 23, 2024. It is now read-only.

Commit

Permalink
add ico parser
Browse files Browse the repository at this point in the history
  • Loading branch information
hsiafan committed Jun 10, 2019
1 parent 7274c19 commit 671051f
Show file tree
Hide file tree
Showing 15 changed files with 522 additions and 24 deletions.
117 changes: 117 additions & 0 deletions exclude_resources.list
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
regex:/java.desktop/apple/laf/(?!JRSUIFocus\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/sun/swing/(?!FilePane\$DetailsTableRowSorter\$2\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/sun/swing/plaf/(?!GTKKeybindings\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/sun/swing/plaf/synth/(?!SynthFileChooserUIImpl\$DirectoryComboBoxAction\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/sun/swing/table/(?!DefaultTableCellHeaderRenderer\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/sun/swing/text/(?!TextComponentPrintable\$9\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/sun/swing/text/html/(?!FrameEditorPaneTag\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/sun/swing/icon/(?!SortArrowIcon\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/sun/print/(?!RasterPrinterJob\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/sun/print/resources/(?!orientRevPortrait\.png)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/sun/java2d/(?!Spans\$Span\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/sun/java2d/cmm/(?!PCMM\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/sun/java2d/cmm/lcms/(?!LcmsServiceProvider\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/sun/java2d/cmm/profiles/(?!sRGB\.pf)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/sun/java2d/marlin/(?!DTransformingPathConsumer2D\$ClosedPathDetector\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/sun/java2d/marlin/stats/(?!StatLong\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/sun/java2d/pipe/(?!BufferedBufImgOps\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/sun/java2d/pipe/hw/(?!AccelTypedVolatileImage\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/sun/java2d/loops/(?!FillRect\$General\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/sun/java2d/opengl/(?!CGLVolatileSurfaceManager\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/sun/awt/(?!WeakIdentityHashMap\$WeakKey\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/sun/awt/util/(?!PerformanceLogger\$1\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/sun/awt/shell/(?!ShellFolder\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/sun/awt/dnd/(?!SunDropTargetContextPeer\$EventDispatcher\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/sun/awt/resources/(?!awt\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/sun/awt/resources/cursors/(?!CopyDrop32x32\.gif)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/sun/awt/www/content/(?!MultimediaContentHandlers\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/sun/awt/www/content/image/(?!x_xbitmap\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/sun/awt/www/content/audio/(?!x_wav\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/sun/awt/image/(?!PixelConverter\$Ushort555Rgbx\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/sun/awt/datatransfer/(?!DataTransferer\$ReencodingInputStream\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/sun/awt/geom/(?!Order2\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/sun/awt/im/(?!ExecutableInputMethodManager\$3\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/sun/awt/event/(?!IgnorePaintEvent\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/sun/font/(?!CMap\$CMapFormat0\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/sun/font/lookup/(?!JDKFontLookup\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/sun/lwawt/(?!LWContainerPeer\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/sun/lwawt/macosx/(?!CSystemTray\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/java/applet/(?!AudioClip\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/java/awt/(?!GraphicsCallback\$PaintHeavyweightComponentsCallback\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/java/awt/dnd/(?!InvalidDnDOperationException\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/java/awt/dnd/peer/(?!DragSourceContextPeer\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/java/awt/color/(?!ProfileDataException\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/java/awt/desktop/(?!FilesEvent\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/java/awt/peer/(?!ButtonPeer\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/java/awt/print/(?!PrinterException\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/java/awt/image/(?!DataBufferUShort\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/java/awt/image/renderable/(?!ContextualRenderedImageFactory\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/java/awt/geom/(?!Point2D\$Float\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/java/awt/im/(?!InputContext\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/java/awt/im/spi/(?!InputMethod\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/java/awt/font/(?!ImageGraphicAttribute\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/java/awt/event/(?!KeyListener\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/javax/swing/(?!JInternalFrame\$AccessibleJInternalFrame\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/javax/swing/border/(?!BevelBorder\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/javax/swing/tree/(?!FixedHeightLayoutCache\$VisibleFHTreeStateNodeEnumeration\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/javax/swing/filechooser/(?!FileNameExtensionFilter\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/javax/swing/plaf/(?!TextUI\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/javax/swing/plaf/metal/(?!MetalLookAndFeel\$AATextListener\$1\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/javax/swing/plaf/metal/sounds/(?!PopupMenuPopup\.wav)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/javax/swing/plaf/metal/icons/ocean/(?!info\.png)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/javax/swing/plaf/metal/icons/(?!Error\.gif)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/javax/swing/plaf/multi/(?!MultiScrollBarUI\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/javax/swing/plaf/basic/(?!BasicColorChooserUI\$Handler\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/javax/swing/plaf/basic/icons/(?!JavaCup16\.png)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/javax/swing/plaf/synth/(?!SynthRootPaneUI\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/javax/swing/plaf/nimbus/(?!ComboBoxArrowButtonEditableState\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/javax/swing/undo/(?!AbstractUndoableEdit\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/javax/swing/table/(?!TableRowSorter\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/javax/swing/colorchooser/(?!SwatchPanel\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/javax/swing/text/(?!DefaultEditorKit\$PreviousWordAction\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/javax/swing/text/rtf/(?!Constants\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/javax/swing/text/rtf/charsets/(?!ansi\.txt)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/javax/swing/text/html/(?!HiddenTagView\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/javax/swing/text/html/parser/(?!ContentModelState\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/javax/swing/event/(?!TreeSelectionListener\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/javax/swing/beaninfo/images/(?!JButtonMono16\.gif)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/javax/print/(?!MultiDocPrintJob\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/javax/print/attribute/(?!SupportedValuesAttribute\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/javax/print/attribute/standard/(?!MediaSize\$JIS\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/javax/print/event/(?!PrintJobListener\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/javax/imageio/(?!ImageIO\$CacheInfo\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/javax/imageio/plugins/jpeg/(?!JPEGHuffmanTable\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/javax/imageio/plugins/bmp/(?!BMPImageWriteParam\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/javax/imageio/plugins/tiff/(?!BaselineTIFFTagSet\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/javax/imageio/stream/(?!FileImageOutputStream\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/javax/imageio/spi/(?!ImageTranscoderSpi\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/javax/imageio/event/(?!IIOWriteWarningListener\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/javax/imageio/metadata/(?!IIOInvalidTreeException\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/javax/accessibility/(?!AccessibleContext\$1\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/javax/sound/sampled/(?!Control\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/javax/sound/sampled/spi/(?!MixerProvider\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/javax/sound/midi/(?!Receiver\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/javax/sound/midi/spi/(?!MidiFileWriter\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/com/apple/eio/(?!FileManager\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/com/apple/laf/(?!AquaFonts\$5\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/com/apple/laf/resources/(?!aqua_ja\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/com/apple/eawt/(?!_AppEventHandler\$_NativeEvent\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/com/apple/eawt/event/(?!GesturePhaseEvent\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/com/sun/swing/internal/plaf/metal/resources/(?!metal_zh_CN\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/com/sun/swing/internal/plaf/basic/resources/(?!basic_ja\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/com/sun/swing/internal/plaf/synth/resources/(?!synth_zh_CN\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/com/sun/java/swing/plaf/motif/(?!MotifDesktopIconUI\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/com/sun/java/swing/plaf/motif/resources/(?!motif\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/com/sun/java/swing/plaf/motif/icons/(?!Error\.gif)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/com/sun/java/swing/(?!SwingUtilities3\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/com/sun/imageio/plugins/png/(?!PNGImageReader\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/com/sun/imageio/plugins/common/(?!BitFile\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/com/sun/imageio/plugins/wbmp/(?!WBMPImageReader\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/com/sun/imageio/plugins/jpeg/(?!JPEGImageReader\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/com/sun/imageio/plugins/bmp/(?!BMPImageReader\$1\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/com/sun/imageio/plugins/tiff/(?!TIFFDeflater\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/com/sun/imageio/plugins/gif/(?!GIFImageWriteParam\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/com/sun/imageio/stream/(?!StreamCloser\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/com/sun/imageio/spi/(?!RAFImageOutputStreamSpi\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/com/sun/accessibility/internal/resources/(?!accessibility\.class)[_a-zA-Z0-9\.\$]+
regex:/java.desktop/com/sun/media/sound/(?!AudioFloatFormatConverter\.class)[_a-zA-Z0-9\.\$]+
21 changes: 4 additions & 17 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<artifactId>cute-proxy</artifactId>
<name>Cute Proxy</name>
<packaging>jar</packaging>
<version>1.0.0</version>
<version>1.0.1</version>

<properties>
<maven.compiler.source>11</maven.compiler.source>
Expand Down Expand Up @@ -85,13 +85,6 @@
<version>0.1.2</version>
</dependency>

<!-- image support for .ico -->
<dependency>
<groupId>org.jclarion</groupId>
<artifactId>image4j</artifactId>
<version>0.7</version>
</dependency>

<!-- for jsse -->
<dependency>
<groupId>org.bouncycastle</groupId>
Expand Down Expand Up @@ -257,15 +250,6 @@
${basedir}/src/main/modules/gson/module-info.java
</moduleInfoFile>
</module>
<module>
<artifact>
<groupId>org.jclarion</groupId>
<artifactId>image4j</artifactId>
</artifact>
<moduleInfoFile>
${basedir}/src/main/modules/image4j/module-info.java
</moduleInfoFile>
</module>
<module>
<artifact>
<groupId>io.netty</groupId>
Expand Down Expand Up @@ -398,6 +382,9 @@
<argument>--ignore-signing-information</argument>
<argument>--no-header-files</argument>
<argument>--no-man-pages</argument>
<!-- try to exclude unused swing and awt resources -->
<argument>--exclude-resources=@${project.basedir}/exclude_resources.list</argument>
<argument>--exclude-files=glob:/java.desktop/lib/*</argument>
</arguments>
</configuration>
</execution>
Expand Down
1 change: 0 additions & 1 deletion src/main/java/module-info.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
requires org.tukaani.xz;

// dependency without stable module name
requires image4j;
requires dec;
requires gson;
requires bcprov.jdk15on;
Expand Down
13 changes: 7 additions & 6 deletions src/main/java/net/dongliu/proxy/ui/UIUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import javafx.beans.binding.Bindings;
import javafx.beans.value.ObservableValue;
import javafx.concurrent.Task;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Node;
import javafx.scene.control.Alert;
import javafx.scene.control.ScrollPane;
Expand All @@ -16,11 +15,10 @@
import javafx.scene.text.Text;
import net.dongliu.proxy.store.BodyType;
import net.dongliu.proxy.ui.component.ProgressDialog;
import net.sf.image4j.codec.ico.ICODecoder;
import net.dongliu.proxy.ui.ico.IconDecoders;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import java.io.UncheckedIOException;
Expand Down Expand Up @@ -70,9 +68,12 @@ public static Node getImagePane(InputStream in, BodyType type) {
}

private static Image getIconImage(InputStream in) throws IOException {
var images = ICODecoder.read(in);
var image = Collections.max(images, Comparator.comparingInt(BufferedImage::getWidth));
return SwingFXUtils.toFXImage(image, null);
// var images = ICODecoder.read(in);
// var image = Collections.max(images, Comparator.comparingInt(BufferedImage::getWidth));

// return SwingFXUtils.toFXImage(image, null);
var image = Collections.max(IconDecoders.decode(in.readAllBytes()), Comparator.comparingDouble(Image::getWidth));
return image;
}

public static void showMessageDialog(String message) {
Expand Down
34 changes: 34 additions & 0 deletions src/main/java/net/dongliu/proxy/ui/ico/BitmapFileHeader.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package net.dongliu.proxy.ui.ico;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;

public class BitmapFileHeader {
public static final int SIZE = 14;
private short magic;
private int size;
private short reserved1;
private short reserved2;
private int dataOffset;

public BitmapFileHeader(short magic, int size, short reserved1, short reserved2, int dataOffset) {
this.magic = magic;
this.size = size;
this.reserved1 = reserved1;
this.reserved2 = reserved2;
this.dataOffset = dataOffset;
}

public static BitmapFileHeader newHeader(int size, int dataOffset) {
return new BitmapFileHeader((short) 0x4d42, size, (short) 0, (short) 0, dataOffset);
}

public void encode(ByteBuffer buffer) {
buffer.order(ByteOrder.LITTLE_ENDIAN)
.putShort(magic)
.putInt(size)
.putShort(reserved1)
.putShort(reserved2)
.putInt(dataOffset);
}
}
94 changes: 94 additions & 0 deletions src/main/java/net/dongliu/proxy/ui/ico/BitmapInfoHeader.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
package net.dongliu.proxy.ui.ico;

import java.nio.ByteBuffer;

public class BitmapInfoHeader {
private int headerSize;
private int width;
private int height;
private short planeNum;
private short bitsPerPixel;
private int compression;
private int imageSize;
private int xpixelsPerM;
private int ypixelsPerM;
private int colorsUsed;
private int colorsImportant;

public static final int SIZE = 40;

public BitmapInfoHeader(int headerSize, int width, int height, short planeNum, short bitsPerPixel, int compression,
int imageSize, int xpixelsPerM, int ypixelsPerM, int colorsUsed, int colorsImportant) {
this.headerSize = headerSize;
this.width = width;
this.height = height;
this.planeNum = planeNum;
this.bitsPerPixel = bitsPerPixel;
this.compression = compression;
this.imageSize = imageSize;
this.xpixelsPerM = xpixelsPerM;
this.ypixelsPerM = ypixelsPerM;
this.colorsUsed = colorsUsed;
this.colorsImportant = colorsImportant;
}

public static BitmapInfoHeader decode(ByteBuffer buffer) {
return new BitmapInfoHeader(
buffer.getInt(),
buffer.getInt(),
buffer.getInt(),
buffer.getShort(),
buffer.getShort(),
buffer.getInt(),
buffer.getInt(),
buffer.getInt(),
buffer.getInt(),
buffer.getInt(),
buffer.getInt()
);
}

public int headerSize() {
return Unsigns.ensure(headerSize);
}

public int width() {
return Unsigns.ensure(width);
}

public int height() {
return Unsigns.ensure(height);
}

public int planeNum() {
return Short.toUnsignedInt(planeNum);
}

public int bitsPerPixel() {
return Short.toUnsignedInt(bitsPerPixel);
}

public int compression() {
return compression;
}

public int imageSize() {
return Unsigns.ensure(imageSize);
}

public int xpixelsPerM() {
return Unsigns.ensure(xpixelsPerM);
}

public int ypixelsPerM() {
return Unsigns.ensure(ypixelsPerM);
}

public int colorsUsed() {
return Unsigns.ensure(colorsUsed);
}

public int colorsImportant() {
return Unsigns.ensure(colorsImportant);
}
}
Loading

0 comments on commit 671051f

Please sign in to comment.