inject splash screen bmp
authorDmitry Jemerov <yole@jetbrains.com>
Wed, 20 Feb 2013 18:19:43 +0000 (19:19 +0100)
committerDmitry Jemerov <yole@jetbrains.com>
Wed, 20 Feb 2013 19:14:12 +0000 (20:14 +0100)
tools/launcher-generator/.idea/libraries/sanselan_0_98_snapshot.xml [new file with mode: 0644]
tools/launcher-generator/launcher-generator.iml
tools/launcher-generator/src/com/pme/exe/res/bmp/BitmapFileHeader.java [deleted file]
tools/launcher-generator/src/com/pme/exe/res/bmp/BmpFile.java [deleted file]
tools/launcher-generator/src/com/pme/exe/res/bmp/PictureResourceInjector.java [deleted file]
tools/launcher-generator/src/com/pme/launcher/LauncherGenerator.java
tools/launcher-generator/src/com/pme/launcher/LauncherGeneratorMain.java

diff --git a/tools/launcher-generator/.idea/libraries/sanselan_0_98_snapshot.xml b/tools/launcher-generator/.idea/libraries/sanselan_0_98_snapshot.xml
new file mode 100644 (file)
index 0000000..845527f
--- /dev/null
@@ -0,0 +1,9 @@
+<component name="libraryTable">
+  <library name="sanselan-0.98-snapshot">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/../../lib/sanselan-0.98-snapshot.jar!/" />
+    </CLASSES>
+    <JAVADOC />
+    <SOURCES />
+  </library>
+</component>
\ No newline at end of file
index 0602a743d3f200d071ba6cd031f2873793b04163..a358b2136eea22d595af766f7e6794b0784f96d0 100644 (file)
@@ -9,6 +9,7 @@
     <orderEntry type="sourceFolder" forTests="false" />
     <orderEntry type="module" module-name="community-resources" />
     <orderEntry type="library" name="jdom" level="project" />
+    <orderEntry type="library" name="sanselan-0.98-snapshot" level="project" />
   </component>
 </module>
 
