cscg22-gearboy

CSCG 2022 Challenge 'Gearboy'
git clone https://git.sinitax.com/sinitax/cscg22-gearboy
Log | Files | Refs | sfeed.txt

SDL_DirectFB_shape.c (4363B)


      1/*
      2  Simple DirectMedia Layer
      3  Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
      4
      5  This software is provided 'as-is', without any express or implied
      6  warranty.  In no event will the authors be held liable for any damages
      7  arising from the use of this software.
      8
      9  Permission is granted to anyone to use this software for any purpose,
     10  including commercial applications, and to alter it and redistribute it
     11  freely, subject to the following restrictions:
     12
     13  1. The origin of this software must not be misrepresented; you must not
     14     claim that you wrote the original software. If you use this software
     15     in a product, an acknowledgment in the product documentation would be
     16     appreciated but is not required.
     17  2. Altered source versions must be plainly marked as such, and must not be
     18     misrepresented as being the original software.
     19  3. This notice may not be removed or altered from any source distribution.
     20*/
     21#include "../../SDL_internal.h"
     22
     23#if SDL_VIDEO_DRIVER_DIRECTFB
     24
     25#include "SDL_assert.h"
     26#include "SDL_DirectFB_video.h"
     27#include "SDL_DirectFB_shape.h"
     28#include "SDL_DirectFB_window.h"
     29
     30#include "../SDL_shape_internals.h"
     31
     32SDL_Window*
     33DirectFB_CreateShapedWindow(const char *title,unsigned int x,unsigned int y,unsigned int w,unsigned int h,Uint32 flags) {
     34    return SDL_CreateWindow(title,x,y,w,h,flags /* | SDL_DFB_WINDOW_SHAPED */);
     35}
     36
     37SDL_WindowShaper*
     38DirectFB_CreateShaper(SDL_Window* window) {
     39    SDL_WindowShaper* result = NULL;
     40
     41    result = malloc(sizeof(SDL_WindowShaper));
     42    result->window = window;
     43    result->mode.mode = ShapeModeDefault;
     44    result->mode.parameters.binarizationCutoff = 1;
     45    result->userx = result->usery = 0;
     46    SDL_ShapeData* data = SDL_malloc(sizeof(SDL_ShapeData));
     47    result->driverdata = data;
     48    data->surface = NULL;
     49    window->shaper = result;
     50    int resized_properly = DirectFB_ResizeWindowShape(window);
     51    SDL_assert(resized_properly == 0);
     52
     53    return result;
     54}
     55
     56int
     57DirectFB_ResizeWindowShape(SDL_Window* window) {
     58    SDL_ShapeData* data = window->shaper->driverdata;
     59    SDL_assert(data != NULL);
     60
     61    if (window->x != -1000)
     62    {
     63        window->shaper->userx = window->x;
     64        window->shaper->usery = window->y;
     65    }
     66    SDL_SetWindowPosition(window,-1000,-1000);
     67
     68    return 0;
     69}
     70
     71int
     72DirectFB_SetWindowShape(SDL_WindowShaper *shaper,SDL_Surface *shape,SDL_WindowShapeMode *shape_mode) {
     73
     74    if(shaper == NULL || shape == NULL || shaper->driverdata == NULL)
     75        return -1;
     76    if(shape->format->Amask == 0 && SDL_SHAPEMODEALPHA(shape_mode->mode))
     77        return -2;
     78    if(shape->w != shaper->window->w || shape->h != shaper->window->h)
     79        return -3;
     80
     81    {
     82        SDL_VideoDisplay *display = SDL_GetDisplayForWindow(shaper->window);
     83        SDL_DFB_DEVICEDATA(display->device);
     84        Uint32 *pixels;
     85        Sint32 pitch;
     86        Uint32 h,w;
     87        Uint8  *src, *bitmap;
     88        DFBSurfaceDescription dsc;
     89
     90        SDL_ShapeData *data = shaper->driverdata;
     91
     92        SDL_DFB_RELEASE(data->surface);
     93
     94        dsc.flags = DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT | DSDESC_CAPS;
     95        dsc.width = shape->w;
     96        dsc.height = shape->h;
     97        dsc.caps = DSCAPS_PREMULTIPLIED;
     98        dsc.pixelformat = DSPF_ARGB;
     99
    100        SDL_DFB_CHECKERR(devdata->dfb->CreateSurface(devdata->dfb, &dsc, &data->surface));
    101
    102        /* Assume that shaper->alphacutoff already has a value, because SDL_SetWindowShape() should have given it one. */
    103        SDL_DFB_ALLOC_CLEAR(bitmap, shape->w * shape->h);
    104        SDL_CalculateShapeBitmap(shaper->mode,shape,bitmap,1);
    105
    106        src = bitmap;
    107
    108        SDL_DFB_CHECK(data->surface->Lock(data->surface, DSLF_WRITE | DSLF_READ, (void **) &pixels, &pitch));
    109
    110        h = shaper->window->h;
    111        while (h--) {
    112            for (w = 0; w < shaper->window->w; w++) {
    113                if (*src)
    114                    pixels[w] = 0xFFFFFFFF;
    115                else
    116                    pixels[w] = 0;
    117                src++;
    118
    119            }
    120            pixels += (pitch >> 2);
    121        }
    122        SDL_DFB_CHECK(data->surface->Unlock(data->surface));
    123        SDL_DFB_FREE(bitmap);
    124
    125        /* FIXME: Need to call this here - Big ?? */
    126        DirectFB_WM_RedrawLayout(SDL_GetDisplayForWindow(shaper->window)->device, shaper->window);
    127    }
    128
    129    return 0;
    130error:
    131    return -1;
    132}
    133
    134#endif /* SDL_VIDEO_DRIVER_DIRECTFB */