Skip to content

Commit fb716b0

Browse files
fix(RGBELoader): upstream fixes (#358)
1 parent e1f6d3e commit fb716b0

File tree

1 file changed

+50
-64
lines changed

1 file changed

+50
-64
lines changed

src/loaders/RGBELoader.js

Lines changed: 50 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -13,31 +13,23 @@ class RGBELoader extends DataTextureLoader {
1313
// adapted from http://www.graphics.cornell.edu/~bjw/rgbe.html
1414

1515
parse(buffer) {
16-
const /* return codes for rgbe routines */
17-
//RGBE_RETURN_SUCCESS = 0,
18-
RGBE_RETURN_FAILURE = -1,
19-
/* default error routine. change this to change error handling */
16+
const /* default error routine. change this to change error handling */
2017
rgbe_read_error = 1,
2118
rgbe_write_error = 2,
2219
rgbe_format_error = 3,
2320
rgbe_memory_error = 4,
2421
rgbe_error = function (rgbe_error_code, msg) {
2522
switch (rgbe_error_code) {
2623
case rgbe_read_error:
27-
console.error('THREE.RGBELoader Read Error: ' + (msg || ''))
28-
break
24+
throw new Error('THREE.RGBELoader: Read Error: ' + (msg || ''))
2925
case rgbe_write_error:
30-
console.error('THREE.RGBELoader Write Error: ' + (msg || ''))
31-
break
26+
throw new Error('THREE.RGBELoader: Write Error: ' + (msg || ''))
3227
case rgbe_format_error:
33-
console.error('THREE.RGBELoader Bad File Format: ' + (msg || ''))
34-
break
28+
throw new Error('THREE.RGBELoader: Bad File Format: ' + (msg || ''))
3529
default:
3630
case rgbe_memory_error:
37-
console.error('THREE.RGBELoader: Error: ' + (msg || ''))
31+
throw new Error('THREE.RGBELoader: Memory Error: ' + (msg || ''))
3832
}
39-
40-
return RGBE_RETURN_FAILURE
4133
},
4234
/* offsets to red, green, and blue components in a data (float) pixel */
4335
//RGBE_DATA_RED = 0,
@@ -113,12 +105,12 @@ class RGBELoader extends DataTextureLoader {
113105
let line, match
114106

115107
if (buffer.pos >= buffer.byteLength || !(line = fgets(buffer))) {
116-
return rgbe_error(rgbe_read_error, 'no header found')
108+
rgbe_error(rgbe_read_error, 'no header found')
117109
}
118110

119111
/* if you want to require the magic token then uncomment the next line */
120112
if (!(match = line.match(magic_token_re))) {
121-
return rgbe_error(rgbe_format_error, 'bad initial token')
113+
rgbe_error(rgbe_format_error, 'bad initial token')
122114
}
123115

124116
header.valid |= RGBE_VALID_PROGRAMTYPE
@@ -158,11 +150,11 @@ class RGBELoader extends DataTextureLoader {
158150
}
159151

160152
if (!(header.valid & RGBE_VALID_FORMAT)) {
161-
return rgbe_error(rgbe_format_error, 'missing format specifier')
153+
rgbe_error(rgbe_format_error, 'missing format specifier')
162154
}
163155

164156
if (!(header.valid & RGBE_VALID_DIMENSIONS)) {
165-
return rgbe_error(rgbe_format_error, 'missing image size specifier')
157+
rgbe_error(rgbe_format_error, 'missing image size specifier')
166158
}
167159

168160
return header
@@ -184,13 +176,13 @@ class RGBELoader extends DataTextureLoader {
184176
}
185177

186178
if (scanline_width !== ((buffer[2] << 8) | buffer[3])) {
187-
return rgbe_error(rgbe_format_error, 'wrong scanline width')
179+
rgbe_error(rgbe_format_error, 'wrong scanline width')
188180
}
189181

190182
const data_rgba = new Uint8Array(4 * w * h)
191183

192184
if (!data_rgba.length) {
193-
return rgbe_error(rgbe_memory_error, 'unable to allocate buffer space')
185+
rgbe_error(rgbe_memory_error, 'unable to allocate buffer space')
194186
}
195187

196188
let offset = 0,
@@ -204,7 +196,7 @@ class RGBELoader extends DataTextureLoader {
204196
// read in each successive scanline
205197
while (num_scanlines > 0 && pos < buffer.byteLength) {
206198
if (pos + 4 > buffer.byteLength) {
207-
return rgbe_error(rgbe_read_error)
199+
rgbe_error(rgbe_read_error)
208200
}
209201

210202
rgbeStart[0] = buffer[pos++]
@@ -213,7 +205,7 @@ class RGBELoader extends DataTextureLoader {
213205
rgbeStart[3] = buffer[pos++]
214206

215207
if (2 != rgbeStart[0] || 2 != rgbeStart[1] || ((rgbeStart[2] << 8) | rgbeStart[3]) != scanline_width) {
216-
return rgbe_error(rgbe_format_error, 'bad rgbe scanline format')
208+
rgbe_error(rgbe_format_error, 'bad rgbe scanline format')
217209
}
218210

219211
// read each of the four channels for the scanline into the buffer
@@ -227,7 +219,7 @@ class RGBELoader extends DataTextureLoader {
227219
if (isEncodedRun) count -= 128
228220

229221
if (0 === count || ptr + count > ptr_end) {
230-
return rgbe_error(rgbe_format_error, 'bad scanline data')
222+
rgbe_error(rgbe_format_error, 'bad scanline data')
231223
}
232224

233225
if (isEncodedRun) {
@@ -291,58 +283,52 @@ class RGBELoader extends DataTextureLoader {
291283
byteArray.pos = 0
292284
const rgbe_header_info = RGBE_ReadHeader(byteArray)
293285

294-
if (RGBE_RETURN_FAILURE !== rgbe_header_info) {
295-
const w = rgbe_header_info.width,
296-
h = rgbe_header_info.height,
297-
image_rgba_data = RGBE_ReadPixels_RLE(byteArray.subarray(byteArray.pos), w, h)
298-
299-
if (RGBE_RETURN_FAILURE !== image_rgba_data) {
300-
let data, type
301-
let numElements
302-
303-
switch (this.type) {
304-
case FloatType:
305-
numElements = image_rgba_data.length / 4
306-
const floatArray = new Float32Array(numElements * 4)
286+
const w = rgbe_header_info.width,
287+
h = rgbe_header_info.height,
288+
image_rgba_data = RGBE_ReadPixels_RLE(byteArray.subarray(byteArray.pos), w, h)
307289

308-
for (let j = 0; j < numElements; j++) {
309-
RGBEByteToRGBFloat(image_rgba_data, j * 4, floatArray, j * 4)
310-
}
290+
let data, type
291+
let numElements
311292

312-
data = floatArray
313-
type = FloatType
314-
break
293+
switch (this.type) {
294+
case FloatType:
295+
numElements = image_rgba_data.length / 4
296+
const floatArray = new Float32Array(numElements * 4)
315297

316-
case HalfFloatType:
317-
numElements = image_rgba_data.length / 4
318-
const halfArray = new Uint16Array(numElements * 4)
298+
for (let j = 0; j < numElements; j++) {
299+
RGBEByteToRGBFloat(image_rgba_data, j * 4, floatArray, j * 4)
300+
}
319301

320-
for (let j = 0; j < numElements; j++) {
321-
RGBEByteToRGBHalf(image_rgba_data, j * 4, halfArray, j * 4)
322-
}
302+
data = floatArray
303+
type = FloatType
304+
break
323305

324-
data = halfArray
325-
type = HalfFloatType
326-
break
306+
case HalfFloatType:
307+
numElements = image_rgba_data.length / 4
308+
const halfArray = new Uint16Array(numElements * 4)
327309

328-
default:
329-
console.error('THREE.RGBELoader: unsupported type: ', this.type)
330-
break
310+
for (let j = 0; j < numElements; j++) {
311+
RGBEByteToRGBHalf(image_rgba_data, j * 4, halfArray, j * 4)
331312
}
332313

333-
return {
334-
width: w,
335-
height: h,
336-
data: data,
337-
header: rgbe_header_info.string,
338-
gamma: rgbe_header_info.gamma,
339-
exposure: rgbe_header_info.exposure,
340-
type: type,
341-
}
342-
}
314+
data = halfArray
315+
type = HalfFloatType
316+
break
317+
318+
default:
319+
throw new Error('THREE.RGBELoader: Unsupported type: ' + this.type)
320+
break
343321
}
344322

345-
return null
323+
return {
324+
width: w,
325+
height: h,
326+
data: data,
327+
header: rgbe_header_info.string,
328+
gamma: rgbe_header_info.gamma,
329+
exposure: rgbe_header_info.exposure,
330+
type: type,
331+
}
346332
}
347333

348334
setDataType(value) {

0 commit comments

Comments
 (0)