1. C++ / Говнокод #12820

    +11

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    void Bitmap::flipRB()
    {
    	int nBytes = w*h;
    	void *d = data;
    	__asm
    	{
    		mov edx, 0;
    pixloop:	mov eax, d;
    		mov eax, [eax];
    		mov ebx, edx;
    		shl ebx, 0x2;
    		add eax, ebx;
    		mov ebx, [eax];
    		
    		and ebx, 0xFFFFFF;
    		mov ecx, ebx;
    		shr ebx, 0x10;
    		shl ecx, 0x10;
    		or ebx, ecx;
    		shr ecx, 0x10;
    		and ecx, 0xFF00;
    		or ebx, ecx;
    		and ebx, 0xFFFFFF;
    		or ebx, 0xFF000000;
    		
    		mov [eax], ebx;
    		inc edx;
    		cmp edx, nBytes;
    		jne pixloop;
    	}
    }

    Откопал очередной свой велосипедный класс, в нем попался такой вот метод для конвертирования цветов ARGB в ABGR.

    Запостил: just_nameless, 28 Марта 2013

    Комментарии (10) RSS

    • Это не ARGB -> ABGR. Это RGB -> ABGR ;)
      Ответить
    • Если уж байтоёбить, то я переписал бы 15-24 вот так:
      mov ecx, ebx
      ror ecx, 16
      and ebx, 0xFF00FF00
      and ecx, 0x00FF00FF
      or ebx, ecx
      or ebx, 0xFF000000 ; можно убрать, если конвертим ARGB а не RGB
      Ответить
    • Да и сам цикл какой-то совсем не байтоебский... Я бы написал как-то так
      __asm {
          mov eax, d
          mov edx, nBytes ; идем с конца, так проще
          jmp start
      
      pixloop:
          dec edx
      
          mov ebx, [eax+edx*4]
      
          mov ecx, ebx
          ror ecx, 16
          and ebx, 0xFF00FF00
          and ecx, 0x00FF00FF
          or ebx, ecx
          or ebx, 0xFF000000 ; убираем эту строку если нужно сохранить A
      
          mov [eax+edx*4], ebx
      
      start:
          test edx, edx
          jne pixloop
      }
      Ответить
    • Да, точно, там действительно альфа заменяется на 255. Добавил этот костыль уже после основного кода, и только сейчас вспомнил о нем.
      Кстати, как выяснилось позже, этот код оказался быстрее:
      int i = scrW * scrH;
      unsigned char *pixel = image;
      unsigned char tmp;
      while (i--)
      {
      	tmp = pixel[0];
      	pixel[0] = pixel[2];
      	pixel[2] = tmp;
      	pixel[3] = 0;
      	pixel += 4;
      }
      Ответить

    Добавить комментарий