00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include "mmsgui/fb/mmsfbconv.h"
00034
00035 #ifdef __HAVE_PF_YUY2__
00036
00037 #include <cstring>
00038 #include "mmstools/mmstools.h"
00039
00040 void mmsfb_blit_yuy2_to_yuy2(MMSFBSurfacePlanes *src_planes, int src_height, int sx, int sy, int sw, int sh,
00041 MMSFBSurfacePlanes *dst_planes, int dst_height, int dx, int dy) {
00042
00043 static bool firsttime = true;
00044 if (firsttime) {
00045 printf("DISKO: Using accelerated copy YUY2 to YUY2.\n");
00046 firsttime = false;
00047 }
00048
00049
00050 unsigned short int *src = (unsigned short int *)src_planes->ptr;
00051 int src_pitch = src_planes->pitch;
00052
00053
00054 unsigned short int *dst = (unsigned short int *)dst_planes->ptr;
00055 int dst_pitch = dst_planes->pitch;
00056
00057
00058
00059 if (sx & 0x01) {
00060 sx++;
00061 sw--;
00062 dx++;
00063 }
00064 if (sw & 0x01) {
00065 sw--;
00066 if (dx & 0x01) {
00067 dx++;
00068 }
00069 }
00070 else
00071 if (dx & 0x01) {
00072 dx++;
00073 sw-=2;
00074 }
00075
00076
00077 int src_pitch_pix = src_pitch >> 1;
00078 int dst_pitch_pix = dst_pitch >> 1;
00079 src+= sx + sy * src_pitch_pix;
00080 dst+= dx + dy * dst_pitch_pix;
00081
00082
00083 if (dst_pitch_pix - dx < sw - sx)
00084 sw = dst_pitch_pix - dx - sx;
00085 if (dst_height - dy < sh - sy)
00086 sh = dst_height - dy - sy;
00087 if ((sw <= 0)||(sh <= 0))
00088 return;
00089
00090 unsigned short int *src_end = src + src_pitch_pix * sh;
00091
00092
00093 while (src < src_end) {
00094
00095 memcpy(dst, src, sw << 1);
00096
00097
00098 src+= src_pitch_pix;
00099 dst+= dst_pitch_pix;
00100 }
00101 }
00102
00103 #endif