diff options
Diffstat (limited to 'modules/libblit/g_pixel.c')
-rw-r--r-- | modules/libblit/g_pixel.c | 271 |
1 files changed, 271 insertions, 0 deletions
diff --git a/modules/libblit/g_pixel.c b/modules/libblit/g_pixel.c new file mode 100644 index 0000000..07238c8 --- /dev/null +++ b/modules/libblit/g_pixel.c @@ -0,0 +1,271 @@ +/* + * Copyright © 2006-2016 SplinterGU (Fenix/Bennugd) + * Copyright © 2002-2006 Fenix Team (Fenix) + * Copyright © 1999-2002 José Luis Cebrián Pagüe (Fenix) + * + * This file is part of Bennu - Game Development + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. + * + */ + +#include <stdio.h> + +#include "libblit.h" + +/* --------------------------------------------------------------------------- */ + +int pixel_color8 = 15 ; +uint16_t pixel_color16 = 0xFFFF ; +uint32_t pixel_color32 = 0xFFFFFFFF ; + +uint16_t pixel_color16_alpha = 0xFFFF ; + +int pixel_alpha = 255; +uint8_t * pixel_alpha8 = NULL ; +uint16_t * pixel_alpha16 = NULL ; + +/* --------------------------------------------------------------------------- */ +/* + * FUNCTION : gr_get_pixel + * + * Read a pixel from a bitmap + * + * PARAMS : + * dest Destination bitmap + * x, y Pixel coordinates + * + * RETURN VALUE : + * 1, 8 or 16-bit integer with the pixel value + * + */ + +int gr_get_pixel( GRAPH * dest, int x, int y ) +{ + if ( x < 0 || y < 0 || x >= ( int ) dest->width || y >= ( int ) dest->height ) return -1 ; + + switch ( dest->format->depth ) + { + case 1: + return (( *( uint8_t * )( dest->data + dest->pitch * y + ( x >> 3 ) ) ) & ( 0x80 >> ( x & 7 ) ) ) ? 1 : 0; + + case 8: + return *(( uint8_t * ) dest->data + dest->pitch * y + x ) ; + + case 16: + return *( uint16_t * )(( uint8_t * ) dest->data + dest->pitch * y + ( x << 1 ) ) ; + + case 32: + return *( uint32_t * )(( uint8_t * ) dest->data + dest->pitch * y + ( x << 2 ) ) ; + } + return -1; +} + +/* --------------------------------------------------------------------------- */ +/* + * FUNCTION : gr_put_pixel + * + * Paint a pixel with no clipping whatsoever, except by + * the bitmap's dimensions + * + * PARAMS : + * dest Destination bitmap + * x, y Pixel coordinates + * color 1, 8 or 16-bit pixel value + * + * RETURN VALUE : + * None + * + */ + +void gr_put_pixel( GRAPH * dest, int x, int y, int color ) +{ + if ( x < 0 || y < 0 || x >= ( int ) dest->width || y >= ( int ) dest->height ) return ; + + switch ( dest->format->depth ) + { + case 1: + if ( color ) + *(( uint8_t * ) dest->data + dest->pitch * y + ( x >> 3 ) ) |= ( 0x80 >> ( x & 7 ) ) ; + else + *(( uint8_t * ) dest->data + dest->pitch * y + ( x >> 3 ) ) &= ~( 0x80 >> ( x & 7 ) ) ; + break; + + case 8: + _Pixel8(( uint8_t * ) dest->data + dest->pitch * y + x , color ); + break; + + case 16: + _Pixel16(( uint8_t * ) dest->data + dest->pitch * y + ( x << 1 ), color, gr_alpha16( pixel_alpha )[ color ] ) ; + break; + + case 32: + { + uint32_t * ptr = ( uint32_t * ) (( uint8_t * ) dest->data + dest->pitch * y + ( x << 2 )) ; + + if ( pixel_alpha == 255 && ( color & 0xff000000 ) == 0xff000000 ) + { + *ptr = color ; + } + else + { + unsigned int _f = color & 0xff000000, _f2 ; + unsigned int r, g, b ; + + _f = ( _f >> 24 ) * pixel_alpha / 255 ; + _f2 = 255 - _f ; + + if ( _f != 0x000000ff ) + { + r = ( ( color & 0x00ff0000 ) * _f + (( *ptr & 0x00ff0000 ) * _f2 ) ) >> 8 ; + g = ( ( color & 0x0000ff00 ) * _f + (( *ptr & 0x0000ff00 ) * _f2 ) ) >> 8 ; + b = ( ( color & 0x000000ff ) * _f + (( *ptr & 0x000000ff ) * _f2 ) ) >> 8 ; + + if ( r > 0x00ff0000 ) r = 0x00ff0000 ; else r &= 0x00ff0000 ; + if ( g > 0x0000ff00 ) g = 0x0000ff00 ; else g &= 0x0000ff00 ; + if ( b > 0x000000ff ) b = 0x000000ff ; else b &= 0x000000ff ; + + *ptr = ( _f << 24 ) | r | g | b ; + } + else + { + r = ( ( color & 0x00ff0000 ) * pixel_alpha + (( *ptr & 0x00ff0000 ) * _f2 ) ) >> 8 ; + g = ( ( color & 0x0000ff00 ) * pixel_alpha + (( *ptr & 0x0000ff00 ) * _f2 ) ) >> 8 ; + b = ( ( color & 0x000000ff ) * pixel_alpha + (( *ptr & 0x000000ff ) * _f2 ) ) >> 8 ; + + if ( r > 0x00ff0000 ) r = 0x00ff0000 ; else r &= 0x00ff0000 ; + if ( g > 0x0000ff00 ) g = 0x0000ff00 ; else g &= 0x0000ff00 ; + if ( b > 0x000000ff ) b = 0x000000ff ; else b &= 0x000000ff ; + + *ptr = 0xff000000 | r | g | b ; + } + } + } + break; + } + + if ( color ) + { + dest->modified = 2 ; + dest->info_flags &= ~GI_CLEAN; + } + else + { + dest->modified = 1 ; /* Don't needs analysis */ + dest->info_flags &= ~GI_NOCOLORKEY; + } +} + +/* --------------------------------------------------------------------------- */ +/* + * FUNCTION : gr_put_pixelc + * + * Paint a pixel using a clipping region + * + * PARAMS : + * dest Destination bitmap + * x, y Pixel coordinates + * color 1, 8 or 16-bit pixel value + * + * RETURN VALUE : + * None + * + */ + +void gr_put_pixelc( GRAPH * dest, REGION * clip, int x, int y, int color ) +{ + if ( clip && x >= clip->x && x <= clip->x2 && y >= clip->y && y <= clip->y2 ) + gr_put_pixel( dest, x, y, color ); +} + +/* --------------------------------------------------------------------------- */ +/* + * FUNCTION : gr_setcolor + * + * Sets the drawing color + * + * PARAMS : + * alpha New color (16 bits if 16 bits enabled) + * + * RETURN VALUE : + * None + * + */ + +void gr_setcolor( int c ) +{ +/* + int r, g, b; + + if ( c ) + { + if ( sys_pixel_format->depth != 8 ) + { + gr_get_rgb( c, &r, &g, &b ); + pixel_color8 = gr_find_nearest_color( r, g, b ); + } + else + { + + } + } + else + pixel_color8 = 0; +*/ + /* Fix this */ + pixel_color8 = c; + pixel_color16 = c ; + pixel_color32 = c ; + + if ( sys_pixel_format->depth == 16 && pixel_alpha != 255 ) pixel_color16_alpha = gr_alpha16( pixel_alpha )[ pixel_color16 ]; +} + +/* --------------------------------------------------------------------------- */ +/* + * FUNCTION : gr_setalpha + * + * Sets the drawing alpha value for primitives + * + * PARAMS : + * alpha New alpha (0-255) + * + * RETURN VALUE : + * None + * + */ + +void gr_setalpha( int value ) +{ + value &= 0xFF; + pixel_alpha = value; + + if ( sys_pixel_format->depth == 16 ) + { + pixel_alpha8 = gr_alpha8( value ); + pixel_alpha16 = gr_alpha16( 255 - value ); + pixel_color16_alpha = gr_alpha16( value )[ pixel_color16 ]; + } + else + { + pixel_alpha8 = gr_alpha8( value ); + } +} + +/* --------------------------------------------------------------------------- */ |