Skip to content

Commit a61fe8b

Browse files
committed
1.0.2
1 parent 8eb1a2a commit a61fe8b

File tree

5 files changed

+237
-24
lines changed

5 files changed

+237
-24
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Icon Generator 1.0.0
1+
# Icon Generator 1.0.2
22

33
Icon Generator is a desktop application developed with Apache Flex and Adobe AIR that helps developers in the task of automating the generation of graphic assets in several sizes.
44

@@ -10,7 +10,7 @@ Some of the key features are:
1010
- Generation of iOS launch screens for iPhones and iPads in Portrait and landscape modes.
1111
- Free and open source!
1212

13-
This application is based on the [Application Icons](http://help.adobe.com/en_US/air/build/WS901d38e593cd1bac1e63e3d129907d2886-8000.html) article from AIR's site.
13+
This application is based on the [Application Icons](http://help.adobe.com/en_US/air/build/WS901d38e593cd1bac1e63e3d129907d2886-8000.html) article from Adobe AIR's site.
1414

1515
To compile this application you will require the [PNGEncoder2 library](https://github.com/cameron314/PNGEncoder2) and recent versions of Apache Flex and Adobe AIR SDKs.
1616

@@ -20,7 +20,7 @@ To compile this application you will require the [PNGEncoder2 library](https://g
2020

2121
You can test this app by downloading it directly from GitHub. You only require to have the AIR runtime installed on your Windows or OSX machine.
2222

23-
[![Download](http://i.imgur.com/333OC0X.png)](https://github.com/PhantomAppDevelopment/icon-generator/releases/download/1.0.0/IconGenerator.air)
23+
[![Download](http://i.imgur.com/333OC0X.png)](https://github.com/PhantomAppDevelopment/icon-generator/releases/download/1.0.2/IconGenerator.air)
2424

2525
## Donations
2626

src/utils/Bicubic.as

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
package utils
2+
{
3+
import flash.display.BitmapData;
4+
import flash.filters.BitmapFilterQuality;
5+
import flash.filters.BlurFilter;
6+
import flash.geom.Point;
7+
8+
public class Bicubic
9+
{
10+
/**
11+
* Resize an Image with bicubic interpolation
12+
* @param width the new desired width
13+
* @param height the new desired height
14+
* @param bitmapData the original sized BitmapData
15+
* @return
16+
*/
17+
public static function interpolateBicubic(bitmapData:BitmapData, width:int, height:int):BitmapData
18+
{
19+
// same size no need to resize
20+
if( width == bitmapData.width && height == bitmapData.height )
21+
{
22+
return bitmapData.clone();
23+
}
24+
25+
var interpolated :BitmapData = new BitmapData( width, height, true, 0x00000000 );
26+
var original_copy :BitmapData = bitmapData.clone();
27+
28+
var xFactor:Number = bitmapData.width / interpolated.width;
29+
var yFactor:Number = bitmapData.height / interpolated.height;
30+
31+
if (xFactor > 1 || yFactor > 1)
32+
original_copy.applyFilter(original_copy, original_copy.rect, new Point(0, 0), new BlurFilter(1.4*(xFactor/2),1.4*(yFactor/2),BitmapFilterQuality.HIGH));
33+
34+
var step:int = 0;
35+
while ( step < interpolated.width )
36+
{
37+
for (var y:int = 0; y < interpolated.height; y++){
38+
interpolated.setPixel32(step, y, getPixelBicubic32(step * xFactor, y * yFactor, original_copy));
39+
}
40+
step++;
41+
}
42+
43+
return interpolated;
44+
}
45+
46+
private static function getPixelBicubic32( x:Number, y:Number, bitmapData:BitmapData ):Number
47+
{
48+
var i:int = int(x);
49+
var j:int = int(y);
50+
51+
if (((i - 1) < 0) || ((j - 1) < 0))
52+
return bitmapData.getPixel32(i, j);
53+
else if (((i + 1) >= bitmapData.width) || ((i + 2) >= bitmapData.width) ||
54+
((j + 1) >= bitmapData.height) || ((j + 2) >= bitmapData.height))
55+
return bitmapData.getPixel32(i, j);
56+
57+
var dx :Number = x - i;
58+
var dy :Number = y - j;
59+
var asum:Number = 0;
60+
var rsum:Number = 0;
61+
var gsum:Number = 0;
62+
var bsum:Number = 0;
63+
64+
var Rmdx:Array = new Array(4);
65+
var Rdyn:Array = new Array(4);
66+
for( var m:int = -1; m <= 2; ++m )
67+
Rmdx[m + 1] = A(m - dx);
68+
for( var n:int = -1; n <= 2; ++n )
69+
Rdyn[n + 1] = A(dy - n);
70+
71+
for( m = -1; m <= 2; ++m )
72+
{
73+
for (n = -1; n <= 2; ++n)
74+
{
75+
var rgb :int = bitmapData.getPixel32(i + m, j + n);
76+
var a :int = (rgb >> 24) & 0x0FF;
77+
var r :int = (rgb >> 16) & 0x0FF;
78+
var g :int = (rgb >> 8) & 0x0FF;
79+
var b :int = (rgb >> 0) & 0x0FF;
80+
81+
var Rres:Number = Rmdx[m + 1] * Rdyn[n + 1];
82+
asum += a * Rres;
83+
rsum += r * Rres;
84+
gsum += g * Rres;
85+
bsum += b * Rres;
86+
}
87+
}
88+
89+
var alpha:int = (int)(asum + 0.5);
90+
if(alpha < 0)
91+
alpha = 0;
92+
else if(alpha > 255)
93+
alpha = 255;
94+
95+
var red:int = (int)(rsum + 0.5);
96+
if(red < 0)
97+
red = 0;
98+
else if(red > 255)
99+
red = 255;
100+
101+
var green:int = (int)(gsum + 0.5);
102+
if(green < 0)
103+
green = 0;
104+
else if(green > 255)
105+
green = 255;
106+
107+
var blue:int = (int)(bsum + 0.5);
108+
if(blue < 0)
109+
blue = 0;
110+
else if(blue > 255)
111+
blue = 255;
112+
113+
return (alpha << 24) | (red << 16) | (green << 8) | (blue << 0);
114+
}
115+
116+
private static function A( x:Number ):Number
117+
{
118+
var p0:Number = ((x + 2) > 0) ? (x + 2) : 0;
119+
var p1:Number = ((x + 1) > 0) ? (x + 1) : 0;
120+
var p2:Number = (x > 0) ? x : 0;
121+
var p3:Number = ((x - 1) > 0) ? (x - 1) : 0;
122+
123+
return (1 / 6) * (p0 * p0 * p0 - 4 * (p1 * p1 * p1) + 6 * (p2 * p2 * p2) - 4 * (p3 * p3 * p3));
124+
}
125+
}
126+
}

src/views/IconView.mxml

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
import spark.components.CheckBox;
1313
import spark.events.IndexChangeEvent;
1414
15+
import utils.Bicubic;
16+
1517
[Bindable] private var AllArray:Array;
1618
[Bindable] private var AndroidArray:Array;
1719
[Bindable] private var iOSArray:Array;
@@ -20,7 +22,9 @@
2022
[Bindable] private var preset2:Array;
2123
[Bindable] private var preset3:Array;
2224
25+
private var bicubic:Boolean;
2326
private var fileRef:FileReference;
27+
private var settings:Object;
2428
2529
protected function init(event:FlexEvent):void
2630
{
@@ -63,32 +67,65 @@
6367
{
6468
currentState = "ExportState";
6569
loadCustomPresets();
70+
71+
settings = new Object();
72+
loadSettings();
73+
6674
generateCheckboxes();
6775
}
6876
6977
private function loadCustomPresets():void
70-
{
78+
{
7179
var file:File = File.applicationStorageDirectory.resolvePath("iconpresets.data");
7280
7381
if(file.exists)
7482
{
7583
var fileStream:FileStream = new FileStream();
7684
fileStream.open(file, FileMode.READ);
7785
78-
if(fileStream.bytesAvailable == 0){
86+
if(file.size <= 1){
7987
fileStream.close();
8088
} else {
8189
var presets:Object = fileStream.readObject();
8290
8391
preset1 = String(presets.preset1).split(",");
8492
preset2 = String(presets.preset2).split(",");
8593
preset3 = String(presets.preset3).split(",");
86-
trace(preset3);
8794
fileStream.close();
8895
}
8996
}
9097
}
9198
99+
private function loadSettings():void
100+
{
101+
var file:File = File.applicationStorageDirectory.resolvePath("settings.data");
102+
103+
if(file.exists)
104+
{
105+
var fileStream:FileStream = new FileStream();
106+
fileStream.open(file, FileMode.READ);
107+
108+
if(file.size <= 1){
109+
fileStream.close();
110+
} else {
111+
settings = fileStream.readObject();
112+
113+
if(settings.hasOwnProperty("bicubic")){
114+
bicubic = settings.bicubic.valueOf();
115+
} else {
116+
bicubic = false;
117+
}
118+
119+
fileStream.close();
120+
}
121+
} else {
122+
123+
//Settings file doesn't exists, so we fallback to the defaults.
124+
125+
bicubic = false;
126+
}
127+
}
128+
92129
protected function generateCheckboxes():void
93130
{
94131
checkBoxGroup.removeAllElements();
@@ -125,7 +162,12 @@
125162
126163
var fileStream:FileStream = new FileStream();
127164
fileStream.open(file, FileMode.WRITE);
128-
fileStream.writeBytes(PNGEncoder2.encode(scaleIcon(iconLarge.bitmapData, Number(tempCheckBox.name), Number(tempCheckBox.name))));
165+
166+
if(bicubic == true){
167+
fileStream.writeBytes(PNGEncoder2.encode(Bicubic.interpolateBicubic(iconLarge.bitmapData, Number(tempCheckBox.name), Number(tempCheckBox.name))));
168+
} else {
169+
fileStream.writeBytes(PNGEncoder2.encode(scaleIcon(iconLarge.bitmapData, Number(tempCheckBox.name), Number(tempCheckBox.name))));
170+
}
129171
fileStream.close();
130172
}
131173
}

src/views/ImagesView.mxml

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,8 @@
55
<fx:Script>
66
<![CDATA[
77
import mx.controls.Alert;
8-
98
import mx.events.FlexEvent;
10-
9+
1110
[Bindable] private var AllArray:Array;
1211
[Bindable] private var iPhoneAllArray:Array;
1312
[Bindable] private var iPhonePortraitArray:Array;
@@ -55,12 +54,7 @@
5554
);
5655
5756
iPhoneLandscapeArray = new Array(
58-
{name:"IPad 1,2 Portrait", file:"Default-Portrait~ipad.png", w:768, h:1024},
59-
{name:"iPad 3, Air Portrait", file:"Old-Default-Portrait@2x~ipad.png", w:1536, h:2048},
60-
{name:"iPad Pro Portrait", file:"Default-Portrait@2x~ipad.png", w:2048, h:2732},
61-
{name:"IPad 1,2 Landscape", file:"Default-Landscape~ipad.png", w:1024, h:768},
62-
{name:"iPad 3, Air Landscape", file:"Old-Default-Landscape@2x~ipad.png", w:2048, h:1536},
63-
{name:"iPad Pro Landscape", file:"Default-Landscape@2x~ipad.png", w:2732, h:2048}
57+
{name:"iPhone 6 Plus", file:"Default-Landscape-414w-736h@3x~iphone.png", w:2208, h:1242}
6458
);
6559
6660
iPadAllArray = new Array(
@@ -138,7 +132,7 @@
138132
label.toolTip = sizeData.file;
139133
return label;
140134
}
141-
135+
142136
protected function generateImage(event:MouseEvent):void
143137
{
144138
var folderName:Number = Math.round(Math.random()*1000000);
@@ -149,9 +143,8 @@
149143
150144
var fileStream:FileStream = new FileStream();
151145
fileStream.open(file, FileMode.WRITE);
152-
fileStream.writeBytes(PNGEncoder2.encode(scaleImage(imageLarge.bitmapData, optionsList.selectedItem.data[i].w, optionsList.selectedItem.data[i].h)));
146+
fileStream.writeBytes(PNGEncoder2.encode(scaleImage(imageLarge.bitmapData, optionsList.selectedItem.data[i].w, optionsList.selectedItem.data[i].h)));
153147
fileStream.close();
154-
155148
}
156149
157150
Alert.show("Images successfully generated at Desktop/launchscreens-" + String(folderName), "Images Generated");

0 commit comments

Comments
 (0)