diff options
author | chai <chaifix@163.com> | 2019-05-11 22:54:56 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2019-05-11 22:54:56 +0800 |
commit | 9645be0af1b1d5cb0ad5892d5464e1b23c51b550 (patch) | |
tree | 129c716bed8e93312421c3adb2f8e7c4f811602d /source/3rd-party/SDL2/src/video/sdlgenblit.pl |
Diffstat (limited to 'source/3rd-party/SDL2/src/video/sdlgenblit.pl')
-rw-r--r-- | source/3rd-party/SDL2/src/video/sdlgenblit.pl | 535 |
1 files changed, 535 insertions, 0 deletions
diff --git a/source/3rd-party/SDL2/src/video/sdlgenblit.pl b/source/3rd-party/SDL2/src/video/sdlgenblit.pl new file mode 100644 index 0000000..d89ae2a --- /dev/null +++ b/source/3rd-party/SDL2/src/video/sdlgenblit.pl @@ -0,0 +1,535 @@ +#!/usr/bin/perl -w +# +# A script to generate optimized C blitters for Simple DirectMedia Layer +# http://www.libsdl.org/ + +use warnings; +use strict; + +my %file; + +# The formats potentially supported by this script: +# SDL_PIXELFORMAT_RGB332 +# SDL_PIXELFORMAT_RGB444 +# SDL_PIXELFORMAT_RGB555 +# SDL_PIXELFORMAT_ARGB4444 +# SDL_PIXELFORMAT_ARGB1555 +# SDL_PIXELFORMAT_RGB565 +# SDL_PIXELFORMAT_RGB24 +# SDL_PIXELFORMAT_BGR24 +# SDL_PIXELFORMAT_RGB888 +# SDL_PIXELFORMAT_BGR888 +# SDL_PIXELFORMAT_ARGB8888 +# SDL_PIXELFORMAT_RGBA8888 +# SDL_PIXELFORMAT_ABGR8888 +# SDL_PIXELFORMAT_BGRA8888 +# SDL_PIXELFORMAT_ARGB2101010 + +# The formats we're actually creating blitters for: +my @src_formats = ( + "RGB888", + "BGR888", + "ARGB8888", + "RGBA8888", + "ABGR8888", + "BGRA8888", +); +my @dst_formats = ( + "RGB888", + "BGR888", + "ARGB8888", +); + +my %format_size = ( + "RGB888" => 4, + "BGR888" => 4, + "ARGB8888" => 4, + "RGBA8888" => 4, + "ABGR8888" => 4, + "BGRA8888" => 4, +); + +my %format_type = ( + "RGB888" => "Uint32", + "BGR888" => "Uint32", + "ARGB8888" => "Uint32", + "RGBA8888" => "Uint32", + "ABGR8888" => "Uint32", + "BGRA8888" => "Uint32", +); + +my %get_rgba_string_ignore_alpha = ( + "RGB888" => "_R = (Uint8)(_pixel >> 16); _G = (Uint8)(_pixel >> 8); _B = (Uint8)_pixel;", + "BGR888" => "_B = (Uint8)(_pixel >> 16); _G = (Uint8)(_pixel >> 8); _R = (Uint8)_pixel;", + "ARGB8888" => "_R = (Uint8)(_pixel >> 16); _G = (Uint8)(_pixel >> 8); _B = (Uint8)_pixel;", + "RGBA8888" => "_R = (Uint8)(_pixel >> 24); _G = (Uint8)(_pixel >> 16); _B = (Uint8)(_pixel >> 8);", + "ABGR8888" => "_B = (Uint8)(_pixel >> 16); _G = (Uint8)(_pixel >> 8); _R = (Uint8)_pixel;", + "BGRA8888" => "_B = (Uint8)(_pixel >> 24); _G = (Uint8)(_pixel >> 16); _R = (Uint8)(_pixel >> 8);", +); + +my %get_rgba_string = ( + "RGB888" => $get_rgba_string_ignore_alpha{"RGB888"} . " _A = 0xFF;", + "BGR888" => $get_rgba_string_ignore_alpha{"BGR888"} . " _A = 0xFF;", + "ARGB8888" => $get_rgba_string_ignore_alpha{"ARGB8888"} . " _A = (Uint8)(_pixel >> 24);", + "RGBA8888" => $get_rgba_string_ignore_alpha{"RGBA8888"} . " _A = (Uint8)_pixel;", + "ABGR8888" => $get_rgba_string_ignore_alpha{"ABGR8888"} . " _A = (Uint8)(_pixel >> 24);", + "BGRA8888" => $get_rgba_string_ignore_alpha{"BGRA8888"} . " _A = (Uint8)_pixel;", +); + +my %set_rgba_string = ( + "RGB888" => "_pixel = ((Uint32)_R << 16) | ((Uint32)_G << 8) | _B;", + "BGR888" => "_pixel = ((Uint32)_B << 16) | ((Uint32)_G << 8) | _R;", + "ARGB8888" => "_pixel = ((Uint32)_A << 24) | ((Uint32)_R << 16) | ((Uint32)_G << 8) | _B;", + "RGBA8888" => "_pixel = ((Uint32)_R << 24) | ((Uint32)_G << 16) | ((Uint32)_B << 8) | _A;", + "ABGR8888" => "_pixel = ((Uint32)_A << 24) | ((Uint32)_B << 16) | ((Uint32)_G << 8) | _R;", + "BGRA8888" => "_pixel = ((Uint32)_B << 24) | ((Uint32)_G << 16) | ((Uint32)_R << 8) | _A;", +); + +sub open_file { + my $name = shift; + open(FILE, ">$name.new") || die "Cant' open $name.new: $!"; + print FILE <<__EOF__; +/* DO NOT EDIT! This file is generated by sdlgenblit.pl */ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2018 Sam Lantinga <slouken\@libsdl.org> + + 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 "../SDL_internal.h" + +/* *INDENT-OFF* */ + +__EOF__ +} + +sub close_file { + my $name = shift; + print FILE <<__EOF__; +/* *INDENT-ON* */ + +/* vi: set ts=4 sw=4 expandtab: */ +__EOF__ + close FILE; + if ( ! -f $name || system("cmp -s $name $name.new") != 0 ) { + rename("$name.new", "$name"); + } else { + unlink("$name.new"); + } +} + +sub output_copydefs +{ + print FILE <<__EOF__; +extern SDL_BlitFuncEntry SDL_GeneratedBlitFuncTable[]; +__EOF__ +} + +sub output_copyfuncname +{ + my $prefix = shift; + my $src = shift; + my $dst = shift; + my $modulate = shift; + my $blend = shift; + my $scale = shift; + my $args = shift; + my $suffix = shift; + + print FILE "$prefix SDL_Blit_${src}_${dst}"; + if ( $modulate ) { + print FILE "_Modulate"; + } + if ( $blend ) { + print FILE "_Blend"; + } + if ( $scale ) { + print FILE "_Scale"; + } + if ( $args ) { + print FILE "(SDL_BlitInfo *info)"; + } + print FILE "$suffix"; +} + +sub get_rgba +{ + my $prefix = shift; + my $format = shift; + my $ignore_alpha = shift; + + my $string; + if ($ignore_alpha) { + $string = $get_rgba_string_ignore_alpha{$format}; + } else { + $string = $get_rgba_string{$format}; + } + + $string =~ s/_/$prefix/g; + if ( $prefix ne "" ) { + print FILE <<__EOF__; + ${prefix}pixel = *$prefix; +__EOF__ + } else { + print FILE <<__EOF__; + pixel = *src; +__EOF__ + } + print FILE <<__EOF__; + $string +__EOF__ +} + +sub set_rgba +{ + my $prefix = shift; + my $format = shift; + my $string = $set_rgba_string{$format}; + $string =~ s/_/$prefix/g; + print FILE <<__EOF__; + $string + *dst = ${prefix}pixel; +__EOF__ +} + +sub output_copycore +{ + my $src = shift; + my $dst = shift; + my $modulate = shift; + my $blend = shift; + my $s = ""; + my $d = ""; + + # Nice and easy... + if ( $src eq $dst && !$modulate && !$blend ) { + print FILE <<__EOF__; + *dst = *src; +__EOF__ + return; + } + + my $dst_has_alpha = ($dst =~ /A/) ? 1 : 0; + my $ignore_dst_alpha = !$dst_has_alpha && !$blend; + + if ( $blend ) { + get_rgba("src", $src, $ignore_dst_alpha); + get_rgba("dst", $dst, !$dst_has_alpha); + $s = "src"; + $d = "dst"; + } else { + get_rgba("", $src, $ignore_dst_alpha); + } + + if ( $modulate ) { + print FILE <<__EOF__; + if (flags & SDL_COPY_MODULATE_COLOR) { + ${s}R = (${s}R * modulateR) / 255; + ${s}G = (${s}G * modulateG) / 255; + ${s}B = (${s}B * modulateB) / 255; + } +__EOF__ + if (not $ignore_dst_alpha) { + print FILE <<__EOF__; + if (flags & SDL_COPY_MODULATE_ALPHA) { + ${s}A = (${s}A * modulateA) / 255; + } +__EOF__ + } + } + if ( $blend ) { + print FILE <<__EOF__; + if (flags & (SDL_COPY_BLEND|SDL_COPY_ADD)) { + /* This goes away if we ever use premultiplied alpha */ + if (${s}A < 255) { + ${s}R = (${s}R * ${s}A) / 255; + ${s}G = (${s}G * ${s}A) / 255; + ${s}B = (${s}B * ${s}A) / 255; + } + } + switch (flags & (SDL_COPY_BLEND|SDL_COPY_ADD|SDL_COPY_MOD)) { + case SDL_COPY_BLEND: + ${d}R = ${s}R + ((255 - ${s}A) * ${d}R) / 255; + ${d}G = ${s}G + ((255 - ${s}A) * ${d}G) / 255; + ${d}B = ${s}B + ((255 - ${s}A) * ${d}B) / 255; +__EOF__ + + if ( $dst_has_alpha ) { + print FILE <<__EOF__; + ${d}A = ${s}A + ((255 - ${s}A) * ${d}A) / 255; +__EOF__ + } + + print FILE <<__EOF__; + break; + case SDL_COPY_ADD: + ${d}R = ${s}R + ${d}R; if (${d}R > 255) ${d}R = 255; + ${d}G = ${s}G + ${d}G; if (${d}G > 255) ${d}G = 255; + ${d}B = ${s}B + ${d}B; if (${d}B > 255) ${d}B = 255; + break; + case SDL_COPY_MOD: + ${d}R = (${s}R * ${d}R) / 255; + ${d}G = (${s}G * ${d}G) / 255; + ${d}B = (${s}B * ${d}B) / 255; + break; + } +__EOF__ + } + if ( $blend ) { + set_rgba("dst", $dst); + } else { + set_rgba("", $dst); + } +} + +sub output_copyfunc +{ + my $src = shift; + my $dst = shift; + my $modulate = shift; + my $blend = shift; + my $scale = shift; + + my $dst_has_alpha = ($dst =~ /A/) ? 1 : 0; + my $ignore_dst_alpha = !$dst_has_alpha && !$blend; + + output_copyfuncname("static void", $src, $dst, $modulate, $blend, $scale, 1, "\n"); + print FILE <<__EOF__; +{ +__EOF__ + if ( $modulate || $blend ) { + print FILE <<__EOF__; + const int flags = info->flags; +__EOF__ + } + if ( $modulate ) { + print FILE <<__EOF__; + const Uint32 modulateR = info->r; + const Uint32 modulateG = info->g; + const Uint32 modulateB = info->b; +__EOF__ + if (!$ignore_dst_alpha) { + print FILE <<__EOF__; + const Uint32 modulateA = info->a; +__EOF__ + } + } + if ( $blend ) { + print FILE <<__EOF__; + Uint32 srcpixel; + Uint32 srcR, srcG, srcB, srcA; + Uint32 dstpixel; +__EOF__ + if ($dst_has_alpha) { + print FILE <<__EOF__; + Uint32 dstR, dstG, dstB, dstA; +__EOF__ + } else { + print FILE <<__EOF__; + Uint32 dstR, dstG, dstB; +__EOF__ + } + } elsif ( $modulate || $src ne $dst ) { + print FILE <<__EOF__; + Uint32 pixel; +__EOF__ + if (!$ignore_dst_alpha) { + print FILE <<__EOF__; + Uint32 R, G, B, A; +__EOF__ + } else { + print FILE <<__EOF__; + Uint32 R, G, B; +__EOF__ + } + } + if ( $scale ) { + print FILE <<__EOF__; + int srcy, srcx; + int posy, posx; + int incy, incx; +__EOF__ + + print FILE <<__EOF__; + + srcy = 0; + posy = 0; + incy = (info->src_h << 16) / info->dst_h; + incx = (info->src_w << 16) / info->dst_w; + + while (info->dst_h--) { + $format_type{$src} *src = 0; + $format_type{$dst} *dst = ($format_type{$dst} *)info->dst; + int n = info->dst_w; + srcx = -1; + posx = 0x10000L; + while (posy >= 0x10000L) { + ++srcy; + posy -= 0x10000L; + } + while (n--) { + if (posx >= 0x10000L) { + while (posx >= 0x10000L) { + ++srcx; + posx -= 0x10000L; + } + src = ($format_type{$src} *)(info->src + (srcy * info->src_pitch) + (srcx * $format_size{$src})); +__EOF__ + print FILE <<__EOF__; + } +__EOF__ + output_copycore($src, $dst, $modulate, $blend); + print FILE <<__EOF__; + posx += incx; + ++dst; + } + posy += incy; + info->dst += info->dst_pitch; + } +__EOF__ + } else { + print FILE <<__EOF__; + + while (info->dst_h--) { + $format_type{$src} *src = ($format_type{$src} *)info->src; + $format_type{$dst} *dst = ($format_type{$dst} *)info->dst; + int n = info->dst_w; + while (n--) { +__EOF__ + output_copycore($src, $dst, $modulate, $blend); + print FILE <<__EOF__; + ++src; + ++dst; + } + info->src += info->src_pitch; + info->dst += info->dst_pitch; + } +__EOF__ + } + print FILE <<__EOF__; +} + +__EOF__ +} + +sub output_copyfunc_h +{ +} + +sub output_copyinc +{ + print FILE <<__EOF__; +#include "SDL_video.h" +#include "SDL_blit.h" +#include "SDL_blit_auto.h" + +__EOF__ +} + +sub output_copyfunctable +{ + print FILE <<__EOF__; +SDL_BlitFuncEntry SDL_GeneratedBlitFuncTable[] = { +__EOF__ + for (my $i = 0; $i <= $#src_formats; ++$i) { + my $src = $src_formats[$i]; + for (my $j = 0; $j <= $#dst_formats; ++$j) { + my $dst = $dst_formats[$j]; + for (my $modulate = 0; $modulate <= 1; ++$modulate) { + for (my $blend = 0; $blend <= 1; ++$blend) { + for (my $scale = 0; $scale <= 1; ++$scale) { + if ( $modulate || $blend || $scale ) { + print FILE " { SDL_PIXELFORMAT_$src, SDL_PIXELFORMAT_$dst, "; + my $flags = ""; + my $flag = ""; + if ( $modulate ) { + $flag = "SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA"; + if ( $flags eq "" ) { + $flags = $flag; + } else { + $flags = "$flags | $flag"; + } + } + if ( $blend ) { + $flag = "SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD"; + if ( $flags eq "" ) { + $flags = $flag; + } else { + $flags = "$flags | $flag"; + } + } + if ( $scale ) { + $flag = "SDL_COPY_NEAREST"; + if ( $flags eq "" ) { + $flags = $flag; + } else { + $flags = "$flags | $flag"; + } + } + if ( $flags eq "" ) { + $flags = "0"; + } + print FILE "($flags), SDL_CPU_ANY,"; + output_copyfuncname("", $src_formats[$i], $dst_formats[$j], $modulate, $blend, $scale, 0, " },\n"); + } + } + } + } + } + } + print FILE <<__EOF__; + { 0, 0, 0, 0, NULL } +}; + +__EOF__ +} + +sub output_copyfunc_c +{ + my $src = shift; + my $dst = shift; + + for (my $modulate = 0; $modulate <= 1; ++$modulate) { + for (my $blend = 0; $blend <= 1; ++$blend) { + for (my $scale = 0; $scale <= 1; ++$scale) { + if ( $modulate || $blend || $scale ) { + output_copyfunc($src, $dst, $modulate, $blend, $scale); + } + } + } + } +} + +open_file("SDL_blit_auto.h"); +output_copydefs(); +for (my $i = 0; $i <= $#src_formats; ++$i) { + for (my $j = 0; $j <= $#dst_formats; ++$j) { + output_copyfunc_h($src_formats[$i], $dst_formats[$j]); + } +} +print FILE "\n"; +close_file("SDL_blit_auto.h"); + +open_file("SDL_blit_auto.c"); +output_copyinc(); +for (my $i = 0; $i <= $#src_formats; ++$i) { + for (my $j = 0; $j <= $#dst_formats; ++$j) { + output_copyfunc_c($src_formats[$i], $dst_formats[$j]); + } +} +output_copyfunctable(); +close_file("SDL_blit_auto.c"); |