ColorKey是什么?你不会连这个都不知道吧!ColorKey就是一种或者一段区间内的颜色值。当硬件在进行Blit操作时,遇到ColorKey指定的颜色,就跳过该点的写像素操作,说白了就是透明色。DirectDraw提供了ColorKey这个属性,做起来很方便。但当我们自己用软件模拟时(因为自己做还可以添加好多其他的操作嘛)就麻烦了,但是我们有MMX。好了,开始入正题:
我们应用比较指令PCMPEQ[B,W,D]和逻辑指令PAND、PANDN和POR 设有两幅图P1和P2,要将P2画到P1上,ColorKey是蓝色(BLUE)。我们只从这两幅图里取几个点来看一看, ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ P1│ A1 │ A2 │ A3 │ A4 │ P2│ BLUEn │ B2 │ B3 │ BLUE │ └───┴───┴───┴───┘ └───┴───┴───┴───┘ 先将P2与ColorKey比较,得到掩码mask ┌───┬───┬───┬───┐ │ BLUE │ B2 │ B3 │ BLUE │ └───┴───┴───┴───┘ ┌───┬───┬───┬───┐ │ BLUE │ BLUE │ BLUE │ BLUE │ └───┴───┴───┴───┘ PCMPEQW ──────────────── ┌───┬───┬───┬───┐ │0xFFFF │ 0 │ 0 │0xFFFF │(mask) └───┴───┴───┴───┘ 再将P1、P2分别与掩码mask作逻辑操作,不过要注意PANDN指令的源操作数和目的操作数的次序 ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ │ A1 │ A2 │ A3 │ A4 │ │ BLUE │ B2 │ B3 │ BLUE │(src) └───┴───┴───┴───┘ └───┴───┴───┴───┘ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ │0xFFFF │ 0 │ 0 │0xFFFF │ │0xFFFF │ 0 │ 0 │0xFFFF │(dest) └───┴───┴───┴───┘ └───┴───┴───┴───┘ PANDN ──────────────── PANDN ─────────────────── ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ │ A1 │ 0 │ 0 │ A4 │ │ 0 │ B2 │ B3 │ 0 │ └───┴───┴───┴───┘ └───┴───┴───┴───┘ 最后,将结果作或操作 ┌───┬───┬───┬───┐ │ A1 │ 0 │ 0 │ A4 │ └───┴───┴───┴───┘ ┌───┬───┬───┬───┐ │ 0 │ B2 │ B3 │ 0 │ └───┴───┴───┴───┘ POR ──────────────── ┌───┬───┬───┬───┐ │ A1 │ B2 │ B3 │ A4 │ └───┴───┴───┴───┘ 看看,是不是要得到的结果啊! 这样的好处是……(此处省去1000字),好了,下次再见了! |