@@ -34,6 +34,24 @@ Copyright (c) 2014 Rafał Lindemann. http://panrafal.github.com/depthy
34
34
35
35
*/
36
36
37
+ function makeUint16Buffer ( arr , littleEndian ) {
38
+ var ab = new ArrayBuffer ( arr . length * 2 ) ,
39
+ dv = new DataView ( ab ) ;
40
+ for ( var i = 0 ; i < arr . length ; ++ i ) {
41
+ dv . setUint16 ( i * 2 , arr [ i ] , littleEndian ) ;
42
+ }
43
+ return new Uint8Array ( ab ) ;
44
+ }
45
+
46
+ function makeUint32Buffer ( arr , littleEndian ) {
47
+ var ab = new ArrayBuffer ( arr . length * 4 ) ,
48
+ dv = new DataView ( ab ) ;
49
+ for ( var i = 0 ; i < arr . length ; ++ i ) {
50
+ dv . setUint32 ( i * 4 , arr [ i ] , littleEndian ) ;
51
+ }
52
+ return new Uint8Array ( ab ) ;
53
+ }
54
+
37
55
window . GDepthEncoder = {
38
56
39
57
xmlns : {
@@ -42,6 +60,8 @@ Copyright (c) 2014 Rafał Lindemann. http://panrafal.github.com/depthy
42
60
'GDepth' : 'http://ns.google.com/photos/1.0/depthmap/' ,
43
61
'xmpNote' : 'http://ns.adobe.com/xmp/note/' ,
44
62
} ,
63
+ xmpHeader : 'http://ns.adobe.com/xap/1.0/' ,
64
+ xmpExtensionHeader : 'http://ns.adobe.com/xmp/extension/' ,
45
65
46
66
// This is NOT a general purpose XMP builder!
47
67
buildXMP : function ( props , xmlns ) {
@@ -62,8 +82,13 @@ Copyright (c) 2014 Rafał Lindemann. http://panrafal.github.com/depthy
62
82
// xmpNote:HasExtendedXMP="420161059863C43993D79FBDFA80C997"
63
83
} ,
64
84
65
- dataURIsplit : function ( uri ) {
66
- return uri . match ( / ^ d a t a : ( .+ ?) ; ( .+ ?) , ( .+ ) $ / ) ;
85
+ dataURIinfo : function ( uri ) {
86
+ var match = uri . match ( / ^ d a t a : ( .+ ?) ; ( .+ ?) , ( .+ ) $ / ) ;
87
+ return match ? {
88
+ mime : match [ 1 ] ,
89
+ encoding : match [ 2 ] ,
90
+ data : match [ 3 ]
91
+ } : null ;
67
92
} ,
68
93
69
94
/**
@@ -73,16 +98,18 @@ Copyright (c) 2014 Rafał Lindemann. http://panrafal.github.com/depthy
73
98
*/
74
99
encodeDepthmap : function ( buffer , depthmap , original , metadata ) {
75
100
var props = { } , extProps = { } , standardXMP , extendedXMP ;
76
- depthmap = this . dataURIsplit ( depthmap || '' ) ;
77
- original = this . dataURIsplit ( original || '' ) ;
101
+ depthmap = this . dataURIinfo ( depthmap || '' ) ;
102
+ original = this . dataURIinfo ( original || '' ) ;
78
103
if ( depthmap ) {
79
104
props [ 'GDepth:Format' ] = 'RangeInverse' ;
80
- props [ 'GDepth:Mime' ] = depthmap [ 1 ] ;
81
- extProps [ 'GDepth:Data' ] = depthmap [ 3 ] ;
105
+ props [ 'GDepth:Mime' ] = depthmap . mime ;
106
+ extProps [ 'GDepth:Data' ] = depthmap . data ;
107
+ console . log ( 'Depthmap size' , depthmap . data . length ) ;
82
108
}
83
109
if ( original ) {
84
- props [ 'GImage:Mime' ] = original [ 1 ] ;
85
- extProps [ 'GImage:Data' ] = depthmap [ 3 ] ;
110
+ props [ 'GImage:Mime' ] = original . mime ;
111
+ extProps [ 'GImage:Data' ] = original . data ;
112
+ console . log ( 'Original size' , original . data . length ) ;
86
113
}
87
114
for ( var k in metadata || { } ) {
88
115
props [ k ] = metadata [ k ] ;
@@ -119,7 +146,7 @@ Copyright (c) 2014 Rafał Lindemann. http://panrafal.github.com/depthy
119
146
segType = data . getUint8 ( offset ++ ) ;
120
147
if ( segType === 0xFF ) {
121
148
console . log ( 'Padding 0xFF found' ) ;
122
- parts . push ( [ 0xFF ] ) ;
149
+ parts . push ( new Uint8Array ( [ 0xFF ] ) ) ;
123
150
} else break ;
124
151
} while ( true ) ;
125
152
if ( segType === 0xC0 || segType === 0xC2 || segType === 0xDA ) {
@@ -146,7 +173,7 @@ Copyright (c) 2014 Rafał Lindemann. http://panrafal.github.com/depthy
146
173
}
147
174
console . log ( 'Found APP1 ' + app1Header ) ;
148
175
// ignore any existing XMP
149
- if ( app1Header === 'http://ns.adobe.com/xap/1.0/' ) {
176
+ if ( app1Header === this . xmpHeader || app1Header === this . xmpExtensionHeader ) {
150
177
console . log ( 'Found old XMP, skipping' ) ;
151
178
offset += segSize - ( offset - segStart - 2 ) ;
152
179
continue ;
@@ -155,17 +182,45 @@ Copyright (c) 2014 Rafał Lindemann. http://panrafal.github.com/depthy
155
182
// copying segment
156
183
console . log ( 'Copying segment ' + segType + ', size: ' + segSize + ', left:' + ( segSize - ( offset - segStart - 2 ) ) ) ;
157
184
offset += segSize - ( offset - segStart - 2 ) ;
158
- parts . push ( new Uint8Array ( buffer , segStart , 1 + segSize ) ) ;
185
+ parts . push ( new Uint8Array ( buffer , segStart , 2 + segSize ) ) ;
159
186
if ( segType === 0xE1 ) {
160
187
writeXMP ( ) ; // right after EXIF
161
188
}
162
189
}
190
+ // console.log('Parts', parts);
163
191
return new Blob ( parts , { type : 'image/jpeg' } ) ;
164
192
} ,
165
193
166
194
buildXMPsegments : function ( standardXMP , extendedXMP ) {
167
- // console.log('StandardXMP: ', standardXMP);
168
- // console.log('ExtendedXMP: ', extendedXMP);
195
+ var extendedUid , parts = [ ] ;
196
+ if ( extendedXMP ) {
197
+ extendedUid = CryptoJS . MD5 ( extendedXMP ) . toString ( ) . toUpperCase ( ) ;
198
+ console . log ( extendedUid ) ;
199
+ standardXMP = standardXMP . replace ( / ( < r d f : D e s c r i p t i o n ) / , '$1 xmpNote:HasExtendedXMP="420161059863C43993D79FBDFA80C997" ' ) ;
200
+ }
201
+ console . log ( 'StandardXMP: ' , standardXMP . length ) ;
202
+ console . log ( 'ExtendedXMP: ' , extendedXMP . length ) ;
203
+
204
+ parts . push ( new Uint8Array ( [ 0xFF , 0xE1 ] ) ) ;
205
+ parts . push ( makeUint16Buffer ( [ 2 + this . xmpHeader . length + 1 + standardXMP . length ] ) ) ;
206
+ parts . push ( this . xmpHeader , new Uint8Array ( [ 0x00 ] ) ) ;
207
+ parts . push ( standardXMP ) ;
208
+ console . log ( 'Written standardXMP' ) ;
209
+ if ( extendedXMP ) {
210
+ var offset = 0 ;
211
+ while ( offset < extendedXMP . length ) {
212
+ var chunkSize = Math . min ( 65300 , extendedXMP . length - offset ) ;
213
+ parts . push ( new Uint8Array ( [ 0xFF , 0xE1 ] ) ) ;
214
+ parts . push ( makeUint16Buffer ( [ 2 + this . xmpExtensionHeader . length + 1 + 32 + 4 + 4 + chunkSize ] ) ) ;
215
+ parts . push ( this . xmpExtensionHeader , new Uint8Array ( [ 0x00 ] ) ) ;
216
+ parts . push ( extendedUid , makeUint32Buffer ( [ extendedXMP . length , offset ] ) ) ;
217
+ parts . push ( extendedXMP . substr ( offset , chunkSize ) ) ;
218
+
219
+ console . log ( 'Written extendedXMP chunk %d %db of %d' , offset , chunkSize , extendedXMP . length ) ;
220
+ offset += chunkSize ;
221
+ }
222
+ }
223
+ return parts ;
169
224
} ,
170
225
171
226
} ;
0 commit comments