diff --git a/tools/launcher-generator/src/com/pme/exe/res/bmp/BitmapFileHeader.java b/tools/launcher-generator/src/com/pme/exe/res/bmp/BitmapFileHeader.java
deleted file mode 100644 (file)
index 7348672..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright 2006 ProductiveMe Inc.
- * Copyright 2013 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.pme.exe.res.bmp;
-
-import com.pme.exe.Bin;
-
-/**
- * Date: May 3, 2006
- * Time: 12:34:47 PM
- */
-public class BitmapFileHeader extends Bin.Structure{
-  public BitmapFileHeader() {
-    super("Bitmap File Header");
-    addMember( new Word( "bfType" ) );
-    addMember( new DWord( "bfSize" ) );
-    addMember( new Word( "bfReserved1" ) );
-    addMember( new Word( "bfReserved2" ) );
-    addMember( new DWord( "bfOffBits" ) );
-  }
-}
diff --git a/tools/launcher-generator/src/com/pme/exe/res/bmp/BmpFile.java b/tools/launcher-generator/src/com/pme/exe/res/bmp/BmpFile.java
deleted file mode 100644 (file)
index 93c9fee..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright 2006 ProductiveMe Inc.
- * Copyright 2013 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.pme.exe.res.bmp;
-
-import com.pme.exe.Bin;
-
-import java.io.File;
-import java.io.DataInput;
-import java.io.IOException;
-import java.io.RandomAccessFile;
-
-/**
- * Date: May 3, 2006
- * Time: 12:33:01 PM
- */
-public class BmpFile extends Bin.Structure {
-  private File myFile;
-  private BitmapFileHeader myHeader = new BitmapFileHeader();
-
-  public BmpFile(File file) {
-    super(file.getName());
-    myFile = file;
-    addMember( myHeader );
-  }
-
-  public void read() throws IOException {
-    RandomAccessFile stream = null;
-    try {
-      stream = new RandomAccessFile(myFile, "r");
-      read(stream);
-    } finally {
-      if (stream != null) {
-        stream.close();
-      }
-    }
-  }
-
-  public void read(DataInput stream) throws IOException {
-    super.read(stream);
-    Value bfSize = myHeader.getValueMember("bfSize");
-    long size = bfSize.getValue() - sizeInBytes();
-    Bytes bytes = new Bytes( "Data", size );
-    bytes.read( stream );
-    addMember( bytes );
-  }
-}
diff --git a/tools/launcher-generator/src/com/pme/exe/res/bmp/PictureResourceInjector.java b/tools/launcher-generator/src/com/pme/exe/res/bmp/PictureResourceInjector.java
deleted file mode 100644 (file)
index 0902800..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright 2006 ProductiveMe Inc.
- * Copyright 2013 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.pme.exe.res.bmp;
-
-import com.pme.exe.res.DirectoryEntry;
-import com.pme.exe.res.RawResource;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.RandomAccessFile;
-
-/**
- * Date: May 3, 2006
- * Time: 1:00:08 PM
- */
-public class PictureResourceInjector {
-  public class PictureWrongFormat extends IOException {
-    public PictureWrongFormat(File file) {
-      super("Picture file is not found: " + file.getPath());
-    }
-  }
-
-  public void inject(File file, DirectoryEntry root, String resourceId) throws IOException {
-    byte[] bytes = new byte[(int) file.length()];
-    RandomAccessFile stream = null;
-    try {
-      stream = new RandomAccessFile(file, "r");
-      stream.read(bytes);
-    }
-    catch (IOException exception) {
-      throw new PictureWrongFormat(file);
-    }
-    finally {
-      if (stream != null) {
-        stream.close();
-      }
-    }
-    DirectoryEntry subDirBmp = root.findSubDir("IRD2").findSubDir(resourceId);
-    RawResource bmpRes = subDirBmp.getRawResource(0);
-    bmpRes.setBytes(bytes);
-  }
-
-}
index 7316ddce8f7ffbe0c100f5c126b26617d99fc3ff..5b43c35b9aab9974af918d1e48cd390748a6e2e3 100644 (file)
 
 package com.pme.launcher;
 
+import com.pme.exe.Bin;
 import com.pme.exe.ExeReader;
 import com.pme.exe.SectionReader;
-import com.pme.exe.Bin;
-import com.pme.exe.res.*;
-import com.pme.exe.res.bmp.PictureResourceInjector;
+import com.pme.exe.res.DirectoryEntry;
+import com.pme.exe.res.RawResource;
+import com.pme.exe.res.ResourceSectionReader;
+import com.pme.exe.res.StringTableDirectory;
 import com.pme.exe.res.icon.IconResourceInjector;
 import com.pme.exe.res.vi.VersionInfo;
 import com.pme.util.OffsetTrackingInputStream;
