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_stretchblit_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, int dw, int dh,
00041 unsigned char alpha) {
00042
00043 if (alpha == 0xff) {
00044
00045 mmsfb_stretchblit_blend_ayuv_to_ayuv(extbuf, src_height, sx, sy, sw, sh,
00046 dst, dst_pitch, dst_height, dx, dy, dw, dh);
00047 return;
00048 }
00049
00050
00051 static bool firsttime = true;
00052 if (firsttime) {
00053 printf("DISKO: Using accelerated stretch & 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 unsigned int *src_end = src + sx + src_pitch_pix * (sy + sh);
00070 if (src_end > src + src_pitch_pix * src_height)
00071 src_end = src + src_pitch_pix * src_height;
00072 unsigned int *dst_end = dst + dst_pitch_pix * dst_height;
00073 src+=sx + sy * src_pitch_pix;
00074 dst+=dx + dy * dst_pitch_pix;
00075
00076
00077
00078
00079 int horifact = (dw<<16)/sw;
00080 int vertfact = (dh<<16)/sh;
00081
00082
00083 register int ALPHA = alpha;
00084 ALPHA++;
00085
00086
00087
00088 int vertcnt = 0x8000;
00089 while ((src < src_end)&&(dst < dst_end)) {
00090
00091 vertcnt+=vertfact;
00092 if (vertcnt & 0xffff0000) {
00093 unsigned int *line_end = src + sw;
00094 unsigned int *old_dst = dst;
00095
00096 do {
00097 int horicnt = 0x8000;
00098 while (src < line_end) {
00099
00100
00101 horicnt+=horifact;
00102
00103 if (horicnt & 0xffff0000) {
00104 register unsigned int SRC = *src;
00105 register unsigned int A = SRC >> 24;
00106
00107 if (!A) {
00108
00109 do {
00110 dst++;
00111 horicnt-=0x10000;
00112 } while (horicnt & 0xffff0000);
00113 }
00114 else
00115 {
00116
00117 register unsigned int DST = *dst;
00118 unsigned int OLDDST = DST + 1;
00119 register unsigned int d;
00120
00121
00122 A = (ALPHA * A) >> 8;
00123 int sy = (SRC << 8) >> 24;
00124 int su = (SRC << 16) >> 24;
00125 int sv = SRC & 0xff;
00126 register int SA= 0x100 - A;
00127
00128
00129
00130
00131 MMSFB_CONV_PREPARE_YUVBLEND(sy,su,sv);
00132 sy = (ALPHA * sy) >> 8;
00133 su = (ALPHA * su) >> 8;
00134 sv = (ALPHA * sv) >> 8;
00135 MMSFB_CONV_RESET_YUVBLEND(sy,su,sv);
00136
00137 do {
00138 if (DST==OLDDST) {
00139
00140 if (A) {
00141
00142 *dst = d;
00143 }
00144 dst++;
00145 DST = *dst;
00146 horicnt-=0x10000;
00147 continue;
00148 }
00149 OLDDST = DST;
00150
00151
00152 unsigned int a = DST >> 24;
00153 int y = (DST << 8) >> 24;
00154 int u = (DST << 16) >> 24;
00155 int v = DST & 0xff;
00156
00157
00158
00159 MMSFB_CONV_PREPARE_YUVBLEND(y,u,v);
00160
00161
00162 a = (SA * a) >> 8;
00163 y = (SA * y) >> 8;
00164 u = (SA * u) >> 8;
00165 v = (SA * v) >> 8;
00166
00167
00168 a += A;
00169 y += sy;
00170 u += su;
00171 v += sv;
00172
00173
00174
00175 d = ((a >> 8) ? 0xff000000 : (a << 24));
00176 if (y > 0)
00177 d |= ((y >> 8) ? 0xff0000 : (y << 16));
00178 if (u > 0)
00179 d |= ((u >> 8) ? 0xff00 : (u << 8));
00180 if (v > 0)
00181 d |= ((v >> 8) ? 0xff : v);
00182
00183 *dst = d;
00184 dst++;
00185 DST = *dst;
00186 horicnt-=0x10000;
00187 } while (horicnt & 0xffff0000);
00188 }
00189 }
00190
00191 src++;
00192 }
00193 src-=sw;
00194 vertcnt-=0x10000;
00195 dst = old_dst + dst_pitch/4;
00196 old_dst = dst;
00197 } while (vertcnt & 0xffff0000);
00198 }
00199
00200
00201 src+=src_pitch/4;
00202 }
00203 }
00204
00205 #endif