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_RGB16__
00036 #ifdef __HAVE_PF_ARGB__
00037
00038 #include <cstring>
00039 #include "mmstools/mmstools.h"
00040
00041 void mmsfb_blit_rgb16_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 RGB16 to ARGB.\n");
00047 firsttime = false;
00048 }
00049
00050
00051 unsigned short int *src = (unsigned short int *)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 >> 1;
00060 int dst_pitch_pix = dst_pitch >> 2;
00061 src+= sx + sy * src_pitch_pix;
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 short int *src_end = src + src_pitch_pix * sh;
00073 int src_pitch_diff = src_pitch_pix - sw;
00074 int dst_pitch_diff = dst_pitch_pix - sw;
00075
00076
00077 while (src < src_end) {
00078
00079 unsigned short int *line_end = src + sw;
00080 while (src < line_end) {
00081
00082 register unsigned short int SRC = *src;
00083 *dst = 0xff000000
00084 | ((SRC >> 11) << 19)
00085 | ((SRC & 0x07e0) << 5)
00086 | ((SRC & 0x1f) << 3);
00087 dst++;
00088 src++;
00089 }
00090
00091
00092 src+= src_pitch_diff;
00093 dst+= dst_pitch_diff;
00094 }
00095 }
00096
00097 #endif
00098 #endif