Path: blob/master/libmupen64plus/mupen64plus-video-glide64/src/TexMod.h
2 views
/*1* Glide64 - Glide video plugin for Nintendo 64 emulators.2* Copyright (c) 2002 Dave20013*4* This program is free software; you can redistribute it and/or modify5* it under the terms of the GNU General Public License as published by6* the Free Software Foundation; either version 2 of the License, or7* any later version.8*9* This program is distributed in the hope that it will be useful,10* but WITHOUT ANY WARRANTY; without even the implied warranty of11* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the12* GNU General Public License for more details.13*14* You should have received a copy of the GNU General Public15* License along with this program; if not, write to the Free16* Software Foundation, Inc., 51 Franklin Street, Fifth Floor,17* Boston, MA 02110-1301, USA18*/1920//****************************************************************21//22// Glide64 - Glide Plugin for Nintendo 64 emulators (tested mostly with Project64)23// Project started on December 29th, 200124//25// To modify Glide64:26// * 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.27// * 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.28//29// Official Glide64 development channel: #Glide64 on EFnet30//31// Original author: Dave2001 ([email protected])32// Other authors: Gonetz, Gugaman33//34//****************************************************************3536#ifndef _WIN3237#include <stdlib.h>38#endif3940static void mod_tex_inter_color_using_factor (WORD *dst, int size, DWORD color, DWORD factor)41{42float percent = factor / 255.0f;43float percent_i = 1 - percent;44DWORD cr, cg, cb;45WORD col, a;46BYTE r, g, b;4748cr = (color >> 12) & 0xF;49cg = (color >> 8) & 0xF;50cb = (color >> 4) & 0xF;5152for (int i=0; i<size; i++)53{54col = *dst;55a = col & 0xF000;56r = (BYTE)(percent_i * ((col >> 8) & 0xF) + percent * cr);57g = (BYTE)(percent_i * ((col >> 4) & 0xF) + percent * cg);58b = (BYTE)(percent_i * (col & 0xF) + percent * cb);59*(dst++) = a | (r << 8) | (g << 4) | b;60}61}6263static void mod_tex_inter_col_using_col1 (WORD *dst, int size, DWORD color0, DWORD color1)64{65DWORD cr, cg, cb;66WORD col, a;67BYTE r, g, b;6869float percent_r = ((color1 >> 12) & 0xF) / 15.0f;70float percent_g = ((color1 >> 8) & 0xF) / 15.0f;71float percent_b = ((color1 >> 4) & 0xF) / 15.0f;72float percent_r_i = 1.0f - percent_r;73float percent_g_i = 1.0f - percent_g;74float percent_b_i = 1.0f - percent_b;7576cr = (color0 >> 12) & 0xF;77cg = (color0 >> 8) & 0xF;78cb = (color0 >> 4) & 0xF;7980for (int i=0; i<size; i++)81{82col = *dst;83a = col & 0xF000;84r = (BYTE)(percent_r_i * ((col >> 8) & 0xF) + percent_r * cr);85g = (BYTE)(percent_g_i * ((col >> 4) & 0xF) + percent_g * cg);86b = (BYTE)(percent_b_i * (col & 0xF) + percent_b * cb);87*(dst++) = a | (r << 8) | (g << 4) | b;88}89}9091static void mod_full_color_sub_tex (WORD *dst, int size, DWORD color)92{93DWORD cr, cg, cb, ca;94WORD col;95BYTE a, r, g, b;9697cr = (color >> 12) & 0xF;98cg = (color >> 8) & 0xF;99cb = (color >> 4) & 0xF;100ca = color & 0xF;101102for (int i=0; i<size; i++)103{104col = *dst;105a = (BYTE)(ca - ((col >> 12) & 0xF));106r = (BYTE)(cr - ((col >> 8) & 0xF));107g = (BYTE)(cg - ((col >> 4) & 0xF));108b = (BYTE)(cb - (col & 0xF));109*(dst++) = (a << 12) | (r << 8) | (g << 4) | b;110}111}112113static void mod_col_inter_col1_using_tex (WORD *dst, int size, DWORD color0, DWORD color1)114{115DWORD cr0, cg0, cb0, cr1, cg1, cb1;116WORD col;117BYTE r, g, b;118WORD a;119float percent_r, percent_g, percent_b;120121cr0 = (color0 >> 12) & 0xF;122cg0 = (color0 >> 8) & 0xF;123cb0 = (color0 >> 4) & 0xF;124cr1 = (color1 >> 12) & 0xF;125cg1 = (color1 >> 8) & 0xF;126cb1 = (color1 >> 4) & 0xF;127128for (int i=0; i<size; i++)129{130col = *dst;131a = col & 0xF000;132percent_r = ((col >> 8) & 0xF) / 15.0f;133percent_g = ((col >> 4) & 0xF) / 15.0f;134percent_b = (col & 0xF) / 15.0f;135r = min(15, (BYTE)((1.0f-percent_r) * cr0 + percent_r * cr1));136g = min(15, (BYTE)((1.0f-percent_g) * cg0 + percent_g * cg1));137b = min(15, (BYTE)((1.0f-percent_b) * cb0 + percent_b * cb1));138*(dst++) = a | (r << 8) | (g << 4) | b;139}140}141142static void mod_col_inter_col1_using_texa (WORD *dst, int size, DWORD color0, DWORD color1)143{144DWORD cr0, cg0, cb0, cr1, cg1, cb1;145WORD col;146BYTE r, g, b;147WORD a;148float percent, percent_i;149150cr0 = (color0 >> 12) & 0xF;151cg0 = (color0 >> 8) & 0xF;152cb0 = (color0 >> 4) & 0xF;153cr1 = (color1 >> 12) & 0xF;154cg1 = (color1 >> 8) & 0xF;155cb1 = (color1 >> 4) & 0xF;156157for (int i=0; i<size; i++)158{159col = *dst;160a = col & 0xF000;161percent = (a >> 12) / 15.0f;162percent_i = 1.0f - percent;163r = (BYTE)(percent_i * cr0 + percent * cr1);164g = (BYTE)(percent_i * cg0 + percent * cg1);165b = (BYTE)(percent_i * cb0 + percent * cb1);166*(dst++) = a | (r << 8) | (g << 4) | b;167}168}169170static void mod_col_inter_col1_using_texa__mul_tex (WORD *dst, int size, DWORD color0, DWORD color1)171{172DWORD cr0, cg0, cb0, cr1, cg1, cb1;173WORD col;174BYTE r, g, b;175WORD a;176float percent, percent_i;177178cr0 = (color0 >> 12) & 0xF;179cg0 = (color0 >> 8) & 0xF;180cb0 = (color0 >> 4) & 0xF;181cr1 = (color1 >> 12) & 0xF;182cg1 = (color1 >> 8) & 0xF;183cb1 = (color1 >> 4) & 0xF;184185for (int i=0; i<size; i++)186{187col = *dst;188a = col & 0xF000;189percent = (a >> 12) / 15.0f;190percent_i = 1.0f - percent;191r = (BYTE)(((percent_i * cr0 + percent * cr1) / 15.0f) * (((col & 0x0F00) >> 8) / 15.0f) * 15.0f);192g = (BYTE)(((percent_i * cg0 + percent * cg1) / 15.0f) * (((col & 0x00F0) >> 4) / 15.0f) * 15.0f);193b = (BYTE)(((percent_i * cb0 + percent * cb1) / 15.0f) * ((col & 0x000F) / 15.0f) * 15.0f);194*(dst++) = a | (r << 8) | (g << 4) | b;195}196}197198static void mod_col_inter_tex_using_tex (WORD *dst, int size, DWORD color)199{200DWORD cr, cg, cb;201WORD col;202BYTE r, g, b;203WORD a;204float percent_r, percent_g, percent_b;205206cr = (color >> 12) & 0xF;207cg = (color >> 8) & 0xF;208cb = (color >> 4) & 0xF;209210for (int i=0; i<size; i++)211{212col = *dst;213a = col & 0xF000;214percent_r = ((col >> 8) & 0xF) / 15.0f;215percent_g = ((col >> 4) & 0xF) / 15.0f;216percent_b = (col & 0xF) / 15.0f;217r = (BYTE)((1.0f-percent_r) * cr + percent_r * ((col & 0x0F00) >> 8));218g = (BYTE)((1.0f-percent_g) * cg + percent_g * ((col & 0x00F0) >> 4));219b = (BYTE)((1.0f-percent_b) * cb + percent_b * (col & 0x000F));220*(dst++) = a | (r << 8) | (g << 4) | b;221}222}223224static void mod_col_inter_tex_using_texa (WORD *dst, int size, DWORD color)225{226DWORD cr, cg, cb;227WORD col;228BYTE r, g, b;229WORD a;230float percent, percent_i;231232cr = (color >> 12) & 0xF;233cg = (color >> 8) & 0xF;234cb = (color >> 4) & 0xF;235236for (int i=0; i<size; i++)237{238col = *dst;239a = col & 0xF000;240percent = (a >> 12) / 15.0f;241percent_i = 1.0f - percent;242r = (BYTE)(percent_i * cr + percent * ((col & 0x0F00) >> 8));243g = (BYTE)(percent_i * cg + percent * ((col & 0x00F0) >> 4));244b = (BYTE)(percent_i * cb + percent * (col & 0x000F));245*(dst++) = a | (r << 8) | (g << 4) | b;246}247}248249static void mod_col2_inter__col_inter_col1_using_tex__using_texa (WORD *dst, int size,250DWORD color0, DWORD color1,251DWORD color2)252{253DWORD cr0, cg0, cb0, cr1, cg1, cb1, cr2, cg2, cb2;254WORD col;255BYTE r, g, b;256WORD a;257float percent_r, percent_g, percent_b, percent_a;258259cr0 = (color0 >> 12) & 0xF;260cg0 = (color0 >> 8) & 0xF;261cb0 = (color0 >> 4) & 0xF;262cr1 = (color1 >> 12) & 0xF;263cg1 = (color1 >> 8) & 0xF;264cb1 = (color1 >> 4) & 0xF;265cr2 = (color2 >> 12) & 0xF;266cg2 = (color2 >> 8) & 0xF;267cb2 = (color2 >> 4) & 0xF;268269for (int i=0; i<size; i++)270{271col = *dst;272a = col & 0xF000;273percent_a = (a >> 12) / 15.0f;274percent_r = ((col >> 8) & 0xF) / 15.0f;275percent_g = ((col >> 4) & 0xF) / 15.0f;276percent_b = (col & 0xF) / 15.0f;277r = (BYTE)(((1.0f-percent_r) * cr0 + percent_r * cr1) * percent_a + cr2 * (1.0f-percent_a));278g = (BYTE)(((1.0f-percent_g) * cg0 + percent_g * cg1) * percent_a + cg2 * (1.0f-percent_a));279b = (BYTE)(((1.0f-percent_b) * cb0 + percent_b * cb1) * percent_a + cb2 * (1.0f-percent_a));280*(dst++) = a | (r << 8) | (g << 4) | b;281}282}283284static void mod_tex_scale_fac_add_fac (WORD *dst, int size, DWORD factor)285{286float percent = factor / 255.0f;287WORD col;288BYTE a;289float base_a = (1.0f - percent) * 15.0f;290291for (int i=0; i<size; i++)292{293col = *dst;294a = (BYTE)(base_a + percent * (col>>12));295*(dst++) = (a<<12) | (col & 0x0FFF);296}297}298299static void mod_tex_sub_col_mul_fac_add_tex (WORD *dst, int size, DWORD color, DWORD factor)300{301float percent = factor / 255.0f;302DWORD cr, cg, cb;303WORD col, a;304float r, g, b;305306cr = (color >> 12) & 0xF;307cg = (color >> 8) & 0xF;308cb = (color >> 4) & 0xF;309310for (int i=0; i<size; i++)311{312col = *dst;313a = col & 0xF000;314r = (float)((col >> 8) & 0xF);315r = /*max(*/(r - cr) * percent/*, 0.0f)*/ + r;316if (r > 15.0f) r = 15.0f;317if (r < 0.0f) r = 0.0f;318g = (float)((col >> 4) & 0xF);319g = /*max(*/(g - cg) * percent/*, 0.0f)*/ + g;320if (g > 15.0f) g = 15.0f;321if (g < 0.0f) g = 0.0f;322b = (float)(col & 0xF);323b = /*max(*/(b - cb) * percent/*, 0.0f)*/ + b;324if (b > 15.0f) b = 15.0f;325if (b < 0.0f) b = 0.0f;326327*(dst++) = a | ((WORD)r << 8) | ((WORD)g << 4) | (WORD)b;328}329}330331static void mod_tex_scale_col_add_col (WORD *dst, int size, DWORD color, DWORD factor)332{333float percent = factor / 255.0f;334float percent_r = (1.0f - ((color>>12)&0xF) / 15.0f) * percent;335float percent_g = (1.0f - ((color>>8)&0xF) / 15.0f) * percent;336float percent_b = (1.0f - ((color>>4)&0xF) / 15.0f) * percent;337WORD col;338float base = (1.0f - percent) * 15.0f;339float r, g, b;340341for (int i=0; i<size; i++)342{343col = *dst;344r = base + percent_r * (float)((col>>8)&0xF);345g = base + percent_g * (float)((col>>4)&0xF);346b = base + percent_b * (float)(col&0xF);347*(dst++) = (col&0xF000) | ((BYTE)r << 8) | ((BYTE)g << 4) | (BYTE)b;348}349}350351static void mod_tex_add_col (WORD *dst, int size, DWORD color)352{353DWORD cr, cg, cb;354WORD col;355BYTE a, r, g, b;356357cr = (color >> 12) & 0xF;358cg = (color >> 8) & 0xF;359cb = (color >> 4) & 0xF;360361for (int i=0; i<size; i++)362{363col = *dst;364a = (BYTE)((col >> 12) & 0xF);365// a = col & 0xF000;366r = (BYTE)(cr + ((col >> 8) & 0xF))&0xF;367g = (BYTE)(cg + ((col >> 4) & 0xF))&0xF;368b = (BYTE)(cb + (col & 0xF))&0xF;369*(dst++) = (a << 12) | (r << 8) | (g << 4) | b;370}371}372373static void mod_col_mul_texa_add_tex (WORD *dst, int size, DWORD color)374{375DWORD cr, cg, cb;376WORD col;377BYTE r, g, b;378WORD a;379float factor;380381cr = (color >> 12) & 0xF;382cg = (color >> 8) & 0xF;383cb = (color >> 4) & 0xF;384385for (int i=0; i<size; i++)386{387col = *dst;388a = col & 0xF000;389factor = (a >> 12) / 15.0f;390r = (BYTE)(cr*factor + ((col >> 8) & 0xF))&0xF;391g = (BYTE)(cg*factor + ((col >> 4) & 0xF))&0xF;392b = (BYTE)(cb*factor + (col & 0xF))&0xF;393*(dst++) = a | (r << 8) | (g << 4) | b;394}395}396397static void mod_tex_sub_col (WORD *dst, int size, DWORD color)398{399DWORD cr, cg, cb, ca;400WORD col;401BYTE a, r, g, b;402403cr = (color >> 12) & 0xF;404cg = (color >> 8) & 0xF;405cb = (color >> 4) & 0xF;406ca = color & 0xF;407408for (int i=0; i<size; i++)409{410col = *dst;411a = (BYTE)(((col >> 12) & 0xF) - ca);412r = (BYTE)(((col >> 8) & 0xF) - cr);413g = (BYTE)(((col >> 4) & 0xF) - cg);414b = (BYTE)((col & 0xF) - cb);415*(dst++) = (a << 12) | (r << 8) | (g << 4) | b;416}417}418419static void mod_tex_sub_col_mul_fac (WORD *dst, int size, DWORD color, DWORD factor)420{421float percent = factor / 255.0f;422DWORD cr, cg, cb;423WORD col, a;424float r, g, b;425426cr = (color >> 12) & 0xF;427cg = (color >> 8) & 0xF;428cb = (color >> 4) & 0xF;429430for (int i=0; i<size; i++)431{432col = *dst;433a = (BYTE)((col >> 12) & 0xF);434r = (float)((col >> 8) & 0xF);435r = (r - cr) * percent;436if (r > 15.0f) r = 15.0f;437if (r < 0.0f) r = 0.0f;438g = (float)((col >> 4) & 0xF);439g = (g - cg) * percent;440if (g > 15.0f) g = 15.0f;441if (g < 0.0f) g = 0.0f;442b = (float)(col & 0xF);443b = (b - cb) * percent;444if (b > 15.0f) b = 15.0f;445if (b < 0.0f) b = 0.0f;446447*(dst++) = (a << 12) | ((WORD)r << 8) | ((WORD)g << 4) | (WORD)b;448}449}450451static void mod_col_inter_tex_using_col1 (WORD *dst, int size, DWORD color0, DWORD color1)452{453DWORD cr, cg, cb;454WORD col, a;455BYTE r, g, b;456457float percent_r = ((color1 >> 12) & 0xF) / 15.0f;458float percent_g = ((color1 >> 8) & 0xF) / 15.0f;459float percent_b = ((color1 >> 4) & 0xF) / 15.0f;460float percent_r_i = 1.0f - percent_r;461float percent_g_i = 1.0f - percent_g;462float percent_b_i = 1.0f - percent_b;463464cr = (color0 >> 12) & 0xF;465cg = (color0 >> 8) & 0xF;466cb = (color0 >> 4) & 0xF;467468for (int i=0; i<size; i++)469{470col = *dst;471a = (BYTE)((col >> 12) & 0xF);472r = (BYTE)(percent_r * ((col >> 8) & 0xF) + percent_r_i * cr);473g = (BYTE)(percent_g * ((col >> 4) & 0xF) + percent_g_i * cg);474b = (BYTE)(percent_b * (col & 0xF) + percent_b_i * cb);475*(dst++) = (a << 12) | (r << 8) | (g << 4) | b;476}477}478479static void mod_tex_inter_noise_using_col (WORD *dst, int size, DWORD color)480{481WORD col, a;482BYTE r, g, b, noise;483484float percent_r = ((color >> 12) & 0xF) / 15.0f;485float percent_g = ((color >> 8) & 0xF) / 15.0f;486float percent_b = ((color >> 4) & 0xF) / 15.0f;487float percent_r_i = 1.0f - percent_r;488float percent_g_i = 1.0f - percent_g;489float percent_b_i = 1.0f - percent_b;490491for (int i=0; i<size; i++)492{493col = *dst;494a = col & 0xF000;495noise = rand()%16;496r = (BYTE)(percent_r_i * ((col >> 8) & 0xF) + percent_r * noise);497g = (BYTE)(percent_g_i * ((col >> 4) & 0xF) + percent_g * noise);498b = (BYTE)(percent_b_i * (col & 0xF) + percent_b * noise);499*(dst++) = a | (r << 8) | (g << 4) | b;500}501}502503static void mod_tex_inter_col_using_texa (WORD *dst, int size, DWORD color)504{505DWORD cr, cg, cb;506WORD col;507BYTE r, g, b;508WORD a;509float percent, percent_i;510511cr = (color >> 12) & 0xF;512cg = (color >> 8) & 0xF;513cb = (color >> 4) & 0xF;514515for (int i=0; i<size; i++)516{517col = *dst;518a = col & 0xF000;519percent = (a >> 12) / 15.0f;520percent_i = 1.0f - percent;521r = (BYTE)(percent * cr + percent_i * ((col & 0x0F00) >> 8));522g = (BYTE)(percent * cg + percent_i * ((col & 0x00F0) >> 4));523b = (BYTE)(percent * cb + percent_i * (col & 0x000F));524*(dst++) = a | (r << 8) | (g << 4) | b;525}526}527528static void mod_tex_mul_col (WORD *dst, int size, DWORD color)529{530float cr, cg, cb;531WORD col;532BYTE r, g, b;533WORD a;534535cr = (float)((color >> 12) & 0xF)/16.0f;536cg = (float)((color >> 8) & 0xF)/16.0f;537cb = (float)((color >> 4) & 0xF)/16.0f;538539for (int i=0; i<size; i++)540{541col = *dst;542a = col & 0xF000;543r = (BYTE)(cr * ((col & 0x0F00) >> 8));544g = (BYTE)(cg * ((col & 0x00F0) >> 4));545b = (BYTE)(cb * (col & 0x000F));546*(dst++) = a | (r << 8) | (g << 4) | b;547}548}549550static void mod_tex_scale_fac_add_col (WORD *dst, int size, DWORD color, DWORD factor)551{552float percent = factor / 255.0f;553DWORD cr, cg, cb;554WORD col;555float r, g, b;556557cr = (color >> 12) & 0xF;558cg = (color >> 8) & 0xF;559cb = (color >> 4) & 0xF;560561for (int i=0; i<size; i++)562{563col = *dst;564r = cr + percent * (float)((col>>8)&0xF);565g = cg + percent * (float)((col>>4)&0xF);566b = cb + percent * (float)(col&0xF);567*(dst++) = (col&0xF000) | ((BYTE)r << 8) | ((BYTE)g << 4) | (BYTE)b;568}569}570571572573