mirror of
https://github.com/libretro/parallel-n64.git
synced 2026-11-07 12:37:50 -10:00
Move more conversion functions to Graphics/image_convert.h
This commit is contained in:
1 parent
4981a5fcd2
commit
24bd0da79c
3 files changed
+72
-131
No files matched your search
@@ -140,6 +140,74 @@ static INLINE uint32_t RGBA16toRGBA32(uint32_t _c)
|
||||
return (c.r << 24) | (c.g << 16) | (c.b << 8) | c.a;
|
||||
}
|
||||
|
||||
static INLINE void UnswapCopyWrap(const uint8_t *src, uint32_t srcIdx, uint8_t *dest, uint32_t destIdx, uint32_t destMask, uint32_t numBytes)
|
||||
{
|
||||
int numDWords;
|
||||
int trailingBytes;
|
||||
// copy leading bytes
|
||||
uint32_t leadingBytes = srcIdx & 3;
|
||||
if (leadingBytes != 0)
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
leadingBytes = 4 - leadingBytes;
|
||||
if ((uint32_t)leadingBytes > numBytes)
|
||||
leadingBytes = numBytes;
|
||||
numBytes -= leadingBytes;
|
||||
|
||||
srcIdx ^= 3;
|
||||
for (i = 0; i < leadingBytes; i++)
|
||||
{
|
||||
dest[destIdx&destMask] = src[srcIdx];
|
||||
++destIdx;
|
||||
--srcIdx;
|
||||
}
|
||||
srcIdx += 5;
|
||||
}
|
||||
|
||||
// copy dwords
|
||||
numDWords = numBytes >> 2;
|
||||
while (numDWords--) {
|
||||
dest[(destIdx + 3) & destMask] = src[srcIdx++];
|
||||
dest[(destIdx + 2) & destMask] = src[srcIdx++];
|
||||
dest[(destIdx + 1) & destMask] = src[srcIdx++];
|
||||
dest[(destIdx + 0) & destMask] = src[srcIdx++];
|
||||
destIdx += 4;
|
||||
}
|
||||
|
||||
// copy trailing bytes
|
||||
trailingBytes = numBytes & 3;
|
||||
if (trailingBytes)
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
srcIdx ^= 3;
|
||||
for (i = 0; i < trailingBytes; i++)
|
||||
{
|
||||
dest[destIdx&destMask] = src[srcIdx];
|
||||
++destIdx;
|
||||
--srcIdx;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static INLINE void DWordInterleaveWrap(uint32_t *src, uint32_t srcIdx, uint32_t srcMask, uint32_t numQWords)
|
||||
{
|
||||
uint32_t tmp;
|
||||
while (numQWords--) {
|
||||
tmp = src[srcIdx & srcMask];
|
||||
src[srcIdx & srcMask] = src[(srcIdx + 1) & srcMask];
|
||||
++srcIdx;
|
||||
src[srcIdx & srcMask] = tmp;
|
||||
++srcIdx;
|
||||
}
|
||||
}
|
||||
|
||||
static INLINE uint16_t swapword( uint16_t value )
|
||||
{
|
||||
return (value << 8) | (value >> 8);
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
+2
-68
@@ -4,6 +4,8 @@
|
||||
#include <stdlib.h>
|
||||
#include <retro_inline.h>
|
||||
|
||||
#include "../../Graphics/image_convert.h"
|
||||
|
||||
#if !defined(__MACH__) && !defined(__ppc__) && defined(__GNUC__)
|
||||
#define HAVE_BSWAP
|
||||
#endif
|
||||
@@ -119,74 +121,6 @@ static const volatile uint8_t One2Eight[2] =
|
||||
255, // 1 = 11111111
|
||||
};
|
||||
|
||||
static INLINE void UnswapCopyWrap(const uint8_t *src, uint32_t srcIdx, uint8_t *dest, uint32_t destIdx, uint32_t destMask, uint32_t numBytes)
|
||||
{
|
||||
int numDWords;
|
||||
int trailingBytes;
|
||||
// copy leading bytes
|
||||
uint32_t leadingBytes = srcIdx & 3;
|
||||
if (leadingBytes != 0)
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
leadingBytes = 4 - leadingBytes;
|
||||
if ((uint32_t)leadingBytes > numBytes)
|
||||
leadingBytes = numBytes;
|
||||
numBytes -= leadingBytes;
|
||||
|
||||
srcIdx ^= 3;
|
||||
for (i = 0; i < leadingBytes; i++)
|
||||
{
|
||||
dest[destIdx&destMask] = src[srcIdx];
|
||||
++destIdx;
|
||||
--srcIdx;
|
||||
}
|
||||
srcIdx += 5;
|
||||
}
|
||||
|
||||
// copy dwords
|
||||
numDWords = numBytes >> 2;
|
||||
while (numDWords--) {
|
||||
dest[(destIdx + 3) & destMask] = src[srcIdx++];
|
||||
dest[(destIdx + 2) & destMask] = src[srcIdx++];
|
||||
dest[(destIdx + 1) & destMask] = src[srcIdx++];
|
||||
dest[(destIdx + 0) & destMask] = src[srcIdx++];
|
||||
destIdx += 4;
|
||||
}
|
||||
|
||||
// copy trailing bytes
|
||||
trailingBytes = numBytes & 3;
|
||||
if (trailingBytes)
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
srcIdx ^= 3;
|
||||
for (i = 0; i < trailingBytes; i++)
|
||||
{
|
||||
dest[destIdx&destMask] = src[srcIdx];
|
||||
++destIdx;
|
||||
--srcIdx;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static INLINE void DWordInterleaveWrap(uint32_t *src, uint32_t srcIdx, uint32_t srcMask, uint32_t numQWords)
|
||||
{
|
||||
uint32_t tmp;
|
||||
while (numQWords--) {
|
||||
tmp = src[srcIdx & srcMask];
|
||||
src[srcIdx & srcMask] = src[(srcIdx + 1) & srcMask];
|
||||
++srcIdx;
|
||||
src[srcIdx & srcMask] = tmp;
|
||||
++srcIdx;
|
||||
}
|
||||
}
|
||||
|
||||
static INLINE uint16_t swapword( uint16_t value )
|
||||
{
|
||||
return (value << 8) | (value >> 8);
|
||||
}
|
||||
|
||||
#define RGBA8888_RGBA4444(color) (((color & 0x000000f0) << 8) | ((color & 0x0000f000) >> 4) | ((color & 0x00f00000) >> 16) | ((color & 0xf0000000) >> 28))
|
||||
|
||||
static INLINE uint32_t RGBA5551_RGBA8888( uint16_t color )
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
|
||||
#include <retro_inline.h>
|
||||
|
||||
#include "../../Graphics/image_convert.h"
|
||||
|
||||
const volatile uint8_t Five2Eight[32] =
|
||||
{
|
||||
0, // 00000 = 00000000
|
||||
@@ -104,69 +106,6 @@ const volatile uint8_t One2Eight[2] =
|
||||
255, // 1 = 11111111
|
||||
};
|
||||
|
||||
static INLINE void UnswapCopyWrap(const uint8_t *src, uint32_t srcIdx, uint8_t *dest, uint32_t destIdx, uint32_t destMask, uint32_t numBytes)
|
||||
{
|
||||
// copy leading bytes
|
||||
uint32_t leadingBytes = srcIdx & 3;
|
||||
if (leadingBytes != 0) {
|
||||
leadingBytes = 4 - leadingBytes;
|
||||
if ((uint32_t)leadingBytes > numBytes)
|
||||
leadingBytes = numBytes;
|
||||
numBytes -= leadingBytes;
|
||||
|
||||
srcIdx ^= 3;
|
||||
for (int i = 0; i < leadingBytes; i++) {
|
||||
dest[destIdx&destMask] = src[srcIdx];
|
||||
++destIdx;
|
||||
--srcIdx;
|
||||
}
|
||||
srcIdx += 5;
|
||||
}
|
||||
|
||||
// copy dwords
|
||||
int numDWords = numBytes >> 2;
|
||||
while (numDWords--) {
|
||||
dest[(destIdx + 3) & destMask] = src[srcIdx++];
|
||||
dest[(destIdx + 2) & destMask] = src[srcIdx++];
|
||||
dest[(destIdx + 1) & destMask] = src[srcIdx++];
|
||||
dest[(destIdx + 0) & destMask] = src[srcIdx++];
|
||||
destIdx += 4;
|
||||
}
|
||||
|
||||
// copy trailing bytes
|
||||
int trailingBytes = numBytes & 3;
|
||||
if (trailingBytes) {
|
||||
srcIdx ^= 3;
|
||||
for (int i = 0; i < trailingBytes; i++) {
|
||||
dest[destIdx&destMask] = src[srcIdx];
|
||||
++destIdx;
|
||||
--srcIdx;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static INLINE void DWordInterleaveWrap(uint32_t *src, uint32_t srcIdx, uint32_t srcMask, uint32_t numQWords)
|
||||
{
|
||||
uint32_t tmp;
|
||||
while (numQWords--) {
|
||||
tmp = src[srcIdx & srcMask];
|
||||
src[srcIdx & srcMask] = src[(srcIdx + 1) & srcMask];
|
||||
++srcIdx;
|
||||
src[srcIdx & srcMask] = tmp;
|
||||
++srcIdx;
|
||||
}
|
||||
}
|
||||
|
||||
static INLINE uint16_t swapword( uint16_t value )
|
||||
{
|
||||
#ifdef ARM_ASM
|
||||
asm("rev16 %0, %0" : "+r"(value)::);
|
||||
return value;
|
||||
#else
|
||||
return (value << 8) | (value >> 8);
|
||||
#endif // ARM_ASM
|
||||
}
|
||||
|
||||
inline uint16_t RGBA8888_RGBA4444( uint32_t color )
|
||||
{
|
||||
return ((color & 0x000000f0) << 8) | // r
|
||||
|
||||
Reference in new issue
Block a user