X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=bigscreen%2Ftinyptc%2Fconvert.c;fp=bigscreen%2Ftinyptc%2Fconvert.c;h=8ea7a35715fe94229bd64c9d09de2b1bbf8965cd;hb=140a0aae7299d15459fe9ec74ad5020887e0a960;hp=0000000000000000000000000000000000000000;hpb=fd56777b1051147ba14850b72f1f959cd82a1827;p=ccbs diff --git a/bigscreen/tinyptc/convert.c b/bigscreen/tinyptc/convert.c new file mode 100644 index 0000000..8ea7a35 --- /dev/null +++ b/bigscreen/tinyptc/convert.c @@ -0,0 +1,267 @@ +/* + * TinyPTC x11 v0.7.3 Pixelformat converters + * Copyright (C) 2000-2002 Alessandro Gatti + * Copyright (C) 2000-2001 Glenn Fiedler + * + * http://www.sourceforge.net/projects/tinyptc/ + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "convert.h" +#include "mmx.h" +#include + +#ifdef __PTC_CONVERTER_32_TO_32_RGB888 +void +ptc_convert_32_to_32_rgb888 (void *src, void *dst, int pixels) +{ +#ifdef __PTC_MMX__ + mmx_memcpy (dst, src, pixels * 4); +#else +#ifdef __PTC_MEMCPY__ + memcpy (dst, src, pixels * 4); +#else + int32 *p = (int32 *) src; + int32 *q = (int32 *) dst; + while (pixels--) + { + *(q++) = *(p++); + } +#endif /* __PTC_MEMCPY__ */ +#endif /* __PTC_MMX__ */ +} +#endif /* __PTC_CONVERTER_32_TO_32_RGB888 */ + +#ifdef __PTC_CONVERTER_32_TO_32_BGR888 +void +ptc_convert_32_to_32_bgr888 (void *src, void *dst, int pixels) +{ + int32 *p = (int32 *) src; + int32 *q = (int32 *) dst; + while (pixels--) + { +#ifdef __PTC_LITTLE_ENDIAN__ + int32 r = (int32) ((*p & 0x00FF0000) << 8); + int32 g = (int32) ((*p & 0x0000FF00) << 8); + int32 b = (int32) ((*p & 0x000000FF) << 8); +#else + int32 r = (int32) ((*p & 0x00FF0000) >> 16); + int32 g = (int32) ((*p & 0x0000FF00)); + int32 b = (int32) ((*p & 0x000000FF) << 16); +#endif /* __PTC_LITTLE_ENDIAN__ */ + *(q++) = r | g | b; + p++; + } +} +#endif /* __PTC_CONVERTER_32_TO_32_BGR888 */ + +#ifdef __PTC_CONVERTER_32_TO_24_RGB888 +void +ptc_convert_32_to_24_rgb888 (void *src, void *dst, int pixels) +{ +#ifdef __PTC_MMX__ + mmx_convert_32_to_24_rgb888 (dst, src, pixels); +#else + char8 *p = (char8 *) src; + char8 *q = (char8 *) dst; + while (pixels--) + { +#ifdef __PTC_LITTLE_ENDIAN__ + *q = *p; + *(q + 1) = *(p + 1); + *(q + 2) = *(p + 2); +#else + *(q + 2) = *p; + *(q + 1) = *(p + 1); + *q = *(p + 2); +#endif /* __PTC_LITTLE_ENDIAN__ */ + p += 4; + q += 3; + } +#endif /* __PTC_MMX__ */ +} +#endif /* __PTC_CONVERTER_32_TO_24_RGB888 */ + +#ifdef __PTC_CONVERTER_32_TO_24_BGR888 +void +ptc_convert_32_to_24_bgr888 (void *src, void *dst, int pixels) +{ +#ifdef __PTC_MMX__ + mmx_convert_32_to_24_bgr888 (dst, src, pixels); +#else + char8 *p = (char8 *) src; + char8 *q = (char8 *) dst; + while (pixels--) + { +#ifdef __PTC_LITTLE_ENDIAN__ + *(q + 2) = *p; + *(q + 1) = *(p + 1); + *q = *(p + 2); +#else + *q = *p; + *(q + 1) = *(p + 1); + *(q + 2) = *(p + 2); +#endif /* __PTC_LITTLE_ENDIAN__ */ + p += 4; + q += 3; + } +#endif /* __PTC_MMX__ */ +} +#endif /* __PTC_CONVERTER_32_TO_24_BGR888 */ + +#ifdef __PTC_CONVERTER_32_TO_16_RGB565 +void +ptc_convert_32_to_16_rgb565 (void *src, void *dst, int pixels) +{ +#ifdef __PTC_MMX__ + mmx_convert_32_to_16_rgb565 (dst, src, pixels); +#else + int32 *p = (int32 *) src; + short16 *q = (short16 *) dst; + while (pixels--) + { + short16 r = (short16) ((*p & 0x00F80000) >> 8); + short16 g = (short16) ((*p & 0x0000FC00) >> 5); + short16 b = (short16) ((*p & 0x000000F8) >> 3); + *q = r | g | b; + p++; + q++; + } +#endif /* __PTC_MMX__ */ +} +#endif /* __PTC_CONVERTER_32_TO_16_RGB565 */ + +#ifdef __PTC_CONVERTER_32_TO_16_BGR565 +void +ptc_convert_32_to_16_bgr565 (void *src, void *dst, int pixels) +{ +#ifdef __PTC_MMX__ + mmx_convert_32_to_16_bgr565 (dst, src, pixels); +#else + int32 *p = (int32 *) src; + short16 *q = (short16 *) dst; + while (pixels--) + { + short16 r = (short16) ((*p & 0x00F80000) >> 19); + short16 g = (short16) ((*p & 0x0000FC00) >> 5); + short16 b = (short16) ((*p & 0x000000F8) << 8); + *q = r | g | b; + p++; + q++; + } +#endif /* __PTC_MMX__ */ +} +#endif /* __PTC_CONVERTER_32_TO_16_RGB565 */ + +#ifdef __PTC_CONVERTER_32_TO_16_RGB555 +void +ptc_convert_32_to_16_rgb555 (void *src, void *dst, int pixels) +{ +#ifdef __PTC_MMX__ + mmx_convert_32_to_16_rgb555 (dst, src, pixels); +#else + int32 *p = (int32 *) src; + short16 *q = (short16 *) dst; + while (pixels--) + { + short16 r = (short16) ((*p & 0x00F80000) >> 9); + short16 g = (short16) ((*p & 0x0000F800) >> 6); + short16 b = (short16) ((*p & 0x000000F8) >> 3); + *q = r | g | b; + p++; + q++; + } +#endif /* __PTC_MMX__ */ +} +#endif /* __PTC_CONVERTER_32_TO_16_RGB555 */ + +#ifdef __PTC_CONVERTER_32_TO_16_BGR555 +void +ptc_convert_32_to_16_bgr555 (void *src, void *dst, int pixels) +{ +#ifdef __PTC_MMX__ + mmx_convert_32_to_16_bgr555 (dst, src, pixels); +#else + int32 *p = (int32 *) src; + short16 *q = (short16 *) dst; + while (pixels--) + { + short16 r = (short16) ((*p & 0x00F80000) >> 20); + short16 g = (short16) ((*p & 0x0000F800) >> 6); + short16 b = (short16) ((*p & 0x000000F8) << 8); + *q = r | g | b; + p++; + q++; + } +#endif /* __PTC_MMX__ */ +} +#endif /* __PTC_CONVERTER_32_TO_16_BGR555 */ + +PTC_CONVERTER +ptc_request_converter (int bits, int32 r, int32 g, int32 b) +{ + /* 32bit RGB888 -> 32bit RGB888 */ +#ifdef __PTC_CONVERTER_32_TO_32_RGB888 + if (bits == 32 && r == 0x00FF0000 && g == 0x0000FF00 && b == 0x000000FF) + return &ptc_convert_32_to_32_rgb888; +#endif + + /* 32bit RGB888 -> 32bit BGR888 */ +#ifdef __PTC_CONVERTER_32_TO_32_BGR888 + if (bits == 32 && r == 0x000000FF && g == 0x0000FF00 && b == 0x00FF0000) + return &ptc_convert_32_to_32_bgr888; +#endif + + /* 32bit RGB888 -> 24bit RGB888 */ +#ifdef __PTC_CONVERTER_32_TO_24_RGB888 + if (bits == 24 && r == 0x00FF0000 && g == 0x0000FF00 && b == 0x000000FF) + return &ptc_convert_32_to_24_rgb888; +#endif + + /* 32bit RGB888 -> 24bit BGR888 */ +#ifdef __PTC_CONVERTER_32_TO_24_BGR888 + if (bits == 24 && r == 0x000000FF && g == 0x0000FF00 && b == 0x00FF0000) + return &ptc_convert_32_to_24_bgr888; +#endif + + /* 32bit RGB888 -> 16bit RGB565 */ +#ifdef __PTC_CONVERTER_32_TO_16_RGB565 + if (bits == 16 && r == 0xF800 && g == 0x07E0 && b == 0x001F) + return &ptc_convert_32_to_16_rgb565; +#endif + + /* 32bit RGB888 -> 16bit BGR565 */ +#ifdef __PTC_CONVERTER_32_TO_16_BGR565 + if (bits == 16 && r == 0x001F && g == 0x07E0 && b == 0xF800) + return &ptc_convert_32_to_16_bgr565; +#endif + + /* 32bit RGB888 -> 16bit RGB555 */ +#ifdef __PTC_CONVERTER_32_TO_16_RGB555 + if (bits == 16 && r == 0x7C00 && g == 0x03E0 && b == 0x001F) + return &ptc_convert_32_to_16_rgb555; +#endif + + /* 32bit RGB888 -> 16bit BGR555 */ +#ifdef __PTC_CONVERTER_32_TO_16_BGR555 + if (bits == 16 && r == 0x001F && g == 0x03E0 && b == 0x7C00) + return &ptc_convert_32_to_16_bgr555; +#endif + + /* failure */ + return 0; +}