Path: blob/master/libmupen64plus/mupen64plus-video-glide64mk2/src/Glide64/TexMod.h
2 views
/*1* Glide64 - Glide video plugin for Nintendo 64 emulators.2* Copyright (c) 2002 Dave20013* Copyright (c) 2003-2009 Sergey 'Gonetz' Lipski4*5* This program is free software; you can redistribute it and/or modify6* it under the terms of the GNU General Public License as published by7* the Free Software Foundation; either version 2 of the License, or8* any later version.9*10* This program is distributed in the hope that it will be useful,11* but WITHOUT ANY WARRANTY; without even the implied warranty of12* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the13* GNU General Public License for more details.14*15* You should have received a copy of the GNU General Public License16* along with this program; if not, write to the Free Software17* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA18*/1920//****************************************************************21//22// Glide64 - Glide Plugin for Nintendo 64 emulators23// Project started on December 29th, 200124//25// Authors:26// Dave2001, original author, founded the project in 2001, left it in 200227// Gugaman, joined the project in 2002, left it in 200228// Sergey 'Gonetz' Lipski, joined the project in 2002, main author since fall of 200229// Hiroshi 'KoolSmoky' Morii, joined the project in 200730//31//****************************************************************32//33// To modify Glide64:34// * Write your name and (optional)email, commented by your work, so I know who did it, and so that you can find which parts you modified when it comes time to send it to me.35// * Do NOT send me the whole project or file that you modified. Take out your modified code sections, and tell me where to put them. If people sent the whole thing, I would have many different versions, but no idea how to combine them all.36//37//****************************************************************3839static void mod_tex_inter_color_using_factor (wxUint16 *dst, int size, wxUint32 color, wxUint32 factor)40{41float percent = factor / 255.0f;42float percent_i = 1 - percent;43wxUint32 cr, cg, cb;44wxUint16 col, a;45wxUint8 r, g, b;4647cr = (color >> 12) & 0xF;48cg = (color >> 8) & 0xF;49cb = (color >> 4) & 0xF;5051for (int i=0; i<size; i++)52{53col = *dst;54a = col & 0xF000;55r = (wxUint8)(percent_i * ((col >> 8) & 0xF) + percent * cr);56g = (wxUint8)(percent_i * ((col >> 4) & 0xF) + percent * cg);57b = (wxUint8)(percent_i * (col & 0xF) + percent * cb);58*(dst++) = a | (r << 8) | (g << 4) | b;59}60}6162static void mod_tex_inter_col_using_col1 (wxUint16 *dst, int size, wxUint32 color0, wxUint32 color1)63{64wxUint32 cr, cg, cb;65wxUint16 col, a;66wxUint8 r, g, b;6768float percent_r = ((color1 >> 12) & 0xF) / 15.0f;69float percent_g = ((color1 >> 8) & 0xF) / 15.0f;70float percent_b = ((color1 >> 4) & 0xF) / 15.0f;71float percent_r_i = 1.0f - percent_r;72float percent_g_i = 1.0f - percent_g;73float percent_b_i = 1.0f - percent_b;7475cr = (color0 >> 12) & 0xF;76cg = (color0 >> 8) & 0xF;77cb = (color0 >> 4) & 0xF;7879for (int i=0; i<size; i++)80{81col = *dst;82a = col & 0xF000;83r = (wxUint8)(percent_r_i * ((col >> 8) & 0xF) + percent_r * cr);84g = (wxUint8)(percent_g_i * ((col >> 4) & 0xF) + percent_g * cg);85b = (wxUint8)(percent_b_i * (col & 0xF) + percent_b * cb);86*(dst++) = a | (r << 8) | (g << 4) | b;87}88}8990static void mod_full_color_sub_tex (wxUint16 *dst, int size, wxUint32 color)91{92wxUint32 cr, cg, cb, ca;93wxUint16 col;94wxUint8 a, r, g, b;9596cr = (color >> 12) & 0xF;97cg = (color >> 8) & 0xF;98cb = (color >> 4) & 0xF;99ca = color & 0xF;100101for (int i=0; i<size; i++)102{103col = *dst;104a = (wxUint8)(ca - ((col >> 12) & 0xF));105r = (wxUint8)(cr - ((col >> 8) & 0xF));106g = (wxUint8)(cg - ((col >> 4) & 0xF));107b = (wxUint8)(cb - (col & 0xF));108*(dst++) = (a << 12) | (r << 8) | (g << 4) | b;109}110}111112static void mod_col_inter_col1_using_tex (wxUint16 *dst, int size, wxUint32 color0, wxUint32 color1)113{114wxUint32 cr0, cg0, cb0, cr1, cg1, cb1;115wxUint16 col;116wxUint8 r, g, b;117wxUint16 a;118float percent_r, percent_g, percent_b;119120cr0 = (color0 >> 12) & 0xF;121cg0 = (color0 >> 8) & 0xF;122cb0 = (color0 >> 4) & 0xF;123cr1 = (color1 >> 12) & 0xF;124cg1 = (color1 >> 8) & 0xF;125cb1 = (color1 >> 4) & 0xF;126127for (int i=0; i<size; i++)128{129col = *dst;130a = col & 0xF000;131percent_r = ((col >> 8) & 0xF) / 15.0f;132percent_g = ((col >> 4) & 0xF) / 15.0f;133percent_b = (col & 0xF) / 15.0f;134r = min(15, (wxUint8)((1.0f-percent_r) * cr0 + percent_r * cr1 + 0.0001f));135g = min(15, (wxUint8)((1.0f-percent_g) * cg0 + percent_g * cg1 + 0.0001f));136b = min(15, (wxUint8)((1.0f-percent_b) * cb0 + percent_b * cb1 + 0.0001f));137*(dst++) = a | (r << 8) | (g << 4) | b;138}139}140141static void mod_col_inter_col1_using_texa (wxUint16 *dst, int size, wxUint32 color0, wxUint32 color1)142{143wxUint32 cr0, cg0, cb0, cr1, cg1, cb1;144wxUint16 col;145wxUint8 r, g, b;146wxUint16 a;147float percent, percent_i;148149cr0 = (color0 >> 12) & 0xF;150cg0 = (color0 >> 8) & 0xF;151cb0 = (color0 >> 4) & 0xF;152cr1 = (color1 >> 12) & 0xF;153cg1 = (color1 >> 8) & 0xF;154cb1 = (color1 >> 4) & 0xF;155156for (int i=0; i<size; i++)157{158col = *dst;159a = col & 0xF000;160percent = (a >> 12) / 15.0f;161percent_i = 1.0f - percent;162r = (wxUint8)(percent_i * cr0 + percent * cr1);163g = (wxUint8)(percent_i * cg0 + percent * cg1);164b = (wxUint8)(percent_i * cb0 + percent * cb1);165*(dst++) = a | (r << 8) | (g << 4) | b;166}167}168169static void mod_col_inter_col1_using_texa__mul_tex (wxUint16 *dst, int size, wxUint32 color0, wxUint32 color1)170{171wxUint32 cr0, cg0, cb0, cr1, cg1, cb1;172wxUint16 col;173wxUint8 r, g, b;174wxUint16 a;175float percent, percent_i;176177cr0 = (color0 >> 12) & 0xF;178cg0 = (color0 >> 8) & 0xF;179cb0 = (color0 >> 4) & 0xF;180cr1 = (color1 >> 12) & 0xF;181cg1 = (color1 >> 8) & 0xF;182cb1 = (color1 >> 4) & 0xF;183184for (int i=0; i<size; i++)185{186col = *dst;187a = col & 0xF000;188percent = (a >> 12) / 15.0f;189percent_i = 1.0f - percent;190r = (wxUint8)(((percent_i * cr0 + percent * cr1) / 15.0f) * (((col & 0x0F00) >> 8) / 15.0f) * 15.0f);191g = (wxUint8)(((percent_i * cg0 + percent * cg1) / 15.0f) * (((col & 0x00F0) >> 4) / 15.0f) * 15.0f);192b = (wxUint8)(((percent_i * cb0 + percent * cb1) / 15.0f) * ((col & 0x000F) / 15.0f) * 15.0f);193*(dst++) = a | (r << 8) | (g << 4) | b;194}195}196197static void mod_col_inter_tex_using_tex (wxUint16 *dst, int size, wxUint32 color)198{199wxUint32 cr, cg, cb;200wxUint16 col;201wxUint8 r, g, b;202wxUint16 a;203float percent_r, percent_g, percent_b;204205cr = (color >> 12) & 0xF;206cg = (color >> 8) & 0xF;207cb = (color >> 4) & 0xF;208209for (int i=0; i<size; i++)210{211col = *dst;212a = col & 0xF000;213percent_r = ((col >> 8) & 0xF) / 15.0f;214percent_g = ((col >> 4) & 0xF) / 15.0f;215percent_b = (col & 0xF) / 15.0f;216r = (wxUint8)((1.0f-percent_r) * cr + percent_r * ((col & 0x0F00) >> 8));217g = (wxUint8)((1.0f-percent_g) * cg + percent_g * ((col & 0x00F0) >> 4));218b = (wxUint8)((1.0f-percent_b) * cb + percent_b * (col & 0x000F));219*(dst++) = a | (r << 8) | (g << 4) | b;220}221}222223static void mod_col_inter_tex_using_texa (wxUint16 *dst, int size, wxUint32 color)224{225wxUint32 cr, cg, cb;226wxUint16 col;227wxUint8 r, g, b;228wxUint16 a;229float percent, percent_i;230231cr = (color >> 12) & 0xF;232cg = (color >> 8) & 0xF;233cb = (color >> 4) & 0xF;234235for (int i=0; i<size; i++)236{237col = *dst;238a = col & 0xF000;239percent = (a >> 12) / 15.0f;240percent_i = 1.0f - percent;241r = (wxUint8)(percent_i * cr + percent * ((col & 0x0F00) >> 8));242g = (wxUint8)(percent_i * cg + percent * ((col & 0x00F0) >> 4));243b = (wxUint8)(percent_i * cb + percent * (col & 0x000F));244*(dst++) = a | (r << 8) | (g << 4) | b;245}246}247248static void mod_col2_inter__col_inter_col1_using_tex__using_texa (wxUint16 *dst, int size,249wxUint32 color0, wxUint32 color1,250wxUint32 color2)251{252wxUint32 cr0, cg0, cb0, cr1, cg1, cb1, cr2, cg2, cb2;253wxUint16 col;254wxUint8 r, g, b;255wxUint16 a;256float percent_r, percent_g, percent_b, percent_a;257258cr0 = (color0 >> 12) & 0xF;259cg0 = (color0 >> 8) & 0xF;260cb0 = (color0 >> 4) & 0xF;261cr1 = (color1 >> 12) & 0xF;262cg1 = (color1 >> 8) & 0xF;263cb1 = (color1 >> 4) & 0xF;264cr2 = (color2 >> 12) & 0xF;265cg2 = (color2 >> 8) & 0xF;266cb2 = (color2 >> 4) & 0xF;267268for (int i=0; i<size; i++)269{270col = *dst;271a = col & 0xF000;272percent_a = (a >> 12) / 15.0f;273percent_r = ((col >> 8) & 0xF) / 15.0f;274percent_g = ((col >> 4) & 0xF) / 15.0f;275percent_b = (col & 0xF) / 15.0f;276r = (wxUint8)(((1.0f-percent_r) * cr0 + percent_r * cr1) * percent_a + cr2 * (1.0f-percent_a));277g = (wxUint8)(((1.0f-percent_g) * cg0 + percent_g * cg1) * percent_a + cg2 * (1.0f-percent_a));278b = (wxUint8)(((1.0f-percent_b) * cb0 + percent_b * cb1) * percent_a + cb2 * (1.0f-percent_a));279*(dst++) = a | (r << 8) | (g << 4) | b;280}281}282283static void mod_tex_scale_fac_add_fac (wxUint16 *dst, int size, wxUint32 factor)284{285float percent = factor / 255.0f;286wxUint16 col;287wxUint8 a;288float base_a = (1.0f - percent) * 15.0f;289290for (int i=0; i<size; i++)291{292col = *dst;293a = (wxUint8)(base_a + percent * (col>>12));294*(dst++) = (a<<12) | (col & 0x0FFF);295}296}297298static void mod_tex_sub_col_mul_fac_add_tex (wxUint16 *dst, int size, wxUint32 color, wxUint32 factor)299{300float percent = factor / 255.0f;301wxUint32 cr, cg, cb;302wxUint16 col, a;303float r, g, b;304305cr = (color >> 12) & 0xF;306cg = (color >> 8) & 0xF;307cb = (color >> 4) & 0xF;308309for (int i=0; i<size; i++)310{311col = *dst;312a = col & 0xF000;313r = (float)((col >> 8) & 0xF);314r = /*max(*/(r - cr) * percent/*, 0.0f)*/ + r;315if (r > 15.0f) r = 15.0f;316if (r < 0.0f) r = 0.0f;317g = (float)((col >> 4) & 0xF);318g = /*max(*/(g - cg) * percent/*, 0.0f)*/ + g;319if (g > 15.0f) g = 15.0f;320if (g < 0.0f) g = 0.0f;321b = (float)(col & 0xF);322b = /*max(*/(b - cb) * percent/*, 0.0f)*/ + b;323if (b > 15.0f) b = 15.0f;324if (b < 0.0f) b = 0.0f;325326*(dst++) = a | ((wxUint16)r << 8) | ((wxUint16)g << 4) | (wxUint16)b;327}328}329330static void mod_tex_scale_col_add_col (wxUint16 *dst, int size, wxUint32 color0, wxUint32 color1)331{332wxUint32 cr0, cg0, cb0, cr1, cg1, cb1;333wxUint16 col;334wxUint8 r, g, b;335wxUint16 a;336float percent_r, percent_g, percent_b;337338cr0 = (color0 >> 12) & 0xF;339cg0 = (color0 >> 8) & 0xF;340cb0 = (color0 >> 4) & 0xF;341cr1 = (color1 >> 12) & 0xF;342cg1 = (color1 >> 8) & 0xF;343cb1 = (color1 >> 4) & 0xF;344345for (int i=0; i<size; i++)346{347col = *dst;348a = col & 0xF000;349percent_r = ((col >> 8) & 0xF) / 15.0f;350percent_g = ((col >> 4) & 0xF) / 15.0f;351percent_b = (col & 0xF) / 15.0f;352r = min(15, (wxUint8)(percent_r * cr0 + cr1 + 0.0001f));353g = min(15, (wxUint8)(percent_g * cg0 + cg1 + 0.0001f));354b = min(15, (wxUint8)(percent_b * cb0 + cb1 + 0.0001f));355*(dst++) = a | (r << 8) | (g << 4) | b;356}357}358359static void mod_tex_add_col (wxUint16 *dst, int size, wxUint32 color)360{361wxUint32 cr, cg, cb;362wxUint16 col;363wxUint8 a, r, g, b;364365cr = (color >> 12) & 0xF;366cg = (color >> 8) & 0xF;367cb = (color >> 4) & 0xF;368369for (int i=0; i<size; i++)370{371col = *dst;372a = (wxUint8)((col >> 12) & 0xF);373// a = col & 0xF000;374r = (wxUint8)(cr + ((col >> 8) & 0xF))&0xF;375g = (wxUint8)(cg + ((col >> 4) & 0xF))&0xF;376b = (wxUint8)(cb + (col & 0xF))&0xF;377*(dst++) = (a << 12) | (r << 8) | (g << 4) | b;378}379}380381static void mod_col_mul_texa_add_tex (wxUint16 *dst, int size, wxUint32 color)382{383wxUint32 cr, cg, cb;384wxUint16 col;385wxUint8 r, g, b;386wxUint16 a;387float factor;388389cr = (color >> 12) & 0xF;390cg = (color >> 8) & 0xF;391cb = (color >> 4) & 0xF;392393for (int i=0; i<size; i++)394{395col = *dst;396a = col & 0xF000;397factor = (a >> 12) / 15.0f;398r = (wxUint8)(cr*factor + ((col >> 8) & 0xF))&0xF;399g = (wxUint8)(cg*factor + ((col >> 4) & 0xF))&0xF;400b = (wxUint8)(cb*factor + (col & 0xF))&0xF;401*(dst++) = a | (r << 8) | (g << 4) | b;402}403}404405static void mod_tex_sub_col (wxUint16 *dst, int size, wxUint32 color)406{407int cr, cg, cb;408wxUint16 col;409wxUint8 a, r, g, b;410411cr = (color >> 12) & 0xF;412cg = (color >> 8) & 0xF;413cb = (color >> 4) & 0xF;414415for (int i=0; i<size; i++)416{417col = *dst;418a = (wxUint8)(col & 0xF000);419r = (wxUint8)max((((col >> 8) & 0xF) - cr), 0);420g = (wxUint8)max((((col >> 4) & 0xF) - cg), 0);421b = (wxUint8)max(((col & 0xF) - cb), 0);422*(dst++) = (a << 12) | (r << 8) | (g << 4) | b;423}424}425426static void mod_tex_sub_col_mul_fac (wxUint16 *dst, int size, wxUint32 color, wxUint32 factor)427{428float percent = factor / 255.0f;429wxUint32 cr, cg, cb;430wxUint16 col, a;431float r, g, b;432433cr = (color >> 12) & 0xF;434cg = (color >> 8) & 0xF;435cb = (color >> 4) & 0xF;436437for (int i=0; i<size; i++)438{439col = *dst;440a = (wxUint8)((col >> 12) & 0xF);441r = (float)((col >> 8) & 0xF);442r = (r - cr) * percent;443if (r > 15.0f) r = 15.0f;444if (r < 0.0f) r = 0.0f;445g = (float)((col >> 4) & 0xF);446g = (g - cg) * percent;447if (g > 15.0f) g = 15.0f;448if (g < 0.0f) g = 0.0f;449b = (float)(col & 0xF);450b = (b - cb) * percent;451if (b > 15.0f) b = 15.0f;452if (b < 0.0f) b = 0.0f;453454*(dst++) = (a << 12) | ((wxUint16)r << 8) | ((wxUint16)g << 4) | (wxUint16)b;455}456}457458static void mod_col_inter_tex_using_col1 (wxUint16 *dst, int size, wxUint32 color0, wxUint32 color1)459{460wxUint32 cr, cg, cb;461wxUint16 col, a;462wxUint8 r, g, b;463464float percent_r = ((color1 >> 12) & 0xF) / 15.0f;465float percent_g = ((color1 >> 8) & 0xF) / 15.0f;466float percent_b = ((color1 >> 4) & 0xF) / 15.0f;467float percent_r_i = 1.0f - percent_r;468float percent_g_i = 1.0f - percent_g;469float percent_b_i = 1.0f - percent_b;470471cr = (color0 >> 12) & 0xF;472cg = (color0 >> 8) & 0xF;473cb = (color0 >> 4) & 0xF;474475for (int i=0; i<size; i++)476{477col = *dst;478a = (wxUint8)((col >> 12) & 0xF);479r = (wxUint8)(percent_r * ((col >> 8) & 0xF) + percent_r_i * cr);480g = (wxUint8)(percent_g * ((col >> 4) & 0xF) + percent_g_i * cg);481b = (wxUint8)(percent_b * (col & 0xF) + percent_b_i * cb);482*(dst++) = (a << 12) | (r << 8) | (g << 4) | b;483}484}485486static void mod_tex_inter_noise_using_col (wxUint16 *dst, int size, wxUint32 color)487{488wxUint16 col, a;489wxUint8 r, g, b, noise;490491float percent_r = ((color >> 12) & 0xF) / 15.0f;492float percent_g = ((color >> 8) & 0xF) / 15.0f;493float percent_b = ((color >> 4) & 0xF) / 15.0f;494float percent_r_i = 1.0f - percent_r;495float percent_g_i = 1.0f - percent_g;496float percent_b_i = 1.0f - percent_b;497498for (int i=0; i<size; i++)499{500col = *dst;501a = col & 0xF000;502noise = rand()%16;503r = (wxUint8)(percent_r_i * ((col >> 8) & 0xF) + percent_r * noise);504g = (wxUint8)(percent_g_i * ((col >> 4) & 0xF) + percent_g * noise);505b = (wxUint8)(percent_b_i * (col & 0xF) + percent_b * noise);506*(dst++) = a | (r << 8) | (g << 4) | b;507}508}509510static void mod_tex_inter_col_using_texa (wxUint16 *dst, int size, wxUint32 color)511{512wxUint32 cr, cg, cb;513wxUint16 col;514wxUint8 r, g, b;515wxUint16 a;516float percent, percent_i;517518cr = (color >> 12) & 0xF;519cg = (color >> 8) & 0xF;520cb = (color >> 4) & 0xF;521522for (int i=0; i<size; i++)523{524col = *dst;525a = col & 0xF000;526percent = (a >> 12) / 15.0f;527percent_i = 1.0f - percent;528r = (wxUint8)(percent * cr + percent_i * ((col & 0x0F00) >> 8));529g = (wxUint8)(percent * cg + percent_i * ((col & 0x00F0) >> 4));530b = (wxUint8)(percent * cb + percent_i * (col & 0x000F));531*(dst++) = a | (r << 8) | (g << 4) | b;532}533}534535static void mod_tex_mul_col (wxUint16 *dst, int size, wxUint32 color)536{537float cr, cg, cb;538wxUint16 col;539wxUint8 r, g, b;540wxUint16 a;541542cr = (float)((color >> 12) & 0xF)/16.0f;543cg = (float)((color >> 8) & 0xF)/16.0f;544cb = (float)((color >> 4) & 0xF)/16.0f;545546for (int i=0; i<size; i++)547{548col = *dst;549a = col & 0xF000;550r = (wxUint8)(cr * ((col & 0x0F00) >> 8));551g = (wxUint8)(cg * ((col & 0x00F0) >> 4));552b = (wxUint8)(cb * (col & 0x000F));553*(dst++) = a | (r << 8) | (g << 4) | b;554}555}556557static void mod_tex_scale_fac_add_col (wxUint16 *dst, int size, wxUint32 color, wxUint32 factor)558{559float percent = factor / 255.0f;560wxUint32 cr, cg, cb;561wxUint16 col;562float r, g, b;563564cr = (color >> 12) & 0xF;565cg = (color >> 8) & 0xF;566cb = (color >> 4) & 0xF;567568for (int i=0; i<size; i++)569{570col = *dst;571r = cr + percent * (float)((col>>8)&0xF);572g = cg + percent * (float)((col>>4)&0xF);573b = cb + percent * (float)(col&0xF);574*(dst++) = (col&0xF000) | ((wxUint8)r << 8) | ((wxUint8)g << 4) | (wxUint8)b;575}576}577578579