cscg22-gearboy

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

SDL_blendline.c (24406B)


      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_RENDER_DISABLED
     24
     25#include "SDL_draw.h"
     26#include "SDL_blendline.h"
     27#include "SDL_blendpoint.h"
     28
     29
     30static void
     31SDL_BlendLine_RGB2(SDL_Surface * dst, int x1, int y1, int x2, int y2,
     32                   SDL_BlendMode blendMode, Uint8 _r, Uint8 _g, Uint8 _b, Uint8 _a,
     33                   SDL_bool draw_end)
     34{
     35    const SDL_PixelFormat *fmt = dst->format;
     36    unsigned r, g, b, a, inva;
     37
     38    if (blendMode == SDL_BLENDMODE_BLEND || blendMode == SDL_BLENDMODE_ADD) {
     39        r = DRAW_MUL(_r, _a);
     40        g = DRAW_MUL(_g, _a);
     41        b = DRAW_MUL(_b, _a);
     42        a = _a;
     43    } else {
     44        r = _r;
     45        g = _g;
     46        b = _b;
     47        a = _a;
     48    }
     49    inva = (a ^ 0xff);
     50
     51    if (y1 == y2) {
     52        switch (blendMode) {
     53        case SDL_BLENDMODE_BLEND:
     54            HLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB, draw_end);
     55            break;
     56        case SDL_BLENDMODE_ADD:
     57            HLINE(Uint16, DRAW_SETPIXEL_ADD_RGB, draw_end);
     58            break;
     59        case SDL_BLENDMODE_MOD:
     60            HLINE(Uint16, DRAW_SETPIXEL_MOD_RGB, draw_end);
     61            break;
     62        default:
     63            HLINE(Uint16, DRAW_SETPIXEL_RGB, draw_end);
     64            break;
     65        }
     66    } else if (x1 == x2) {
     67        switch (blendMode) {
     68        case SDL_BLENDMODE_BLEND:
     69            VLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB, draw_end);
     70            break;
     71        case SDL_BLENDMODE_ADD:
     72            VLINE(Uint16, DRAW_SETPIXEL_ADD_RGB, draw_end);
     73            break;
     74        case SDL_BLENDMODE_MOD:
     75            VLINE(Uint16, DRAW_SETPIXEL_MOD_RGB, draw_end);
     76            break;
     77        default:
     78            VLINE(Uint16, DRAW_SETPIXEL_RGB, draw_end);
     79            break;
     80        }
     81    } else if (ABS(x1 - x2) == ABS(y1 - y2)) {
     82        switch (blendMode) {
     83        case SDL_BLENDMODE_BLEND:
     84            DLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB, draw_end);
     85            break;
     86        case SDL_BLENDMODE_ADD:
     87            DLINE(Uint16, DRAW_SETPIXEL_ADD_RGB, draw_end);
     88            break;
     89        case SDL_BLENDMODE_MOD:
     90            DLINE(Uint16, DRAW_SETPIXEL_MOD_RGB, draw_end);
     91            break;
     92        default:
     93            DLINE(Uint16, DRAW_SETPIXEL_RGB, draw_end);
     94            break;
     95        }
     96    } else {
     97        switch (blendMode) {
     98        case SDL_BLENDMODE_BLEND:
     99            AALINE(x1, y1, x2, y2,
    100                   DRAW_SETPIXELXY2_BLEND_RGB, DRAW_SETPIXELXY2_BLEND_RGB,
    101                   draw_end);
    102            break;
    103        case SDL_BLENDMODE_ADD:
    104            AALINE(x1, y1, x2, y2,
    105                   DRAW_SETPIXELXY2_ADD_RGB, DRAW_SETPIXELXY2_ADD_RGB,
    106                   draw_end);
    107            break;
    108        case SDL_BLENDMODE_MOD:
    109            AALINE(x1, y1, x2, y2,
    110                   DRAW_SETPIXELXY2_MOD_RGB, DRAW_SETPIXELXY2_MOD_RGB,
    111                   draw_end);
    112            break;
    113        default:
    114            AALINE(x1, y1, x2, y2,
    115                   DRAW_SETPIXELXY2_RGB, DRAW_SETPIXELXY2_BLEND_RGB,
    116                   draw_end);
    117            break;
    118        }
    119    }
    120}
    121
    122static void
    123SDL_BlendLine_RGB555(SDL_Surface * dst, int x1, int y1, int x2, int y2,
    124                     SDL_BlendMode blendMode, Uint8 _r, Uint8 _g, Uint8 _b, Uint8 _a,
    125                     SDL_bool draw_end)
    126{
    127    unsigned r, g, b, a, inva;
    128
    129    if (blendMode == SDL_BLENDMODE_BLEND || blendMode == SDL_BLENDMODE_ADD) {
    130        r = DRAW_MUL(_r, _a);
    131        g = DRAW_MUL(_g, _a);
    132        b = DRAW_MUL(_b, _a);
    133        a = _a;
    134    } else {
    135        r = _r;
    136        g = _g;
    137        b = _b;
    138        a = _a;
    139    }
    140    inva = (a ^ 0xff);
    141
    142    if (y1 == y2) {
    143        switch (blendMode) {
    144        case SDL_BLENDMODE_BLEND:
    145            HLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB555, draw_end);
    146            break;
    147        case SDL_BLENDMODE_ADD:
    148            HLINE(Uint16, DRAW_SETPIXEL_ADD_RGB555, draw_end);
    149            break;
    150        case SDL_BLENDMODE_MOD:
    151            HLINE(Uint16, DRAW_SETPIXEL_MOD_RGB555, draw_end);
    152            break;
    153        default:
    154            HLINE(Uint16, DRAW_SETPIXEL_RGB555, draw_end);
    155            break;
    156        }
    157    } else if (x1 == x2) {
    158        switch (blendMode) {
    159        case SDL_BLENDMODE_BLEND:
    160            VLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB555, draw_end);
    161            break;
    162        case SDL_BLENDMODE_ADD:
    163            VLINE(Uint16, DRAW_SETPIXEL_ADD_RGB555, draw_end);
    164            break;
    165        case SDL_BLENDMODE_MOD:
    166            VLINE(Uint16, DRAW_SETPIXEL_MOD_RGB555, draw_end);
    167            break;
    168        default:
    169            VLINE(Uint16, DRAW_SETPIXEL_RGB555, draw_end);
    170            break;
    171        }
    172    } else if (ABS(x1 - x2) == ABS(y1 - y2)) {
    173        switch (blendMode) {
    174        case SDL_BLENDMODE_BLEND:
    175            DLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB555, draw_end);
    176            break;
    177        case SDL_BLENDMODE_ADD:
    178            DLINE(Uint16, DRAW_SETPIXEL_ADD_RGB555, draw_end);
    179            break;
    180        case SDL_BLENDMODE_MOD:
    181            DLINE(Uint16, DRAW_SETPIXEL_MOD_RGB555, draw_end);
    182            break;
    183        default:
    184            DLINE(Uint16, DRAW_SETPIXEL_RGB555, draw_end);
    185            break;
    186        }
    187    } else {
    188        switch (blendMode) {
    189        case SDL_BLENDMODE_BLEND:
    190            AALINE(x1, y1, x2, y2,
    191                   DRAW_SETPIXELXY_BLEND_RGB555, DRAW_SETPIXELXY_BLEND_RGB555,
    192                   draw_end);
    193            break;
    194        case SDL_BLENDMODE_ADD:
    195            AALINE(x1, y1, x2, y2,
    196                   DRAW_SETPIXELXY_ADD_RGB555, DRAW_SETPIXELXY_ADD_RGB555,
    197                   draw_end);
    198            break;
    199        case SDL_BLENDMODE_MOD:
    200            AALINE(x1, y1, x2, y2,
    201                   DRAW_SETPIXELXY_MOD_RGB555, DRAW_SETPIXELXY_MOD_RGB555,
    202                   draw_end);
    203            break;
    204        default:
    205            AALINE(x1, y1, x2, y2,
    206                   DRAW_SETPIXELXY_RGB555, DRAW_SETPIXELXY_BLEND_RGB555,
    207                   draw_end);
    208            break;
    209        }
    210    }
    211}
    212
    213static void
    214SDL_BlendLine_RGB565(SDL_Surface * dst, int x1, int y1, int x2, int y2,
    215                     SDL_BlendMode blendMode, Uint8 _r, Uint8 _g, Uint8 _b, Uint8 _a,
    216                     SDL_bool draw_end)
    217{
    218    unsigned r, g, b, a, inva;
    219
    220    if (blendMode == SDL_BLENDMODE_BLEND || blendMode == SDL_BLENDMODE_ADD) {
    221        r = DRAW_MUL(_r, _a);
    222        g = DRAW_MUL(_g, _a);
    223        b = DRAW_MUL(_b, _a);
    224        a = _a;
    225    } else {
    226        r = _r;
    227        g = _g;
    228        b = _b;
    229        a = _a;
    230    }
    231    inva = (a ^ 0xff);
    232
    233    if (y1 == y2) {
    234        switch (blendMode) {
    235        case SDL_BLENDMODE_BLEND:
    236            HLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB565, draw_end);
    237            break;
    238        case SDL_BLENDMODE_ADD:
    239            HLINE(Uint16, DRAW_SETPIXEL_ADD_RGB565, draw_end);
    240            break;
    241        case SDL_BLENDMODE_MOD:
    242            HLINE(Uint16, DRAW_SETPIXEL_MOD_RGB565, draw_end);
    243            break;
    244        default:
    245            HLINE(Uint16, DRAW_SETPIXEL_RGB565, draw_end);
    246            break;
    247        }
    248    } else if (x1 == x2) {
    249        switch (blendMode) {
    250        case SDL_BLENDMODE_BLEND:
    251            VLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB565, draw_end);
    252            break;
    253        case SDL_BLENDMODE_ADD:
    254            VLINE(Uint16, DRAW_SETPIXEL_ADD_RGB565, draw_end);
    255            break;
    256        case SDL_BLENDMODE_MOD:
    257            VLINE(Uint16, DRAW_SETPIXEL_MOD_RGB565, draw_end);
    258            break;
    259        default:
    260            VLINE(Uint16, DRAW_SETPIXEL_RGB565, draw_end);
    261            break;
    262        }
    263    } else if (ABS(x1 - x2) == ABS(y1 - y2)) {
    264        switch (blendMode) {
    265        case SDL_BLENDMODE_BLEND:
    266            DLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB565, draw_end);
    267            break;
    268        case SDL_BLENDMODE_ADD:
    269            DLINE(Uint16, DRAW_SETPIXEL_ADD_RGB565, draw_end);
    270            break;
    271        case SDL_BLENDMODE_MOD:
    272            DLINE(Uint16, DRAW_SETPIXEL_MOD_RGB565, draw_end);
    273            break;
    274        default:
    275            DLINE(Uint16, DRAW_SETPIXEL_RGB565, draw_end);
    276            break;
    277        }
    278    } else {
    279        switch (blendMode) {
    280        case SDL_BLENDMODE_BLEND:
    281            AALINE(x1, y1, x2, y2,
    282                   DRAW_SETPIXELXY_BLEND_RGB565, DRAW_SETPIXELXY_BLEND_RGB565,
    283                   draw_end);
    284            break;
    285        case SDL_BLENDMODE_ADD:
    286            AALINE(x1, y1, x2, y2,
    287                   DRAW_SETPIXELXY_ADD_RGB565, DRAW_SETPIXELXY_ADD_RGB565,
    288                   draw_end);
    289            break;
    290        case SDL_BLENDMODE_MOD:
    291            AALINE(x1, y1, x2, y2,
    292                   DRAW_SETPIXELXY_MOD_RGB565, DRAW_SETPIXELXY_MOD_RGB565,
    293                   draw_end);
    294            break;
    295        default:
    296            AALINE(x1, y1, x2, y2,
    297                   DRAW_SETPIXELXY_RGB565, DRAW_SETPIXELXY_BLEND_RGB565,
    298                   draw_end);
    299            break;
    300        }
    301    }
    302}
    303
    304static void
    305SDL_BlendLine_RGB4(SDL_Surface * dst, int x1, int y1, int x2, int y2,
    306                   SDL_BlendMode blendMode, Uint8 _r, Uint8 _g, Uint8 _b, Uint8 _a,
    307                   SDL_bool draw_end)
    308{
    309    const SDL_PixelFormat *fmt = dst->format;
    310    unsigned r, g, b, a, inva;
    311
    312    if (blendMode == SDL_BLENDMODE_BLEND || blendMode == SDL_BLENDMODE_ADD) {
    313        r = DRAW_MUL(_r, _a);
    314        g = DRAW_MUL(_g, _a);
    315        b = DRAW_MUL(_b, _a);
    316        a = _a;
    317    } else {
    318        r = _r;
    319        g = _g;
    320        b = _b;
    321        a = _a;
    322    }
    323    inva = (a ^ 0xff);
    324
    325    if (y1 == y2) {
    326        switch (blendMode) {
    327        case SDL_BLENDMODE_BLEND:
    328            HLINE(Uint32, DRAW_SETPIXEL_BLEND_RGB, draw_end);
    329            break;
    330        case SDL_BLENDMODE_ADD:
    331            HLINE(Uint32, DRAW_SETPIXEL_ADD_RGB, draw_end);
    332            break;
    333        case SDL_BLENDMODE_MOD:
    334            HLINE(Uint32, DRAW_SETPIXEL_MOD_RGB, draw_end);
    335            break;
    336        default:
    337            HLINE(Uint32, DRAW_SETPIXEL_RGB, draw_end);
    338            break;
    339        }
    340    } else if (x1 == x2) {
    341        switch (blendMode) {
    342        case SDL_BLENDMODE_BLEND:
    343            VLINE(Uint32, DRAW_SETPIXEL_BLEND_RGB, draw_end);
    344            break;
    345        case SDL_BLENDMODE_ADD:
    346            VLINE(Uint32, DRAW_SETPIXEL_ADD_RGB, draw_end);
    347            break;
    348        case SDL_BLENDMODE_MOD:
    349            VLINE(Uint32, DRAW_SETPIXEL_MOD_RGB, draw_end);
    350            break;
    351        default:
    352            VLINE(Uint32, DRAW_SETPIXEL_RGB, draw_end);
    353            break;
    354        }
    355    } else if (ABS(x1 - x2) == ABS(y1 - y2)) {
    356        switch (blendMode) {
    357        case SDL_BLENDMODE_BLEND:
    358            DLINE(Uint32, DRAW_SETPIXEL_BLEND_RGB, draw_end);
    359            break;
    360        case SDL_BLENDMODE_ADD:
    361            DLINE(Uint32, DRAW_SETPIXEL_ADD_RGB, draw_end);
    362            break;
    363        case SDL_BLENDMODE_MOD:
    364            DLINE(Uint32, DRAW_SETPIXEL_MOD_RGB, draw_end);
    365            break;
    366        default:
    367            DLINE(Uint32, DRAW_SETPIXEL_RGB, draw_end);
    368            break;
    369        }
    370    } else {
    371        switch (blendMode) {
    372        case SDL_BLENDMODE_BLEND:
    373            AALINE(x1, y1, x2, y2,
    374                   DRAW_SETPIXELXY4_BLEND_RGB, DRAW_SETPIXELXY4_BLEND_RGB,
    375                   draw_end);
    376            break;
    377        case SDL_BLENDMODE_ADD:
    378            AALINE(x1, y1, x2, y2,
    379                   DRAW_SETPIXELXY4_ADD_RGB, DRAW_SETPIXELXY4_ADD_RGB,
    380                   draw_end);
    381            break;
    382        case SDL_BLENDMODE_MOD:
    383            AALINE(x1, y1, x2, y2,
    384                   DRAW_SETPIXELXY4_MOD_RGB, DRAW_SETPIXELXY4_MOD_RGB,
    385                   draw_end);
    386            break;
    387        default:
    388            AALINE(x1, y1, x2, y2,
    389                   DRAW_SETPIXELXY4_RGB, DRAW_SETPIXELXY4_BLEND_RGB,
    390                   draw_end);
    391            break;
    392        }
    393    }
    394}
    395
    396static void
    397SDL_BlendLine_RGBA4(SDL_Surface * dst, int x1, int y1, int x2, int y2,
    398                    SDL_BlendMode blendMode, Uint8 _r, Uint8 _g, Uint8 _b, Uint8 _a,
    399                    SDL_bool draw_end)
    400{
    401    const SDL_PixelFormat *fmt = dst->format;
    402    unsigned r, g, b, a, inva;
    403
    404    if (blendMode == SDL_BLENDMODE_BLEND || blendMode == SDL_BLENDMODE_ADD) {
    405        r = DRAW_MUL(_r, _a);
    406        g = DRAW_MUL(_g, _a);
    407        b = DRAW_MUL(_b, _a);
    408        a = _a;
    409    } else {
    410        r = _r;
    411        g = _g;
    412        b = _b;
    413        a = _a;
    414    }
    415    inva = (a ^ 0xff);
    416
    417    if (y1 == y2) {
    418        switch (blendMode) {
    419        case SDL_BLENDMODE_BLEND:
    420            HLINE(Uint32, DRAW_SETPIXEL_BLEND_RGBA, draw_end);
    421            break;
    422        case SDL_BLENDMODE_ADD:
    423            HLINE(Uint32, DRAW_SETPIXEL_ADD_RGBA, draw_end);
    424            break;
    425        case SDL_BLENDMODE_MOD:
    426            HLINE(Uint32, DRAW_SETPIXEL_MOD_RGBA, draw_end);
    427            break;
    428        default:
    429            HLINE(Uint32, DRAW_SETPIXEL_RGBA, draw_end);
    430            break;
    431        }
    432    } else if (x1 == x2) {
    433        switch (blendMode) {
    434        case SDL_BLENDMODE_BLEND:
    435            VLINE(Uint32, DRAW_SETPIXEL_BLEND_RGBA, draw_end);
    436            break;
    437        case SDL_BLENDMODE_ADD:
    438            VLINE(Uint32, DRAW_SETPIXEL_ADD_RGBA, draw_end);
    439            break;
    440        case SDL_BLENDMODE_MOD:
    441            VLINE(Uint32, DRAW_SETPIXEL_MOD_RGBA, draw_end);
    442            break;
    443        default:
    444            VLINE(Uint32, DRAW_SETPIXEL_RGBA, draw_end);
    445            break;
    446        }
    447    } else if (ABS(x1 - x2) == ABS(y1 - y2)) {
    448        switch (blendMode) {
    449        case SDL_BLENDMODE_BLEND:
    450            DLINE(Uint32, DRAW_SETPIXEL_BLEND_RGBA, draw_end);
    451            break;
    452        case SDL_BLENDMODE_ADD:
    453            DLINE(Uint32, DRAW_SETPIXEL_ADD_RGBA, draw_end);
    454            break;
    455        case SDL_BLENDMODE_MOD:
    456            DLINE(Uint32, DRAW_SETPIXEL_MOD_RGBA, draw_end);
    457            break;
    458        default:
    459            DLINE(Uint32, DRAW_SETPIXEL_RGBA, draw_end);
    460            break;
    461        }
    462    } else {
    463        switch (blendMode) {
    464        case SDL_BLENDMODE_BLEND:
    465            AALINE(x1, y1, x2, y2,
    466                   DRAW_SETPIXELXY4_BLEND_RGBA, DRAW_SETPIXELXY4_BLEND_RGBA,
    467                   draw_end);
    468            break;
    469        case SDL_BLENDMODE_ADD:
    470            AALINE(x1, y1, x2, y2,
    471                   DRAW_SETPIXELXY4_ADD_RGBA, DRAW_SETPIXELXY4_ADD_RGBA,
    472                   draw_end);
    473            break;
    474        case SDL_BLENDMODE_MOD:
    475            AALINE(x1, y1, x2, y2,
    476                   DRAW_SETPIXELXY4_MOD_RGBA, DRAW_SETPIXELXY4_MOD_RGBA,
    477                   draw_end);
    478            break;
    479        default:
    480            AALINE(x1, y1, x2, y2,
    481                   DRAW_SETPIXELXY4_RGBA, DRAW_SETPIXELXY4_BLEND_RGBA,
    482                   draw_end);
    483            break;
    484        }
    485    }
    486}
    487
    488static void
    489SDL_BlendLine_RGB888(SDL_Surface * dst, int x1, int y1, int x2, int y2,
    490                     SDL_BlendMode blendMode, Uint8 _r, Uint8 _g, Uint8 _b, Uint8 _a,
    491                     SDL_bool draw_end)
    492{
    493    unsigned r, g, b, a, inva;
    494
    495    if (blendMode == SDL_BLENDMODE_BLEND || blendMode == SDL_BLENDMODE_ADD) {
    496        r = DRAW_MUL(_r, _a);
    497        g = DRAW_MUL(_g, _a);
    498        b = DRAW_MUL(_b, _a);
    499        a = _a;
    500    } else {
    501        r = _r;
    502        g = _g;
    503        b = _b;
    504        a = _a;
    505    }
    506    inva = (a ^ 0xff);
    507
    508    if (y1 == y2) {
    509        switch (blendMode) {
    510        case SDL_BLENDMODE_BLEND:
    511            HLINE(Uint32, DRAW_SETPIXEL_BLEND_RGB888, draw_end);
    512            break;
    513        case SDL_BLENDMODE_ADD:
    514            HLINE(Uint32, DRAW_SETPIXEL_ADD_RGB888, draw_end);
    515            break;
    516        case SDL_BLENDMODE_MOD:
    517            HLINE(Uint32, DRAW_SETPIXEL_MOD_RGB888, draw_end);
    518            break;
    519        default:
    520            HLINE(Uint32, DRAW_SETPIXEL_RGB888, draw_end);
    521            break;
    522        }
    523    } else if (x1 == x2) {
    524        switch (blendMode) {
    525        case SDL_BLENDMODE_BLEND:
    526            VLINE(Uint32, DRAW_SETPIXEL_BLEND_RGB888, draw_end);
    527            break;
    528        case SDL_BLENDMODE_ADD:
    529            VLINE(Uint32, DRAW_SETPIXEL_ADD_RGB888, draw_end);
    530            break;
    531        case SDL_BLENDMODE_MOD:
    532            VLINE(Uint32, DRAW_SETPIXEL_MOD_RGB888, draw_end);
    533            break;
    534        default:
    535            VLINE(Uint32, DRAW_SETPIXEL_RGB888, draw_end);
    536            break;
    537        }
    538    } else if (ABS(x1 - x2) == ABS(y1 - y2)) {
    539        switch (blendMode) {
    540        case SDL_BLENDMODE_BLEND:
    541            DLINE(Uint32, DRAW_SETPIXEL_BLEND_RGB888, draw_end);
    542            break;
    543        case SDL_BLENDMODE_ADD:
    544            DLINE(Uint32, DRAW_SETPIXEL_ADD_RGB888, draw_end);
    545            break;
    546        case SDL_BLENDMODE_MOD:
    547            DLINE(Uint32, DRAW_SETPIXEL_MOD_RGB888, draw_end);
    548            break;
    549        default:
    550            DLINE(Uint32, DRAW_SETPIXEL_RGB888, draw_end);
    551            break;
    552        }
    553    } else {
    554        switch (blendMode) {
    555        case SDL_BLENDMODE_BLEND:
    556            AALINE(x1, y1, x2, y2,
    557                   DRAW_SETPIXELXY_BLEND_RGB888, DRAW_SETPIXELXY_BLEND_RGB888,
    558                   draw_end);
    559            break;
    560        case SDL_BLENDMODE_ADD:
    561            AALINE(x1, y1, x2, y2,
    562                   DRAW_SETPIXELXY_ADD_RGB888, DRAW_SETPIXELXY_ADD_RGB888,
    563                   draw_end);
    564            break;
    565        case SDL_BLENDMODE_MOD:
    566            AALINE(x1, y1, x2, y2,
    567                   DRAW_SETPIXELXY_MOD_RGB888, DRAW_SETPIXELXY_MOD_RGB888,
    568                   draw_end);
    569            break;
    570        default:
    571            AALINE(x1, y1, x2, y2,
    572                   DRAW_SETPIXELXY_RGB888, DRAW_SETPIXELXY_BLEND_RGB888,
    573                   draw_end);
    574            break;
    575        }
    576    }
    577}
    578
    579static void
    580SDL_BlendLine_ARGB8888(SDL_Surface * dst, int x1, int y1, int x2, int y2,
    581                       SDL_BlendMode blendMode, Uint8 _r, Uint8 _g, Uint8 _b, Uint8 _a,
    582                       SDL_bool draw_end)
    583{
    584    unsigned r, g, b, a, inva;
    585
    586    if (blendMode == SDL_BLENDMODE_BLEND || blendMode == SDL_BLENDMODE_ADD) {
    587        r = DRAW_MUL(_r, _a);
    588        g = DRAW_MUL(_g, _a);
    589        b = DRAW_MUL(_b, _a);
    590        a = _a;
    591    } else {
    592        r = _r;
    593        g = _g;
    594        b = _b;
    595        a = _a;
    596    }
    597    inva = (a ^ 0xff);
    598
    599    if (y1 == y2) {
    600        switch (blendMode) {
    601        case SDL_BLENDMODE_BLEND:
    602            HLINE(Uint32, DRAW_SETPIXEL_BLEND_ARGB8888, draw_end);
    603            break;
    604        case SDL_BLENDMODE_ADD:
    605            HLINE(Uint32, DRAW_SETPIXEL_ADD_ARGB8888, draw_end);
    606            break;
    607        case SDL_BLENDMODE_MOD:
    608            HLINE(Uint32, DRAW_SETPIXEL_MOD_ARGB8888, draw_end);
    609            break;
    610        default:
    611            HLINE(Uint32, DRAW_SETPIXEL_ARGB8888, draw_end);
    612            break;
    613        }
    614    } else if (x1 == x2) {
    615        switch (blendMode) {
    616        case SDL_BLENDMODE_BLEND:
    617            VLINE(Uint32, DRAW_SETPIXEL_BLEND_ARGB8888, draw_end);
    618            break;
    619        case SDL_BLENDMODE_ADD:
    620            VLINE(Uint32, DRAW_SETPIXEL_ADD_ARGB8888, draw_end);
    621            break;
    622        case SDL_BLENDMODE_MOD:
    623            VLINE(Uint32, DRAW_SETPIXEL_MOD_ARGB8888, draw_end);
    624            break;
    625        default:
    626            VLINE(Uint32, DRAW_SETPIXEL_ARGB8888, draw_end);
    627            break;
    628        }
    629    } else if (ABS(x1 - x2) == ABS(y1 - y2)) {
    630        switch (blendMode) {
    631        case SDL_BLENDMODE_BLEND:
    632            DLINE(Uint32, DRAW_SETPIXEL_BLEND_ARGB8888, draw_end);
    633            break;
    634        case SDL_BLENDMODE_ADD:
    635            DLINE(Uint32, DRAW_SETPIXEL_ADD_ARGB8888, draw_end);
    636            break;
    637        case SDL_BLENDMODE_MOD:
    638            DLINE(Uint32, DRAW_SETPIXEL_MOD_ARGB8888, draw_end);
    639            break;
    640        default:
    641            DLINE(Uint32, DRAW_SETPIXEL_ARGB8888, draw_end);
    642            break;
    643        }
    644    } else {
    645        switch (blendMode) {
    646        case SDL_BLENDMODE_BLEND:
    647            AALINE(x1, y1, x2, y2,
    648                   DRAW_SETPIXELXY_BLEND_ARGB8888, DRAW_SETPIXELXY_BLEND_ARGB8888,
    649                   draw_end);
    650            break;
    651        case SDL_BLENDMODE_ADD:
    652            AALINE(x1, y1, x2, y2,
    653                   DRAW_SETPIXELXY_ADD_ARGB8888, DRAW_SETPIXELXY_ADD_ARGB8888,
    654                   draw_end);
    655            break;
    656        case SDL_BLENDMODE_MOD:
    657            AALINE(x1, y1, x2, y2,
    658                   DRAW_SETPIXELXY_MOD_ARGB8888, DRAW_SETPIXELXY_MOD_ARGB8888,
    659                   draw_end);
    660            break;
    661        default:
    662            AALINE(x1, y1, x2, y2,
    663                   DRAW_SETPIXELXY_ARGB8888, DRAW_SETPIXELXY_BLEND_ARGB8888,
    664                   draw_end);
    665            break;
    666        }
    667    }
    668}
    669
    670typedef void (*BlendLineFunc) (SDL_Surface * dst,
    671                               int x1, int y1, int x2, int y2,
    672                               SDL_BlendMode blendMode,
    673                               Uint8 r, Uint8 g, Uint8 b, Uint8 a,
    674                               SDL_bool draw_end);
    675
    676static BlendLineFunc
    677SDL_CalculateBlendLineFunc(const SDL_PixelFormat * fmt)
    678{
    679    switch (fmt->BytesPerPixel) {
    680    case 2:
    681        if (fmt->Rmask == 0x7C00) {
    682            return SDL_BlendLine_RGB555;
    683        } else if (fmt->Rmask == 0xF800) {
    684            return SDL_BlendLine_RGB565;
    685        } else {
    686            return SDL_BlendLine_RGB2;
    687        }
    688        break;
    689    case 4:
    690        if (fmt->Rmask == 0x00FF0000) {
    691            if (fmt->Amask) {
    692                return SDL_BlendLine_ARGB8888;
    693            } else {
    694                return SDL_BlendLine_RGB888;
    695            }
    696        } else {
    697            if (fmt->Amask) {
    698                return SDL_BlendLine_RGBA4;
    699            } else {
    700                return SDL_BlendLine_RGB4;
    701            }
    702        }
    703    }
    704    return NULL;
    705}
    706
    707int
    708SDL_BlendLine(SDL_Surface * dst, int x1, int y1, int x2, int y2,
    709              SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
    710{
    711    BlendLineFunc func;
    712
    713    if (!dst) {
    714        return SDL_SetError("SDL_BlendLine(): Passed NULL destination surface");
    715    }
    716
    717    func = SDL_CalculateBlendLineFunc(dst->format);
    718    if (!func) {
    719        return SDL_SetError("SDL_BlendLine(): Unsupported surface format");
    720    }
    721
    722    /* Perform clipping */
    723    /* FIXME: We don't actually want to clip, as it may change line slope */
    724    if (!SDL_IntersectRectAndLine(&dst->clip_rect, &x1, &y1, &x2, &y2)) {
    725        return 0;
    726    }
    727
    728    func(dst, x1, y1, x2, y2, blendMode, r, g, b, a, SDL_TRUE);
    729    return 0;
    730}
    731
    732int
    733SDL_BlendLines(SDL_Surface * dst, const SDL_Point * points, int count,
    734               SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
    735{
    736    int i;
    737    int x1, y1;
    738    int x2, y2;
    739    SDL_bool draw_end;
    740    BlendLineFunc func;
    741
    742    if (!dst) {
    743        return SDL_SetError("SDL_BlendLines(): Passed NULL destination surface");
    744    }
    745
    746    func = SDL_CalculateBlendLineFunc(dst->format);
    747    if (!func) {
    748        return SDL_SetError("SDL_BlendLines(): Unsupported surface format");
    749    }
    750
    751    for (i = 1; i < count; ++i) {
    752        x1 = points[i-1].x;
    753        y1 = points[i-1].y;
    754        x2 = points[i].x;
    755        y2 = points[i].y;
    756
    757        /* Perform clipping */
    758        /* FIXME: We don't actually want to clip, as it may change line slope */
    759        if (!SDL_IntersectRectAndLine(&dst->clip_rect, &x1, &y1, &x2, &y2)) {
    760            continue;
    761        }
    762
    763        /* Draw the end if it was clipped */
    764        draw_end = (x2 != points[i].x || y2 != points[i].y);
    765
    766        func(dst, x1, y1, x2, y2, blendMode, r, g, b, a, draw_end);
    767    }
    768    if (points[0].x != points[count-1].x || points[0].y != points[count-1].y) {
    769        SDL_BlendPoint(dst, points[count-1].x, points[count-1].y,
    770                       blendMode, r, g, b, a);
    771    }
    772    return 0;
    773}
    774
    775#endif /* !SDL_RENDER_DISABLED */
    776
    777/* vi: set ts=4 sw=4 expandtab: */