; Grafx2 - The Ultimate 256-color bitmap paint program ; ; Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud) ; ; Grafx2 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; version 2 ; of the License. ; ; Grafx2 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 Grafx2; if not, see or ; write to the Free Software Foundation, Inc., ; 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ; -- Calcul de la meilleure couleur s'approchant d'une teinte particuliŠre -- Meilleure_couleur proc near push ebp mov ebp,esp arg Rouge:byte,Vert:byte,Bleu:byte push ebx push esi push edi ; On place dans ESI l'adresse de la palette mov esi,offset Principal_Palette ; On place l'indice de la couleur au d‚but de la table d'exclusion de coul. mov MC_Indice,offset Exclude_color ; EDI servira … stocker la meilleure diff‚rence mov edi,07FFFFFFFh ; On se sert de CL pour compter la couleur en cours ; (et CH servira … stocker la meilleure couleur) xor cx,cx ; On nettoie la partie haute de EAX: xor eax,eax Meilleure_couleur_Pour_chaque_couleur: ; On v‚rifie que la couleur ne soit pas exclue mov ebx,MC_Indice cmp byte ptr [ebx],0 jnz Meilleure_couleur_Pas_mieux ; EBX sert … pointer la table pr‚calcul‚e mov ebx,MC_Table_differences ; On calcule la diff‚rence: ; ; Le calcul s'effectue dans EDX (on y cumule les diff‚rences), en se ; servant de EBX pour pointer la table pr‚calcul‚e, et de AX comme ; indice dans la table ; On s'occupe de la composante Rouge mov al,[esi] mov dl,[esi+1] ; et en entrelac‚ de la composante verte mov ah,Rouge mov dh,Vert sub al,ah sub dl,dh and eax,127 and edx,127 mov edx,[ebx+4*edx+128*4] add edx,[ebx+4*eax] ; On s'occupe de la composante Bleue mov al,[esi+2] mov ah,Bleu sub al,ah and eax,127 add edx,[ebx+4*eax+256*4] jz Meilleure_couleur_Correspond_impeccablement cmp edx,edi jae Meilleure_couleur_Pas_mieux ; L…, on sait que CL contient une meilleure couleur que CH mov ch,cl ; On commence par mettre CH … CL mov edi,edx ; Ensuite, on peut mettre DI (meilleure diff‚rence) … jour Meilleure_couleur_Pas_mieux: inc MC_Indice add esi,3 inc cl jnz Meilleure_couleur_Pour_chaque_couleur ; Ici, on sait que CH contient d‚j… la meilleure couleur. On va donc faire ; une sortie rapide (c'est pas bien, mais ‡a fait gagner 3 cycles) mov al,ch pop edi pop esi pop ebx mov esp,ebp pop ebp ret Meilleure_couleur_Correspond_impeccablement: ; Ici, on sait que CL contient la couleur qui correspond exactement aux ; exigences de l'appelant mov al,cl pop edi pop esi pop ebx mov esp,ebp pop ebp ret Meilleure_couleur endp ; -- Calcul de la meilleure couleur s'approchant d'une teinte particuliŠre -- ; -- et ceci SANS exclure certaines couleurs coch‚es par l'utilisateur -- Meilleure_couleur_sans_exclusion proc near push ebp mov ebp,esp arg Rouge:byte,Vert:byte,Bleu:byte push ebx push esi push edi ; On place dans ESI l'adresse de la palette mov esi,offset Principal_Palette ; EDI servira … stocker la meilleure diff‚rence mov edi,07FFFFFFFh ; On se sert de CL pour compter la couleur en cours ; (et CH servira … stocker la meilleure couleur) xor cx,cx ; On nettoie la partie haute de EAX: xor eax,eax ; EBX sert … pointer la table pr‚calcul‚e mov ebx,MC_Table_differences MCSE_Pour_chaque_couleur: ; On calcule la diff‚rence: ; ; Le calcul s'effectue dans EDX (on y cumule les diff‚rences), en se ; servant de EBX pour pointer la table pr‚calcul‚e, et de AX comme ; indice dans la table ; On s'occupe de la composante Rouge mov al,[esi] mov dl,[esi+1] ; et en entrelac‚ de la composante verte mov ah,Rouge mov dh,Vert sub al,ah sub dl,dh and eax,127 and edx,127 mov edx,[ebx+4*edx+128*4] add edx,[ebx+4*eax] ; On s'occupe de la composante Bleue mov al,[esi+2] mov ah,Bleu sub al,ah and eax,127 add edx,[ebx+4*eax+256*4] jz MCSE_Correspond_impeccablement cmp edx,edi jae MCSE_Pas_mieux ; L…, on sait que CL contient une meilleure couleur que CH mov ch,cl ; On commence par mettre CH … CL mov edi,edx ; Ensuite, on peut mettre DI (meilleure diff‚rence) … jour MCSE_Pas_mieux: add esi,3 inc cl jnz MCSE_Pour_chaque_couleur ; Ici, on sait que CH contient d‚j… la meilleure couleur. On va donc faire ; une sortie rapide (c'est pas bien, mais ‡a fait gagner 3 cycles) mov al,ch pop edi pop esi pop ebx mov esp,ebp pop ebp ret MCSE_Correspond_impeccablement: ; Ici, on sait que CL contient la couleur qui correspond exactement aux ; exigences de l'appelant mov al,cl pop edi pop esi pop ebx mov esp,ebp pop ebp ret Meilleure_couleur_sans_exclusion endp