// Contact: 70565912@qq.com
//////////////////////////////////////////////////////////////////////////
#pragma once
/* C99 types */
typedef unsigned char uint8_t;
typedef signed char int8_t;
typedef unsigned short uint16_t;
typedef signed short int16_t;
typedef unsigned int uint32_t;
typedef signed int int32_t;
typedef unsigned __int64 uint64_t;
typedef signed __int64 int64_t;
typedef uint32_t uintptr_t;
typedef int32_t intptr_t;
typedef void (*rgb_piexl_p)(uint8_t*&, const uint8_t*&);
static void inline rgb_line(uint8_t* dst, uint32_t dst_pitch,
const uint8_t* src, uint32_t width, uint32_t height, uint32_t src_pitch, rgb_piexl_p p_rgb_piexl)
{
uint8_t *d = dst;
uint8_t *d_line = dst;
const uint8_t *s = src;
const uint8_t *s_line = src;
const uint8_t *end = src + src_pitch*height;
uint32_t i;
while (s < end)
{
for (i = 0; i < width; i++) {
p_rgb_piexl(d, s);
}
s_line += src_pitch;
d_line += dst_pitch;
s = s_line;
d = d_line;
}
}
//////////////////////////////////////////////////////////////////////////
static void inline rgb_piexl_16to32(uint8_t *&d, const uint8_t *&s)
{
uint16_t rgb = *((uint16_t*)s);
*d++ = (rgb&0x1F)<<3; //b
*d++ = (rgb&0x7E0)>>3; //g
*d++ = (rgb&0xF800)>>8; //r
*d++ = 255;
s+=2;
}
static void inline rgb_piexl_16to24(uint8_t *&d, const uint8_t *&s)
{
uint16_t rgb = *((uint16_t*)s);
*d++ = (rgb&0x1F)<<3; //b
*d++ = (rgb&0x7E0)>>3; //g
*d++ = (rgb&0xF800)>>8; //r
s+=2;
}
static void inline rgb_piexl_16to16(uint8_t *&d, const uint8_t *&s)
{
d[ 0 ] = s[ 0 ];
d[ 1 ] = s[ 1 ];
d += 2;
s += 2;
}
static void inline rgb_piexl_16to15(uint8_t *&d, const uint8_t *&s)
{
uint16_t rgb = *((uint16_t*)s);
*((uint16_t*)d) = (rgb&0x1F) | ((rgb&0x7C0)>>1) | ((rgb&0xF800)>>1);
d += 2;
s += 2;
}
#define rgb16to32(dst, dst_pitch, src, width, height, src_pitch) \
rgb_line(dst, dst_pitch, src, width, height, src_pitch, rgb_piexl_16to32);
#define rgb16to24(dst, dst_pitch, src, width, height, src_pitch) \
rgb_line(dst, dst_pitch, src, width, height, src_pitch, rgb_piexl_16to24);
#define rgb16to16(dst, dst_pitch, src, width, height, src_pitch) \
rgb_line(dst, dst_pitch, src, width, height, src_pitch, rgb_piexl_16to16);
#define rgb16to15(dst, dst_pitch, src, width, height, src_pitch) \
rgb_line(dst, dst_pitch, src, width, height, src_pitch, rgb_piexl_16to15);
//////////////////////////////////////////////////////////////////////////
static void inline rgb_piexl_24to32(uint8_t *&d, const uint8_t *&s)
{
d[ 0 ] = s[ 0 ]; //b
d[ 1 ] = s[ 1 ]; //g
d[ 2 ] = s[ 2 ]; //r
d[ 3 ] = 255; //a
s += 3;
d += 4;
}
static void inline rgb_piexl_24to24(uint8_t *&d, const uint8_t *&s)
{
d[ 0 ] = s[ 0 ]; //b
d[ 1 ] = s[ 1 ]; //g
d[ 2 ] = s[ 2 ]; //r
s += 3;
d += 3;
}
static void inline rgb_piexl_24to16(uint8_t *&d, const uint8_t *&s)
{
uint32_t rgb = *((uint32_t*)s);
*((uint16_t*)d) = ((rgb&0xF8)>>3) | ((rgb&0xFC00)>>5) | ((rgb&0xF80000)>>8);
d += 2;
s += 3;
}
static void inline rgb_piexl_24to15(uint8_t *&d, const uint8_t *&s)
{
uint32_t rgb = *(uint32_t*)s;
*((uint16_t*)d) = (rgb&0xF8>>3) | ((rgb&0xF800)>>6) | ((rgb&0xF80000)>>9);
s += 4;
d += 2;
}
#define rgb24to32(dst, dst_pitch, src, width, height, src_pitch) \
rgb_line(dst, dst_pitch, src, width, height, src_pitch, rgb_piexl_24to32);
#define rgb24to24(dst, dst_pitch, src, width, height, src_pitch) \
rgb_line(dst, dst_pitch, src, width, height, src_pitch, rgb_piexl_24to24);
#define rgb24to16(dst, dst_pitch, src, width, height, src_pitch) \
rgb_line(dst, dst_pitch, src, width, height, src_pitch, rgb_piexl_24to16);
#define rgb24to15(dst, dst_pitch, src, width, height, src_pitch) \
rgb_line(dst, dst_pitch, src, width, height, src_pitch, rgb_piexl_24to15);
//////////////////////////////////////////////////////////////////////////
static void inline rgb_piexl_32to32(uint8_t *&d, const uint8_t *&s)
{
d[ 0 ] = s[ 0 ]; //b
d[ 1 ] = s[ 1 ]; //g
d[ 2 ] = s[ 2 ]; //r
d[ 3 ] = s[ 3 ]; //a
s += 4;
d += 4;
}
static void inline rgb_piexl_32to24(uint8_t *&d, const uint8_t *&s)
{
d[ 0 ] = s[ 0 ]; //b
d[ 1 ] = s[ 1 ]; //g
d[ 2 ] = s[ 2 ]; //r
s += 4;
d += 3;
}
static void inline rgb_piexl_32to16(uint8_t *&d, const uint8_t *&s)
{
uint32_t rgb = *((uint32_t*)s);
*((uint16_t*)d) = ((rgb&0xF8)>>3) | ((rgb&0xFC00)>>5) | ((rgb&0xF80000)>>8);
d += 2;
s += 4;
}
static void inline rgb_piexl_32to15(uint8_t *&d, const uint8_t *&s)
{
uint32_t rgb = *(uint32_t*)s;
*((uint16_t*)d) = ((rgb&0xF8)>>3) | ((rgb&0xF800)>>6) | ((rgb&0xF80000)>>9);
s += 4;
d += 2;
}
#define rgb32to32(dst, dst_pitch, src, width, height, src_pitch) \
rgb_line(dst, dst_pitch, src, width, height, src_pitch, rgb_piexl_32to32);
#define rgb32to24(dst, dst_pitch, src, width, height, src_pitch) \
rgb_line(dst, dst_pitch, src, width, height, src_pitch, rgb_piexl_32to24);
#define rgb32to16(dst, dst_pitch, src, width, height, src_pitch) \
rgb_line(dst, dst_pitch, src, width, height, src_pitch, rgb_piexl_32to16);
#define rgb32to15(dst, dst_pitch, src, width, height, src_pitch) \
rgb_line(dst, dst_pitch, src, width, height, src_pitch, rgb_piexl_32to15);
(JackyHwei) |