static int DisplayPaletteChanged(void *userdata, SDL_Palette * palette) { #if USE_DISPLAY_PALETTE DirectFB_RenderData *data = (DirectFB_RenderData *) userdata; SDL_DFB_WINDOWSURFACE(data->window); IDirectFBPalette *surfpal; int i; int ncolors; DFBColor entries[256]; SDL_DFB_CHECKERR(destsurf->GetPalette(destsurf, &surfpal)); /* FIXME: number of colors */ ncolors = (palette->ncolors < 256 ? palette->ncolors : 256); for (i = 0; i < ncolors; ++i) { entries[i].r = palette->colors[i].r; entries[i].g = palette->colors[i].g; entries[i].b = palette->colors[i].b; entries[i].a = palette->colors[i].a; } SDL_DFB_CHECKERR(surfpal->SetEntries(surfpal, entries, ncolors, 0)); return 0; error: #else SDL_Unsupported(); #endif return -1; }
static int DirectFB_RenderPoint(SDL_Renderer * renderer, int x, int y) { DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata; SDL_DFB_WINDOWSURFACE(data->window); DFBResult ret; PrepareDraw(renderer); SDL_DFB_CHECKERR(destsurf->DrawLine(destsurf, x, y, x, y)); return 0; error: return -1; }
static void SetBlendMode(DirectFB_RenderData * data, int blendMode, DirectFB_TextureData * source) { SDL_DFB_WINDOWSURFACE(data->window); //FIXME: check for format change if (1 || data->lastBlendMode != blendMode) { switch (blendMode) { case SDL_BLENDMODE_NONE: /**< No blending */ data->blitFlags = DSBLIT_NOFX; data->drawFlags = DSDRAW_NOFX; destsurf->SetSrcBlendFunction(destsurf, DSBF_ONE); destsurf->SetDstBlendFunction(destsurf, DSBF_ZERO); break; case SDL_BLENDMODE_MASK: data->blitFlags = DSBLIT_BLEND_ALPHACHANNEL; data->drawFlags = DSDRAW_BLEND; destsurf->SetSrcBlendFunction(destsurf, DSBF_SRCALPHA); destsurf->SetDstBlendFunction(destsurf, DSBF_INVSRCALPHA); break; case SDL_BLENDMODE_BLEND: data->blitFlags = DSBLIT_BLEND_ALPHACHANNEL; data->drawFlags = DSDRAW_BLEND; destsurf->SetSrcBlendFunction(destsurf, DSBF_SRCALPHA); destsurf->SetDstBlendFunction(destsurf, DSBF_INVSRCALPHA); break; case SDL_BLENDMODE_ADD: data->blitFlags = DSBLIT_BLEND_ALPHACHANNEL; data->drawFlags = DSDRAW_BLEND; // FIXME: SRCALPHA kills performance on radeon ... // It will be cheaper to copy the surface to // a temporay surface and premultiply if (source && TextureHasAlpha(source)) destsurf->SetSrcBlendFunction(destsurf, DSBF_SRCALPHA); else destsurf->SetSrcBlendFunction(destsurf, DSBF_ONE); destsurf->SetDstBlendFunction(destsurf, DSBF_ONE); break; case SDL_BLENDMODE_MOD: data->blitFlags = DSBLIT_BLEND_ALPHACHANNEL; data->drawFlags = DSDRAW_BLEND; destsurf->SetSrcBlendFunction(destsurf, DSBF_DESTCOLOR); destsurf->SetDstBlendFunction(destsurf, DSBF_ZERO); break; } data->lastBlendMode = blendMode; } }
static int DirectFB_RenderFill(SDL_Renderer * renderer, const SDL_Rect * rect) { DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata; SDL_DFB_WINDOWSURFACE(data->window); DFBResult ret; PrepareDraw(renderer); SDL_DFB_CHECKERR(destsurf->FillRectangle(destsurf, rect->x, rect->y, rect->w, rect->h)); return 0; error: return -1; }
static int DirectFB_RenderLine(SDL_Renderer * renderer, int x1, int y1, int x2, int y2) { DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata; SDL_DFB_WINDOWSURFACE(data->window); DFBResult ret; PrepareDraw(renderer); /* Use antialiasing when available */ #if (DFB_VERSION_ATLEAST(1,2,0)) SDL_DFB_CHECKERR(destsurf->SetRenderOptions(destsurf, DSRO_ANTIALIAS)); #endif SDL_DFB_CHECKERR(destsurf->DrawLine(destsurf, x1, y1, x2, y2)); return 0; error: return -1; }
static int PrepareDraw(SDL_Renderer * renderer) { DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata; SDL_DFB_WINDOWSURFACE(data->window); DFBResult ret; Uint8 r, g, b, a; r = renderer->r; g = renderer->g; b = renderer->b; a = renderer->a; SetBlendMode(data, renderer->blendMode, NULL); SDL_DFB_CHECKERR(destsurf->SetDrawingFlags(destsurf, data->drawFlags)); switch (renderer->blendMode) { case SDL_BLENDMODE_NONE: case SDL_BLENDMODE_MASK: case SDL_BLENDMODE_BLEND: break; case SDL_BLENDMODE_ADD: case SDL_BLENDMODE_MOD: r = ((int) r * (int) a) / 255; g = ((int) g * (int) a) / 255; b = ((int) b * (int) a) / 255; a = 255; break; } SDL_DFB_CHECKERR(destsurf->SetColor(destsurf, r, g, b, a)); return 0; error: return -1; }
static int DirectFB_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, const SDL_Rect * srcrect, const SDL_Rect * dstrect) { DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata; SDL_DFB_WINDOWSURFACE(data->window); DirectFB_TextureData *texturedata = (DirectFB_TextureData *) texture->driverdata; Uint8 alpha = 0xFF; DFBResult ret; if (texturedata->display) { int px, py; SDL_Window *window = SDL_GetWindowFromID(renderer->window); SDL_DFB_WINDOWDATA(window); SDL_VideoDisplay *display = texturedata->display; DFB_DisplayData *dispdata = (DFB_DisplayData *) display->driverdata; SDL_DFB_CHECKERR(dispdata-> vidlayer->SetSourceRectangle(dispdata->vidlayer, srcrect->x, srcrect->y, srcrect->w, srcrect->h)); windata->window->GetPosition(windata->window, &px, &py); px += windata->client.x; py += windata->client.y; SDL_DFB_CHECKERR(dispdata-> vidlayer->SetScreenRectangle(dispdata->vidlayer, px + dstrect->x, py + dstrect->y, dstrect->w, dstrect->h)); } else { DFBRectangle sr, dr; DFBSurfaceBlittingFlags flags = 0; if (texturedata->dirty.list) { SDL_DirtyRect *dirty; void *pixels; int bpp = SDL_BYTESPERPIXEL(texture->format); int pitch = texturedata->pitch; for (dirty = texturedata->dirty.list; dirty; dirty = dirty->next) { SDL_Rect *rect = &dirty->rect; pixels = (void *) ((Uint8 *) texturedata->pixels + rect->y * pitch + rect->x * bpp); DirectFB_UpdateTexture(renderer, texture, rect, texturedata->pixels, texturedata->pitch); } SDL_ClearDirtyRects(&texturedata->dirty); } SDLtoDFBRect(srcrect, &sr); SDLtoDFBRect(dstrect, &dr); SDL_DFB_CHECKERR(destsurf-> SetColor(destsurf, 0xFF, 0xFF, 0xFF, 0xFF)); if (texture-> modMode & (SDL_TEXTUREMODULATE_COLOR | SDL_TEXTUREMODULATE_ALPHA)) { if (texture->modMode & SDL_TEXTUREMODULATE_ALPHA) { alpha = texture->a; SDL_DFB_CHECKERR(destsurf->SetColor(destsurf, 0xFF, 0xFF, 0xFF, alpha)); } if (texture->modMode & SDL_TEXTUREMODULATE_COLOR) { SDL_DFB_CHECKERR(destsurf->SetColor(destsurf, texture->r, texture->g, texture->b, alpha)); flags |= DSBLIT_COLORIZE; } if (alpha < 0xFF) flags |= DSBLIT_SRC_PREMULTCOLOR; } else SDL_DFB_CHECKERR(destsurf->SetColor(destsurf, 0xFF, 0xFF, 0xFF, 0xFF)); SetBlendMode(data, texture->blendMode, texturedata); SDL_DFB_CHECKERR(destsurf->SetBlittingFlags(destsurf, data->blitFlags | flags)); #if (DFB_VERSION_ATLEAST(1,2,0)) SDL_DFB_CHECKERR(destsurf->SetRenderOptions(destsurf, texturedata-> render_options)); #endif if (srcrect->w == dstrect->w && srcrect->h == dstrect->h) { SDL_DFB_CHECKERR(destsurf->Blit(destsurf, texturedata->surface, &sr, dr.x, dr.y)); } else { SDL_DFB_CHECKERR(destsurf->StretchBlit(destsurf, texturedata->surface, &sr, &dr)); } } return 0; error: return -1; }