summaryrefslogtreecommitdiffstats
path: root/Gui/wm/wsconv.c
diff options
context:
space:
mode:
authorarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-08-25 21:04:29 +0000
committerarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-08-25 21:04:29 +0000
commit9f6529b3d3a1ec681a84735d57a9f2d8656809af (patch)
tree4943e4a95c68932a956ce7a693c58f5b2ed79b37 /Gui/wm/wsconv.c
parent05f7ab93841eef7bf50c31b64bf723c100e0c123 (diff)
downloadmpv-9f6529b3d3a1ec681a84735d57a9f2d8656809af.tar.bz2
mpv-9f6529b3d3a1ec681a84735d57a9f2d8656809af.tar.xz
GUI version n-1
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@1694 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'Gui/wm/wsconv.c')
-rw-r--r--Gui/wm/wsconv.c204
1 files changed, 204 insertions, 0 deletions
diff --git a/Gui/wm/wsconv.c b/Gui/wm/wsconv.c
new file mode 100644
index 0000000000..935672cf09
--- /dev/null
+++ b/Gui/wm/wsconv.c
@@ -0,0 +1,204 @@
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "../../config.h"
+#ifdef xHAVE_MMX
+ #include "../../main/libvo/mmx.h"
+ #include "../../main/libvo/fastmemcpy.h"
+#endif
+#include "wsconv.h"
+
+wsTConvFunc wsConvFunc = NULL;
+
+// ---
+
+#define COPY_RGB_24(src,dst) dst[0]=src[0];dst[1]=src[1];dst[2]=src[2]
+
+#define SWAP_RGB_24(src,dst) dst[1]=src[0];dst[1]=src[1];dst[2]=src[0]
+
+void BGR8880_to_RGB555_c( unsigned char * in_pixels, unsigned char * out_pixels, int num_pixels)
+{
+ unsigned short pixel;
+ int i;
+ for(i = 0; i < num_pixels; i++)
+ {
+ PACK_RGB15(in_pixels[0],in_pixels[1],in_pixels[2],pixel);
+ *(unsigned short*)out_pixels = pixel;
+ in_pixels += 4;
+ out_pixels += 2;
+ }
+}
+
+void BGR8880_to_BGR555_c( unsigned char * in_pixels, unsigned char * out_pixels, int num_pixels)
+{
+ unsigned short pixel;
+ int i;
+ for(i = 0; i < num_pixels; i++)
+ {
+ PACK_RGB15(in_pixels[2],in_pixels[1],in_pixels[0],pixel);
+ *(unsigned short*)out_pixels = pixel;
+ in_pixels += 4;
+ out_pixels += 2;
+ }
+}
+
+void BGR8880_to_RGB565_c( unsigned char * in_pixels, unsigned char * out_pixels, int num_pixels)
+{
+ unsigned short pixel;
+ int i;
+ for(i = 0; i < num_pixels; i++)
+ {
+ PACK_RGB16(in_pixels[0],in_pixels[1],in_pixels[2],pixel);
+ *(unsigned short*)out_pixels = pixel;
+ in_pixels += 4;
+ out_pixels += 2;
+ }
+}
+
+void BGR8880_to_BGR565_c( unsigned char * in_pixels, unsigned char * out_pixels, int num_pixels)
+{
+ unsigned short pixel;
+ int i;
+ for(i = 0; i < num_pixels; i++)
+ {
+ PACK_RGB16(in_pixels[2],in_pixels[1],in_pixels[0],pixel);
+ *(unsigned short*)out_pixels = pixel;
+ in_pixels += 4;
+ out_pixels += 2;
+ }
+}
+
+void BGR8880_to_RGB888_c( unsigned char * in_pixels, unsigned char * out_pixels,int num_pixels )
+{
+ int i;
+ for(i = 0; i < num_pixels; i++)
+ {
+ COPY_RGB_24(in_pixels,out_pixels);
+ in_pixels += 4;
+ out_pixels += 3;
+ }
+}
+
+void BGR8880_to_BGR888_c( unsigned char * in_pixels, unsigned char * out_pixels,int num_pixels )
+{
+ int i;
+ for(i = 0; i < num_pixels; i++)
+ {
+ SWAP_RGB_24(in_pixels,out_pixels);
+ in_pixels += 4;
+ out_pixels += 3;
+ }
+}
+
+void BGR8880_to_BGR8880_c( unsigned char * in_pixels, unsigned char * out_pixels,int num_pixels )
+{
+ int i;
+ for(i = 0; i < num_pixels; i++)
+ {
+ SWAP_RGB_24(in_pixels,out_pixels);
+ in_pixels += 4;
+ out_pixels += 4;
+ }
+}
+
+void BGR8880_to_RGB8880_c( unsigned char * in_pixels, unsigned char * out_pixels,int num_pixels )
+{ memcpy( out_pixels,in_pixels,num_pixels * 4 ); }
+
+/*
+
+unsigned char * map_5_to_8[32];
+unsigned char * map_6_to_8[64];
+
+#define POINTER_TO_GUINT16(a) *((unsigned short*)a)
+#define RGB16_TO_R(pixel) map_5_to_8[pixel & RGB16_LOWER_MASK]
+#define RGB16_TO_G(pixel) map_6_to_8[(pixel & RGB16_MIDDLE_MASK)>>5]
+#define RGB16_TO_B(pixel) map_5_to_8[(pixel & RGB16_UPPER_MASK)>>11]
+#define RGB16_LOWER_MASK 0x001f
+#define RGB16_MIDDLE_MASK 0x07e0
+#define RGB16_UPPER_MASK 0xf800
+
+void RGB565_to_RGB888_c( unsigned char * in_pixels, unsigned char * out_pixels,int num_pixels)
+{
+ unsigned short in_pixel;
+ int i;
+ for(i = 0; i < num_pixels; i++)
+ {
+ in_pixel = POINTER_TO_GUINT16(in_pixels);
+ out_pixels[0] = RGB16_TO_R(in_pixel);
+ out_pixels[1] = RGB16_TO_G(in_pixel);
+ out_pixels[2] = RGB16_TO_B(in_pixel);
+ in_pixels += 2;
+ out_pixels += 3;
+ }
+}
+
+*/
+
+// ---
+
+#ifdef xHAVE_MMX
+
+#define LOAD_32(in) movq_m2r(*in, mm0); in += 8;\
+ movq_m2r(*in, mm1); in += 8
+
+#define PACK_32_TO_24 movq_r2r(mm0, mm2);\
+ pand_m2r(rgb32_l_mask,mm0);\
+ pand_m2r(rgb32_u_mask,mm2);\
+ psrlq_i2r(8, mm2);\
+ por_r2r(mm2,mm0);\
+ movq_r2r(mm1, mm2);\
+ pand_m2r(rgb32_l_mask,mm1);\
+ pand_m2r(rgb32_u_mask,mm2);\
+ psrlq_i2r(8, mm2);\
+ por_r2r(mm2,mm1);
+
+#define WRITE_24(out) movq_r2m(mm0, *out); out+=6;\
+ movq_r2m(mm1, *out); out+=6;
+
+#define WRITE_16(out) movq_r2m(mm0, *out); out+=8;
+
+static mmx_t rgb32_l_mask; // Mask for the lower of 2 RGB24 pixels
+static mmx_t rgb32_u_mask; // Mask for the upper of 2 RGB24 pixels
+
+static mmx_t rgb32_r_mask; // Mask for the reds of 2 RGB32 pixels
+static mmx_t rgb32_g_mask; // Mask for the greens of 2 RGB32 pixels
+static mmx_t rgb32_b_mask; // Mask for the blues of 2 RGB32 pixels
+
+static mmx_t lower_dword_mask; // Mask for the lower doublewords
+static mmx_t upper_dword_mask; // Mask for the upper doublewords
+
+void BGR8880_to_RGB888_mmx(unsigned char * in_pixels,unsigned char * out_pixels,int num_pixels)
+{
+ int imax = num_pixels/4;
+ int i;
+
+ for(i = 0; i < imax; i++)
+ {
+ LOAD_32(in_pixels);
+ PACK_32_TO_24;
+ WRITE_24(out_pixels);
+ }
+ emms();
+}
+
+#endif
+
+// ---
+
+void initConverter( void )
+{
+#ifdef xHAVE_MMX
+// int i;
+
+// for(i = 0; i < 64; i++) map_6_to_8[i] = (unsigned char)((float)i/63.0*255.0+0.5);
+// for(i = 0; i < 32; i++) map_5_to_8[i] = (unsigned char)((float)i/31.0*255.0+0.5);
+
+ rgb32_l_mask.q = 0x0000000000FFFFFFLL; // Mask for the lower of 2 RGB32 pixels
+ rgb32_u_mask.q = 0x00FFFFFF00000000LL; // Mask for the upper of 2 RGB32 pixels
+
+ rgb32_r_mask.q = 0x000000FF000000FFLL; // Mask for the reds of 2 RGB32 pixels
+ rgb32_g_mask.q = 0x0000FF000000FF00LL; // Mask for the greens of 2 RGB32 pixels
+ rgb32_b_mask.q = 0x00FF000000FF0000LL; // Mask for the blues of 2 RGB32 pixels
+#endif
+} \ No newline at end of file