Path: blob/master/libmupen64plus/mupen64plus-video-glide64mk2/src/Glide64/TexLoad8b.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//****************************************************************38#include <stdint.h>3940static inline void load8bCI(uint8_t *src, uint8_t *dst, int wid_64, int height, int line, int ext, uint16_t *pal)41{42uint8_t *v7;43uint32_t *v8;44int v9;45int v10;46int v11;47uint32_t v12;48uint32_t *v13;49uint32_t v14;50uint32_t *v15;51uint32_t v16;52uint32_t *v17;53uint32_t *v18;54int v19;55int v20;56uint32_t v21;57uint32_t v22;58uint32_t *v23;59uint32_t v24;60int v25;61int v26;6263v7 = src;64v8 = (uint32_t *)dst;65v9 = height;66do67{68v25 = v9;69v10 = wid_64;70do71{72v11 = v10;73v12 = bswap32(*(uint32_t *)v7);74v13 = (uint32_t *)(v7 + 4);75ALOWORD(v10) = __ROR__(*(uint16_t *)((char *)pal + ((v12 >> 15) & 0x1FE)), 1);76v14 = v10 << 16;77ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v12 >> 23) & 0x1FE)), 1);78*v8 = v14;79v15 = v8 + 1;80ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + (2 * (uint16_t)v12 & 0x1FE)), 1);81v14 <<= 16;82ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v12 >> 7) & 0x1FE)), 1);83*v15 = v14;84++v15;85v16 = bswap32(*v13);86v7 = (uint8_t *)(v13 + 1);87ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v16 >> 15) & 0x1FE)), 1);88v14 <<= 16;89ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v16 >> 23) & 0x1FE)), 1);90*v15 = v14;91++v15;92ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + (2 * (uint16_t)v16 & 0x1FE)), 1);93v14 <<= 16;94ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v16 >> 7) & 0x1FE)), 1);95*v15 = v14;96v8 = v15 + 1;97v10 = v11 - 1;98}99while ( v11 != 1 );100if ( v25 == 1 )101break;102v26 = v25 - 1;103v17 = (uint32_t *)&src[(line + (uintptr_t)v7 - (uintptr_t)src) & 0x7FF];104v18 = (uint32_t *)((char *)v8 + ext);105v19 = wid_64;106do107{108v20 = v19;109v21 = bswap32(v17[1]);110ALOWORD(v19) = __ROR__(*(uint16_t *)((char *)pal + ((v21 >> 15) & 0x1FE)), 1);111v22 = v19 << 16;112ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v21 >> 23) & 0x1FE)), 1);113*v18 = v22;114v23 = v18 + 1;115ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + (2 * (uint16_t)v21 & 0x1FE)), 1);116v22 <<= 16;117ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v21 >> 7) & 0x1FE)), 1);118*v23 = v22;119++v23;120v24 = bswap32(*v17);121v17 = (uint32_t *)&src[((uintptr_t)v17 + 8 - (uintptr_t)src) & 0x7FF];122ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v24 >> 15) & 0x1FE)), 1);123v22 <<= 16;124ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v24 >> 23) & 0x1FE)), 1);125*v23 = v22;126++v23;127ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + (2 * (uint16_t)v24 & 0x1FE)), 1);128v22 <<= 16;129ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v24 >> 7) & 0x1FE)), 1);130*v23 = v22;131v18 = v23 + 1;132v19 = v20 - 1;133}134while ( v20 != 1 );135v7 = &src[(line + (uintptr_t)v17 - (uintptr_t)src) & 0x7FF];136v8 = (uint32_t *)((char *)v18 + ext);137v9 = v26 - 1;138}139while ( v26 != 1 );140}141142static inline void load8bIA8(uint8_t *src, uint8_t *dst, int wid_64, int height, int line, int ext, uint16_t *pal)143{144uint32_t *v7;145uint32_t *v8;146int v9;147int v10;148int v11;149uint32_t v12;150uint32_t *v13;151uint32_t v14;152uint32_t *v15;153uint32_t v16;154uint32_t *v17;155uint32_t *v18;156int v19;157int v20;158uint32_t v21;159uint32_t v22;160uint32_t *v23;161uint32_t v24;162int v25;163int v26;164165v7 = (uint32_t *)src;166v8 = (uint32_t *)dst;167v9 = height;168do169{170v25 = v9;171v10 = wid_64;172do173{174v11 = v10;175v12 = bswap32(*v7);176v13 = v7 + 1;177ALOWORD(v10) = __ROR__(*(uint16_t *)((char *)pal + ((v12 >> 15) & 0x1FE)), 8);178v14 = v10 << 16;179ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v12 >> 23) & 0x1FE)), 8);180*v8 = v14;181v15 = v8 + 1;182ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + (2 * (uint16_t)v12 & 0x1FE)), 8);183v14 <<= 16;184ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v12 >> 7) & 0x1FE)), 8);185*v15 = v14;186++v15;187v16 = bswap32(*v13);188v7 = v13 + 1;189ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v16 >> 15) & 0x1FE)), 8);190v14 <<= 16;191ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v16 >> 23) & 0x1FE)), 8);192*v15 = v14;193++v15;194ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + (2 * (uint16_t)v16 & 0x1FE)), 8);195v14 <<= 16;196ALOWORD(v14) = __ROR__(*(uint16_t *)((char *)pal + ((v16 >> 7) & 0x1FE)), 8);197*v15 = v14;198v8 = v15 + 1;199v10 = v11 - 1;200}201while ( v11 != 1 );202if ( v25 == 1 )203break;204v26 = v25 - 1;205v17 = (uint32_t *)((char *)v7 + line);206v18 = (uint32_t *)((char *)v8 + ext);207v19 = wid_64;208do209{210v20 = v19;211v21 = bswap32(v17[1]);212ALOWORD(v19) = __ROR__(*(uint16_t *)((char *)pal + ((v21 >> 15) & 0x1FE)), 8);213v22 = v19 << 16;214ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v21 >> 23) & 0x1FE)), 8);215*v18 = v22;216v23 = v18 + 1;217ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + (2 * (uint16_t)v21 & 0x1FE)), 8);218v22 <<= 16;219ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v21 >> 7) & 0x1FE)), 8);220*v23 = v22;221++v23;222v24 = bswap32(*v17);223v17 += 2;224ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v24 >> 15) & 0x1FE)), 8);225v22 <<= 16;226ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v24 >> 23) & 0x1FE)), 8);227*v23 = v22;228++v23;229ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + (2 * (uint16_t)v24 & 0x1FE)), 8);230v22 <<= 16;231ALOWORD(v22) = __ROR__(*(uint16_t *)((char *)pal + ((v24 >> 7) & 0x1FE)), 8);232*v23 = v22;233v18 = v23 + 1;234v19 = v20 - 1;235}236while ( v20 != 1 );237v7 = (uint32_t *)((char *)v17 + line);238v8 = (uint32_t *)((char *)v18 + ext);239v9 = v26 - 1;240}241while ( v26 != 1 );242}243244static inline void load8bIA4(uint8_t *src, uint8_t *dst, int wid_64, int height, int line, int ext)245{246uint32_t *v6;247uint32_t *v7;248int v8;249int v9;250uint32_t v10;251uint32_t v11;252uint32_t *v12;253uint32_t *v13;254uint32_t v14;255uint32_t v15;256uint32_t *v16;257uint32_t *v17;258int v18;259uint32_t *v19;260uint32_t v20;261int v21;262int v22;263264v6 = (uint32_t *)src;265v7 = (uint32_t *)dst;266v8 = height;267do268{269v21 = v8;270v9 = wid_64;271do272{273v10 = *v6;274v11 = (*v6 >> 4) & 0xF0F0F0F;275v12 = v6 + 1;276*v7 = (16 * v10 & 0xF0F0F0F0) | v11;277v13 = v7 + 1;278v14 = (*v12 >> 4) & 0xF0F0F0F;279v15 = 16 * *v12 & 0xF0F0F0F0;280v6 = v12 + 1;281*v13 = v15 | v14;282v7 = v13 + 1;283--v9;284}285while ( v9 );286if ( v21 == 1 )287break;288v22 = v21 - 1;289v16 = (uint32_t *)((char *)v6 + line);290v17 = (uint32_t *)((char *)v7 + ext);291v18 = wid_64;292do293{294*v17 = (16 * v16[1] & 0xF0F0F0F0) | ((v16[1] >> 4) & 0xF0F0F0F);295v19 = v17 + 1;296v20 = *v16;297v16 += 2;298*v19 = (16 * v20 & 0xF0F0F0F0) | ((v20 >> 4) & 0xF0F0F0F);299v17 = v19 + 1;300--v18;301}302while ( v18 );303v6 = (uint32_t *)((char *)v16 + line);304v7 = (uint32_t *)((char *)v17 + ext);305v8 = v22 - 1;306}307while ( v22 != 1 );308}309310static inline void load8bI(uint8_t *src, uint8_t *dst, int wid_64, int height, int line, int ext)311{312uint32_t *v6;313uint32_t *v7;314int v8;315int v9;316uint32_t v10;317uint32_t *v11;318uint32_t *v12;319uint32_t v13;320uint32_t *v14;321uint32_t *v15;322int v16;323uint32_t *v17;324uint32_t v18;325int v19;326int v20;327328v6 = (uint32_t *)src;329v7 = (uint32_t *)dst;330v8 = height;331do332{333v19 = v8;334v9 = wid_64;335do336{337v10 = *v6;338v11 = v6 + 1;339*v7 = v10;340v12 = v7 + 1;341v13 = *v11;342v6 = v11 + 1;343*v12 = v13;344v7 = v12 + 1;345--v9;346}347while ( v9 );348if ( v19 == 1 )349break;350v20 = v19 - 1;351v14 = (uint32_t *)((char *)v6 + line);352v15 = (uint32_t *)((char *)v7 + ext);353v16 = wid_64;354do355{356*v15 = v14[1];357v17 = v15 + 1;358v18 = *v14;359v14 += 2;360*v17 = v18;361v15 = v17 + 1;362--v16;363}364while ( v16 );365v6 = (uint32_t *)((char *)v14 + line);366v7 = (uint32_t *)((char *)v15 + ext);367v8 = v20 - 1;368}369while ( v20 != 1 );370}371372//****************************************************************373// Size: 1, Format: 2374//375376wxUint32 Load8bCI (wxUIntPtr dst, wxUIntPtr src, int wid_64, int height, int line, int real_width, int tile)377{378if (wid_64 < 1) wid_64 = 1;379if (height < 1) height = 1;380int ext = (real_width - (wid_64 << 3));381unsigned short * pal = rdp.pal_8;382383switch (rdp.tlut_mode) {384case 0: //palette is not used385//in tlut DISABLE mode load CI texture as plain intensity texture instead of palette dereference.386//Thanks to angrylion for the advice387load8bI ((uint8_t *)src, (uint8_t *)dst, wid_64, height, line, ext);388return /*(0 << 16) | */GR_TEXFMT_ALPHA_8;389case 2: //color palette390ext <<= 1;391load8bCI ((uint8_t *)src, (uint8_t *)dst, wid_64, height, line, ext, pal);392return (1 << 16) | GR_TEXFMT_ARGB_1555;393default: //IA palette394ext <<= 1;395load8bIA8 ((uint8_t *)src, (uint8_t *)dst, wid_64, height, line, ext, pal);396return (1 << 16) | GR_TEXFMT_ALPHA_INTENSITY_88;397}398}399400//****************************************************************401// Size: 1, Format: 3402//403// ** by Gugaman **404405wxUint32 Load8bIA (wxUIntPtr dst, wxUIntPtr src, int wid_64, int height, int line, int real_width, int tile)406{407if (rdp.tlut_mode != 0)408return Load8bCI (dst, src, wid_64, height, line, real_width, tile);409410if (wid_64 < 1) wid_64 = 1;411if (height < 1) height = 1;412int ext = (real_width - (wid_64 << 3));413load8bIA4 ((uint8_t *)src, (uint8_t *)dst, wid_64, height, line, ext);414return /*(0 << 16) | */GR_TEXFMT_ALPHA_INTENSITY_44;415}416417//****************************************************************418// Size: 1, Format: 4419//420// ** by Gugaman **421422wxUint32 Load8bI (wxUIntPtr dst, wxUIntPtr src, int wid_64, int height, int line, int real_width, int tile)423{424if (rdp.tlut_mode != 0)425return Load8bCI (dst, src, wid_64, height, line, real_width, tile);426427if (wid_64 < 1) wid_64 = 1;428if (height < 1) height = 1;429int ext = (real_width - (wid_64 << 3));430load8bI ((uint8_t *)src, (uint8_t *)dst, wid_64, height, line, ext);431return /*(0 << 16) | */GR_TEXFMT_ALPHA_8;432}433434435436