src/video/SDL_blendpoint.c
author Sam Lantinga <slouken@libsdl.org>
Sun, 02 Aug 2009 18:39:57 +0000
changeset 3227 458e53d8662c
parent 2901 133601e3b255
child 3536 0267b8b1595c
permissions -rw-r--r--
Clarified API documentation
     1 /*
     2     SDL - Simple DirectMedia Layer
     3     Copyright (C) 1997-2009 Sam Lantinga
     4 
     5     This library is free software; you can redistribute it and/or
     6     modify it under the terms of the GNU Lesser General Public
     7     License as published by the Free Software Foundation; either
     8     version 2.1 of the License, or (at your option) any later version.
     9 
    10     This library is distributed in the hope that it will be useful,
    11     but WITHOUT ANY WARRANTY; without even the implied warranty of
    12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    13     Lesser General Public License for more details.
    14 
    15     You should have received a copy of the GNU Lesser General Public
    16     License along with this library; if not, write to the Free Software
    17     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
    18 
    19     Sam Lantinga
    20     slouken@libsdl.org
    21 */
    22 #include "SDL_config.h"
    23 
    24 #include "SDL_draw.h"
    25 
    26 static int
    27 SDL_BlendPoint_RGB555(SDL_Surface * dst, int x, int y, int blendMode, Uint8 r,
    28                       Uint8 g, Uint8 b, Uint8 a)
    29 {
    30     unsigned inva = 0xff - a;
    31 
    32     switch (blendMode) {
    33     case SDL_BLENDMODE_BLEND:
    34         DRAW_SETPIXELXY_BLEND_RGB555(x, y);
    35         break;
    36     case SDL_BLENDMODE_ADD:
    37         DRAW_SETPIXELXY_ADD_RGB555(x, y);
    38         break;
    39     case SDL_BLENDMODE_MOD:
    40         DRAW_SETPIXELXY_MOD_RGB555(x, y);
    41         break;
    42     default:
    43         DRAW_SETPIXELXY_RGB555(x, y);
    44         break;
    45     }
    46     return 0;
    47 }
    48 
    49 static int
    50 SDL_BlendPoint_RGB565(SDL_Surface * dst, int x, int y, int blendMode, Uint8 r,
    51                       Uint8 g, Uint8 b, Uint8 a)
    52 {
    53     unsigned inva = 0xff - a;
    54 
    55     switch (blendMode) {
    56     case SDL_BLENDMODE_BLEND:
    57         DRAW_SETPIXELXY_BLEND_RGB565(x, y);
    58         break;
    59     case SDL_BLENDMODE_ADD:
    60         DRAW_SETPIXELXY_ADD_RGB565(x, y);
    61         break;
    62     case SDL_BLENDMODE_MOD:
    63         DRAW_SETPIXELXY_MOD_RGB565(x, y);
    64         break;
    65     default:
    66         DRAW_SETPIXELXY_RGB565(x, y);
    67         break;
    68     }
    69     return 0;
    70 }
    71 
    72 static int
    73 SDL_BlendPoint_RGB888(SDL_Surface * dst, int x, int y, int blendMode, Uint8 r,
    74                       Uint8 g, Uint8 b, Uint8 a)
    75 {
    76     unsigned inva = 0xff - a;
    77 
    78     switch (blendMode) {
    79     case SDL_BLENDMODE_BLEND:
    80         DRAW_SETPIXELXY_BLEND_RGB888(x, y);
    81         break;
    82     case SDL_BLENDMODE_ADD:
    83         DRAW_SETPIXELXY_ADD_RGB888(x, y);
    84         break;
    85     case SDL_BLENDMODE_MOD:
    86         DRAW_SETPIXELXY_MOD_RGB888(x, y);
    87         break;
    88     default:
    89         DRAW_SETPIXELXY_RGB888(x, y);
    90         break;
    91     }
    92     return 0;
    93 }
    94 
    95 static int
    96 SDL_BlendPoint_ARGB8888(SDL_Surface * dst, int x, int y, int blendMode,
    97                         Uint8 r, Uint8 g, Uint8 b, Uint8 a)
    98 {
    99     unsigned inva = 0xff - a;
   100 
   101     switch (blendMode) {
   102     case SDL_BLENDMODE_BLEND:
   103         DRAW_SETPIXELXY_BLEND_ARGB8888(x, y);
   104         break;
   105     case SDL_BLENDMODE_ADD:
   106         DRAW_SETPIXELXY_ADD_ARGB8888(x, y);
   107         break;
   108     case SDL_BLENDMODE_MOD:
   109         DRAW_SETPIXELXY_MOD_ARGB8888(x, y);
   110         break;
   111     default:
   112         DRAW_SETPIXELXY_ARGB8888(x, y);
   113         break;
   114     }
   115     return 0;
   116 }
   117 
   118 static int
   119 SDL_BlendPoint_RGB(SDL_Surface * dst, int x, int y, int blendMode, Uint8 r,
   120                    Uint8 g, Uint8 b, Uint8 a)
   121 {
   122     SDL_PixelFormat *fmt = dst->format;
   123     unsigned inva = 0xff - a;
   124 
   125     switch (fmt->BytesPerPixel) {
   126     case 2:
   127         switch (blendMode) {
   128         case SDL_BLENDMODE_BLEND:
   129             DRAW_SETPIXELXY2_BLEND_RGB(x, y);
   130             break;
   131         case SDL_BLENDMODE_ADD:
   132             DRAW_SETPIXELXY2_ADD_RGB(x, y);
   133             break;
   134         case SDL_BLENDMODE_MOD:
   135             DRAW_SETPIXELXY2_MOD_RGB(x, y);
   136             break;
   137         default:
   138             DRAW_SETPIXELXY2_RGB(x, y);
   139             break;
   140         }
   141         return 0;
   142     case 4:
   143         switch (blendMode) {
   144         case SDL_BLENDMODE_BLEND:
   145             DRAW_SETPIXELXY4_BLEND_RGB(x, y);
   146             break;
   147         case SDL_BLENDMODE_ADD:
   148             DRAW_SETPIXELXY4_ADD_RGB(x, y);
   149             break;
   150         case SDL_BLENDMODE_MOD:
   151             DRAW_SETPIXELXY4_MOD_RGB(x, y);
   152             break;
   153         default:
   154             DRAW_SETPIXELXY4_RGB(x, y);
   155             break;
   156         }
   157         return 0;
   158     default:
   159         SDL_Unsupported();
   160         return -1;
   161     }
   162 }
   163 
   164 static int
   165 SDL_BlendPoint_RGBA(SDL_Surface * dst, int x, int y, int blendMode, Uint8 r,
   166                     Uint8 g, Uint8 b, Uint8 a)
   167 {
   168     SDL_PixelFormat *fmt = dst->format;
   169     unsigned inva = 0xff - a;
   170 
   171     switch (fmt->BytesPerPixel) {
   172     case 4:
   173         switch (blendMode) {
   174         case SDL_BLENDMODE_BLEND:
   175             DRAW_SETPIXELXY4_BLEND_RGBA(x, y);
   176             break;
   177         case SDL_BLENDMODE_ADD:
   178             DRAW_SETPIXELXY4_ADD_RGBA(x, y);
   179             break;
   180         case SDL_BLENDMODE_MOD:
   181             DRAW_SETPIXELXY4_MOD_RGBA(x, y);
   182             break;
   183         default:
   184             DRAW_SETPIXELXY4_RGBA(x, y);
   185             break;
   186         }
   187         return 0;
   188     default:
   189         SDL_Unsupported();
   190         return -1;
   191     }
   192 }
   193 
   194 int
   195 SDL_BlendPoint(SDL_Surface * dst, int x, int y, int blendMode, Uint8 r,
   196                Uint8 g, Uint8 b, Uint8 a)
   197 {
   198     SDL_PixelFormat *fmt = dst->format;
   199 
   200     /* This function doesn't work on surfaces < 8 bpp */
   201     if (dst->format->BitsPerPixel < 8) {
   202         SDL_SetError("SDL_BlendPoint(): Unsupported surface format");
   203         return (-1);
   204     }
   205 
   206     /* Perform clipping */
   207     if (x < dst->clip_rect.x || y < dst->clip_rect.y ||
   208         x >= (dst->clip_rect.x + dst->clip_rect.w) ||
   209         y >= (dst->clip_rect.y + dst->clip_rect.h)) {
   210         return 0;
   211     }
   212 
   213     if ((blendMode == SDL_BLENDMODE_BLEND)
   214         || (blendMode == SDL_BLENDMODE_ADD)) {
   215         r = DRAW_MUL(r, a);
   216         g = DRAW_MUL(g, a);
   217         b = DRAW_MUL(b, a);
   218     }
   219 
   220     switch (fmt->BitsPerPixel) {
   221     case 15:
   222         switch (fmt->Rmask) {
   223         case 0x7C00:
   224             return SDL_BlendPoint_RGB555(dst, x, y, blendMode, r, g, b, a);
   225         }
   226         break;
   227     case 16:
   228         switch (fmt->Rmask) {
   229         case 0xF800:
   230             return SDL_BlendPoint_RGB565(dst, x, y, blendMode, r, g, b, a);
   231         }
   232         break;
   233     case 32:
   234         switch (fmt->Rmask) {
   235         case 0x00FF0000:
   236             if (!fmt->Amask) {
   237                 return SDL_BlendPoint_RGB888(dst, x, y, blendMode, r, g, b,
   238                                              a);
   239             } else {
   240                 return SDL_BlendPoint_ARGB8888(dst, x, y, blendMode, r, g, b,
   241                                                a);
   242             }
   243             break;
   244         }
   245     default:
   246         break;
   247     }
   248 
   249     if (!fmt->Amask) {
   250         return SDL_BlendPoint_RGB(dst, x, y, blendMode, r, g, b, a);
   251     } else {
   252         return SDL_BlendPoint_RGBA(dst, x, y, blendMode, r, g, b, a);
   253     }
   254 }
   255 
   256 /* vi: set ts=4 sw=4 expandtab: */