Imported Upstream version 2.3.1
[platform/upstream/harfbuzz.git] / util / ansi-print.cc
index 873bee8..49a0477 100644 (file)
 #include <unistd.h> /* for isatty() */
 #endif
 
+#if defined (_MSC_VER) && (_MSC_VER < 1800)
+static inline long int
+lround (double x)
+{
+  if (x >= 0)
+    return floor (x + 0.5);
+  else
+    return ceil (x - 0.5);
+}
+#endif
+
+#define ESC_E (char)27
+
 #define MIN(a,b) ((a) < (b) ? (a) : (b))
 
 #define CELL_W 8
@@ -58,10 +71,10 @@ struct color_t
 {
   static color_t from_ansi (unsigned int x)
   {
-    color_t c = {(0xFF<<24) | ((0xFF*(x&1))<<16) | ((0xFF*((x >> 1)&1))<<8) | (0xFF*((x >> 2)&1))};
+    color_t c = {(0xFFu<<24) | ((0xFFu*(x&1))<<16) | ((0xFFu*((x >> 1)&1))<<8) | (0xFFu*((x >> 2)&1))};
     return c;
   }
-  unsigned int to_ansi (void)
+  unsigned int to_ansi ()
   {
     return ((v >> 23) & 1) | ((v >> 14)&2) | ((v >> 5)&4);
   }
@@ -97,7 +110,7 @@ struct image_t
                own_data (true),
                data ((color_t *) malloc (sizeof (data[0]) * width * height)),
                stride (width) {}
-  ~image_t (void)
+  ~image_t ()
   { if (own_data) free (data); }
 
   color_t &operator () (unsigned int x, unsigned int y)
@@ -146,8 +159,9 @@ struct biimage_t
   biimage_t (unsigned int width, unsigned int height) :
                width (width),
                height (height),
+               bg (0), fg (0), unicolor (true),
                data ((uint8_t *) malloc (sizeof (data[0]) * width * height)) {}
-  ~biimage_t (void)
+  ~biimage_t ()
   { free (data); }
 
   void set (const image_t &image)
@@ -209,12 +223,13 @@ struct biimage_t
   uint8_t * const data;
 };
 
-const char *
-block_best (const biimage_t &bi, unsigned int *score, bool *inverse)
+static const char *
+block_best (const biimage_t &bi, bool *inverse)
 {
   assert (bi.width  <= CELL_W);
   assert (bi.height <= CELL_H);
 
+  unsigned int score = (unsigned int) -1;
   unsigned int row_sum[CELL_H] = {0};
   unsigned int col_sum[CELL_W] = {0};
   unsigned int row_sum_i[CELL_H] = {0};
@@ -250,14 +265,14 @@ block_best (const biimage_t &bi, unsigned int *score, bool *inverse)
   const char *best_c = " ";
 
   /* Maybe empty is better! */
-  if (total < *score) {
-    *score = total;
+  if (total < score) {
+    score = total;
     *inverse = false;
     best_c = " ";
   }
   /* Maybe full is better! */
-  if (total_i < *score) {
-    *score = total_i;
+  if (total_i < score) {
+    score = total_i;
     *inverse = true;
     best_c = " ";
   }
@@ -283,11 +298,11 @@ block_best (const biimage_t &bi, unsigned int *score, bool *inverse)
        best_inv = true;
       }
     }
-    if (best_s < *score) {
+    if (best_s < score) {
       static const char *lower[7] = {"▁", "▂", "▃", "▄", "▅", "▆", "▇"};
-      unsigned int which = lround (((best_i + 1) * 8) / bi.height);
+      unsigned int which = lround ((double) ((best_i + 1) * 8) / bi.height);
       if (1 <= which && which <= 7) {
-       *score = best_s;
+       score = best_s;
        *inverse = best_inv;
        best_c = lower[7 - which];
       }
@@ -315,11 +330,11 @@ block_best (const biimage_t &bi, unsigned int *score, bool *inverse)
        best_inv = false;
       }
     }
-    if (best_s < *score) {
+    if (best_s < score) {
       static const char *left [7] = {"▏", "▎", "▍", "▌", "▋", "▊", "▉"};
-      unsigned int which = lround (((best_i + 1) * 8) / bi.width);
+      unsigned int which = lround ((double) ((best_i + 1) * 8) / bi.width);
       if (1 <= which && which <= 7) {
-       *score = best_s;
+       score = best_s;
        *inverse = best_inv;
        best_c = left[which - 1];
       }
@@ -337,8 +352,8 @@ block_best (const biimage_t &bi, unsigned int *score, bool *inverse)
          qs += quad_i[i][j];
        } else
          qs += quad[i][j];
-    if (qs < *score) {
-      const char *c = NULL;
+    if (qs < score) {
+      const char *c = nullptr;
       bool inv = false;
       switch (q) {
        case 1:  c = "▟"; inv = true;  break;
@@ -353,7 +368,7 @@ block_best (const biimage_t &bi, unsigned int *score, bool *inverse)
        case 14: c = "▟"; inv = true;  break;
       }
       if (c) {
-       *score = qs;
+       score = qs;
        *inverse = inv;
        best_c = c;
       }
@@ -382,24 +397,23 @@ ansi_print_image_rgb24 (const uint32_t *data,
       bi.set (cell);
       if (bi.unicolor) {
         if (last_bg != bi.bg) {
-         printf ("\e[%dm", 40 + bi.bg);
+         printf ("%c[%dm", ESC_E, 40 + bi.bg);
          last_bg = bi.bg;
        }
        printf (" ");
       } else {
         /* Figure out the closest character to the biimage */
-        unsigned int score = (unsigned int) -1;
        bool inverse = false;
-        const char *c = block_best (bi, &score, &inverse);
+        const char *c = block_best (bi, &inverse);
        if (inverse) {
          if (last_bg != bi.fg || last_fg != bi.bg) {
-           printf ("\e[%d;%dm", 30 + bi.bg, 40 + bi.fg);
+           printf ("%c[%d;%dm", ESC_E, 30 + bi.bg, 40 + bi.fg);
            last_bg = bi.fg;
            last_fg = bi.bg;
          }
        } else {
          if (last_bg != bi.bg || last_fg != bi.fg) {
-           printf ("\e[%d;%dm", 40 + bi.bg, 30 + bi.fg);
+           printf ("%c[%d;%dm", ESC_E, 40 + bi.bg, 30 + bi.fg);
            last_bg = bi.bg;
            last_fg = bi.fg;
          }
@@ -407,7 +421,7 @@ ansi_print_image_rgb24 (const uint32_t *data,
        printf ("%s", c);
       }
     }
-    printf ("\e[0m\n"); /* Reset */
+    printf ("%c[0m\n", ESC_E); /* Reset */
     last_bg = last_fg = -1;
   }
 }