/* * This file is part of the Advance project. * * Copyright (C) 2003 Andrea Mazzoleni * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * In addition, as a special exception, Andrea Mazzoleni * gives permission to link the code of this program with * the MAME library (or with modified versions of MAME that use the * same license as MAME), and distribute linked combinations including * the two. You must obey the GNU General Public License in all * respects for all of the code used other than MAME. If you modify * this file, you may extend this exception to your version of the * file, but you are not obligated to do so. If you do not wish to * do so, delete this exception statement from your version. */ #ifdef HAVE_CONFIG_H #include #endif #include "SDL.h" #include "../screen.h" #include "../video.h" #include "hqx_common.h" #include "hq3x.h" /***************************************************************************/ /* HQ3x C implementation */ /* * This effect is a rewritten implementation of the hq3x effect made by Maxim Stepin */ static Uint16 *dst0, *dst1, *dst2, *src0, *src1, *src2; static Uint16 height; #ifdef I386_ASM void hq3x_16_i386(Uint8*, Uint8*, int, int, int); #endif SDL_bool effect_hq3x_init(void) { #ifdef I386_ASM /* init LUT & RGB2YUV table*/ InitLUTs(); tmps= SDL_CreateRGBSurface(SDL_SWSURFACE,visible_area.w, visible_area.h, 16, 0xF800, 0x7E0, 0x1F, 0); #endif return SDL_TRUE; } #ifndef I386_ASM void hq3x_16_def(Uint16 *dst0, Uint16 *dst1, Uint16 *dst2, Uint16 *src0, Uint16 *src1, Uint16 *src2, unsigned count) { unsigned i; for(i=0;i0) { c[0] = src0[-1]; c[3] = src1[-1]; c[6] = src2[-1]; } else { c[0] = c[1]; c[3] = c[4]; c[6] = c[7]; } if (ipixels + yscreenpadding; dst1 = (Uint16 *)dst0 + visible_area.w*3; dst2 = (Uint16 *)dst1 + visible_area.w*3; src1 = (Uint16 *)buffer->pixels + 352 * visible_area.y + visible_area.x; src0 = (Uint16 *)src1 - 352; src2 = (Uint16 *)src1 + 352; while(height--) { hq3x_16_def(dst0, dst1, dst2, src0, src1, src2, visible_area.w); dst0 += (visible_area.w*9); dst1 += (visible_area.w*9); dst2 += (visible_area.w*9); src0 += 352; src1 += 352; src2 += 352; } } #else void effect_hq3x_update(void) { SDL_BlitSurface(buffer, &visible_area, tmps, &tmps_rect); dst0 = (Uint16 *)screen->pixels + yscreenpadding; src0 = (Uint16 *)tmps->pixels; //src0 = (Uint16 *)buffer->pixels + 352 * visible_area.y + visible_area.x; hq3x_16_i386((Uint8*)src0, (Uint8*)dst0, visible_area.w, visible_area.h, visible_area.w*6); } #endif