2014年8月24日日曜日

グレースケールその2

ループもアセンブラで書いた
void apply_grayscale(uint8_t* dstImg, uint8_t* srcImg, int pixelCount)
{
    uint16_t tmp1;
    int counter;

    __asm
    {
        mov ebx, srcImg
        mov ecx, pixelCount
        mov counter, 0
            
    loop0:
        mov tmp1, 0

        mov ah, 77                        // 0.298912 * 256
        mov al, [ebx+0]
        mul ah
        mov tmp1, ax

        mov ah, 150                        // 0.586611 * 256
        mov al, [ebx+1]
        mul ah
        add tmp1, ax

        mov ah, 29                        // 0.114478 * 256
        mov al, [ebx+2]
        mul ah
        add tmp1, ax
        
        shr tmp1, 8
        mov ax, tmp1

        push ebx
        mov ebx, dstImg
        add ebx, counter
        mov [ebx+0], al
        mov [ebx+1], al
        mov [ebx+2], al
        pop ebx

        add counter, 3
        add ebx, 3
        sub ecx, 3
        jnz loop0
    }
}
もうちょい短くなるのかな?

2014/08/24 18:31 追記
ちょっと短くなった
void apply_grayscale(uint8_t* dstImg, uint8_t* srcImg, int pixelCount)
{
    int counter;

    __asm
    {
        mov ebx, srcImg
        mov ecx, pixelCount
        mov counter, 0
            
    loop0:
        mov dx, 0

        mov ax, 77                        // 0.298912 * 256
        mul [ebx+0]
        mov dx, ax

        mov ax, 150                       // 0.586611 * 256
        mul [ebx+1]
        add dx, ax

        mov ax, 29                        // 0.114478 * 256
        mul [ebx+2]
        add dx, ax
        
        shr dx, 8

        push ebx
        mov ebx, dstImg
        add ebx, counter
        mov [ebx+0], dl
        mov [ebx+1], dl
        mov [ebx+2], dl
        pop ebx

        add counter, 3
        add ebx, 3
        sub ecx, 3
        jnz loop0
    }
}

0 件のコメント:

コメントを投稿

SQL で MP4 をパース

SQL でビットマップ画像の2値化は4年位前に挑戦した。 最近、それの Impala 版 を作ったときに閃いた。 「再帰CTEがあるなら、mp4 もいけるんじゃないか」と。 やってみた。 use ragingo drop table video go create...