LazyShpee

compose tga

Sep 18th, 2017
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.90 KB | None | 0 0
  1. #include <iostream>
  2. #include "TargaImage.h"
  3.  
  4. #define MAX(a, b) (a > b ? a : b)
  5. #define MIN(a, b) (a < b ? a : b)
  6. #define CLIP(c) (MIN(MAX(0, c), 255))
  7.  
  8. int main(int c, char **v) {
  9.   if (c != 3) {
  10.     std::cerr << "Syntax: " << v[0] << " <original.tga> <compose.tga>" << std::endl;
  11.     return 42;
  12.   }
  13.   TargaImage *image = TargaImage::readImage(v[1]);
  14.   unsigned char *p1 = image->pixels();
  15.   unsigned int h = image->height();
  16.   unsigned int w = image->width();
  17.  
  18.   TargaImage *out = TargaImage::blankImage(w, h * 6);
  19.   unsigned char *p2 = out->pixels();
  20.  
  21.   for (unsigned int i = 0; i < w * h * 6; i++) {
  22.     unsigned int ii = i % (w * h); // Original pixel array offset
  23.     unsigned char r = p1[ii * 4], g = p1[ii * 4 + 1], b = p1[ii * 4 + 2];
  24.  
  25.     p2[i * 4 + 3] = p1[ii * 4 + 3]; // Always set alpha to original alpha
  26.     switch(i / w / h) {
  27.       case 0: // Lighten
  28.         p2[i * 4]     = CLIP(r + 50);
  29.         p2[i * 4 + 1] = CLIP(g + 50);
  30.         p2[i * 4 + 2] = CLIP(b + 50);
  31.         break;
  32.       case 1: // Darken
  33.         p2[i * 4]     = CLIP(r - 50);
  34.         p2[i * 4 + 1] = CLIP(g - 50);
  35.         p2[i * 4 + 2] = CLIP(b - 50);
  36.         break;
  37.       case 2: // Low Contrast
  38.         p2[i * 4]     = CLIP(r / 2);
  39.         p2[i * 4 + 1] = CLIP(g / 2);
  40.         p2[i * 4 + 2] = CLIP(b / 2);
  41.         break;
  42.       case 3: // High Contrast
  43.         p2[i * 4]     = CLIP(r * 2);
  44.         p2[i * 4 + 1] = CLIP(g * 2);
  45.         p2[i * 4 + 2] = CLIP(b * 2);
  46.         break;
  47.       case 4: // Low Contrast
  48.         p2[i * 4] = p2[i * 4 + 1] = p2[i * 4 + 2] = CLIP(r * 0.299 + g * 0.587 + b * 0.114);
  49.         break;
  50.       case 5: // Low Contrast
  51.         p2[i * 4]     = CLIP(r * 0.393 + g * 0.769 + b * 0.189);
  52.         p2[i * 4 + 1] = CLIP(r * 0.349 + g * 0.686 + b * 0.168);
  53.         p2[i * 4 + 2] = CLIP(r * 0.272 + g * 0.534 + b * 0.131);
  54.         break;
  55.     }
  56.   }
  57.  
  58.   out->write(v[2]);
  59.  
  60.   return 0;
  61. }
Advertisement
Add Comment
Please, Sign In to add comment