Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- #include <time.h>
- #pragma pack(push, 2)
- typedef struct {
- char signature[2];
- int size;
- short emptyField1;
- short emptyField2;
- int data;
- int lengthHead;
- int width;
- int heidth;
- short countColorPlace;
- short bit;
- char methodArch[4];
- int lengthRastrMas;
- int gorisResolution;
- int vertResolution;
- int countColorPic;
- int countMainColor;
- } head_bmp;
- #pragma pack(pop)
- char nameFile[] = "1.bmp";
- int saveImg(char *buf, head_bmp head, int width, int heigth, int comp, char name[])
- {
- FILE *f;
- if ((fopen_s(&f, name, "wb")) != 0)
- {
- printf("Ошибочка вышла: файла не существует");
- return -5;
- }
- fwrite(&head, sizeof(char)* 54, 1, f);
- fseek(f, head.data, SEEK_SET);
- fwrite(buf, sizeof(char)* ((3 * width*heigth) + (comp*heigth)), 1, f);
- fclose(f);
- return 0;
- }
- char* reflectGorisA(char *buffer, int width, int heigth, int comp)
- {
- int i, j, index, w;
- char t;
- __asm
- {
- //for (i = 1; i <= heigth/2; i = i + 1)
- mov i, 1
- jmp SHORT LN6
- LN5:
- mov eax,i
- add eax, 1
- mov i, eax
- LN6:
- mov eax, heigth
- cdq
- sub eax, edx
- sar eax, 1
- cmp i, eax
- jg LN4
- //index = 3 * (i - 1)*width + (i - 1)*comp;
- mov eax, i
- sub eax, 1
- imul ecx, eax, 3
- imul ecx,width
- mov edx, i
- sub edx, 1
- imul edx, comp
- add ecx, edx
- mov index, ecx
- //w = (int)3 * width;
- imul eax, width, 3
- mov w, eax
- //for (j = 0; j <= w; j = j + 1)
- mov j, 0
- jmp SHORT LN3
- LN2:
- mov eax, j
- add eax, 1
- mov j, eax
- LN3:
- mov eax, j
- cmp eax, w
- jg SHORT LNE
- //t = buffer[index + j];
- mov eax, index;
- add eax, j;
- mov esi, buffer;
- add esi, eax;
- lodsb;
- mov t, al;
- //buffer[index + j] = buffer[((3 * width*heigth + heigth*comp) - (3*width*i + comp*i)) + j];
- imul eax, width, 3
- imul eax, heigth
- mov ecx, heigth
- imul ecx, comp
- add eax, ecx
- imul edx, width, 3
- imul edx, i
- mov ecx,comp
- imul ecx, i
- add edx, ecx
- sub eax, edx
- add eax, j
- mov edi, index
- add edi, j
- add edi, buffer
- mov esi, buffer
- add esi, eax
- lodsb
- stos
- //buffer[((3 * width*heigth + heigth*comp) - (3*width*i+comp*i)) + j] = t;
- imul edi, width, 3
- imul edi, heigth
- mov ecx, heigth
- imul ecx, comp
- add edi, ecx
- imul edx, width, 3
- imul edx,i
- mov ecx, comp
- imul ecx,i
- add edx, ecx
- sub edi, edx
- add edi, j
- add edi, buffer
- mov al, t
- stos
- //Line 149
- jmp LN2
- LNE:
- //Line 150
- jmp LN5
- LN4:
- }
- return buffer;
- }
- char* reflectGoris(char *buffer, int width, int heigth, int comp)
- {
- int i, j, index, w;
- char t;
- for (i = 1; i <= heigth/2; i = i + 1)
- {
- index = 3 * (i - 1)*width + (i - 1)*comp;
- w = (int)3 * width;
- for (j = 0; j <= w; j = j + 1)
- {
- t = buffer[index + j];
- buffer[index + j] = buffer[((3 * width*heigth + heigth*comp) - (3*width*i + comp*i)) + j];
- buffer[((3 * width*heigth + heigth*comp) - (3*width*i+comp*i)) + j] = t;
- }
- }
- return buffer;
- }
- int main()
- {
- clock_t time = clock(NULL);
- clock_t time2 = clock(NULL);
- head_bmp imgHead;
- FILE* f;
- char *buffer;
- char *buffer2;
- int comp;
- int r;
- char name[] = "1_1_A.bmp";
- char name2[] = "1_2_S.bmp";
- if ((fopen_s(&f,"1.bmp", "rb")) != 0)
- {
- printf("Ошибочка вышла: файла не существует");
- return -10;
- }
- fread_s(&imgHead, sizeof(char)* 54, 1, sizeof(char)* 54, f);
- if (imgHead.signature[0] == 'B' && imgHead.signature[1] == 'M')
- {
- if (imgHead.bit == 24)
- {
- comp = (4 - (3 * imgHead.width) % 4);
- buffer = (char*)malloc(sizeof(char)* ((3 * imgHead.width*imgHead.heidth) + (comp*imgHead.heidth)));
- buffer2 = (char*)malloc(sizeof(char)* ((3 * imgHead.width*imgHead.heidth) + (comp*imgHead.heidth)));
- fseek(f, imgHead.data, SEEK_SET);
- fread_s(buffer, sizeof(char)* ((3 * imgHead.width*imgHead.heidth) + (comp*imgHead.heidth)), 1, sizeof(char)* ((3 * imgHead.width*imgHead.heidth) + (comp*imgHead.heidth)), f);
- fseek(f, imgHead.data, SEEK_SET);
- fread_s(buffer2, sizeof(char)* ((3 * imgHead.width*imgHead.heidth) + (comp*imgHead.heidth)), 1, sizeof(char)* ((3 * imgHead.width*imgHead.heidth) + (comp*imgHead.heidth)), f);
- for (r = 0; r < 299; r++)
- {
- buffer2 = reflectGorisA(buffer2, imgHead.width, imgHead.heidth, comp);
- }
- time = clock() - time;
- time2 = clock();
- for (r = 0; r < 299; r++)
- {
- buffer = reflectGorisA(buffer, imgHead.width, imgHead.heidth, comp);
- }
- time2 = clock() - time2;
- saveImg(buffer2, imgHead, imgHead.width, imgHead.heidth, comp, name);
- saveImg(buffer, imgHead, imgHead.width, imgHead.heidth, comp, name2);
- }
- else
- {
- printf("BitColor");
- }
- }
- else
- {
- printf("Format");
- }
- fclose(f);
- fprintf(stderr, "C: %fc", (double)time / CLOCKS_PER_SEC);
- fprintf(stderr, "\nASM: %fc", (double)time2 / CLOCKS_PER_SEC);
- scanf_s(&buffer);
- free(&buffer);
- free(&buffer2);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement