comparison src/video/SDL_blit_N.c @ 2267:c785543d1843

Okay, still some bugs, but everything builds again...
author Sam Lantinga <slouken@libsdl.org>
date Sat, 18 Aug 2007 05:39:09 +0000
parents bee005ace1bf
children e1da92da346c
comparison
equal deleted inserted replaced
2266:e61ad15a205f 2267:c785543d1843
158 static void 158 static void
159 Blit_RGB888_RGB565Altivec(SDL_BlitInfo * info) 159 Blit_RGB888_RGB565Altivec(SDL_BlitInfo * info)
160 { 160 {
161 int height = info->dst_h; 161 int height = info->dst_h;
162 Uint8 *src = (Uint8 *) info->src; 162 Uint8 *src = (Uint8 *) info->src;
163 int srcskip = info->s_skip; 163 int srcskip = info->src_skip;
164 Uint8 *dst = (Uint8 *) info->dst; 164 Uint8 *dst = (Uint8 *) info->dst;
165 int dstskip = info->dst_pitch; 165 int dstskip = info->dst_skip;
166 SDL_PixelFormat *srcfmt = info->src; 166 SDL_PixelFormat *srcfmt = info->src;
167 vector unsigned char valpha = vec_splat_u8(0); 167 vector unsigned char valpha = vec_splat_u8(0);
168 vector unsigned char vpermute = calc_swizzle32(srcfmt, NULL); 168 vector unsigned char vpermute = calc_swizzle32(srcfmt, NULL);
169 vector unsigned char vgmerge = VECUINT8_LITERAL(0x00, 0x02, 0x00, 0x06, 169 vector unsigned char vgmerge = VECUINT8_LITERAL(0x00, 0x02, 0x00, 0x06,
170 0x00, 0x0a, 0x00, 0x0e, 170 0x00, 0x0a, 0x00, 0x0e,
262 static void 262 static void
263 Blit_RGB565_32Altivec(SDL_BlitInfo * info) 263 Blit_RGB565_32Altivec(SDL_BlitInfo * info)
264 { 264 {
265 int height = info->dst_h; 265 int height = info->dst_h;
266 Uint8 *src = (Uint8 *) info->src; 266 Uint8 *src = (Uint8 *) info->src;
267 int srcskip = info->s_skip; 267 int srcskip = info->src_skip;
268 Uint8 *dst = (Uint8 *) info->dst; 268 Uint8 *dst = (Uint8 *) info->dst;
269 int dstskip = info->dst_pitch; 269 int dstskip = info->dst_skip;
270 SDL_PixelFormat *srcfmt = info->src; 270 SDL_PixelFormat *srcfmt = info->src;
271 SDL_PixelFormat *dstfmt = info->dst; 271 SDL_PixelFormat *dstfmt = info->dst;
272 unsigned alpha; 272 unsigned alpha;
273 vector unsigned char valpha; 273 vector unsigned char valpha;
274 vector unsigned char vpermute; 274 vector unsigned char vpermute;
320 assert(dstfmt->BytesPerPixel == 4); 320 assert(dstfmt->BytesPerPixel == 4);
321 321
322 vf800 = (vector unsigned short) vec_splat_u8(-7); 322 vf800 = (vector unsigned short) vec_splat_u8(-7);
323 vf800 = vec_sl(vf800, vec_splat_u16(8)); 323 vf800 = vec_sl(vf800, vec_splat_u16(8));
324 324
325 if (dstfmt->Amask && (info->cmod >> 24)) { 325 if (dstfmt->Amask && info->a) {
326 ((unsigned char *) &valpha)[0] = alpha = (info->cmod >> 24); 326 ((unsigned char *) &valpha)[0] = alpha = info->a;
327 valpha = vec_splat(valpha, 0); 327 valpha = vec_splat(valpha, 0);
328 } else { 328 } else {
329 alpha = 0; 329 alpha = 0;
330 valpha = vec_splat_u8(0); 330 valpha = vec_splat_u8(0);
331 } 331 }
410 static void 410 static void
411 Blit_RGB555_32Altivec(SDL_BlitInfo * info) 411 Blit_RGB555_32Altivec(SDL_BlitInfo * info)
412 { 412 {
413 int height = info->dst_h; 413 int height = info->dst_h;
414 Uint8 *src = (Uint8 *) info->src; 414 Uint8 *src = (Uint8 *) info->src;
415 int srcskip = info->s_skip; 415 int srcskip = info->src_skip;
416 Uint8 *dst = (Uint8 *) info->dst; 416 Uint8 *dst = (Uint8 *) info->dst;
417 int dstskip = info->dst_pitch; 417 int dstskip = info->dst_skip;
418 SDL_PixelFormat *srcfmt = info->src; 418 SDL_PixelFormat *srcfmt = info->src;
419 SDL_PixelFormat *dstfmt = info->dst; 419 SDL_PixelFormat *dstfmt = info->dst;
420 unsigned alpha; 420 unsigned alpha;
421 vector unsigned char valpha; 421 vector unsigned char valpha;
422 vector unsigned char vpermute; 422 vector unsigned char vpermute;
468 assert(dstfmt->BytesPerPixel == 4); 468 assert(dstfmt->BytesPerPixel == 4);
469 469
470 vf800 = (vector unsigned short) vec_splat_u8(-7); 470 vf800 = (vector unsigned short) vec_splat_u8(-7);
471 vf800 = vec_sl(vf800, vec_splat_u16(8)); 471 vf800 = vec_sl(vf800, vec_splat_u16(8));
472 472
473 if (dstfmt->Amask && (info->cmod >> 24)) { 473 if (dstfmt->Amask && info->a) {
474 ((unsigned char *) &valpha)[0] = alpha = (info->cmod >> 24); 474 ((unsigned char *) &valpha)[0] = alpha = info->a;
475 valpha = vec_splat(valpha, 0); 475 valpha = vec_splat(valpha, 0);
476 } else { 476 } else {
477 alpha = 0; 477 alpha = 0;
478 valpha = vec_splat_u8(0); 478 valpha = vec_splat_u8(0);
479 } 479 }
559 static void 559 static void
560 Blit32to32KeyAltivec(SDL_BlitInfo * info) 560 Blit32to32KeyAltivec(SDL_BlitInfo * info)
561 { 561 {
562 int height = info->dst_h; 562 int height = info->dst_h;
563 Uint32 *srcp = (Uint32 *) info->src; 563 Uint32 *srcp = (Uint32 *) info->src;
564 int srcskip = info->s_skip; 564 int srcskip = info->src_skip;
565 Uint32 *dstp = (Uint32 *) info->dst; 565 Uint32 *dstp = (Uint32 *) info->dst;
566 int dstskip = info->dst_pitch; 566 int dstskip = info->dst_skip;
567 SDL_PixelFormat *srcfmt = info->src; 567 SDL_PixelFormat *srcfmt = info->src;
568 int srcbpp = srcfmt->BytesPerPixel; 568 int srcbpp = srcfmt->BytesPerPixel;
569 SDL_PixelFormat *dstfmt = info->dst; 569 SDL_PixelFormat *dstfmt = info->dst;
570 int dstbpp = dstfmt->BytesPerPixel; 570 int dstbpp = dstfmt->BytesPerPixel;
571 int copy_alpha = (srcfmt->Amask && dstfmt->Amask); 571 int copy_alpha = (srcfmt->Amask && dstfmt->Amask);
572 unsigned alpha = dstfmt->Amask ? (info->cmod >> 24) : 0; 572 unsigned alpha = dstfmt->Amask ? info->a : 0;
573 Uint32 rgbmask = srcfmt->Rmask | srcfmt->Gmask | srcfmt->Bmask; 573 Uint32 rgbmask = srcfmt->Rmask | srcfmt->Gmask | srcfmt->Bmask;
574 Uint32 ckey = info->ckey; 574 Uint32 ckey = info->colorkey;
575 vector unsigned int valpha; 575 vector unsigned int valpha;
576 vector unsigned char vpermute; 576 vector unsigned char vpermute;
577 vector unsigned char vzero; 577 vector unsigned char vzero;
578 vector unsigned int vckey; 578 vector unsigned int vckey;
579 vector unsigned int vrgbmask; 579 vector unsigned int vrgbmask;
677 static void 677 static void
678 ConvertAltivec32to32_noprefetch(SDL_BlitInfo * info) 678 ConvertAltivec32to32_noprefetch(SDL_BlitInfo * info)
679 { 679 {
680 int height = info->dst_h; 680 int height = info->dst_h;
681 Uint32 *src = (Uint32 *) info->src; 681 Uint32 *src = (Uint32 *) info->src;
682 int srcskip = info->s_skip; 682 int srcskip = info->src_skip;
683 Uint32 *dst = (Uint32 *) info->dst; 683 Uint32 *dst = (Uint32 *) info->dst;
684 int dstskip = info->dst_pitch; 684 int dstskip = info->dst_skip;
685 SDL_PixelFormat *srcfmt = info->src; 685 SDL_PixelFormat *srcfmt = info->src;
686 SDL_PixelFormat *dstfmt = info->dst; 686 SDL_PixelFormat *dstfmt = info->dst;
687 vector unsigned int vzero = vec_splat_u32(0); 687 vector unsigned int vzero = vec_splat_u32(0);
688 vector unsigned char vpermute = calc_swizzle32(srcfmt, dstfmt); 688 vector unsigned char vpermute = calc_swizzle32(srcfmt, dstfmt);
689 if (dstfmt->Amask && !srcfmt->Amask) { 689 if (dstfmt->Amask && !srcfmt->Amask) {
690 if ((info->cmod >> 24)) { 690 if (info->a) {
691 vector unsigned char valpha; 691 vector unsigned char valpha;
692 ((unsigned char *) &valpha)[0] = (info->cmod >> 24); 692 ((unsigned char *) &valpha)[0] = info->a;
693 vzero = (vector unsigned int) vec_splat(valpha, 0); 693 vzero = (vector unsigned int) vec_splat(valpha, 0);
694 } 694 }
695 } 695 }
696 696
697 assert(srcfmt->BytesPerPixel == 4); 697 assert(srcfmt->BytesPerPixel == 4);
756 const int scalar_dst_lead = sizeof(Uint32) * 4; 756 const int scalar_dst_lead = sizeof(Uint32) * 4;
757 const int vector_dst_lead = sizeof(Uint32) * 16; 757 const int vector_dst_lead = sizeof(Uint32) * 16;
758 758
759 int height = info->dst_h; 759 int height = info->dst_h;
760 Uint32 *src = (Uint32 *) info->src; 760 Uint32 *src = (Uint32 *) info->src;
761 int srcskip = info->s_skip; 761 int srcskip = info->src_skip;
762 Uint32 *dst = (Uint32 *) info->dst; 762 Uint32 *dst = (Uint32 *) info->dst;
763 int dstskip = info->dst_pitch; 763 int dstskip = info->dst_skip;
764 SDL_PixelFormat *srcfmt = info->src; 764 SDL_PixelFormat *srcfmt = info->src;
765 SDL_PixelFormat *dstfmt = info->dst; 765 SDL_PixelFormat *dstfmt = info->dst;
766 vector unsigned int vzero = vec_splat_u32(0); 766 vector unsigned int vzero = vec_splat_u32(0);
767 vector unsigned char vpermute = calc_swizzle32(srcfmt, dstfmt); 767 vector unsigned char vpermute = calc_swizzle32(srcfmt, dstfmt);
768 if (dstfmt->Amask && !srcfmt->Amask) { 768 if (dstfmt->Amask && !srcfmt->Amask) {
769 if ((info->cmod >> 24)) { 769 if (info->a) {
770 vector unsigned char valpha; 770 vector unsigned char valpha;
771 ((unsigned char *) &valpha)[0] = (info->cmod >> 24); 771 ((unsigned char *) &valpha)[0] = info->a;
772 vzero = (vector unsigned int) vec_splat(valpha, 0); 772 vzero = (vector unsigned int) vec_splat(valpha, 0);
773 } 773 }
774 } 774 }
775 775
776 assert(srcfmt->BytesPerPixel == 4); 776 assert(srcfmt->BytesPerPixel == 4);
899 899
900 /* Set up some basic variables */ 900 /* Set up some basic variables */
901 width = info->dst_w; 901 width = info->dst_w;
902 height = info->dst_h; 902 height = info->dst_h;
903 src = (Uint32 *) info->src; 903 src = (Uint32 *) info->src;
904 srcskip = info->s_skip / 4; 904 srcskip = info->src_skip / 4;
905 dst = info->dst; 905 dst = info->dst;
906 dstskip = info->dst_pitch; 906 dstskip = info->dst_skip;
907 map = info->table; 907 map = info->table;
908 908
909 if (map == NULL) { 909 if (map == NULL) {
910 while (height--) { 910 while (height--) {
911 #ifdef USE_DUFFS_LOOP 911 #ifdef USE_DUFFS_LOOP
1016 1016
1017 /* Set up some basic variables */ 1017 /* Set up some basic variables */
1018 width = info->dst_w; 1018 width = info->dst_w;
1019 height = info->dst_h; 1019 height = info->dst_h;
1020 src = (Uint32 *) info->src; 1020 src = (Uint32 *) info->src;
1021 srcskip = info->s_skip / 4; 1021 srcskip = info->src_skip / 4;
1022 dst = (Uint16 *) info->dst; 1022 dst = (Uint16 *) info->dst;
1023 dstskip = info->dst_pitch / 2; 1023 dstskip = info->dst_skip / 2;
1024 1024
1025 #ifdef USE_DUFFS_LOOP 1025 #ifdef USE_DUFFS_LOOP
1026 while (height--) { 1026 while (height--) {
1027 /* *INDENT-OFF* */ 1027 /* *INDENT-OFF* */
1028 DUFFS_LOOP( 1028 DUFFS_LOOP(
1140 1140
1141 /* Set up some basic variables */ 1141 /* Set up some basic variables */
1142 width = info->dst_w; 1142 width = info->dst_w;
1143 height = info->dst_h; 1143 height = info->dst_h;
1144 src = (Uint32 *) info->src; 1144 src = (Uint32 *) info->src;
1145 srcskip = info->s_skip / 4; 1145 srcskip = info->src_skip / 4;
1146 dst = (Uint16 *) info->dst; 1146 dst = (Uint16 *) info->dst;
1147 dstskip = info->dst_pitch / 2; 1147 dstskip = info->dst_skip / 2;
1148 1148
1149 #ifdef USE_DUFFS_LOOP 1149 #ifdef USE_DUFFS_LOOP
1150 while (height--) { 1150 while (height--) {
1151 /* *INDENT-OFF* */ 1151 /* *INDENT-OFF* */
1152 DUFFS_LOOP( 1152 DUFFS_LOOP(
1253 1253
1254 /* Set up some basic variables */ 1254 /* Set up some basic variables */
1255 width = info->dst_w; 1255 width = info->dst_w;
1256 height = info->dst_h; 1256 height = info->dst_h;
1257 src = (Uint8 *) info->src; 1257 src = (Uint8 *) info->src;
1258 srcskip = info->s_skip; 1258 srcskip = info->src_skip;
1259 dst = (Uint32 *) info->dst; 1259 dst = (Uint32 *) info->dst;
1260 dstskip = info->dst_pitch / 4; 1260 dstskip = info->dst_skip / 4;
1261 1261
1262 #ifdef USE_DUFFS_LOOP 1262 #ifdef USE_DUFFS_LOOP
1263 while (height--) { 1263 while (height--) {
1264 /* *INDENT-OFF* */ 1264 /* *INDENT-OFF* */
1265 DUFFS_LOOP( 1265 DUFFS_LOOP(
1875 1875
1876 /* Set up some basic variables */ 1876 /* Set up some basic variables */
1877 width = info->dst_w; 1877 width = info->dst_w;
1878 height = info->dst_h; 1878 height = info->dst_h;
1879 src = (Uint32 *) info->src; 1879 src = (Uint32 *) info->src;
1880 srcskip = info->s_skip / 4; 1880 srcskip = info->src_skip / 4;
1881 dst = info->dst; 1881 dst = info->dst;
1882 dstskip = info->dst_pitch; 1882 dstskip = info->dst_skip;
1883 map = info->table; 1883 map = info->table;
1884 1884
1885 #ifdef USE_DUFFS_LOOP 1885 #ifdef USE_DUFFS_LOOP
1886 while (height--) { 1886 while (height--) {
1887 /* *INDENT-OFF* */ 1887 /* *INDENT-OFF* */
1948 1948
1949 /* Set up some basic variables */ 1949 /* Set up some basic variables */
1950 width = info->dst_w; 1950 width = info->dst_w;
1951 height = info->dst_h; 1951 height = info->dst_h;
1952 src = info->src; 1952 src = info->src;
1953 srcskip = info->s_skip; 1953 srcskip = info->src_skip;
1954 dst = info->dst; 1954 dst = info->dst;
1955 dstskip = info->dst_pitch; 1955 dstskip = info->dst_skip;
1956 map = info->table; 1956 map = info->table;
1957 srcfmt = info->src; 1957 srcfmt = info->src_fmt;
1958 srcbpp = srcfmt->BytesPerPixel; 1958 srcbpp = srcfmt->BytesPerPixel;
1959 1959
1960 if (map == NULL) { 1960 if (map == NULL) {
1961 while (height--) { 1961 while (height--) {
1962 #ifdef USE_DUFFS_LOOP 1962 #ifdef USE_DUFFS_LOOP
2029 Blit4to4MaskAlpha(SDL_BlitInfo * info) 2029 Blit4to4MaskAlpha(SDL_BlitInfo * info)
2030 { 2030 {
2031 int width = info->dst_w; 2031 int width = info->dst_w;
2032 int height = info->dst_h; 2032 int height = info->dst_h;
2033 Uint32 *src = (Uint32 *) info->src; 2033 Uint32 *src = (Uint32 *) info->src;
2034 int srcskip = info->s_skip; 2034 int srcskip = info->src_skip;
2035 Uint32 *dst = (Uint32 *) info->dst; 2035 Uint32 *dst = (Uint32 *) info->dst;
2036 int dstskip = info->dst_pitch; 2036 int dstskip = info->dst_skip;
2037 SDL_PixelFormat *srcfmt = info->src; 2037 SDL_PixelFormat *srcfmt = info->src_fmt;
2038 SDL_PixelFormat *dstfmt = info->dst; 2038 SDL_PixelFormat *dstfmt = info->dst_fmt;
2039 2039
2040 if (dstfmt->Amask) { 2040 if (dstfmt->Amask) {
2041 /* RGB->RGBA, SET_ALPHA */ 2041 /* RGB->RGBA, SET_ALPHA */
2042 Uint32 mask = ((info->cmod >> 24) >> dstfmt->Aloss) << dstfmt->Ashift; 2042 Uint32 mask = (info->a >> dstfmt->Aloss) << dstfmt->Ashift;
2043 2043
2044 while (height--) { 2044 while (height--) {
2045 /* *INDENT-OFF* */ 2045 /* *INDENT-OFF* */
2046 DUFFS_LOOP( 2046 DUFFS_LOOP(
2047 { 2047 {
2078 BlitNtoN(SDL_BlitInfo * info) 2078 BlitNtoN(SDL_BlitInfo * info)
2079 { 2079 {
2080 int width = info->dst_w; 2080 int width = info->dst_w;
2081 int height = info->dst_h; 2081 int height = info->dst_h;
2082 Uint8 *src = info->src; 2082 Uint8 *src = info->src;
2083 int srcskip = info->s_skip; 2083 int srcskip = info->src_skip;
2084 Uint8 *dst = info->dst; 2084 Uint8 *dst = info->dst;
2085 int dstskip = info->dst_pitch; 2085 int dstskip = info->dst_skip;
2086 SDL_PixelFormat *srcfmt = info->src; 2086 SDL_PixelFormat *srcfmt = info->src_fmt;
2087 int srcbpp = srcfmt->BytesPerPixel; 2087 int srcbpp = srcfmt->BytesPerPixel;
2088 SDL_PixelFormat *dstfmt = info->dst; 2088 SDL_PixelFormat *dstfmt = info->dst_fmt;
2089 int dstbpp = dstfmt->BytesPerPixel; 2089 int dstbpp = dstfmt->BytesPerPixel;
2090 unsigned alpha = dstfmt->Amask ? (info->cmod >> 24) : 0; 2090 unsigned alpha = dstfmt->Amask ? info->a : 0;
2091 2091
2092 while (height--) { 2092 while (height--) {
2093 /* *INDENT-OFF* */ 2093 /* *INDENT-OFF* */
2094 DUFFS_LOOP( 2094 DUFFS_LOOP(
2095 { 2095 {
2113 BlitNtoNCopyAlpha(SDL_BlitInfo * info) 2113 BlitNtoNCopyAlpha(SDL_BlitInfo * info)
2114 { 2114 {
2115 int width = info->dst_w; 2115 int width = info->dst_w;
2116 int height = info->dst_h; 2116 int height = info->dst_h;
2117 Uint8 *src = info->src; 2117 Uint8 *src = info->src;
2118 int srcskip = info->s_skip; 2118 int srcskip = info->src_skip;
2119 Uint8 *dst = info->dst; 2119 Uint8 *dst = info->dst;
2120 int dstskip = info->dst_pitch; 2120 int dstskip = info->dst_skip;
2121 SDL_PixelFormat *srcfmt = info->src; 2121 SDL_PixelFormat *srcfmt = info->src_fmt;
2122 int srcbpp = srcfmt->BytesPerPixel; 2122 int srcbpp = srcfmt->BytesPerPixel;
2123 SDL_PixelFormat *dstfmt = info->dst; 2123 SDL_PixelFormat *dstfmt = info->dst_fmt;
2124 int dstbpp = dstfmt->BytesPerPixel; 2124 int dstbpp = dstfmt->BytesPerPixel;
2125 int c; 2125 int c;
2126 2126
2127 /* FIXME: should map alpha to [0..255] correctly! */ 2127 /* FIXME: should map alpha to [0..255] correctly! */
2128 while (height--) { 2128 while (height--) {
2143 BlitNto1Key(SDL_BlitInfo * info) 2143 BlitNto1Key(SDL_BlitInfo * info)
2144 { 2144 {
2145 int width = info->dst_w; 2145 int width = info->dst_w;
2146 int height = info->dst_h; 2146 int height = info->dst_h;
2147 Uint8 *src = info->src; 2147 Uint8 *src = info->src;
2148 int srcskip = info->s_skip; 2148 int srcskip = info->src_skip;
2149 Uint8 *dst = info->dst; 2149 Uint8 *dst = info->dst;
2150 int dstskip = info->dst_pitch; 2150 int dstskip = info->dst_skip;
2151 SDL_PixelFormat *srcfmt = info->src; 2151 SDL_PixelFormat *srcfmt = info->src_fmt;
2152 const Uint8 *palmap = info->table; 2152 const Uint8 *palmap = info->table;
2153 Uint32 ckey = info->ckey; 2153 Uint32 ckey = info->colorkey;
2154 Uint32 rgbmask = ~srcfmt->Amask; 2154 Uint32 rgbmask = ~srcfmt->Amask;
2155 int srcbpp; 2155 int srcbpp;
2156 Uint32 Pixel; 2156 Uint32 Pixel;
2157 unsigned sR, sG, sB; 2157 unsigned sR, sG, sB;
2158 2158
2209 Blit2to2Key(SDL_BlitInfo * info) 2209 Blit2to2Key(SDL_BlitInfo * info)
2210 { 2210 {
2211 int width = info->dst_w; 2211 int width = info->dst_w;
2212 int height = info->dst_h; 2212 int height = info->dst_h;
2213 Uint16 *srcp = (Uint16 *) info->src; 2213 Uint16 *srcp = (Uint16 *) info->src;
2214 int srcskip = info->s_skip; 2214 int srcskip = info->src_skip;
2215 Uint16 *dstp = (Uint16 *) info->dst; 2215 Uint16 *dstp = (Uint16 *) info->dst;
2216 int dstskip = info->dst_pitch; 2216 int dstskip = info->dst_skip;
2217 Uint32 ckey = info->ckey; 2217 Uint32 ckey = info->colorkey;
2218 Uint32 rgbmask = ~info->src->Amask; 2218 Uint32 rgbmask = ~info->src_fmt->Amask;
2219 2219
2220 /* Set up some basic variables */ 2220 /* Set up some basic variables */
2221 srcskip /= 2; 2221 srcskip /= 2;
2222 dstskip /= 2; 2222 dstskip /= 2;
2223 ckey &= rgbmask; 2223 ckey &= rgbmask;
2243 BlitNtoNKey(SDL_BlitInfo * info) 2243 BlitNtoNKey(SDL_BlitInfo * info)
2244 { 2244 {
2245 int width = info->dst_w; 2245 int width = info->dst_w;
2246 int height = info->dst_h; 2246 int height = info->dst_h;
2247 Uint8 *src = info->src; 2247 Uint8 *src = info->src;
2248 int srcskip = info->s_skip; 2248 int srcskip = info->src_skip;
2249 Uint8 *dst = info->dst; 2249 Uint8 *dst = info->dst;
2250 int dstskip = info->dst_pitch; 2250 int dstskip = info->dst_skip;
2251 Uint32 ckey = info->ckey; 2251 Uint32 ckey = info->colorkey;
2252 SDL_PixelFormat *srcfmt = info->src; 2252 SDL_PixelFormat *srcfmt = info->src_fmt;
2253 SDL_PixelFormat *dstfmt = info->dst; 2253 SDL_PixelFormat *dstfmt = info->dst_fmt;
2254 int srcbpp = srcfmt->BytesPerPixel; 2254 int srcbpp = srcfmt->BytesPerPixel;
2255 int dstbpp = dstfmt->BytesPerPixel; 2255 int dstbpp = dstfmt->BytesPerPixel;
2256 unsigned alpha = dstfmt->Amask ? (info->cmod >> 24) : 0; 2256 unsigned alpha = dstfmt->Amask ? info->a : 0;
2257 Uint32 rgbmask = ~srcfmt->Amask; 2257 Uint32 rgbmask = ~srcfmt->Amask;
2258 2258
2259 /* Set up some basic variables */ 2259 /* Set up some basic variables */
2260 ckey &= rgbmask; 2260 ckey &= rgbmask;
2261 2261
2286 BlitNtoNKeyCopyAlpha(SDL_BlitInfo * info) 2286 BlitNtoNKeyCopyAlpha(SDL_BlitInfo * info)
2287 { 2287 {
2288 int width = info->dst_w; 2288 int width = info->dst_w;
2289 int height = info->dst_h; 2289 int height = info->dst_h;
2290 Uint8 *src = info->src; 2290 Uint8 *src = info->src;
2291 int srcskip = info->s_skip; 2291 int srcskip = info->src_skip;
2292 Uint8 *dst = info->dst; 2292 Uint8 *dst = info->dst;
2293 int dstskip = info->dst_pitch; 2293 int dstskip = info->dst_skip;
2294 Uint32 ckey = info->ckey; 2294 Uint32 ckey = info->colorkey;
2295 SDL_PixelFormat *srcfmt = info->src; 2295 SDL_PixelFormat *srcfmt = info->src_fmt;
2296 SDL_PixelFormat *dstfmt = info->dst; 2296 SDL_PixelFormat *dstfmt = info->dst_fmt;
2297 Uint32 rgbmask = ~srcfmt->Amask; 2297 Uint32 rgbmask = ~srcfmt->Amask;
2298 2298
2299 Uint8 srcbpp; 2299 Uint8 srcbpp;
2300 Uint8 dstbpp; 2300 Uint8 dstbpp;
2301 Uint32 Pixel; 2301 Uint32 Pixel;
2330 { 2330 {
2331 Uint32 srcR, srcG, srcB; 2331 Uint32 srcR, srcG, srcB;
2332 int dstbpp; 2332 int dstbpp;
2333 Uint32 dstR, dstG, dstB; 2333 Uint32 dstR, dstG, dstB;
2334 Uint32 blit_features; 2334 Uint32 blit_features;
2335 SDL_loblit blitfunc; 2335 SDL_BlitFunc blitfunc;
2336 enum 2336 enum
2337 { NO_ALPHA = 1, SET_ALPHA = 2, COPY_ALPHA = 4 } alpha; 2337 { NO_ALPHA = 1, SET_ALPHA = 2, COPY_ALPHA = 4 } alpha;
2338 }; 2338 };
2339 static const struct blit_table normal_blit_1[] = { 2339 static const struct blit_table normal_blit_1[] = {
2340 /* Default for 8-bit RGB source, an invalid combination */ 2340 /* Default for 8-bit RGB source, an invalid combination */
2401 }; 2401 };
2402 2402
2403 /* Mask matches table, or table entry is zero */ 2403 /* Mask matches table, or table entry is zero */
2404 #define MASKOK(x, y) (((x) == (y)) || ((y) == 0x00000000)) 2404 #define MASKOK(x, y) (((x) == (y)) || ((y) == 0x00000000))
2405 2405
2406 SDL_loblit 2406 SDL_BlitFunc
2407 SDL_CalculateBlitN(SDL_Surface * surface, int blit_index) 2407 SDL_CalculateBlitN(SDL_Surface * surface)
2408 { 2408 {
2409 SDL_PixelFormat *srcfmt; 2409 SDL_PixelFormat *srcfmt;
2410 SDL_PixelFormat *dstfmt; 2410 SDL_PixelFormat *dstfmt;
2411 const struct blit_table *table; 2411 const struct blit_table *table;
2412 int which; 2412 int which;
2413 SDL_loblit blitfun; 2413 SDL_BlitFunc blitfun;
2414 2414
2415 /* Set up data for choosing the blit */ 2415 /* Set up data for choosing the blit */
2416 srcfmt = surface->format; 2416 srcfmt = surface->format;
2417 dstfmt = surface->map->dst->format; 2417 dstfmt = surface->map->dst->format;
2418 2418
2419 if (blit_index & 2) {
2420 /* alpha or alpha+colorkey */
2421 return SDL_CalculateAlphaBlit(surface, blit_index);
2422 }
2423
2424 /* We don't support destinations less than 8-bits */ 2419 /* We don't support destinations less than 8-bits */
2425 if (dstfmt->BitsPerPixel < 8) { 2420 if (dstfmt->BitsPerPixel < 8) {
2426 return (NULL); 2421 return (NULL);
2427 } 2422 }
2428 2423
2429 if (blit_index == 1) { 2424 switch (surface->map->info.flags) {
2425 case 0:
2426 blitfun = NULL;
2427 if (dstfmt->BitsPerPixel == 8) {
2428 /* We assume 8-bit destinations are palettized */
2429 if ((srcfmt->BytesPerPixel == 4) &&
2430 (srcfmt->Rmask == 0x00FF0000) &&
2431 (srcfmt->Gmask == 0x0000FF00) &&
2432 (srcfmt->Bmask == 0x000000FF)) {
2433 if (surface->map->info.table) {
2434 blitfun = Blit_RGB888_index8_map;
2435 } else {
2436 blitfun = Blit_RGB888_index8;
2437 }
2438 } else {
2439 blitfun = BlitNto1;
2440 }
2441 } else {
2442 /* Now the meat, choose the blitter we want */
2443 int a_need = NO_ALPHA;
2444 if (dstfmt->Amask)
2445 a_need = srcfmt->Amask ? COPY_ALPHA : SET_ALPHA;
2446 table = normal_blit[srcfmt->BytesPerPixel - 1];
2447 for (which = 0; table[which].dstbpp; ++which) {
2448 if (MASKOK(srcfmt->Rmask, table[which].srcR) &&
2449 MASKOK(srcfmt->Gmask, table[which].srcG) &&
2450 MASKOK(srcfmt->Bmask, table[which].srcB) &&
2451 MASKOK(dstfmt->Rmask, table[which].dstR) &&
2452 MASKOK(dstfmt->Gmask, table[which].dstG) &&
2453 MASKOK(dstfmt->Bmask, table[which].dstB) &&
2454 dstfmt->BytesPerPixel == table[which].dstbpp &&
2455 (a_need & table[which].alpha) == a_need &&
2456 ((table[which].blit_features & GetBlitFeatures()) ==
2457 table[which].blit_features))
2458 break;
2459 }
2460 blitfun = table[which].blitfunc;
2461
2462 if (blitfun == BlitNtoN) { /* default C fallback catch-all. Slow! */
2463 /* Fastpath C fallback: 32bit RGB<->RGBA blit with matching RGB */
2464 if (srcfmt->BytesPerPixel == 4 && dstfmt->BytesPerPixel == 4
2465 && srcfmt->Rmask == dstfmt->Rmask
2466 && srcfmt->Gmask == dstfmt->Gmask
2467 && srcfmt->Bmask == dstfmt->Bmask) {
2468 blitfun = Blit4to4MaskAlpha;
2469 } else if (a_need == COPY_ALPHA) {
2470 blitfun = BlitNtoNCopyAlpha;
2471 }
2472 }
2473 }
2474 return (blitfun);
2475
2476 case SDL_COPY_COLORKEY:
2430 /* colorkey blit: Here we don't have too many options, mostly 2477 /* colorkey blit: Here we don't have too many options, mostly
2431 because RLE is the preferred fast way to deal with this. 2478 because RLE is the preferred fast way to deal with this.
2432 If a particular case turns out to be useful we'll add it. */ 2479 If a particular case turns out to be useful we'll add it. */
2433 2480
2434 if (srcfmt->BytesPerPixel == 2 && surface->map->identity) 2481 if (srcfmt->BytesPerPixel == 2 && surface->map->identity)
2440 if ((srcfmt->BytesPerPixel == 4) && (dstfmt->BytesPerPixel == 4) 2487 if ((srcfmt->BytesPerPixel == 4) && (dstfmt->BytesPerPixel == 4)
2441 && SDL_HasAltiVec()) { 2488 && SDL_HasAltiVec()) {
2442 return Blit32to32KeyAltivec; 2489 return Blit32to32KeyAltivec;
2443 } else 2490 } else
2444 #endif 2491 #endif
2445 2492 if (srcfmt->Amask && dstfmt->Amask) {
2446 if (srcfmt->Amask && dstfmt->Amask)
2447 return BlitNtoNKeyCopyAlpha; 2493 return BlitNtoNKeyCopyAlpha;
2448 else 2494 } else {
2449 return BlitNtoNKey; 2495 return BlitNtoNKey;
2450 }
2451 }
2452
2453 blitfun = NULL;
2454 if (dstfmt->BitsPerPixel == 8) {
2455 /* We assume 8-bit destinations are palettized */
2456 if ((srcfmt->BytesPerPixel == 4) &&
2457 (srcfmt->Rmask == 0x00FF0000) &&
2458 (srcfmt->Gmask == 0x0000FF00) && (srcfmt->Bmask == 0x000000FF)) {
2459 if (surface->map->table) {
2460 blitfun = Blit_RGB888_index8_map;
2461 } else {
2462 blitfun = Blit_RGB888_index8;
2463 } 2496 }
2464 } else { 2497 }
2465 blitfun = BlitNto1; 2498 }
2466 } 2499
2467 } else { 2500 return NULL;
2468 /* Now the meat, choose the blitter we want */
2469 int a_need = NO_ALPHA;
2470 if (dstfmt->Amask)
2471 a_need = srcfmt->Amask ? COPY_ALPHA : SET_ALPHA;
2472 table = normal_blit[srcfmt->BytesPerPixel - 1];
2473 for (which = 0; table[which].dstbpp; ++which) {
2474 if (MASKOK(srcfmt->Rmask, table[which].srcR) &&
2475 MASKOK(srcfmt->Gmask, table[which].srcG) &&
2476 MASKOK(srcfmt->Bmask, table[which].srcB) &&
2477 MASKOK(dstfmt->Rmask, table[which].dstR) &&
2478 MASKOK(dstfmt->Gmask, table[which].dstG) &&
2479 MASKOK(dstfmt->Bmask, table[which].dstB) &&
2480 dstfmt->BytesPerPixel == table[which].dstbpp &&
2481 (a_need & table[which].alpha) == a_need &&
2482 ((table[which].blit_features & GetBlitFeatures()) ==
2483 table[which].blit_features))
2484 break;
2485 }
2486 blitfun = table[which].blitfunc;
2487
2488 if (blitfun == BlitNtoN) { /* default C fallback catch-all. Slow! */
2489 /* Fastpath C fallback: 32bit RGB<->RGBA blit with matching RGB */
2490 if (srcfmt->BytesPerPixel == 4 && dstfmt->BytesPerPixel == 4 &&
2491 srcfmt->Rmask == dstfmt->Rmask &&
2492 srcfmt->Gmask == dstfmt->Gmask &&
2493 srcfmt->Bmask == dstfmt->Bmask) {
2494 blitfun = Blit4to4MaskAlpha;
2495 } else if (a_need == COPY_ALPHA) {
2496 blitfun = BlitNtoNCopyAlpha;
2497 }
2498 }
2499 }
2500
2501 #ifdef DEBUG_ASM
2502 if ((blitfun == BlitNtoN) || (blitfun == BlitNto1))
2503 fprintf(stderr, "Using C blit\n");
2504 else
2505 fprintf(stderr, "Using optimized C blit\n");
2506 #endif /* DEBUG_ASM */
2507
2508 return (blitfun);
2509 } 2501 }
2510 2502
2511 /* vi: set ts=4 sw=4 expandtab: */ 2503 /* vi: set ts=4 sw=4 expandtab: */