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