| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 |
- ;
- ; Command & Conquer Red Alert(tm)
- ; Copyright 2025 Electronic Arts Inc.
- ;
- ; 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 3 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, see <http://www.gnu.org/licenses/>.
- ;
- ;***************************************************************************
- ;** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S **
- ;***************************************************************************
- ;* *
- ;* Project Name : Westwood Library *
- ;* *
- ;* File Name : FADING.ASM *
- ;* *
- ;* Programmer : Joe L. Bostic *
- ;* *
- ;* Start Date : August 20, 1993 *
- ;* *
- ;* Last Update : August 20, 1993 [JLB] *
- ;* *
- ;*-------------------------------------------------------------------------*
- ;* Functions: *
- ;* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *
- IDEAL
- P386
- MODEL USE32 FLAT
- GLOBAL Build_Fading_Table :NEAR
- CODESEG
- ;***********************************************************
- ; BUILD_FADING_TABLE
- ;
- ; void *Build_Fading_Table(void *palette, void *dest, long int color, long int frac);
- ;
- ; This routine will create the fading effect table used to coerce colors
- ; from toward a common value. This table is used when Fading_Effect is
- ; active.
- ;
- ; Bounds Checking: None
- ;*
- PROC Build_Fading_Table C near
- USES ebx, ecx, edi, esi
- ARG palette:DWORD
- ARG dest:DWORD
- ARG color:DWORD
- ARG frac:DWORD
- LOCAL matchvalue:DWORD ; Last recorded match value.
- LOCAL targetred:BYTE ; Target gun red.
- LOCAL targetgreen:BYTE ; Target gun green.
- LOCAL targetblue:BYTE ; Target gun blue.
- LOCAL idealred:BYTE
- LOCAL idealgreen:BYTE
- LOCAL idealblue:BYTE
- LOCAL matchcolor:BYTE ; Tentative match color.
- cld
- ; If the source palette is NULL, then just return with current fading table pointer.
- cmp [palette],0
- je ??fini
- cmp [dest],0
- je ??fini
- ; Fractions above 255 become 255.
- mov eax,[frac]
- cmp eax,0100h
- jb short ??ok
- mov [frac],0FFh
- ??ok:
- ; Record the target gun values.
- mov esi,[palette]
- mov ebx,[color]
- add esi,ebx
- add esi,ebx
- add esi,ebx
- lodsb
- mov [targetred],al
- lodsb
- mov [targetgreen],al
- lodsb
- mov [targetblue],al
- ; Main loop.
- xor ebx,ebx ; Remap table index.
- ; Transparent black never gets remapped.
- mov edi,[dest]
- mov [edi],bl
- inc edi
- ; EBX = source palette logical number (1..255).
- ; EDI = running pointer into dest remap table.
- ??mainloop:
- inc ebx
- mov esi,[palette]
- add esi,ebx
- add esi,ebx
- add esi,ebx
- mov edx,[frac]
- shr edx,1
- ; new = orig - ((orig-target) * fraction);
- lodsb ; orig
- mov dh,al ; preserve it for later.
- sub al,[targetred] ; al = (orig-target)
- imul dl ; ax = (orig-target)*fraction
- shl ax,1
- sub dh,ah ; dh = orig - ((orig-target) * fraction)
- mov [idealred],dh ; preserve ideal color gun value.
- lodsb ; orig
- mov dh,al ; preserve it for later.
- sub al,[targetgreen] ; al = (orig-target)
- imul dl ; ax = (orig-target)*fraction
- shl ax,1
- sub dh,ah ; dh = orig - ((orig-target) * fraction)
- mov [idealgreen],dh ; preserve ideal color gun value.
- lodsb ; orig
- mov dh,al ; preserve it for later.
- sub al,[targetblue] ; al = (orig-target)
- imul dl ; ax = (orig-target)*fraction
- shl ax,1
- sub dh,ah ; dh = orig - ((orig-target) * fraction)
- mov [idealblue],dh ; preserve ideal color gun value.
- ; Sweep through the entire existing palette to find the closest
- ; matching color. Never matches with color 0.
- mov eax,[color]
- mov [matchcolor],al ; Default color (self).
- mov [matchvalue],-1 ; Ridiculous match value init.
- mov ecx,255
- mov esi,[palette] ; Pointer to original palette.
- add esi,3
- ; BH = color index.
- mov bh,1
- ??innerloop:
- ; Recursion through the fading table won't work if a color is allowed
- ; to remap to itself. Prevent this from occuring.
- add esi,3
- cmp bh,bl
- je short ??notclose
- sub esi,3
- xor edx,edx ; Comparison value starts null.
- mov eax,edx
- ; Build the comparison value based on the sum of the differences of the color
- ; guns squared.
- lodsb
- sub al,[idealred]
- mov ah,al
- imul ah
- add edx,eax
-
- lodsb
- sub al,[idealgreen]
- mov ah,al
- imul ah
- add edx,eax
- lodsb
- sub al,[idealblue]
- mov ah,al
- imul ah
- add edx,eax
- jz short ??perfect ; If perfect match found then quit early.
- cmp edx,[matchvalue]
- ja short ??notclose
- mov [matchvalue],edx ; Record new possible color.
- mov [matchcolor],bh
- ??notclose:
- inc bh ; Checking color index.
- loop ??innerloop
- mov bh,[matchcolor]
- ??perfect:
- mov [matchcolor],bh
- xor bh,bh ; Make BX valid main index again.
- ; When the loop exits, we have found the closest match.
- mov al,[matchcolor]
- stosb
- cmp ebx,255
- jne ??mainloop
- ??fini:
- mov eax,[dest]
- ret
- ENDP Build_Fading_Table
- END
|