Advertisement
Guest User

Untitled

a guest
Nov 17th, 2019
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.99 KB | None | 0 0
  1. #include <inttypes.h>
  2. #include <math.h>
  3. #include <stdbool.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <smmintrin.h>
  7. #include <xmmintrin.h>
  8.  
  9. const uint8_t INF_BYTES = 26;
  10.  
  11. bool read_pack(int n, FILE* f_in, FILE* f_out)
  12. {
  13.     uint8_t* a = (uint8_t*)_mm_malloc(n * sizeof(uint8_t), sizeof(uint8_t));
  14.     int readed = fread(a, sizeof(*a), n, f_in);
  15.     if (f_out != NULL) {
  16.         fwrite(a, sizeof(*a), readed, f_out);
  17.     }
  18.     _mm_free(a);
  19.     return readed == n;
  20. }
  21.  
  22. uint32_t read_information(FILE* fin,
  23.     FILE* fout,
  24.     int32_t* width,
  25.     int32_t* height)
  26. {
  27.     read_pack(10, fin, fout);
  28.     uint32_t bOffBits;
  29.     fread(&bOffBits, sizeof(uint32_t), 1, fin);
  30.  
  31.     if (fout != NULL) {
  32.         fwrite(&bOffBits, sizeof(bOffBits), 1, fout);
  33.     }
  34.     read_pack(4, fin, fout);
  35.    
  36.        
  37.     fread(width, sizeof(*width), 1, fin);
  38.     fread(height, sizeof(*height), 1, fin);
  39.     if (fout != NULL) {
  40.         fwrite(width, sizeof(*width), 1, fout);
  41.         fwrite(height, sizeof(*height), 1, fout);
  42.     }
  43.     return bOffBits;
  44. }
  45.  
  46. void read_from_file(
  47.     FILE* fin,
  48.     FILE* fout,
  49.     uint8_t*** color,
  50.     int32_t* width,
  51.     int32_t* height)
  52. {
  53.     uint32_t bOffBits = read_information(fin, fout, width, height);
  54.  
  55.     read_pack(bOffBits - INF_BYTES, fin, fout);
  56.  
  57.     (*color)[0] = (uint8_t*)_mm_malloc((*height) * (*width) * sizeof(uint8_t), sizeof(uint8_t));
  58.     (*color)[1] = (uint8_t*)_mm_malloc((*height) * (*width) * sizeof(uint8_t), sizeof(uint8_t));
  59.     (*color)[2] = (uint8_t*)_mm_malloc((*height) * (*width) * sizeof(uint8_t), sizeof(uint8_t));
  60.     (*color)[3] = (uint8_t*)_mm_malloc((*height) * (*width) * sizeof(uint8_t), sizeof(uint8_t));
  61.    
  62.     for (int32_t i = 0; i < (*height) * (*width); ++i) {
  63.         fread((*color)[0] + i, sizeof(uint8_t), 1, fin);
  64.         fread((*color)[1] + i, sizeof(uint8_t), 1, fin);
  65.         fread((*color)[2] + i, sizeof(uint8_t), 1, fin);
  66.         fread((*color)[3] + i, sizeof(uint8_t), 1, fin);
  67.     }
  68.  
  69. }
  70.  
  71. void recalculate(uint8_t** color1, int32_t width, int32_t height, uint8_t** color2)
  72. {
  73.     uint8_t* recalc = _mm_malloc(sizeof(uint8_t) * 4, sizeof(uint8_t));
  74.    
  75.     for (int32_t i = 0; i < height; ++i) {
  76.         for (int32_t j = 0; j + 4 < width; j += 4) {
  77.             int32_t ind = i * width + j;
  78.             color1[0][ind] = 255;
  79.             color1[0][ind + 1] = 255;
  80.             color1[0][ind + 2] = 255;
  81.             color1[0][ind + 3] = 255;
  82.            
  83.            
  84.             __m128 A2 = _mm_set_epi32(color2[0][ind + 3], color2[0][ind + 2], color2[0][ind + 1], color2[0][ind + 0]);
  85.             __m128 A2_255 = _mm_set_epi32(255 - color2[0][ind + 3], 255 - color2[0][ind + 2], 255 - color2[0][ind + 1], 255 - color2[0][ind]);
  86.             __m128 max = _mm_set_epi32(255, 255, 255, 255);
  87.            
  88.             __m128 col1 = _mm_set_epi32(color1[2][ind + 3], color1[2][ind + 2], color1[2][ind + 1], color1[2][ind + 0]);
  89.             __m128 col2 = _mm_set_epi32(color2[2][ind + 3], color2[2][ind + 2], color2[2][ind + 1], color2[2][ind + 0]);
  90.            
  91.             col1 = _mm_div_epi32(_mm_add_epi32(_mm_mul_epi32(col1, A2_255), _mm_mul_epi32(col2, A2)), max);
  92.             _mm_store_epi32(recalc, col1);
  93.             color1[2][ind] = (uint8_t)recalc[0];
  94.             color1[2][ind + 1] = (uint8_t)recalc[1];
  95.             color1[2][ind + 2] = (uint8_t)recalc[2];
  96.             color1[2][ind + 3] = (uint8_t)recalc[3];
  97.            
  98.            
  99.            
  100.             col1 = _mm_set_epi32(color1[1][ind + 3], color1[1][ind + 2], color1[1][ind + 1], color1[1][ind + 0]);
  101.             col2 = _mm_set_epi32(color2[1][ind + 3], color2[1][ind + 2], color2[1][ind + 1], color2[1][ind + 0]);
  102.            
  103.             col1 = _mm_div_epi32(_mm_add_epi32(_mm_mul_epi32(col1, A2_255), _mm_mul_epi32(col2, A2)), max);
  104.             _mm_store_epi32(recalc, col1);
  105.             color1[1][ind] = (uint8_t)recalc[0];
  106.             color1[1][ind + 1] = (uint8_t)recalc[1];
  107.             color1[1][ind + 2] = (uint8_t)recalc[2];
  108.             color1[1][ind + 3] = (uint8_t)recalc[3];
  109.          
  110.             col1 = _mm_set_epi32(color1[3][ind + 3], color1[3][ind + 2], color1[3][ind + 1], color1[3][ind + 0]);
  111.             col2 = _mm_set_epi32(color2[3][ind + 3], color2[3][ind + 2], color2[3][ind + 1], color2[3][ind + 0]);
  112.             col1 = _mm_div_epi32(_mm_add_epi32(_mm_mul_epi32(col1, A2_255), _mm_mul_epi32(col2, A2)), max);
  113.             _mm_store_epi32(recalc, col1);
  114.             color1[3][ind] = (uint8_t)recalc[0];
  115.             color1[3][ind + 1] = (uint8_t)recalc[1];
  116.             color1[3][ind + 2] = (uint8_t)recalc[2];
  117.             color1[3][ind + 3] = (uint8_t)recalc[3];
  118.         }
  119.     }
  120.     _mm_free(recalc);
  121. }
  122.  
  123. void write_to_file(FILE* file, uint32_t height, uint32_t width, uint8_t** color1)
  124. {
  125.     for (int32_t i = 0; i < height * width; ++i) {
  126.         fwrite(color1[0] + i, sizeof(uint8_t), 1, file);
  127.         fwrite(color1[1] + i, sizeof(uint8_t), 1, file);
  128.         fwrite(color1[2] + i, sizeof(uint8_t), 1, file);
  129.         fwrite(color1[3] + i, sizeof(uint8_t), 1, file);
  130.     }
  131. }
  132.  
  133. void free_arr(uint8_t*** col)
  134. {
  135.     _mm_free((*col)[0]);
  136.     _mm_free((*col)[1]);
  137.     _mm_free((*col)[2]);
  138.     _mm_free((*col)[3]);
  139.     _mm_free(*col);
  140. }
  141.  
  142. int main(int argc, char* argv[])
  143. {
  144.     FILE* f1 = fopen(argv[1], "rb");
  145.     FILE* f2 = fopen(argv[2], "rb");
  146.     FILE* fout = fopen(argv[3], "wb");
  147.  
  148.    
  149.     uint8_t** color1 = (uint8_t**)_mm_malloc(4 * sizeof(uint8_t*), sizeof(uint8_t*));
  150.     int32_t width1;
  151.     int32_t height1;
  152.  
  153.     uint8_t** color2 = (uint8_t**)_mm_malloc(4 * sizeof(uint8_t*), sizeof(uint8_t*));
  154.     int32_t width2;
  155.     int32_t height2;
  156.  
  157.     read_from_file(f1, fout, &color1, &width1, &height1);
  158.     read_from_file(f2, NULL, &color2, &width2, &height2);
  159.  
  160.    
  161.     recalculate(color1, width1, height1, color2);
  162.  
  163.     write_to_file(fout, height1, width1, color1);
  164.    
  165.     while (read_pack(1000, f1, fout)) {
  166.         continue;
  167.     }
  168.    
  169.     free_arr(&color1);
  170.     free_arr(&color2);
  171.     return 0;
  172. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement