Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2009, 22:39   #1
gizmonder
 
Регистрация: 19.05.2009
Сообщений: 3
Стрелка MMX инструкции , С++ и *.bmp

Задание. Сформируйте 2 файла в формате BMP с произвольной картинкой и с некоторым фрагментом на однородном фоне. Напишите программу, которая выполняет наложение фрагмента на картинку.



UPDATE: уже разобрался

Код:
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
#include <sys\stat.h>
#include <windows.h>

void mmx(void * p1, void * p2, int s)
{
//так можно определять 64-разрядные данные
__int64 mask = 0xffffffffffffffff;
__asm
{
mov esi, p1
mov edi, p2
mov ecx, s

l1:
movq mm2, mask //;обнулить регистр mm2
movq mm0, [esi] //;загрузить восемь байтов спрайта 
movq mm1, [edi] //;загрузить восемь байтов фона
pcmpeqb mm2, mm0 //;сделать маску байтов, которые надо вывести
pand mm2, mm0 //;обнулить ненужные
por mm1, mm0 //;сложить их с байтами спрайта
movq [esi], mm1 //;сохранить их обратно на изображение

add esi, 8
add edi, 8
sub ecx,8
cmp ecx,0
jg l1
//emms
}
}

int main(int argc, char* argv[])
{
int h_bmp1, h_bmp2, h_bmp3;
h_bmp1 = _open("r1.bmp", _O_RDONLY);
h_bmp2 = _open("r2.bmp", _O_RDONLY);
unsigned char * buf_bmp1, * buf_bmp2, * p1, * p2;
unsigned long len_bmp1, len_bmp2;
len_bmp1 = filelength(h_bmp1);
len_bmp2 = filelength(h_bmp2);

p1 = buf_bmp1 = new unsigned char[len_bmp1];
p2 = buf_bmp2 = new unsigned char[len_bmp2];
buf_bmp1=p1;
_read(h_bmp1, p1, len_bmp1);
_read(h_bmp2, p2, len_bmp2);

BITMAPFILEHEADER bmp_fh1, bmp_fh2;
BITMAPINFO bmp_inf1, bmp_inf2;
bmp_fh1 = *((BITMAPFILEHEADER*)p1);
bmp_fh2 = *((BITMAPFILEHEADER*)p2);
p1 = p1 + sizeof(BITMAPFILEHEADER);
p2 = p2 + sizeof(BITMAPFILEHEADER);
bmp_inf1 = *((BITMAPINFO*)p1);
bmp_inf2 = *((BITMAPINFO*)p2);
//1020 = размер_элемента_палитры(4)*(размер_ палитры(256) - 1)
p1 = p1 + sizeof(BITMAPINFO)+1020;
p2 = p2 + sizeof(BITMAPINFO)+1020;

mmx(p1, p2, bmp_inf1.bmiHeader.biSizeImage);

h_bmp3 = _open("r3.bmp", _O_WRONLY);
_write(h_bmp3,buf_bmp1/*p1*/, len_bmp1)

_close(h_bmp1);
_close(h_bmp2);
_close(h_bmp3);

return 0;
}

Последний раз редактировалось Sazary; 16.11.2009 в 00:38. Причина: update
gizmonder вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
bmp картинки B@R@B@$HK@ Общие вопросы C/C++ 0 09.06.2009 23:08
Почему после выполнения do-while, вложенного в if, инструкции дальше не выполняются? Chewing_dog Помощь студентам 3 09.06.2009 06:44
Регистры и команды i486 i586 i686 SSE MMX SSE2 etc в качестве альтернативы памяти. Ivan_32 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 02.06.2009 00:30
работа с .bmp DeadWorm Общие вопросы C/C++ 4 16.04.2009 14:09
Декодирование BMP Rezet Мультимедиа в Delphi 6 24.01.2009 22:33