Skip to content

Commit e500dcf

Browse files
committed
Add support for unpacking 16-bit BGRA
1 parent b2d6671 commit e500dcf

File tree

2 files changed

+28
-0
lines changed

2 files changed

+28
-0
lines changed

Tests/test_lib_pack.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,8 @@ def test_RGBA(self):
444444
self.assert_unpack("RGBA", "RGBA;4B", 2, (17, 0, 34, 0), (51, 0, 68, 0))
445445
self.assert_unpack("RGBA", "RGBA;16L", 8, (2, 4, 6, 8), (10, 12, 14, 16))
446446
self.assert_unpack("RGBA", "RGBA;16B", 8, (1, 3, 5, 7), (9, 11, 13, 15))
447+
self.assert_unpack("RGBA", "BGRA;16L", 8, (6, 4, 2, 8), (14, 12, 10, 16))
448+
self.assert_unpack("RGBA", "BGRA;16B", 8, (5, 3, 1, 7), (13, 11, 9, 15))
447449
self.assert_unpack(
448450
"RGBA", "BGRA", 4, (3, 2, 1, 4), (7, 6, 5, 8), (11, 10, 9, 12)
449451
)

src/libImaging/Unpack.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1065,6 +1065,30 @@ unpackBGRA(UINT8 *_out, const UINT8 *in, int pixels) {
10651065
}
10661066
}
10671067

1068+
static void
1069+
unpackBGRA16L(UINT8 *_out, const UINT8 *in, int pixels) {
1070+
int i;
1071+
/* 16-bit RGBA, little-endian order, reversed words */
1072+
for (i = 0; i < pixels; i++) {
1073+
UINT32 iv = MAKE_UINT32(in[5], in[3], in[1], in[7]);
1074+
memcpy(_out, &iv, sizeof(iv));
1075+
in += 8;
1076+
_out += 4;
1077+
}
1078+
}
1079+
1080+
static void
1081+
unpackBGRA16B(UINT8 *_out, const UINT8 *in, int pixels) {
1082+
int i;
1083+
/* 16-bit RGBA, big-endian order, reversed words */
1084+
for (i = 0; i < pixels; i++) {
1085+
UINT32 iv = MAKE_UINT32(in[4], in[2], in[0], in[6]);
1086+
memcpy(_out, &iv, sizeof(iv));
1087+
in += 8;
1088+
_out += 4;
1089+
}
1090+
}
1091+
10681092
/* Unpack to "CMYK" image */
10691093

10701094
static void
@@ -1574,6 +1598,8 @@ static struct {
15741598
{"RGBA", "RGBA;16L", 64, unpackRGBA16L},
15751599
{"RGBA", "RGBA;16B", 64, unpackRGBA16B},
15761600
{"RGBA", "BGRA", 32, unpackBGRA},
1601+
{"RGBA", "BGRA;16L", 64, unpackBGRA16L},
1602+
{"RGBA", "BGRA;16B", 64, unpackBGRA16B},
15771603
{"RGBA", "ARGB", 32, unpackARGB},
15781604
{"RGBA", "ABGR", 32, unpackABGR},
15791605
{"RGBA", "YCCA;P", 32, ImagingUnpackYCCA},

0 commit comments

Comments
 (0)