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_AYUV__
00036
00037 #include "mmstools/mmstools.h"
00038
00039 void mmsfb_blit_blend_ayuv_to_ayuv(MMSFBExternalSurfaceBuffer *extbuf, int src_height, int sx, int sy, int sw, int sh,
00040 unsigned int *dst, int dst_pitch, int dst_height, int dx, int dy) {
00041
00042 static bool firsttime = true;
00043 if (firsttime) {
00044 printf("DISKO: Using accelerated blend AYUV to AYUV.\n");
00045 firsttime = false;
00046 }
00047
00048
00049 unsigned int *src = (unsigned int *)extbuf->ptr;
00050 int src_pitch = extbuf->pitch;
00051
00052
00053 int src_pitch_pix = src_pitch >> 2;
00054 int dst_pitch_pix = dst_pitch >> 2;
00055 src+= sx + sy * src_pitch_pix;
00056 dst+= dx + dy * dst_pitch_pix;
00057
00058
00059 if (dst_pitch_pix - dx < sw - sx)
00060 sw = dst_pitch_pix - dx - sx;
00061 if (dst_height - dy < sh - sy)
00062 sh = dst_height - dy - sy;
00063 if ((sw <= 0)||(sh <= 0))
00064 return;
00065
00066 unsigned int OLDDST = (*dst) + 1;
00067 unsigned int OLDSRC = (*src) + 1;
00068 unsigned int *src_end = src + src_pitch_pix * sh;
00069 int src_pitch_diff = src_pitch_pix - sw;
00070 int dst_pitch_diff = dst_pitch_pix - sw;
00071 register unsigned int d;
00072
00073
00074 while (src < src_end) {
00075
00076 unsigned int *line_end = src + sw;
00077 while (src < line_end) {
00078
00079 register unsigned int SRC = *src;
00080
00081
00082 register unsigned int A = SRC >> 24;
00083 if (A == 0xff) {
00084
00085 *dst = SRC;
00086 }
00087 else
00088 if (A) {
00089
00090 register unsigned int DST = *dst;
00091
00092 if ((DST==OLDDST)&&(SRC==OLDSRC)) {
00093
00094 *dst = d;
00095 dst++;
00096 src++;
00097 continue;
00098 }
00099 OLDDST = DST;
00100 OLDSRC = SRC;
00101
00102
00103 register int SA= 0x100 - A;
00104 unsigned int a = DST >> 24;
00105 int y = (DST << 8) >> 24;
00106 int u = (DST << 16) >> 24;
00107 int v = DST & 0xff;
00108
00109
00110
00111 MMSFB_CONV_PREPARE_YUVBLEND(y,u,v);
00112
00113
00114 a = (SA * a) >> 8;
00115 y = (SA * y) >> 8;
00116 u = (SA * u) >> 8;
00117 v = (SA * v) >> 8;
00118
00119
00120 a += A;
00121 y += (SRC << 8) >> 24;
00122 u += (SRC << 16) >> 24;
00123 v += SRC & 0xff;
00124
00125
00126
00127 d = ((a >> 8) ? 0xff000000 : (a << 24));
00128 if (y > 0)
00129 d |= ((y >> 8) ? 0xff0000 : (y << 16));
00130 if (u > 0)
00131 d |= ((u >> 8) ? 0xff00 : (u << 8));
00132 if (v > 0)
00133 d |= ((v >> 8) ? 0xff : v);
00134
00135 *dst = d;
00136 }
00137
00138 dst++;
00139 src++;
00140 }
00141
00142
00143 src+= src_pitch_diff;
00144 dst+= dst_pitch_diff;
00145 }
00146 }
00147
00148 #endif