@@ -35,7 +37,6 @@ import java.io.*;
 public class LauncherGenerator {
   private File myTemplate;
   private File myIcon;
-  private File myBmp;
   private File myExePath;
   private StringTableDirectory myStringTableDirectory;
   private DirectoryEntry myRoot;
@@ -67,11 +68,6 @@ public class LauncherGenerator {
       iconInjector.injectIcon(myIcon, myRoot, "IRD101");
     }
 
-    if (myBmp != null) {
-      PictureResourceInjector bmpInjector = new PictureResourceInjector();
-      bmpInjector.inject(myBmp, myRoot, "IRD104");
-    }
-
     DirectoryEntry viDir = myRoot.findSubDir("IRD16").findSubDir( "IRD1" );
     Bin.Bytes viBytes = viDir.getRawResource( 0 ).getBytes();
     ByteArrayInputStream bytesStream = new ByteArrayInputStream(viBytes.getBytes());
@@ -91,4 +87,10 @@ public class LauncherGenerator {
   public void setResourceString(int id, String value) {
     myStringTableDirectory.setString(id, value);
   }
+
+  public void injectBitmap(int id, byte[] bitmapData) {
+    DirectoryEntry subDirBmp = myRoot.findSubDir("IRD2").findSubDir("IRD" + id);
+    RawResource bmpRes = subDirBmp.getRawResource(0);
+    bmpRes.setBytes(bitmapData);
+  }
 }
index 73dbff498e687a2a4c83881cbc94b11361794a9e..b08f4dc6b824b5f350bb5d560389e2a863068db6 100644 (file)
 
 package com.pme.launcher;
 
+import org.apache.sanselan.ImageFormat;
+import org.apache.sanselan.Sanselan;
 import org.jdom.Document;
 import org.jdom.input.SAXBuilder;
 
+import java.awt.image.BufferedImage;
 import java.io.*;
 import java.nio.charset.Charset;
 import java.util.HashMap;
@@ -41,20 +44,41 @@ public class LauncherGeneratorMain {
     File template = new File(args[0]);
     if (!template.exists()) {
       System.err.println("Launcher template EXE file " + args[0] + " not found");
-      System.exit(1);
+      System.exit(2);
     }
 
     InputStream appInfoStream = LauncherGeneratorMain.class.getClassLoader().getResourceAsStream(args[1]);
     if (appInfoStream == null) {
       System.err.println("Application info file " + appInfoStream + " not found");
-      System.exit(1);
+      System.exit(3);
     }
     Document appInfo;
     try {
       appInfo = new SAXBuilder().build(appInfoStream);
     } catch (Exception e) {
       System.err.println("Error loading application info file " + appInfoStream + ": " + e.getMessage());
-      System.exit(1);
+      System.exit(4);
+      return;
+    }
+
+    String splashUrl = appInfo.getRootElement().getChild("logo").getAttributeValue("url");
+    if (splashUrl.startsWith("/")) {
+      splashUrl = splashUrl.substring(1);
+    }
+    InputStream splashStream = LauncherGeneratorMain.class.getClassLoader().getResourceAsStream(splashUrl);
+    if (splashStream == null) {
+      System.err.println("Splash screen image file file " + splashUrl + " not found");
+      System.exit(5);
+    }
+
+    ByteArrayOutputStream splashBmpStream = new ByteArrayOutputStream();
+    try {
+      BufferedImage bufferedImage = Sanselan.getBufferedImage(splashStream);
+      Sanselan.writeImage(bufferedImage, splashBmpStream, ImageFormat.IMAGE_FORMAT_BMP, new HashMap());
+    }
+    catch (Exception e) {
+      System.err.println("Error converting splash screen to BMP: " + e.getMessage());
+      System.exit(6);
     }
 
     Map<String, Integer> resourceIDs;
@@ -63,7 +87,7 @@ public class LauncherGeneratorMain {
     }
     catch (Exception e) {
       System.err.println("Error loading resource.h: " + e.getMessage());
-      System.exit(1);
+      System.exit(7);
       return;
     }
 
@@ -79,7 +103,7 @@ public class LauncherGeneratorMain {
     }
     catch (IOException e) {
       System.err.println("Error loading launcher properties: " + e.getMessage());
-      System.exit(1);
+      System.exit(8);
     }
 
     LauncherGenerator generator = new LauncherGenerator(template, new File(args[4]));
@@ -91,14 +115,17 @@ public class LauncherGeneratorMain {
         Integer id = resourceIDs.get(key);
         if (id == null) {
           System.err.println("Invalid stringtable ID found: " + key);
-          System.exit(1);
+          System.exit(9);
         }
         generator.setResourceString(id, (String) pair.getValue());
       }
 
+      generator.injectBitmap(resourceIDs.get("IDB_SPLASH"), splashBmpStream.toByteArray());
+
       generator.generate();
     } catch (IOException e) {
       e.printStackTrace();
+      System.exit(10);
     }
   }