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