Skip to content

Commit 3612438

Browse files
committed
Optimize native/Java color conversions
1 parent 2e48046 commit 3612438

1 file changed

Lines changed: 51 additions & 46 deletions

File tree

core/src/processing/opengl/PGL.java

Lines changed: 51 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1510,12 +1510,10 @@ protected static int nextPowerOfTwo(int val) {
15101510
*/
15111511
protected static int nativeToJavaARGB(int color) {
15121512
if (BIG_ENDIAN) { // RGBA to ARGB
1513-
return (color >>> 8) | ((color << 24) & 0xFF000000);
1514-
// equivalent to
1515-
// ((color >> 8) & 0x00FFFFFF) | ((color << 24) & 0xFF000000)
1513+
return (color >>> 8) | (color << 24);
15161514
} else { // ABGR to ARGB
1517-
return ((color & 0xFF) << 16) | ((color & 0xFF0000) >> 16) |
1518-
(color & 0xFF00FF00);
1515+
int rb = color & 0x00FF00FF;
1516+
return (color & 0xFF00FF00) | (rb << 16) | (rb >> 16);
15191517
}
15201518
}
15211519

@@ -1534,13 +1532,13 @@ protected static void nativeToJavaARGB(int[] pixels, int width, int height) {
15341532
int pixy = pixels[yindex];
15351533
int pixi = pixels[index];
15361534
if (BIG_ENDIAN) { // RGBA to ARGB
1537-
pixels[index] = (pixy >>> 8) | ((pixy << 24) & 0xFF000000);
1538-
pixels[yindex] = (pixi >>> 8) | ((pixi << 24) & 0xFF000000);
1535+
pixels[index] = (pixy >>> 8) | (pixy << 24);
1536+
pixels[yindex] = (pixi >>> 8) | (pixi << 24);
15391537
} else { // ABGR to ARGB
1540-
pixels[index] = ((pixy & 0xFF) << 16) | ((pixy & 0xFF0000) >> 16) |
1541-
(pixy & 0xFF00FF00);
1542-
pixels[yindex] = ((pixi & 0xFF) << 16) | ((pixi & 0xFF0000) >> 16) |
1543-
(pixi & 0xFF00FF00);
1538+
int rbi = pixi & 0x00FF00FF;
1539+
int rby = pixy & 0x00FF00FF;
1540+
pixels[index] = (pixy & 0xFF00FF00) | (rby << 16) | (rby >> 16);
1541+
pixels[yindex] = (pixi & 0xFF00FF00) | (rbi << 16) | (rbi >> 16);
15441542
}
15451543
index++;
15461544
yindex++;
@@ -1553,10 +1551,10 @@ protected static void nativeToJavaARGB(int[] pixels, int width, int height) {
15531551
for (int x = 0; x < width; x++) {
15541552
int pixi = pixels[index];
15551553
if (BIG_ENDIAN) { // RGBA to ARGB
1556-
pixels[index] = (pixi >>> 8) | ((pixi << 24) & 0xFF000000);
1554+
pixels[index] = (pixi >>> 8) | (pixi << 24);
15571555
} else { // ABGR to ARGB
1558-
pixels[index] = ((pixi & 0xFF) << 16) | ((pixi & 0xFF0000) >> 16) |
1559-
(pixi & 0xFF00FF00);
1556+
int rbi = pixi & 0x00FF00FF;
1557+
pixels[index] = (pixi & 0xFF00FF00) | (rbi << 16) | (rbi >> 16);
15601558
}
15611559
index++;
15621560
}
@@ -1573,8 +1571,9 @@ protected static int nativeToJavaRGB(int color) {
15731571
if (BIG_ENDIAN) { // RGBA to ARGB
15741572
return (color >>> 8) | 0xFF000000;
15751573
} else { // ABGR to ARGB
1576-
return ((color & 0xFF) << 16) | ((color & 0xFF0000) >> 16) |
1577-
(color & 0xFF00FF00) | 0xFF000000;
1574+
int rb = color & 0x00FF00FF;
1575+
return 0xFF000000 | (rb << 16) |
1576+
(color & 0x0000FF00) | (rb >> 16);
15781577
}
15791578
}
15801579

@@ -1597,10 +1596,12 @@ protected static void nativeToJavaRGB(int[] pixels, int width, int height) {
15971596
pixels[index] = (pixy >>> 8) | 0xFF000000;
15981597
pixels[yindex] = (pixi >>> 8) | 0xFF000000;
15991598
} else { // ABGR to ARGB
1600-
pixels[index] = ((pixy & 0xFF) << 16) | ((pixy & 0xFF0000) >> 16) |
1601-
(pixy & 0xFF00FF00) | 0xFF000000;
1602-
pixels[yindex] = ((pixi & 0xFF) << 16) | ((pixi & 0xFF0000) >> 16) |
1603-
(pixi & 0xFF00FF00) | 0xFF000000;
1599+
int rbi = pixi & 0x00FF00FF;
1600+
int rby = pixy & 0x00FF00FF;
1601+
pixels[index] = 0xFF000000 | (rby << 16) |
1602+
(pixy & 0x0000FF00) | (rby >> 16);
1603+
pixels[yindex] = 0xFF000000 | (rbi << 16) |
1604+
(pixi & 0x0000FF00) | (rbi >> 16);
16041605
}
16051606
index++;
16061607
yindex++;
@@ -1615,8 +1616,9 @@ protected static void nativeToJavaRGB(int[] pixels, int width, int height) {
16151616
if (BIG_ENDIAN) { // RGBA to ARGB
16161617
pixels[index] = (pixi >>> 8) | 0xFF000000;
16171618
} else { // ABGR to ARGB
1618-
pixels[index] = ((pixi & 0xFF) << 16) | ((pixi & 0xFF0000) >> 16) |
1619-
(pixi & 0xFF00FF00) | 0xFF000000;
1619+
int rbi = pixi & 0x00FF00FF;
1620+
pixels[index] = 0xFF000000 | (rbi << 16) |
1621+
(pixi & 0x000FF00) | (rbi >> 16);
16201622
}
16211623
index++;
16221624
}
@@ -1630,10 +1632,10 @@ protected static void nativeToJavaRGB(int[] pixels, int width, int height) {
16301632
*/
16311633
protected static int javaToNativeARGB(int color) {
16321634
if (BIG_ENDIAN) { // ARGB to RGBA
1633-
return ((color >> 24) & 0xFF) | ((color << 8) & 0xFFFFFF00);
1635+
return (color >>> 24) | (color << 8);
16341636
} else { // ARGB to ABGR
1635-
return (color & 0xFF000000) | ((color << 16) & 0xFF0000) |
1636-
(color & 0xFF00) | ((color >> 16) & 0xFF);
1637+
int rb = color & 0x00FF00FF;
1638+
return (color & 0xFF00FF00) | (rb << 16) | (rb >> 16);
16371639
}
16381640
}
16391641

@@ -1652,13 +1654,13 @@ protected static void javaToNativeARGB(int[] pixels, int width, int height) {
16521654
int pixy = pixels[yindex];
16531655
int pixi = pixels[index];
16541656
if (BIG_ENDIAN) { // ARGB to RGBA
1655-
pixels[index] = ((pixy >> 24) & 0xFF) | ((pixy << 8) & 0xFFFFFF00);
1656-
pixels[yindex] = ((pixi >> 24) & 0xFF) | ((pixi << 8) & 0xFFFFFF00);
1657+
pixels[index] = (pixy >>> 24) | (pixy << 8);
1658+
pixels[yindex] = (pixi >>> 24) | (pixi << 8);
16571659
} else { // ARGB to ABGR
1658-
pixels[index] = (pixy & 0xFF000000) | ((pixy << 16) & 0xFF0000) |
1659-
(pixy & 0xFF00) | ((pixy >> 16) & 0xFF);
1660-
pixels[yindex] = (pixi & 0xFF000000) | ((pixi << 16) & 0xFF0000) |
1661-
(pixi & 0xFF00) | ((pixi >> 16) & 0xFF);
1660+
int rbi = pixi & 0x00FF00FF;
1661+
int rby = pixy & 0x00FF00FF;
1662+
pixels[index] = (pixy & 0xFF00FF00) | (rby << 16) | (rby >> 16);
1663+
pixels[yindex] = (pixi & 0xFF00FF00) | (rbi << 16) | (rbi >> 16);
16621664
}
16631665
index++;
16641666
yindex++;
@@ -1671,10 +1673,10 @@ protected static void javaToNativeARGB(int[] pixels, int width, int height) {
16711673
for (int x = 0; x < width; x++) {
16721674
int pixi = pixels[index];
16731675
if (BIG_ENDIAN) { // ARGB to RGBA
1674-
pixels[index] = ((pixi >> 24) & 0xFF) | ((pixi << 8) & 0xFFFFFF00);
1676+
pixels[index] = (pixi >>> 24) | (pixi << 8);
16751677
} else { // ARGB to ABGR
1676-
pixels[index] = (pixi & 0xFF000000) | ((pixi << 16) & 0xFF0000) |
1677-
(pixi & 0xFF00) | ((pixi >> 16) & 0xFF);
1678+
int rbi = pixi & 0x00FF00FF;
1679+
pixels[index] = (pixi & 0xFF00FF00) | (rbi << 16) | (rbi >> 16);
16781680
}
16791681
index++;
16801682
}
@@ -1688,10 +1690,10 @@ protected static void javaToNativeARGB(int[] pixels, int width, int height) {
16881690
*/
16891691
protected static int javaToNativeRGB(int color) {
16901692
if (BIG_ENDIAN) { // ARGB to RGB
1691-
return 0xFF | ((color << 8) & 0xFFFFFF00);
1693+
return 0xFF | (color << 8);
16921694
} else { // ARGB to BGR
1693-
return 0xFF000000 | ((color << 16) & 0xFF0000) |
1694-
(color & 0xFF00) | ((color >> 16) & 0xFF);
1695+
int rb = color & 0x00FF00FF;
1696+
return 0xFF000000 | (rb << 16) | (color & 0x0000FF00) | (rb >> 16);
16951697
}
16961698
}
16971699

@@ -1711,13 +1713,15 @@ protected static void javaToNativeRGB(int[] pixels, int width, int height) {
17111713
int pixy = pixels[yindex];
17121714
int pixi = pixels[index];
17131715
if (BIG_ENDIAN) { // ARGB to RGB
1714-
pixels[index] = 0xFF | ((pixy << 8) & 0xFFFFFF00);
1715-
pixels[yindex] = 0xFF | ((pixi << 8) & 0xFFFFFF00);
1716+
pixels[index] = 0xFF | (pixy << 8);
1717+
pixels[yindex] = 0xFF | (pixi << 8);
17161718
} else { // ARGB to BGR
1717-
pixels[index] = 0xFF000000 | ((pixy << 16) & 0xFF0000) |
1718-
(pixy & 0xFF00) | ((pixy >> 16) & 0xFF);
1719-
pixels[yindex] = 0xFF000000 | ((pixi << 16) & 0xFF0000) |
1720-
(pixi & 0xFF00) | ((pixi >> 16) & 0xFF);
1719+
int rbi = pixi & 0x00FF00FF;
1720+
int rby = pixy & 0x00FF00FF;
1721+
pixels[index] = 0xFF000000 | (rby << 16) |
1722+
(pixy & 0x0000FF00) | (rby >> 16);
1723+
pixels[yindex] = 0xFF000000 | (rbi << 16) |
1724+
(pixi & 0x0000FF00) | (rbi >> 16);
17211725
}
17221726
index++;
17231727
yindex++;
@@ -1730,10 +1734,11 @@ protected static void javaToNativeRGB(int[] pixels, int width, int height) {
17301734
for (int x = 0; x < width; x++) {
17311735
int pixi = pixels[index];
17321736
if (BIG_ENDIAN) { // ARGB to RGB
1733-
pixels[index] = 0xFF | ((pixi << 8) & 0xFFFFFF00);
1737+
pixels[index] = 0xFF | (pixi << 8);
17341738
} else { // ARGB to BGR
1735-
pixels[index] = 0xFF000000 | ((pixi << 16) & 0xFF0000) |
1736-
(pixi & 0xFF00) | ((pixi >> 16) & 0xFF);
1739+
int rbi = pixi & 0x00FF00FF;
1740+
pixels[index] = 0xFF000000 | (rbi << 16) |
1741+
(pixi & 0x0000FF00) | (rbi >> 16);
17371742
}
17381743
index++;
17391744
}

0 commit comments

Comments
 (0)