Advertisement
Slapoguzov

LSP_lab2_ver4

Oct 23rd, 2014
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.07 KB | None | 0 0
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <math.h>
  5. #include <time.h>
  6.  
  7.  
  8.  
  9. #pragma pack(push, 2)
  10. typedef struct {
  11.     char signature[2];
  12.     int size;
  13.     short emptyField1;
  14.     short emptyField2;
  15.     int data;
  16.     int lengthHead;
  17.     int width;
  18.     int heidth;
  19.     short countColorPlace;
  20.     short bit;
  21.     char methodArch[4];
  22.     int lengthRastrMas;
  23.     int gorisResolution;
  24.     int vertResolution;
  25.     int countColorPic;
  26.     int countMainColor;
  27. } head_bmp;
  28. #pragma pack(pop)
  29.  
  30. char nameFile[] = "1.bmp";
  31.  
  32. int saveImg(char *buf, head_bmp head, int width, int heigth, int comp, char name[])
  33. {
  34.     FILE *f;
  35.     if ((fopen_s(&f, name, "wb")) != 0)
  36.     {
  37.         printf("Ошибочка вышла: файла не существует");
  38.         return -5;
  39.     }
  40.  
  41.  
  42.     fwrite(&head, sizeof(char)* 54, 1, f);
  43.     fseek(f, head.data, SEEK_SET);
  44.     fwrite(buf, sizeof(char)* ((3 * width*heigth) + (comp*heigth)), 1, f);
  45.     fclose(f);
  46.  
  47.     return 0;
  48. }
  49.  
  50. char* reflectGorisA(char *buffer, int width, int heigth, int comp)
  51. {
  52.     int i, j, index, w;
  53.     char t;
  54.  
  55.     __asm
  56.     {
  57.  
  58.  
  59.         //for (i = 1; i <= heigth/2; i = i + 1)
  60.             mov i, 1
  61.             jmp SHORT LN6
  62.             LN5:
  63.             mov eax,i
  64.             add eax, 1
  65.             mov i, eax
  66.             LN6:
  67.             mov eax, heigth
  68.             cdq
  69.             sub eax, edx
  70.             sar eax, 1
  71.             cmp i, eax
  72.             jg  LN4
  73.         //index = 3 * (i - 1)*width + (i - 1)*comp;
  74.             mov eax, i
  75.             sub eax, 1
  76.             imul ecx, eax, 3
  77.             imul ecx,width
  78.             mov edx, i
  79.             sub edx, 1
  80.             imul    edx, comp
  81.             add ecx, edx
  82.             mov index, ecx
  83.         //w = (int)3 * width;
  84.             imul    eax, width, 3
  85.             mov w, eax
  86.         //for (j = 0; j <= w; j = j + 1)
  87.             mov j, 0
  88.             jmp SHORT LN3
  89.             LN2:
  90.             mov eax, j
  91.             add eax, 1
  92.             mov j, eax
  93.             LN3:
  94.             mov eax, j
  95.             cmp eax, w
  96.             jg SHORT LNE
  97.         //t = buffer[index + j];
  98.             mov  eax, index;
  99.             add  eax, j;
  100.             mov  esi, buffer;
  101.             add esi, eax;
  102.             lodsb;
  103.             mov t, al;
  104.        //buffer[index + j] = buffer[((3 * width*heigth + heigth*comp) - (3*width*i + comp*i)) + j];
  105.             imul eax, width, 3
  106.             imul eax, heigth
  107.             mov ecx, heigth
  108.             imul ecx, comp
  109.             add eax, ecx
  110.             imul edx, width, 3
  111.             imul edx, i
  112.             mov ecx,comp
  113.             imul    ecx, i
  114.             add edx, ecx
  115.             sub eax, edx
  116.             add eax, j
  117.             mov edi, index
  118.             add edi, j
  119.             add edi, buffer
  120.             mov esi, buffer
  121.             add esi, eax
  122.             lodsb
  123.             stos
  124.         //buffer[((3 * width*heigth + heigth*comp) - (3*width*i+comp*i)) + j] = t;
  125.             imul edi, width, 3
  126.             imul    edi, heigth
  127.             mov ecx, heigth
  128.             imul    ecx, comp
  129.             add edi, ecx
  130.             imul    edx, width, 3
  131.             imul    edx,i
  132.             mov ecx, comp
  133.             imul    ecx,i
  134.             add edx, ecx
  135.             sub edi, edx
  136.             add edi, j
  137.             add edi, buffer
  138.             mov al, t
  139.             stos
  140.         //Line 149
  141.             jmp LN2
  142.         LNE:
  143.         //Line 150
  144.             jmp LN5
  145.             LN4:
  146.     }
  147.  
  148.     return buffer;
  149. }
  150.  
  151. char* reflectGoris(char *buffer, int width, int heigth, int comp)
  152. {
  153.     int i, j, index, w;
  154.     char t;
  155.  
  156.  
  157.  
  158.     for (i = 1; i <= heigth/2; i = i + 1)
  159.     {
  160.         index = 3 * (i - 1)*width + (i - 1)*comp;
  161.         w = (int)3 * width;
  162.         for (j = 0; j <= w; j = j + 1)
  163.         {
  164.             t = buffer[index + j];
  165.             buffer[index + j] = buffer[((3 * width*heigth + heigth*comp) - (3*width*i + comp*i)) + j];
  166.             buffer[((3 * width*heigth + heigth*comp) - (3*width*i+comp*i)) + j] = t;
  167.  
  168.         }
  169.     }
  170.     return buffer;
  171. }
  172. int main()
  173. {
  174.     clock_t time = clock(NULL);
  175.     clock_t time2 = clock(NULL);
  176.     head_bmp imgHead;
  177.     FILE* f;
  178.     char *buffer;
  179.     char *buffer2;
  180.     int comp;
  181.     int r;
  182.     char name[] = "1_1_A.bmp";
  183.     char name2[] = "1_2_S.bmp";
  184.  
  185.  
  186.     if ((fopen_s(&f,"1.bmp", "rb")) != 0)
  187.     {
  188.         printf("Ошибочка вышла: файла не существует");
  189.         return -10;
  190.     }
  191.  
  192.     fread_s(&imgHead, sizeof(char)* 54, 1, sizeof(char)* 54, f);
  193.     if (imgHead.signature[0] == 'B' && imgHead.signature[1] == 'M')
  194.     {
  195.  
  196.         if (imgHead.bit == 24)
  197.         {
  198.             comp = (4 - (3 * imgHead.width) % 4);
  199.             buffer = (char*)malloc(sizeof(char)* ((3 * imgHead.width*imgHead.heidth) + (comp*imgHead.heidth)));
  200.             buffer2 = (char*)malloc(sizeof(char)* ((3 * imgHead.width*imgHead.heidth) + (comp*imgHead.heidth)));
  201.             fseek(f, imgHead.data, SEEK_SET);
  202.             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);
  203.             fseek(f, imgHead.data, SEEK_SET);
  204.             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);
  205.  
  206.             for (r = 0; r < 299; r++)
  207.             {
  208.                 buffer2 = reflectGorisA(buffer2, imgHead.width, imgHead.heidth, comp);
  209.             }
  210.             time = clock() - time;
  211.             time2 = clock();
  212.             for (r = 0; r < 299; r++)
  213.             {
  214.                 buffer = reflectGorisA(buffer, imgHead.width, imgHead.heidth, comp);
  215.             }
  216.             time2 = clock() - time2;
  217.  
  218.             saveImg(buffer2, imgHead, imgHead.width, imgHead.heidth, comp, name);
  219.             saveImg(buffer, imgHead, imgHead.width, imgHead.heidth, comp, name2);
  220.  
  221.  
  222.         }
  223.         else
  224.         {
  225.             printf("BitColor");
  226.  
  227.         }
  228.     }
  229.  
  230.     else
  231.     {
  232.         printf("Format");
  233.  
  234.     }
  235.  
  236.     fclose(f);
  237.  
  238.     fprintf(stderr, "C: %fc", (double)time / CLOCKS_PER_SEC);
  239.     fprintf(stderr, "\nASM: %fc", (double)time2 / CLOCKS_PER_SEC);
  240.     scanf_s(&buffer);
  241.  
  242.     free(&buffer);
  243.     free(&buffer2);
  244.  
  245.     return 0;
  246. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement