Mercurial > sdl-ios-xcode
comparison src/video/SDL_surface.c @ 3434:147d6ef5be03
Added a utility function to convert blocks of pixels
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Sun, 15 Nov 2009 09:21:46 +0000 |
parents | 7be21a78777e |
children | 0538362b98d3 |
comparison
equal
deleted
inserted
replaced
3433:ad845d9835aa | 3434:147d6ef5be03 |
---|---|
861 /* We're ready to go! */ | 861 /* We're ready to go! */ |
862 return (convert); | 862 return (convert); |
863 } | 863 } |
864 | 864 |
865 /* | 865 /* |
866 * Create a surface on the stack for quick blit operations | |
867 */ | |
868 static __inline__ SDL_bool | |
869 SDL_CreateSurfaceOnStack(int width, int height, Uint32 pixel_format, | |
870 void * pixels, int pitch, SDL_Surface * surface, | |
871 SDL_PixelFormat * format, SDL_BlitMap * blitmap) | |
872 { | |
873 int bpp; | |
874 Uint32 Rmask, Gmask, Bmask, Amask; | |
875 | |
876 if (!SDL_PixelFormatEnumToMasks(pixel_format, | |
877 &bpp, &Rmask, &Gmask, &Bmask, &Amask)) { | |
878 return SDL_FALSE; | |
879 } | |
880 if (bpp <= 8) { | |
881 SDL_SetError("Indexed pixel formats not supported"); | |
882 return SDL_FALSE; | |
883 } | |
884 | |
885 SDL_zerop(surface); | |
886 surface->flags = SDL_PREALLOC; | |
887 surface->format = SDL_InitFormat(format, bpp, Rmask, Gmask, Bmask, Amask); | |
888 surface->pixels = pixels; | |
889 surface->w = width; | |
890 surface->h = height; | |
891 surface->pitch = pitch; | |
892 /* We don't actually need to set up the clip rect for our purposes */ | |
893 /*SDL_SetClipRect(surface, NULL);*/ | |
894 | |
895 /* Allocate an empty mapping */ | |
896 SDL_zerop(blitmap); | |
897 blitmap->info.r = 0xFF; | |
898 blitmap->info.g = 0xFF; | |
899 blitmap->info.b = 0xFF; | |
900 blitmap->info.a = 0xFF; | |
901 surface->map = blitmap; | |
902 SDL_FormatChanged(surface); | |
903 | |
904 /* The surface is ready to go */ | |
905 surface->refcount = 1; | |
906 return SDL_TRUE; | |
907 } | |
908 | |
909 /* | |
910 * Copy a block of pixels of one format to another format | |
911 */ | |
912 int SDL_ConvertPixels(int width, int height, | |
913 Uint32 src_format, const void * src, int src_pitch, | |
914 Uint32 dst_format, void * dst, int dst_pitch) | |
915 { | |
916 SDL_Surface src_surface, dst_surface; | |
917 SDL_PixelFormat src_fmt, dst_fmt; | |
918 SDL_BlitMap src_blitmap, dst_blitmap; | |
919 SDL_Rect rect; | |
920 | |
921 /* Fast path for same format copy */ | |
922 if (src_format == dst_format) { | |
923 int bpp; | |
924 | |
925 if (SDL_ISPIXELFORMAT_FOURCC(src_format)) { | |
926 switch (src_format) { | |
927 case SDL_PIXELFORMAT_YV12: | |
928 case SDL_PIXELFORMAT_IYUV: | |
929 case SDL_PIXELFORMAT_YUY2: | |
930 case SDL_PIXELFORMAT_UYVY: | |
931 case SDL_PIXELFORMAT_YVYU: | |
932 bpp = 2; | |
933 default: | |
934 SDL_SetError("Unknown FOURCC pixel format"); | |
935 return -1; | |
936 } | |
937 } else { | |
938 bpp = SDL_BYTESPERPIXEL(src_format); | |
939 } | |
940 width *= bpp; | |
941 | |
942 while (height-- > 0) { | |
943 SDL_memcpy(dst, src, width); | |
944 src = (Uint8*)src + src_pitch; | |
945 dst = (Uint8*)dst + dst_pitch; | |
946 } | |
947 return SDL_TRUE; | |
948 } | |
949 | |
950 if (!SDL_CreateSurfaceOnStack(width, height, src_format, (void*)src, | |
951 src_pitch, | |
952 &src_surface, &src_fmt, &src_blitmap)) { | |
953 return -1; | |
954 } | |
955 if (!SDL_CreateSurfaceOnStack(width, height, dst_format, dst, dst_pitch, | |
956 &dst_surface, &dst_fmt, &dst_blitmap)) { | |
957 return -1; | |
958 } | |
959 | |
960 /* Set up the rect and go! */ | |
961 rect.x = 0; | |
962 rect.y = 0; | |
963 rect.w = width; | |
964 rect.h = width; | |
965 return SDL_LowerBlit(&src_surface, &rect, &dst_surface, &rect); | |
966 } | |
967 | |
968 /* | |
866 * Free a surface created by the above function. | 969 * Free a surface created by the above function. |
867 */ | 970 */ |
868 void | 971 void |
869 SDL_FreeSurface(SDL_Surface * surface) | 972 SDL_FreeSurface(SDL_Surface * surface) |
870 { | 973 { |