Mercurial > sdl-ios-xcode
comparison src/video/directfb/SDL_DirectFB_render.c @ 3038:c73a5f8a03d2
Fixed MakeSubSurface compiling issue for DirectFB <= 1.2.0
author | Couriersud <couriersud@arcor.de> |
---|---|
date | Tue, 13 Jan 2009 22:59:02 +0000 |
parents | 490f3e4fe753 |
children | 62d4992e5a92 |
comparison
equal
deleted
inserted
replaced
3037:490f3e4fe753 | 3038:c73a5f8a03d2 |
---|---|
84 static void DirectFB_RenderPresent(SDL_Renderer * renderer); | 84 static void DirectFB_RenderPresent(SDL_Renderer * renderer); |
85 static void DirectFB_DestroyTexture(SDL_Renderer * renderer, | 85 static void DirectFB_DestroyTexture(SDL_Renderer * renderer, |
86 SDL_Texture * texture); | 86 SDL_Texture * texture); |
87 static void DirectFB_DestroyRenderer(SDL_Renderer * renderer); | 87 static void DirectFB_DestroyRenderer(SDL_Renderer * renderer); |
88 | 88 |
89 #define SDL_DFB_WINDOWSURFACE(win) IDirectFBSurface *destsurf = ((DFB_WindowData *) ((win)->driverdata))->surface; | |
90 | |
89 SDL_RenderDriver DirectFB_RenderDriver = { | 91 SDL_RenderDriver DirectFB_RenderDriver = { |
90 DirectFB_CreateRenderer, | 92 DirectFB_CreateRenderer, |
91 { | 93 { |
92 "directfb", | 94 "directfb", |
93 (SDL_RENDERER_SINGLEBUFFER | SDL_RENDERER_PRESENTCOPY | | 95 (SDL_RENDERER_SINGLEBUFFER | SDL_RENDERER_PRESENTCOPY | |
120 0} | 122 0} |
121 }; | 123 }; |
122 | 124 |
123 typedef struct | 125 typedef struct |
124 { | 126 { |
125 IDirectFBSurface *surface; | 127 SDL_Window *window; |
126 DFBSurfaceFlipFlags flipflags; | 128 DFBSurfaceFlipFlags flipflags; |
127 int isyuvdirect; | 129 int isyuvdirect; |
128 int size_changed; | 130 int size_changed; |
129 int lastBlendMode; | 131 int lastBlendMode; |
130 DFBSurfaceBlittingFlags blitFlags; | 132 DFBSurfaceBlittingFlags blitFlags; |
178 | 180 |
179 static void | 181 static void |
180 SetBlendMode(DirectFB_RenderData * data, int blendMode, | 182 SetBlendMode(DirectFB_RenderData * data, int blendMode, |
181 DirectFB_TextureData * source) | 183 DirectFB_TextureData * source) |
182 { | 184 { |
183 //FIXME: check for format change | 185 SDL_DFB_WINDOWSURFACE(data->window); |
186 | |
187 //FIXME: check for format change | |
184 if (1 || data->lastBlendMode != blendMode) { | 188 if (1 || data->lastBlendMode != blendMode) { |
185 switch (blendMode) { | 189 switch (blendMode) { |
186 case SDL_BLENDMODE_NONE: | 190 case SDL_BLENDMODE_NONE: |
187 /**< No blending */ | 191 /**< No blending */ |
188 data->blitFlags = DSBLIT_NOFX; | 192 data->blitFlags = DSBLIT_NOFX; |
189 data->drawFlags = DSDRAW_NOFX; | 193 data->drawFlags = DSDRAW_NOFX; |
190 data->surface->SetSrcBlendFunction(data->surface, DSBF_ONE); | 194 destsurf->SetSrcBlendFunction(destsurf, DSBF_ONE); |
191 data->surface->SetDstBlendFunction(data->surface, DSBF_ZERO); | 195 destsurf->SetDstBlendFunction(destsurf, DSBF_ZERO); |
192 break; | 196 break; |
193 case SDL_BLENDMODE_MASK: | 197 case SDL_BLENDMODE_MASK: |
194 data->blitFlags = DSBLIT_BLEND_ALPHACHANNEL; | 198 data->blitFlags = DSBLIT_BLEND_ALPHACHANNEL; |
195 data->drawFlags = DSDRAW_BLEND; | 199 data->drawFlags = DSDRAW_BLEND; |
196 data->surface->SetSrcBlendFunction(data->surface, DSBF_SRCALPHA); | 200 destsurf->SetSrcBlendFunction(destsurf, DSBF_SRCALPHA); |
197 data->surface->SetDstBlendFunction(data->surface, | 201 destsurf->SetDstBlendFunction(destsurf, |
198 DSBF_INVSRCALPHA); | 202 DSBF_INVSRCALPHA); |
199 break; | 203 break; |
200 case SDL_BLENDMODE_BLEND: | 204 case SDL_BLENDMODE_BLEND: |
201 data->blitFlags = DSBLIT_BLEND_ALPHACHANNEL; | 205 data->blitFlags = DSBLIT_BLEND_ALPHACHANNEL; |
202 data->drawFlags = DSDRAW_BLEND; | 206 data->drawFlags = DSDRAW_BLEND; |
203 data->surface->SetSrcBlendFunction(data->surface, DSBF_SRCALPHA); | 207 destsurf->SetSrcBlendFunction(destsurf, DSBF_SRCALPHA); |
204 data->surface->SetDstBlendFunction(data->surface, | 208 destsurf->SetDstBlendFunction(destsurf, |
205 DSBF_INVSRCALPHA); | 209 DSBF_INVSRCALPHA); |
206 break; | 210 break; |
207 case SDL_BLENDMODE_ADD: | 211 case SDL_BLENDMODE_ADD: |
208 data->blitFlags = DSBLIT_BLEND_ALPHACHANNEL; | 212 data->blitFlags = DSBLIT_BLEND_ALPHACHANNEL; |
209 data->drawFlags = DSDRAW_BLEND; | 213 data->drawFlags = DSDRAW_BLEND; |
210 // FIXME: SRCALPHA kills performance on radeon ... | 214 // FIXME: SRCALPHA kills performance on radeon ... |
211 // It will be cheaper to copy the surface to | 215 // It will be cheaper to copy the surface to |
212 // a temporay surface and premultiply | 216 // a temporay surface and premultiply |
213 if (source && TextureHasAlpha(source)) | 217 if (source && TextureHasAlpha(source)) |
214 data->surface->SetSrcBlendFunction(data->surface, | 218 destsurf->SetSrcBlendFunction(destsurf, |
215 DSBF_SRCALPHA); | 219 DSBF_SRCALPHA); |
216 else | 220 else |
217 data->surface->SetSrcBlendFunction(data->surface, DSBF_ONE); | 221 destsurf->SetSrcBlendFunction(destsurf, DSBF_ONE); |
218 data->surface->SetDstBlendFunction(data->surface, DSBF_ONE); | 222 destsurf->SetDstBlendFunction(destsurf, DSBF_ONE); |
219 break; | 223 break; |
220 case SDL_BLENDMODE_MOD: | 224 case SDL_BLENDMODE_MOD: |
221 data->blitFlags = DSBLIT_BLEND_ALPHACHANNEL; | 225 data->blitFlags = DSBLIT_BLEND_ALPHACHANNEL; |
222 data->drawFlags = DSDRAW_BLEND; | 226 data->drawFlags = DSDRAW_BLEND; |
223 data->surface->SetSrcBlendFunction(data->surface, DSBF_DESTCOLOR); | 227 destsurf->SetSrcBlendFunction(destsurf, DSBF_DESTCOLOR); |
224 data->surface->SetDstBlendFunction(data->surface, DSBF_ZERO); | 228 destsurf->SetDstBlendFunction(destsurf, DSBF_ZERO); |
225 break; | 229 break; |
226 } | 230 } |
227 data->lastBlendMode = blendMode; | 231 data->lastBlendMode = blendMode; |
228 } | 232 } |
229 } | 233 } |
239 static int | 243 static int |
240 DisplayPaletteChanged(void *userdata, SDL_Palette * palette) | 244 DisplayPaletteChanged(void *userdata, SDL_Palette * palette) |
241 { | 245 { |
242 #if USE_DISPLAY_PALETTE | 246 #if USE_DISPLAY_PALETTE |
243 DirectFB_RenderData *data = (DirectFB_RenderData *) userdata; | 247 DirectFB_RenderData *data = (DirectFB_RenderData *) userdata; |
248 SDL_DFB_WINDOWSURFACE(data->window); | |
244 IDirectFBPalette *surfpal; | 249 IDirectFBPalette *surfpal; |
245 | 250 |
246 int ret; | 251 int ret; |
247 int i; | 252 int i; |
248 int ncolors; | 253 int ncolors; |
249 DFBColor entries[256]; | 254 DFBColor entries[256]; |
250 | 255 |
251 SDL_DFB_CHECKERR(data->surface->GetPalette(data->surface, &surfpal)); | 256 SDL_DFB_CHECKERR(destsurf->GetPalette(destsurf, &surfpal)); |
252 | 257 |
253 /* FIXME: number of colors */ | 258 /* FIXME: number of colors */ |
254 ncolors = (palette->ncolors < 256 ? palette->ncolors : 256); | 259 ncolors = (palette->ncolors < 256 ? palette->ncolors : 256); |
255 | 260 |
256 for (i = 0; i < ncolors; ++i) { | 261 for (i = 0; i < ncolors; ++i) { |
307 renderer->driverdata = data; | 312 renderer->driverdata = data; |
308 | 313 |
309 renderer->info.flags = | 314 renderer->info.flags = |
310 SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTDISCARD; | 315 SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTDISCARD; |
311 | 316 |
312 data->surface = windata->surface; | 317 data->window = window; |
313 data->surface->AddRef(data->surface); | |
314 | 318 |
315 data->flipflags = DSFLIP_PIPELINE | DSFLIP_BLIT; | 319 data->flipflags = DSFLIP_PIPELINE | DSFLIP_BLIT; |
316 | 320 |
317 if (flags & SDL_RENDERER_PRESENTVSYNC) { | 321 if (flags & SDL_RENDERER_PRESENTVSYNC) { |
318 data->flipflags |= DSFLIP_WAITFORSYNC; | 322 data->flipflags |= DSFLIP_WAITFORSYNC; |
319 renderer->info.flags |= SDL_RENDERER_PRESENTVSYNC; | 323 renderer->info.flags |= SDL_RENDERER_PRESENTVSYNC; |
320 } else | 324 } else |
321 data->flipflags |= DSFLIP_ONSYNC; | 325 data->flipflags |= DSFLIP_ONSYNC; |
322 | 326 |
323 SDL_DFB_CHECKERR(data->surface->GetCapabilities(data->surface, &scaps)); | 327 SDL_DFB_CHECKERR(windata->surface->GetCapabilities(windata->surface, &scaps)); |
324 if (scaps & DSCAPS_DOUBLE) | 328 if (scaps & DSCAPS_DOUBLE) |
325 renderer->info.flags |= SDL_RENDERER_PRESENTFLIP2; | 329 renderer->info.flags |= SDL_RENDERER_PRESENTFLIP2; |
326 else if (scaps & DSCAPS_TRIPLE) | 330 else if (scaps & DSCAPS_TRIPLE) |
327 renderer->info.flags |= SDL_RENDERER_PRESENTFLIP3; | 331 renderer->info.flags |= SDL_RENDERER_PRESENTFLIP3; |
328 else | 332 else |
792 | 796 |
793 static int | 797 static int |
794 PrepareDraw(SDL_Renderer * renderer) | 798 PrepareDraw(SDL_Renderer * renderer) |
795 { | 799 { |
796 DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata; | 800 DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata; |
801 SDL_DFB_WINDOWSURFACE(data->window); | |
802 | |
797 DFBResult ret; | 803 DFBResult ret; |
798 Uint8 r, g, b, a; | 804 Uint8 r, g, b, a; |
799 | 805 |
800 r = renderer->r; | 806 r = renderer->r; |
801 g = renderer->g; | 807 g = renderer->g; |
802 b = renderer->b; | 808 b = renderer->b; |
803 a = renderer->a; | 809 a = renderer->a; |
804 | 810 |
805 SetBlendMode(data, renderer->blendMode, NULL); | 811 SetBlendMode(data, renderer->blendMode, NULL); |
806 SDL_DFB_CHECKERR(data->surface->SetDrawingFlags(data->surface, | 812 SDL_DFB_CHECKERR(destsurf->SetDrawingFlags(destsurf, |
807 data->drawFlags)); | 813 data->drawFlags)); |
808 | 814 |
809 switch (renderer->blendMode) { | 815 switch (renderer->blendMode) { |
810 case SDL_BLENDMODE_NONE: | 816 case SDL_BLENDMODE_NONE: |
811 case SDL_BLENDMODE_MASK: | 817 case SDL_BLENDMODE_MASK: |
818 b = ((int) b * (int) a) / 255; | 824 b = ((int) b * (int) a) / 255; |
819 a = 255; | 825 a = 255; |
820 break; | 826 break; |
821 } | 827 } |
822 | 828 |
823 SDL_DFB_CHECKERR(data->surface->SetColor(data->surface, r, g, b, a)); | 829 SDL_DFB_CHECKERR(destsurf->SetColor(destsurf, r, g, b, a)); |
824 return 0; | 830 return 0; |
825 error: | 831 error: |
826 return -1; | 832 return -1; |
827 } | 833 } |
828 | 834 |
829 static int | 835 static int |
830 DirectFB_RenderPoint(SDL_Renderer * renderer, int x, int y) | 836 DirectFB_RenderPoint(SDL_Renderer * renderer, int x, int y) |
831 { | 837 { |
832 DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata; | 838 DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata; |
839 SDL_DFB_WINDOWSURFACE(data->window); | |
833 DFBResult ret; | 840 DFBResult ret; |
834 | 841 |
835 PrepareDraw(renderer); | 842 PrepareDraw(renderer); |
836 SDL_DFB_CHECKERR(data->surface->DrawLine(data->surface, x, y, x, y)); | 843 SDL_DFB_CHECKERR(destsurf->DrawLine(destsurf, x, y, x, y)); |
837 return 0; | 844 return 0; |
838 error: | 845 error: |
839 return -1; | 846 return -1; |
840 } | 847 } |
841 | 848 |
842 static int | 849 static int |
843 DirectFB_RenderLine(SDL_Renderer * renderer, int x1, int y1, int x2, int y2) | 850 DirectFB_RenderLine(SDL_Renderer * renderer, int x1, int y1, int x2, int y2) |
844 { | 851 { |
845 DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata; | 852 DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata; |
853 SDL_DFB_WINDOWSURFACE(data->window); | |
846 DFBResult ret; | 854 DFBResult ret; |
847 | 855 |
848 PrepareDraw(renderer); | 856 PrepareDraw(renderer); |
849 /* Use antialiasing when available */ | 857 /* Use antialiasing when available */ |
850 #if (DFB_VERSION_ATLEAST(1,2,0)) | 858 #if (DFB_VERSION_ATLEAST(1,2,0)) |
851 SDL_DFB_CHECKERR(data->surface->SetRenderOptions(data->surface, | 859 SDL_DFB_CHECKERR(destsurf->SetRenderOptions(destsurf, |
852 DSRO_ANTIALIAS)); | 860 DSRO_ANTIALIAS)); |
853 #endif | 861 #endif |
854 SDL_DFB_CHECKERR(data->surface->DrawLine(data->surface, x1, y1, x2, y2)); | 862 SDL_DFB_CHECKERR(destsurf->DrawLine(destsurf, x1, y1, x2, y2)); |
855 return 0; | 863 return 0; |
856 error: | 864 error: |
857 return -1; | 865 return -1; |
858 } | 866 } |
859 | 867 |
860 static int | 868 static int |
861 DirectFB_RenderFill(SDL_Renderer * renderer, const SDL_Rect * rect) | 869 DirectFB_RenderFill(SDL_Renderer * renderer, const SDL_Rect * rect) |
862 { | 870 { |
863 DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata; | 871 DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata; |
872 SDL_DFB_WINDOWSURFACE(data->window); | |
864 DFBResult ret; | 873 DFBResult ret; |
865 | 874 |
866 PrepareDraw(renderer); | 875 PrepareDraw(renderer); |
867 SDL_DFB_CHECKERR(data-> | 876 SDL_DFB_CHECKERR(destsurf->FillRectangle(destsurf, rect->x, rect->y, |
868 surface->FillRectangle(data->surface, rect->x, rect->y, | |
869 rect->w, rect->h)); | 877 rect->w, rect->h)); |
870 | 878 |
871 return 0; | 879 return 0; |
872 error: | 880 error: |
873 return -1; | 881 return -1; |
876 static int | 884 static int |
877 DirectFB_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, | 885 DirectFB_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, |
878 const SDL_Rect * srcrect, const SDL_Rect * dstrect) | 886 const SDL_Rect * srcrect, const SDL_Rect * dstrect) |
879 { | 887 { |
880 DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata; | 888 DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata; |
889 SDL_DFB_WINDOWSURFACE(data->window); | |
881 DirectFB_TextureData *texturedata = | 890 DirectFB_TextureData *texturedata = |
882 (DirectFB_TextureData *) texture->driverdata; | 891 (DirectFB_TextureData *) texture->driverdata; |
883 Uint8 alpha = 0xFF; | 892 Uint8 alpha = 0xFF; |
884 DFBResult ret; | 893 DFBResult ret; |
885 | 894 |
927 } | 936 } |
928 | 937 |
929 SDLtoDFBRect(srcrect, &sr); | 938 SDLtoDFBRect(srcrect, &sr); |
930 SDLtoDFBRect(dstrect, &dr); | 939 SDLtoDFBRect(dstrect, &dr); |
931 | 940 |
932 SDL_DFB_CHECKERR(data-> | 941 SDL_DFB_CHECKERR(destsurf->SetColor(destsurf, 0xFF, 0xFF, 0xFF, 0xFF)); |
933 surface->SetColor(data->surface, 0xFF, 0xFF, 0xFF, | |
934 0xFF)); | |
935 if (texture->modMode & | 942 if (texture->modMode & |
936 (SDL_TEXTUREMODULATE_COLOR | SDL_TEXTUREMODULATE_ALPHA)) { | 943 (SDL_TEXTUREMODULATE_COLOR | SDL_TEXTUREMODULATE_ALPHA)) { |
937 if (texture->modMode & SDL_TEXTUREMODULATE_ALPHA) { | 944 if (texture->modMode & SDL_TEXTUREMODULATE_ALPHA) { |
938 alpha = texture->a; | 945 alpha = texture->a; |
939 SDL_DFB_CHECKERR(data-> | 946 SDL_DFB_CHECKERR(destsurf->SetColor(destsurf, 0xFF, 0xFF, |
940 surface->SetColor(data->surface, 0xFF, 0xFF, | |
941 0xFF, alpha)); | 947 0xFF, alpha)); |
942 } | 948 } |
943 if (texture->modMode & SDL_TEXTUREMODULATE_COLOR) { | 949 if (texture->modMode & SDL_TEXTUREMODULATE_COLOR) { |
944 | 950 |
945 SDL_DFB_CHECKERR(data->surface->SetColor(data->surface, | 951 SDL_DFB_CHECKERR(destsurf->SetColor(destsurf, |
946 texture->r, | 952 texture->r, |
947 texture->g, | 953 texture->g, |
948 texture->b, alpha)); | 954 texture->b, alpha)); |
949 flags |= DSBLIT_COLORIZE; | 955 flags |= DSBLIT_COLORIZE; |
950 } | 956 } |
951 if (alpha < 0xFF) | 957 if (alpha < 0xFF) |
952 flags |= DSBLIT_SRC_PREMULTCOLOR; | 958 flags |= DSBLIT_SRC_PREMULTCOLOR; |
953 } else | 959 } else |
954 SDL_DFB_CHECKERR(data-> | 960 SDL_DFB_CHECKERR(destsurf->SetColor(destsurf, 0xFF, 0xFF, |
955 surface->SetColor(data->surface, 0xFF, 0xFF, | |
956 0xFF, 0xFF)); | 961 0xFF, 0xFF)); |
957 | 962 |
958 SetBlendMode(data, texture->blendMode, texturedata); | 963 SetBlendMode(data, texture->blendMode, texturedata); |
959 | 964 |
960 SDL_DFB_CHECKERR(data->surface->SetBlittingFlags(data->surface, | 965 SDL_DFB_CHECKERR(destsurf->SetBlittingFlags(destsurf, |
961 data->blitFlags | 966 data->blitFlags |
962 | flags)); | 967 | flags)); |
963 | 968 |
964 #if (DFB_VERSION_ATLEAST(1,2,0)) | 969 #if (DFB_VERSION_ATLEAST(1,2,0)) |
965 SDL_DFB_CHECKERR(data->surface->SetRenderOptions(data->surface, | 970 SDL_DFB_CHECKERR(destsurf->SetRenderOptions(destsurf, |
966 texturedata-> | 971 texturedata-> |
967 render_options)); | 972 render_options)); |
968 #endif | 973 #endif |
969 | 974 |
970 if (srcrect->w == dstrect->w && srcrect->h == dstrect->h) { | 975 if (srcrect->w == dstrect->w && srcrect->h == dstrect->h) { |
971 SDL_DFB_CHECKERR(data->surface->Blit(data->surface, | 976 SDL_DFB_CHECKERR(destsurf->Blit(destsurf, |
972 texturedata->surface, | 977 texturedata->surface, |
973 &sr, dr.x, dr.y)); | 978 &sr, dr.x, dr.y)); |
974 } else { | 979 } else { |
975 SDL_DFB_CHECKERR(data->surface->StretchBlit(data->surface, | 980 SDL_DFB_CHECKERR(destsurf->StretchBlit(destsurf, |
976 texturedata->surface, | 981 texturedata->surface, |
977 &sr, &dr)); | 982 &sr, &dr)); |
978 } | 983 } |
979 } | 984 } |
980 return 0; | 985 return 0; |
1028 | 1033 |
1029 static void | 1034 static void |
1030 DirectFB_DestroyRenderer(SDL_Renderer * renderer) | 1035 DirectFB_DestroyRenderer(SDL_Renderer * renderer) |
1031 { | 1036 { |
1032 DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata; | 1037 DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata; |
1033 | 1038 |
1034 if (data) { | 1039 if (data) { |
1035 SDL_DFB_RELEASE(data->surface); | |
1036 SDL_free(data); | 1040 SDL_free(data); |
1037 } | 1041 } |
1038 SDL_free(renderer); | 1042 SDL_free(renderer); |
1039 } | 1043 } |
1040 | 1044 |