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_RGB24__
00036 #ifdef __HAVE_PF_ARGB__
00037
00038 #include <cstring>
00039 #include "mmstools/mmstools.h"
00040
00041 void mmsfb_blit_rgb24_to_argb(MMSFBSurfacePlanes *src_planes, int src_height, int sx, int sy, int sw, int sh,
00042 MMSFBSurfacePlanes *dst_planes, int dst_height, int dx, int dy) {
00043
00044 static bool firsttime = true;
00045 if (firsttime) {
00046 printf("DISKO: Using accelerated conversion RGB24 to ARGB.\n");
00047 firsttime = false;
00048 }
00049
00050
00051 unsigned char *src = (unsigned char *)src_planes->ptr;
00052 int src_pitch = src_planes->pitch;
00053
00054
00055 unsigned int *dst = (unsigned int *)dst_planes->ptr;
00056 int dst_pitch = dst_planes->pitch;
00057
00058
00059 int src_pitch_pix = src_pitch / 3;
00060 int dst_pitch_pix = dst_pitch >> 2;
00061 src+= (sx + sy * src_pitch_pix) * 3;
00062 dst+= dx + dy * dst_pitch_pix;
00063
00064
00065 if (dst_pitch_pix - dx < sw - sx)
00066 sw = dst_pitch_pix - dx - sx;
00067 if (dst_height - dy < sh - sy)
00068 sh = dst_height - dy - sy;
00069 if ((sw <= 0)||(sh <= 0))
00070 return;
00071
00072 unsigned char *src_end = src + (src_pitch_pix * sh) * 3;
00073 int src_pitch_diff = (src_pitch_pix - sw) * 3;
00074 int dst_pitch_diff = dst_pitch_pix - sw;
00075 int sww = sw * 3;
00076
00077
00078 while (src < src_end) {
00079
00080 unsigned char *line_end = src + sww;
00081 while (src < line_end) {
00082
00083 *dst = 0xff000000 | ((*src)<<16) | ((*(src+1))<<8) | *(src+2);
00084 dst++;
00085 src+=3;
00086 }
00087
00088
00089 src+= src_pitch_diff;
00090 dst+= dst_pitch_diff;
00091 }
00092 }
00093
00094 #endif
00095 #endif