Skip to content
This repository was archived by the owner on Jan 14, 2022. It is now read-only.

Commit 978db19

Browse files
authored
Merge pull request #48 from pwa-builder/dev
Dev
2 parents 2c47b59 + e3711f6 commit 978db19

File tree

4 files changed

+106
-68
lines changed

4 files changed

+106
-68
lines changed

assets/serviceWorkers/serviceworkers.json

Lines changed: 0 additions & 29 deletions
This file was deleted.

lib/manifestTools/manifestCreator/scrapers/icojs/src/ico.js

Lines changed: 103 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,71 @@ var range = function(n) {
2121
* @class ICO
2222
*/
2323

24+
/**
25+
* Generate the hexadecimal value from an arrayBuffer.
26+
* @memberof ICO
27+
* @param {ArrayBuffer} buffer The ArrayBuffer object contain the TypedArray of a ICO file.
28+
* @returns {String} The hexadecimal value.
29+
*/
30+
function buf2hex(buffer) { // buffer is an ArrayBuffer
31+
return Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2)).join('');
32+
}
33+
34+
/**
35+
* Creates a PNG image object using the createIcon method.
36+
* @memberof ICO
37+
* @param {Int} index The image index.
38+
* @param {ArrayBuffer} buffer The ArrayBuffer object contain the TypedArray of a ICO file.
39+
* @returns {Object} PNG icon object.
40+
*/
41+
42+
function createPng(index, buffer) {
43+
var dv = new DataView(buffer);
44+
45+
var icoWidth = dv.getUint8(6 + (index * 16)) || 256;
46+
var icoHeight = dv.getUint8(7 + (index * 16)) || 256;
47+
var icoOffset = dv.getUint32(18 + (index * 16), true);
48+
var icoBit = dv.getUint8((icoOffset + 16) + 8, true);
49+
var endImage = (buf2hex(buffer.slice(icoOffset, buffer.byteLength))).indexOf("49454e44");
50+
var imgBuffer = buffer.slice(icoOffset, icoOffset + endImage);
51+
52+
return createIcon(icoBit, icoWidth, icoHeight, imgBuffer);
53+
}
54+
55+
/**
56+
* Validates if the image is PNG.
57+
* @memberof ICO
58+
* @param {Int} index The image index.
59+
* @param {ArrayBuffer} buffer The ArrayBuffer object contain the TypedArray of a ICO file.
60+
* @returns {Boolean} True if the image is PNG.
61+
*/
62+
63+
function isPNG(index, buffer) {
64+
var icoDv = new DataView(buffer);
65+
var startImage = icoDv.getUint32(18 + (index * 16), true);
66+
var bufferSlice = buf2hex(buffer.slice(startImage, startImage + 4))
67+
return (bufferSlice === "89504e47");
68+
}
69+
70+
71+
/**
72+
* Creates an image object.
73+
* @memberof ICO
74+
* @param {Int} bit The image bit depth.
75+
* @param {Int} width The image width.
76+
* @param {Int} height The image height.
77+
* @param {ArrayBuffer} buffer The ArrayBuffer object contain the TypedArray of a ICO file.
78+
* @returns {Object} An icon object.
79+
*/
80+
function createIcon(bit, width, height, buffer) {
81+
return {
82+
bit: bit,
83+
width: width,
84+
height: height,
85+
buffer: buffer
86+
}
87+
}
88+
2489
var factory = function(config) {
2590
var previousICO = global.ICO;
2691
var Image = config.Image;
@@ -38,47 +103,49 @@ var factory = function(config) {
38103
* * `buffer` **ArrayBuffer** - Image buffer.
39104
*/
40105
parse: function(buffer, mime) {
106+
41107
var icoDv = new DataView(buffer);
42108
if (icoDv.getUint16(0, true) !== 0 || icoDv.getUint16(2, true) !== 1) {
43109
var deferred = Q.defer();
44110
return deferred.reject(new Error('buffer is not ico'));
45111
}
46-
47-
// make single image icon
48-
// let idCount = icoDv.getUint16(4, true);
49-
return Q.all(range(icoDv.getUint16(4, true)).map(function(i) {
50-
var ico = extractOne(buffer, i);
51-
var image = {
52-
width: ico.width,
53-
height: ico.height
54-
};
55-
56-
switch (ico.bit) { // eslint-disable-line default-case
57-
case 1:
58-
image.data = imageData.from1bit(ico);
59-
break;
60-
case 4:
61-
image.data = imageData.from4bit(ico);
62-
break;
63-
case 8:
64-
image.data = imageData.from8bit(ico);
65-
break;
66-
case 24:
67-
image.data = imageData.from24bit(ico);
68-
break;
69-
case 32:
70-
image.data = imageData.from32bit(ico);
71-
break;
72-
}
73-
74-
return Image.encode(image, mime).then(function(pngBuffer) {
75-
return {
76-
bit: ico.bit,
77-
width: ico.width,
78-
height: ico.height,
79-
buffer: pngBuffer
80-
};
81-
});
112+
113+
return Q.all(range(icoDv.getUint16(4, true))
114+
.map(function(i) {
115+
116+
if(isPNG(i,buffer)){
117+
var deferred = Q.defer();
118+
deferred.resolve(createPng(i,buffer));
119+
return deferred.promise;
120+
} else {
121+
var ico = extractOne(buffer, i);
122+
var image = {
123+
width: ico.width,
124+
height: ico.height
125+
};
126+
127+
switch (ico.bit) { // eslint-disable-line default-case
128+
case 1:
129+
image.data = imageData.from1bit(ico);
130+
break;
131+
case 4:
132+
image.data = imageData.from4bit(ico);
133+
break;
134+
case 8:
135+
image.data = imageData.from8bit(ico);
136+
break;
137+
case 24:
138+
image.data = imageData.from24bit(ico);
139+
break;
140+
case 32:
141+
image.data = imageData.from32bit(ico);
142+
break;
143+
}
144+
145+
return Image.encode(image, mime).then(function(pngBuffer) {
146+
return createIcon(ico.bit, ico.width, ico.height, pngBuffer);
147+
});
148+
}
82149
}));
83150
},
84151
/**

lib/manifestTools/manifestLoader.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ function processManifestContents (data, manifestFormat, callback) {
7171
log.warn('Forcing to format ' + manifestFormat + '...');
7272
detectedFormat = manifestFormat;
7373
} else if (!detectedFormat) {
74-
detectedFormat = 'w3c'
74+
detectedFormat = 'w3c';
7575
// var availableFormats = listAvailableManifestFormats().join(', ');
7676
//return callback(new Error('Unable to detect the input manifest format. Try specifying the correct format using the -f <format> option. Available formats are: ' + availableFormats + '.'));
7777
}

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "pwabuilder-lib",
3-
"version": "2.0.2-RC.0",
3+
"version": "2.0.3-RC.0",
44
"description": "PWA Builder Core Library",
55
"repository": {
66
"type": "git",
@@ -46,7 +46,7 @@
4646
"mime-types": "^2.1.11",
4747
"mkdirp": "^0.5.1",
4848
"ncp": "^2.0.0",
49-
"pwabuilder-serviceworkers": "^1.1.0",
49+
"pwabuilder-serviceworkers": "^1.1.1",
5050
"q": "^1.4.1",
5151
"request": "^2.67.0",
5252
"semver": "^5.1.0",

0 commit comments

Comments
 (0)