Blame src/image.cpp

Packit 1c1d7e
/******************************************************************************
Packit 1c1d7e
 *
Packit 1c1d7e
 * 
Packit 1c1d7e
 *
Packit 1c1d7e
 *
Packit 1c1d7e
 * Copyright (C) 1997-2015 by Dimitri van Heesch.
Packit 1c1d7e
 *
Packit 1c1d7e
 * Permission to use, copy, modify, and distribute this software and its
Packit 1c1d7e
 * documentation under the terms of the GNU General Public License is hereby 
Packit 1c1d7e
 * granted. No representations are made about the suitability of this software 
Packit 1c1d7e
 * for any purpose. It is provided "as is" without express or implied warranty.
Packit 1c1d7e
 * See the GNU General Public License for more details.
Packit 1c1d7e
 *
Packit 1c1d7e
 * Documents produced by Doxygen are derivative works derived from the
Packit 1c1d7e
 * input used in their production; they are not affected by this license.
Packit 1c1d7e
 *
Packit 1c1d7e
 */
Packit 1c1d7e
Packit 1c1d7e
#include "image.h"
Packit 1c1d7e
#include <qfile.h>
Packit 1c1d7e
#include <math.h>
Packit 1c1d7e
#include "lodepng.h"
Packit 1c1d7e
#include "config.h"
Packit 1c1d7e
Packit 1c1d7e
typedef unsigned char  Byte;
Packit 1c1d7e
Packit 1c1d7e
/** Helper struct representing a RGBA color */
Packit 1c1d7e
struct Color
Packit 1c1d7e
{
Packit 1c1d7e
  Byte red;
Packit 1c1d7e
  Byte green;
Packit 1c1d7e
  Byte blue;
Packit 1c1d7e
  Byte alpha;
Packit 1c1d7e
};
Packit 1c1d7e
Packit 1c1d7e
const int charSetWidth=80;
Packit 1c1d7e
const int charHeight=12;
Packit 1c1d7e
const int numChars=96;
Packit 1c1d7e
Packit 1c1d7e
unsigned short charPos[numChars]    = 
Packit 1c1d7e
  {   
Packit 1c1d7e
      0,  5,  8, 13, 20, 27, 38, 47, 
Packit 1c1d7e
     50, 54, 58, 65, 72, 76, 83, 87, 
Packit 1c1d7e
     91, 98,105,112,119,126,133,140,
Packit 1c1d7e
    147,154,161,164,167,174,181,188,
Packit 1c1d7e
    195,207,216,224,233,242,250,258,
Packit 1c1d7e
    267,276,279,286,294,301,312,321,
Packit 1c1d7e
    331,339,349,357,365,372,380,389,
Packit 1c1d7e
    400,409,418,427,430,434,437,443,
Packit 1c1d7e
    450,453,460,467,474,481,488,492,
Packit 1c1d7e
    499,506,509,512,518,521,530,537,
Packit 1c1d7e
    544,551,557,562,568,571,578,585,
Packit 1c1d7e
    594,600,607,613,617,620,624,631
Packit 1c1d7e
  };
Packit 1c1d7e
Packit 1c1d7e
unsigned char charWidth[numChars] = 
Packit 1c1d7e
  {
Packit 1c1d7e
     5, 3, 5, 7, 7,11, 9, 3,
Packit 1c1d7e
     4, 4, 7, 7, 4, 7, 4, 4,
Packit 1c1d7e
Packit 1c1d7e
     7, 7, 7, 7, 7, 7, 7, 7,
Packit 1c1d7e
     7, 7, 3, 3, 7, 7, 7, 7,
Packit 1c1d7e
    12, 9, 8, 9, 9, 8, 8, 9,
Packit 1c1d7e
     9, 3, 7, 8, 7,11, 9,10,
Packit 1c1d7e
     8,10, 8, 8, 7, 8, 9,11,
Packit 1c1d7e
     9, 9, 9, 3, 4, 3, 6, 7,
Packit 1c1d7e
     3, 7, 7, 7, 7, 7, 4, 7,
Packit 1c1d7e
     7, 3, 3, 6, 3, 9, 7, 7,
Packit 1c1d7e
     7, 6, 5, 6, 3, 7, 7, 9,
Packit 1c1d7e
     6, 7, 6, 4, 3, 4, 7, 5   
Packit 1c1d7e
  };
Packit 1c1d7e
Packit 1c1d7e
unsigned char fontRaw[charSetWidth*charHeight] = {
Packit 1c1d7e
  0x02, 0x50, 0x01, 0x06, 0x20, 0x60, 0xc6, 0x04, 0x00, 0x00, 0x00, 0x27,
Packit 1c1d7e
  0x04, 0x1c, 0x38, 0x11, 0xf1, 0xc7, 0xc7, 0x0e, 0x00, 0x00, 0x00, 0x03,
Packit 1c1d7e
  0x81, 0xf0, 0x10, 0x7c, 0x1e, 0x3e, 0x1f, 0x9f, 0x87, 0x88, 0x24, 0x09,
Packit 1c1d7e
  0x09, 0x02, 0x02, 0x41, 0x0f, 0x0f, 0x83, 0xc3, 0xe1, 0xe7, 0xf4, 0x24,
Packit 1c1d7e
  0x12, 0x22, 0x41, 0x20, 0x9f, 0xce, 0x30, 0x00, 0x10, 0x04, 0x00, 0x01,
Packit 1c1d7e
  0x00, 0x30, 0x08, 0x12, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
Packit 1c1d7e
  0x00, 0x00, 0x00, 0x00, 0x01, 0xac, 0x00, 0x00, 0x02, 0x51, 0x43, 0x89,
Packit 1c1d7e
  0x40, 0x90, 0x49, 0x15, 0x00, 0x00, 0x00, 0x28, 0x9c, 0x22, 0x44, 0x31,
Packit 1c1d7e
  0x02, 0x20, 0x48, 0x91, 0x00, 0x00, 0x00, 0x04, 0x46, 0x08, 0x28, 0x42,
Packit 1c1d7e
  0x21, 0x21, 0x10, 0x10, 0x08, 0x48, 0x24, 0x09, 0x11, 0x03, 0x06, 0x61,
Packit 1c1d7e
  0x10, 0x88, 0x44, 0x22, 0x12, 0x10, 0x84, 0x24, 0x12, 0x22, 0x22, 0x20,
Packit 1c1d7e
  0x80, 0x4a, 0x11, 0x00, 0x20, 0x04, 0x00, 0x01, 0x00, 0x40, 0x08, 0x00,
Packit 1c1d7e
  0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
Packit 1c1d7e
  0x02, 0x22, 0x00, 0x00, 0x02, 0x51, 0x45, 0x49, 0x40, 0x90, 0x89, 0x0a,
Packit 1c1d7e
  0x00, 0x00, 0x00, 0x48, 0x84, 0x02, 0x04, 0x51, 0x02, 0x00, 0x88, 0x91,
Packit 1c1d7e
  0x00, 0x00, 0x00, 0x04, 0x44, 0xd4, 0x28, 0x42, 0x40, 0x20, 0x90, 0x10,
Packit 1c1d7e
  0x10, 0x08, 0x24, 0x09, 0x21, 0x03, 0x06, 0x51, 0x20, 0x48, 0x48, 0x12,
Packit 1c1d7e
  0x12, 0x00, 0x84, 0x22, 0x22, 0x22, 0x22, 0x11, 0x00, 0x89, 0x12, 0x80,
Packit 1c1d7e
  0x31, 0xc5, 0x87, 0x0d, 0x1c, 0xe3, 0x4b, 0x12, 0x49, 0x29, 0x16, 0x1c,
Packit 1c1d7e
  0x58, 0x69, 0x4c, 0xe8, 0x91, 0x44, 0x61, 0x44, 0xf2, 0x22, 0x00, 0x00,
Packit 1c1d7e
  0x02, 0x07, 0xe5, 0x06, 0x80, 0x60, 0x10, 0x95, 0x08, 0x00, 0x00, 0x48,
Packit 1c1d7e
  0x84, 0x04, 0x18, 0x51, 0xe2, 0xc0, 0x87, 0x11, 0x24, 0x18, 0x03, 0x00,
Packit 1c1d7e
  0x89, 0x24, 0x44, 0x42, 0x40, 0x20, 0x90, 0x10, 0x10, 0x08, 0x24, 0x09,
Packit 1c1d7e
  0x41, 0x02, 0x8a, 0x51, 0x20, 0x48, 0x48, 0x12, 0x11, 0x80, 0x84, 0x22,
Packit 1c1d7e
  0x21, 0x24, 0x14, 0x11, 0x01, 0x09, 0x14, 0x40, 0x02, 0x26, 0x48, 0x93,
Packit 1c1d7e
  0x22, 0x44, 0xcc, 0x92, 0x51, 0x36, 0x99, 0x22, 0x64, 0x99, 0x92, 0x48,
Packit 1c1d7e
  0x91, 0x44, 0x52, 0x44, 0x12, 0x22, 0x00, 0x00, 0x02, 0x01, 0x43, 0x80,
Packit 1c1d7e
  0x80, 0xa0, 0x10, 0x84, 0x08, 0x00, 0x00, 0x88, 0x84, 0x08, 0x04, 0x90,
Packit 1c1d7e
  0x13, 0x21, 0x08, 0x8f, 0x00, 0x61, 0xf0, 0xc0, 0x8a, 0x24, 0x44, 0x7c,
Packit 1c1d7e
  0x40, 0x20, 0x9f, 0x9f, 0x11, 0xcf, 0xe4, 0x09, 0xc1, 0x02, 0x8a, 0x49,
Packit 1c1d7e
  0x20, 0x4f, 0x88, 0x13, 0xe0, 0x60, 0x84, 0x22, 0x21, 0x54, 0x08, 0x0a,
Packit 1c1d7e
  0x02, 0x08, 0x90, 0x00, 0x00, 0x24, 0x48, 0x11, 0x22, 0x44, 0x48, 0x92,
Packit 1c1d7e
  0x61, 0x24, 0x91, 0x22, 0x44, 0x89, 0x10, 0x48, 0x91, 0x24, 0x8c, 0x44,
Packit 1c1d7e
  0x22, 0x22, 0x64, 0x00, 0x02, 0x07, 0xe1, 0x41, 0x31, 0x14, 0x10, 0x80,
Packit 1c1d7e
  0x3e, 0x07, 0xc0, 0x88, 0x84, 0x10, 0x05, 0x10, 0x12, 0x21, 0x08, 0x81,
Packit 1c1d7e
  0x01, 0x80, 0x00, 0x31, 0x0a, 0x24, 0x7c, 0x42, 0x40, 0x20, 0x90, 0x10,
Packit 1c1d7e
  0x10, 0x48, 0x24, 0x09, 0x21, 0x02, 0x52, 0x45, 0x20, 0x48, 0x08, 0x92,
Packit 1c1d7e
  0x20, 0x10, 0x84, 0x21, 0x41, 0x54, 0x14, 0x04, 0x04, 0x08, 0x90, 0x00,
Packit 1c1d7e
  0x01, 0xe4, 0x48, 0x11, 0x3e, 0x44, 0x48, 0x92, 0x61, 0x24, 0x91, 0x22,
Packit 1c1d7e
  0x44, 0x89, 0x0c, 0x48, 0x8a, 0x24, 0x8c, 0x48, 0x44, 0x21, 0x98, 0x00,
Packit 1c1d7e
  0x02, 0x02, 0x85, 0x41, 0x49, 0x08, 0x10, 0x80, 0x08, 0x00, 0x00, 0x88,
Packit 1c1d7e
  0x84, 0x20, 0x45, 0xf9, 0x12, 0x21, 0x08, 0x81, 0x00, 0x61, 0xf0, 0xc1,
Packit 1c1d7e
  0x0a, 0x68, 0x82, 0x42, 0x40, 0x20, 0x90, 0x10, 0x10, 0x48, 0x24, 0x89,
Packit 1c1d7e
  0x11, 0x02, 0x52, 0x45, 0x20, 0x48, 0x08, 0x52, 0x12, 0x10, 0x84, 0x21,
Packit 1c1d7e
  0x40, 0x88, 0x22, 0x04, 0x08, 0x08, 0x90, 0x00, 0x02, 0x24, 0x48, 0x11,
Packit 1c1d7e
  0x20, 0x44, 0x48, 0x92, 0x51, 0x24, 0x91, 0x22, 0x44, 0x89, 0x02, 0x48,
Packit 1c1d7e
  0x8a, 0x2a, 0x92, 0x28, 0x42, 0x22, 0x00, 0x00, 0x00, 0x02, 0x85, 0x41,
Packit 1c1d7e
  0x49, 0x18, 0x10, 0x80, 0x08, 0x00, 0x01, 0x08, 0x84, 0x20, 0x44, 0x11,
Packit 1c1d7e
  0x12, 0x22, 0x08, 0x91, 0x00, 0x18, 0x03, 0x00, 0x09, 0xb0, 0x82, 0x42,
Packit 1c1d7e
  0x21, 0x21, 0x10, 0x10, 0x08, 0xc8, 0x24, 0x89, 0x09, 0x02, 0x22, 0x43,
Packit 1c1d7e
  0x10, 0x88, 0x04, 0x22, 0x12, 0x10, 0x84, 0x20, 0x80, 0x88, 0x22, 0x04,
Packit 1c1d7e
  0x10, 0x08, 0x50, 0x00, 0x02, 0x26, 0x48, 0x93, 0x22, 0x44, 0xc8, 0x92,
Packit 1c1d7e
  0x49, 0x24, 0x91, 0x22, 0x64, 0x99, 0x12, 0x49, 0x84, 0x11, 0x21, 0x28,
Packit 1c1d7e
  0x82, 0x22, 0x00, 0x00, 0x02, 0x02, 0x83, 0x82, 0x30, 0xe4, 0x10, 0x80,
Packit 1c1d7e
  0x00, 0x20, 0x05, 0x07, 0x04, 0x3e, 0x38, 0x10, 0xe1, 0xc2, 0x07, 0x0e,
Packit 1c1d7e
  0x24, 0x00, 0x00, 0x01, 0x04, 0x00, 0x82, 0x7c, 0x1e, 0x3e, 0x1f, 0x90,
Packit 1c1d7e
  0x07, 0x48, 0x24, 0x71, 0x05, 0xf2, 0x22, 0x41, 0x0f, 0x08, 0x03, 0xd2,
Packit 1c1d7e
  0x11, 0xe0, 0x83, 0xc0, 0x80, 0x88, 0x41, 0x04, 0x1f, 0xc8, 0x50, 0x00,
Packit 1c1d7e
  0x01, 0xd5, 0x87, 0x0d, 0x1c, 0x43, 0x48, 0x92, 0x45, 0x24, 0x91, 0x1c,
Packit 1c1d7e
  0x58, 0x69, 0x0c, 0x66, 0x84, 0x11, 0x21, 0x10, 0xf2, 0x22, 0x00, 0x00,
Packit 1c1d7e
  0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x20, 0x00, 0x00,
Packit 1c1d7e
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
Packit 1c1d7e
  0x03, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit 1c1d7e
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit 1c1d7e
  0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit 1c1d7e
  0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x00, 0x00, 0x40, 0x08, 0x00, 0x00,
Packit 1c1d7e
  0x00, 0x00, 0x00, 0x10, 0x02, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit 1c1d7e
  0x00, 0x00, 0x09, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit 1c1d7e
  0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit 1c1d7e
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit 1c1d7e
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit 1c1d7e
  0x00, 0x08, 0x10, 0x1f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, 0x02,
Packit 1c1d7e
  0x00, 0x00, 0x00, 0x00, 0x40, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
Packit 1c1d7e
  0x02, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00,
Packit 1c1d7e
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit 1c1d7e
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit 1c1d7e
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit 1c1d7e
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x30, 0x00,
Packit 1c1d7e
  0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00,
Packit 1c1d7e
  0x40, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0xac, 0x00, 0x00
Packit 1c1d7e
};
Packit 1c1d7e
Packit 1c1d7e
static Color palette[] =
Packit 1c1d7e
{
Packit 1c1d7e
  { 0xff, 0xff, 0xff, 0x00 },
Packit 1c1d7e
  { 0x00, 0x00, 0x00, 0xff },
Packit 1c1d7e
  { 0xff, 0xff, 0xc0, 0xff },
Packit 1c1d7e
  { 0x9f, 0x9f, 0x60, 0xff },
Packit 1c1d7e
  { 0x90, 0x00, 0x00, 0xff },
Packit 1c1d7e
  { 0x00, 0x90, 0x00, 0xff },
Packit 1c1d7e
  { 0x00, 0x00, 0x90, 0xff },
Packit 1c1d7e
  { 0xc0, 0xc0, 0xc0, 0xff }
Packit 1c1d7e
};
Packit 1c1d7e
Packit 1c1d7e
// for alpha we use x^(1/1.3)
Packit 1c1d7e
static Color palette2[] =
Packit 1c1d7e
{
Packit 1c1d7e
  { 0x00, 0x00, 0x00, 0x00 },
Packit 1c1d7e
  { 0x00, 0x00, 0x00, 0x2e },
Packit 1c1d7e
  { 0x00, 0x00, 0x00, 0x48 },
Packit 1c1d7e
  { 0x00, 0x00, 0x00, 0x5d },
Packit 1c1d7e
  { 0x00, 0x00, 0x00, 0x6f },
Packit 1c1d7e
  { 0x00, 0x00, 0x00, 0x80 },
Packit 1c1d7e
  { 0x00, 0x00, 0x00, 0x8f },
Packit 1c1d7e
  { 0x00, 0x00, 0x00, 0x9e },
Packit 1c1d7e
  { 0x00, 0x00, 0x00, 0xac },
Packit 1c1d7e
  { 0x00, 0x00, 0x00, 0xb9 },
Packit 1c1d7e
  { 0x00, 0x00, 0x00, 0xc5 },
Packit 1c1d7e
  { 0x00, 0x00, 0x00, 0xd2 },
Packit 1c1d7e
  { 0x00, 0x00, 0x00, 0xdd },
Packit 1c1d7e
  { 0x00, 0x00, 0x00, 0xe9 },
Packit 1c1d7e
  { 0x00, 0x00, 0x00, 0xf4 },
Packit 1c1d7e
  { 0x00, 0x00, 0x00, 0xff }
Packit 1c1d7e
};
Packit 1c1d7e
Packit 1c1d7e
static Color palette3[] =
Packit 1c1d7e
{
Packit 1c1d7e
  { 0xff, 0xff, 0xff, 0xff },
Packit 1c1d7e
  { 0xe0, 0xe0, 0xe0, 0xff },
Packit 1c1d7e
  { 0xd0, 0xd0, 0xd0, 0xff },
Packit 1c1d7e
  { 0xc0, 0xc0, 0xc0, 0xff },
Packit 1c1d7e
  { 0xb0, 0xb0, 0xb0, 0xff },
Packit 1c1d7e
  { 0xa0, 0xa0, 0xa0, 0xff },
Packit 1c1d7e
  { 0x90, 0x90, 0x90, 0xff },
Packit 1c1d7e
  { 0x80, 0x80, 0x80, 0xff },
Packit 1c1d7e
  { 0x70, 0x70, 0x70, 0xff },
Packit 1c1d7e
  { 0x60, 0x60, 0x60, 0xff },
Packit 1c1d7e
  { 0x50, 0x50, 0x50, 0xff },
Packit 1c1d7e
  { 0x40, 0x40, 0x40, 0xff },
Packit 1c1d7e
  { 0x30, 0x30, 0x30, 0xff },
Packit 1c1d7e
  { 0x20, 0x20, 0x20, 0xff },
Packit 1c1d7e
  { 0x10, 0x10, 0x10, 0xff },
Packit 1c1d7e
  { 0x00, 0x00, 0x00, 0xff }
Packit 1c1d7e
};
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
Image::Image(int w,int h)
Packit 1c1d7e
{
Packit 1c1d7e
  static int hue   = Config_getInt(HTML_COLORSTYLE_HUE);
Packit 1c1d7e
  static int sat   = Config_getInt(HTML_COLORSTYLE_SAT);
Packit 1c1d7e
  static int gamma = Config_getInt(HTML_COLORSTYLE_GAMMA);
Packit 1c1d7e
Packit 1c1d7e
  double red1,green1,blue1;
Packit 1c1d7e
  double red2,green2,blue2;
Packit 1c1d7e
Packit 1c1d7e
  ColoredImage::hsl2rgb(hue/360.0,                  // hue
Packit 1c1d7e
                        sat/255.0,                  // saturation
Packit 1c1d7e
                        pow(235/255.0,gamma/100.0), // luma (gamma corrected)
Packit 1c1d7e
                        &red1,&green1,&blue1
Packit 1c1d7e
                       );
Packit 1c1d7e
Packit 1c1d7e
  ColoredImage::hsl2rgb(hue/360.0,                  // hue
Packit 1c1d7e
                        sat/255.0,                  // saturation
Packit 1c1d7e
                        pow(138/255.0,gamma/100.0), // luma (gamma corrected)
Packit 1c1d7e
                        &red2,&green2,&blue2
Packit 1c1d7e
                       );
Packit 1c1d7e
Packit 1c1d7e
  palette[2].red   = (int)(red1   * 255.0);
Packit 1c1d7e
  palette[2].green = (int)(green1 * 255.0);
Packit 1c1d7e
  palette[2].blue  = (int)(blue1  * 255.0);
Packit 1c1d7e
Packit 1c1d7e
  palette[3].red   = (int)(red2   * 255.0);
Packit 1c1d7e
  palette[3].green = (int)(green2 * 255.0);
Packit 1c1d7e
  palette[3].blue  = (int)(blue2  * 255.0);
Packit 1c1d7e
Packit 1c1d7e
  data = new uchar[w*h];
Packit 1c1d7e
  memset(data,0,w*h);
Packit 1c1d7e
  width = w;
Packit 1c1d7e
  height = h;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Image::~Image()
Packit 1c1d7e
{
Packit 1c1d7e
  delete[] data;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void Image::setPixel(int x,int y,uchar val)
Packit 1c1d7e
{
Packit 1c1d7e
  if (x>=0 && x<width && y>=0 && y
Packit 1c1d7e
    data[y*width+x] = val;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
uchar Image::getPixel(int x,int y) const
Packit 1c1d7e
{
Packit 1c1d7e
  if (x>=0 && x<width && y>=0 && y
Packit 1c1d7e
    return data[y*width+x];
Packit 1c1d7e
  else
Packit 1c1d7e
    return 0;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void Image::writeChar(int x,int y,char c,uchar fg) 
Packit 1c1d7e
{
Packit 1c1d7e
  if (c>=' ')
Packit 1c1d7e
  {
Packit 1c1d7e
    int xf,yf,ci=c-' ';
Packit 1c1d7e
    int rowOffset=0;
Packit 1c1d7e
    int cw = charWidth[ci];
Packit 1c1d7e
    int cp = charPos[ci];
Packit 1c1d7e
    for (yf=0;yf
Packit 1c1d7e
    {
Packit 1c1d7e
      unsigned short bitPattern=0;
Packit 1c1d7e
      int bitsLeft=cw;
Packit 1c1d7e
      int byteOffset = rowOffset+(cp>>3);
Packit 1c1d7e
      int bitOffset  = cp&7;
Packit 1c1d7e
      // get the bit pattern for row yf of the character from the font data
Packit 1c1d7e
      while (bitsLeft>0)
Packit 1c1d7e
      {
Packit 1c1d7e
        int bits=8-bitOffset;
Packit 1c1d7e
        if (bits>bitsLeft) bits=bitsLeft; 
Packit 1c1d7e
        bitPattern<<=bits; 
Packit 1c1d7e
        bitPattern|=((fontRaw[byteOffset]<<bitOffset)&0xff)>>(8-bits);
Packit 1c1d7e
        bitsLeft-=bits;
Packit 1c1d7e
        bitOffset=0;
Packit 1c1d7e
        byteOffset++;
Packit 1c1d7e
      }
Packit 1c1d7e
      int mask=1<<(cw-1);
Packit 1c1d7e
      // draw character row yf
Packit 1c1d7e
      for (xf=0;xf
Packit 1c1d7e
      {
Packit 1c1d7e
        setPixel(x+xf,y+yf,(bitPattern&mask) ? fg : getPixel(x+xf,y+yf));
Packit 1c1d7e
        mask>>=1;
Packit 1c1d7e
      }
Packit 1c1d7e
      rowOffset+=charSetWidth;
Packit 1c1d7e
    }
Packit 1c1d7e
  } 
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void Image::writeString(int x,int y,const char *s,uchar fg) 
Packit 1c1d7e
{
Packit 1c1d7e
  if (s)
Packit 1c1d7e
  {
Packit 1c1d7e
    char c;
Packit 1c1d7e
    while ((c=*s++))
Packit 1c1d7e
    {
Packit 1c1d7e
      writeChar(x,y,c,fg);
Packit 1c1d7e
      x+=charWidth[c-' '];
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
uint Image::stringLength(const char *s) 
Packit 1c1d7e
{
Packit 1c1d7e
  int w=0;
Packit 1c1d7e
  if (s)
Packit 1c1d7e
  {
Packit 1c1d7e
    char c;
Packit 1c1d7e
    while ((c=*s++)) w+=charWidth[c-' '];
Packit 1c1d7e
  }
Packit 1c1d7e
  return w;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void Image::drawHorzLine(int y,int xs,int xe,uchar colIndex,uint mask)
Packit 1c1d7e
{
Packit 1c1d7e
  int x,i=0,j=0;
Packit 1c1d7e
  for (x=xs;x<=xe;x++,j++) 
Packit 1c1d7e
  {
Packit 1c1d7e
    if (j&1) i++;
Packit 1c1d7e
    if (mask&(1<<(i&0x1f))) setPixel(x,y,colIndex);
Packit 1c1d7e
  }
Packit 1c1d7e
} 
Packit 1c1d7e
Packit 1c1d7e
void Image::drawHorzArrow(int y,int xs,int xe,uchar colIndex,uint mask)
Packit 1c1d7e
{
Packit 1c1d7e
  drawHorzLine(y,xs,xe,colIndex,mask);
Packit 1c1d7e
  int i;
Packit 1c1d7e
  for (i=0;i<6;i++)
Packit 1c1d7e
  {
Packit 1c1d7e
    int h=i>>1;
Packit 1c1d7e
    drawVertLine(xe-i,y-h,y+h,colIndex,0xffffffff);
Packit 1c1d7e
  }
Packit 1c1d7e
} 
Packit 1c1d7e
Packit 1c1d7e
void Image::drawVertLine(int x,int ys,int ye,uchar colIndex,uint mask)
Packit 1c1d7e
{
Packit 1c1d7e
  int y,i=0;
Packit 1c1d7e
  for (y=ys;y<=ye;y++,i++) 
Packit 1c1d7e
  {
Packit 1c1d7e
    if (mask&(1<<(i&0x1f))) setPixel(x,y,colIndex);
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void Image::drawVertArrow(int x,int ys,int ye,uchar colIndex,uint mask)
Packit 1c1d7e
{
Packit 1c1d7e
  drawVertLine(x,ys,ye,colIndex,mask);
Packit 1c1d7e
  int i;
Packit 1c1d7e
  for (i=0;i<6;i++)
Packit 1c1d7e
  {
Packit 1c1d7e
    int h=i>>1;
Packit 1c1d7e
    drawHorzLine(ys+i,x-h,x+h,colIndex,0xffffffff);
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void Image::drawRect(int x,int y,int w,int h,uchar colIndex,uint mask)
Packit 1c1d7e
{
Packit 1c1d7e
  drawHorzLine(y,x,x+w-1,colIndex,mask);
Packit 1c1d7e
  drawHorzLine(y+h-1,x,x+w-1,colIndex,mask);
Packit 1c1d7e
  drawVertLine(x,y,y+h-1,colIndex,mask);
Packit 1c1d7e
  drawVertLine(x+w-1,y,y+h-1,colIndex,mask);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void Image::fillRect(int x,int y,int lwidth,int lheight,uchar colIndex,uint mask)
Packit 1c1d7e
{
Packit 1c1d7e
  int xp,yp,xi,yi;
Packit 1c1d7e
  for (yp=y,yi=0;yp
Packit 1c1d7e
    for (xp=x,xi=0;xp
Packit 1c1d7e
      if (mask&(1<<((xi+yi)&0x1f))) 
Packit 1c1d7e
        setPixel(xp,yp,colIndex);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
bool Image::save(const char *fileName,int mode)
Packit 1c1d7e
{
Packit 1c1d7e
#if 0
Packit 1c1d7e
  GifEncoder gifenc(data,
Packit 1c1d7e
                    mode==0 ? palette : palette2,
Packit 1c1d7e
                    width,height,
Packit 1c1d7e
                    mode==0 ? 3 : 4,
Packit 1c1d7e
                    0);
Packit 1c1d7e
  QFile file(fileName);
Packit 1c1d7e
  if (file.open(IO_WriteOnly))
Packit 1c1d7e
  {
Packit 1c1d7e
    gifenc.writeGIF(file);
Packit 1c1d7e
    return TRUE;
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    return FALSE;
Packit 1c1d7e
  }
Packit 1c1d7e
#endif
Packit 1c1d7e
  static bool useTransparency = Config_getBool(FORMULA_TRANSPARENT);
Packit 1c1d7e
  uchar* buffer;
Packit 1c1d7e
  size_t bufferSize;
Packit 1c1d7e
  LodePNG_Encoder encoder;
Packit 1c1d7e
  LodePNG_Encoder_init(&encoder);
Packit 1c1d7e
  int numCols = mode==0 ? 8 : 16;
Packit 1c1d7e
  Color *pPal = mode==0         ? palette  : 
Packit 1c1d7e
                useTransparency ? palette2 : 
Packit 1c1d7e
                                  palette3 ;
Packit 1c1d7e
  int i;
Packit 1c1d7e
  for (i=0;i
Packit 1c1d7e
  {
Packit 1c1d7e
    LodePNG_InfoColor_addPalette(&encoder.infoPng.color,
Packit 1c1d7e
                                 pPal->red,pPal->green,pPal->blue,pPal->alpha);
Packit 1c1d7e
  }
Packit 1c1d7e
  encoder.infoPng.color.colorType = 3; 
Packit 1c1d7e
  encoder.infoRaw.color.colorType = 3;
Packit 1c1d7e
  LodePNG_encode(&encoder, &buffer, &bufferSize, data, width, height);
Packit 1c1d7e
  LodePNG_saveFile(buffer, bufferSize, fileName);
Packit 1c1d7e
  free(buffer);
Packit 1c1d7e
  LodePNG_Encoder_cleanup(&encoder);
Packit 1c1d7e
  return TRUE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
//----------------------------------------------------------------
Packit 1c1d7e
Packit 1c1d7e
void ColoredImage::hsl2rgb(double h,double s,double l,
Packit 1c1d7e
                         double *pRed,double *pGreen,double *pBlue)
Packit 1c1d7e
{
Packit 1c1d7e
  double v;
Packit 1c1d7e
  double r,g,b;
Packit 1c1d7e
Packit 1c1d7e
  r = l;   // default to gray
Packit 1c1d7e
  g = l;
Packit 1c1d7e
  b = l;
Packit 1c1d7e
  v = (l <= 0.5) ? (l * (1.0 + s)) : (l + s - l * s);
Packit 1c1d7e
  if (v > 0)
Packit 1c1d7e
  {
Packit 1c1d7e
    double m;
Packit 1c1d7e
    double sv;
Packit 1c1d7e
    int sextant;
Packit 1c1d7e
    double fract, vsf, mid1, mid2;
Packit 1c1d7e
Packit 1c1d7e
    m       = l + l - v;
Packit 1c1d7e
    sv      = (v - m ) / v;
Packit 1c1d7e
    h      *= 6.0;
Packit 1c1d7e
    sextant = (int)h;
Packit 1c1d7e
    fract   = h - sextant;
Packit 1c1d7e
    vsf     = v * sv * fract;
Packit 1c1d7e
    mid1    = m + vsf;
Packit 1c1d7e
    mid2    = v - vsf;
Packit 1c1d7e
    switch (sextant)
Packit 1c1d7e
    {
Packit 1c1d7e
      case 0:
Packit 1c1d7e
        r = v;
Packit 1c1d7e
        g = mid1;
Packit 1c1d7e
        b = m;
Packit 1c1d7e
        break;
Packit 1c1d7e
      case 1:
Packit 1c1d7e
        r = mid2;
Packit 1c1d7e
        g = v;
Packit 1c1d7e
        b = m;
Packit 1c1d7e
        break;
Packit 1c1d7e
      case 2:
Packit 1c1d7e
        r = m;
Packit 1c1d7e
        g = v;
Packit 1c1d7e
        b = mid1;
Packit 1c1d7e
        break;
Packit 1c1d7e
      case 3:
Packit 1c1d7e
        r = m;
Packit 1c1d7e
        g = mid2;
Packit 1c1d7e
        b = v;
Packit 1c1d7e
        break;
Packit 1c1d7e
      case 4:
Packit 1c1d7e
        r = mid1;
Packit 1c1d7e
        g = m;
Packit 1c1d7e
        b = v;
Packit 1c1d7e
        break;
Packit 1c1d7e
      case 5:
Packit 1c1d7e
        r = v;
Packit 1c1d7e
        g = m;
Packit 1c1d7e
        b = mid2;
Packit 1c1d7e
        break;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  *pRed   = r;
Packit 1c1d7e
  *pGreen = g;
Packit 1c1d7e
  *pBlue  = b;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
ColoredImage::ColoredImage(int width,int height,
Packit 1c1d7e
           const uchar *greyLevels,const uchar *alphaLevels,
Packit 1c1d7e
           int saturation,int hue,int gamma)
Packit 1c1d7e
{
Packit 1c1d7e
  m_hasAlpha = alphaLevels!=0;
Packit 1c1d7e
  m_width    = width;
Packit 1c1d7e
  m_height   = height;
Packit 1c1d7e
  m_data     = (uchar*)malloc(width*height*4);
Packit 1c1d7e
  int i;
Packit 1c1d7e
  for (i=0;i
Packit 1c1d7e
  {
Packit 1c1d7e
    uchar r,g,b,a;
Packit 1c1d7e
    double red,green,blue;
Packit 1c1d7e
    hsl2rgb(hue/360.0,                            // hue
Packit 1c1d7e
            saturation/255.0,                     // saturation
Packit 1c1d7e
            pow(greyLevels[i]/255.0,gamma/100.0), // luma (gamma corrected)
Packit 1c1d7e
            &red,&green,&blue);
Packit 1c1d7e
    r = (int)(red  *255.0);
Packit 1c1d7e
    g = (int)(green*255.0);
Packit 1c1d7e
    b = (int)(blue *255.0);
Packit 1c1d7e
    a = alphaLevels ? alphaLevels[i] : 255;
Packit 1c1d7e
    m_data[i*4+0]=r;
Packit 1c1d7e
    m_data[i*4+1]=g;
Packit 1c1d7e
    m_data[i*4+2]=b;
Packit 1c1d7e
    m_data[i*4+3]=a;
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
ColoredImage::~ColoredImage()
Packit 1c1d7e
{
Packit 1c1d7e
  free(m_data);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
bool ColoredImage::save(const char *fileName)
Packit 1c1d7e
{
Packit 1c1d7e
  uchar *buffer;
Packit 1c1d7e
  size_t bufferSize;
Packit 1c1d7e
  LodePNG_Encoder encoder;
Packit 1c1d7e
  LodePNG_Encoder_init(&encoder);
Packit 1c1d7e
  encoder.infoPng.color.colorType = m_hasAlpha ? 6 : 2; // 2=RGB 24 bit, 6=RGBA 32 bit
Packit 1c1d7e
  encoder.infoRaw.color.colorType = 6; // 6=RGBA 32 bit
Packit 1c1d7e
  LodePNG_encode(&encoder, &buffer, &bufferSize, m_data, m_width, m_height);
Packit 1c1d7e
  LodePNG_saveFile(buffer, bufferSize, fileName);
Packit 1c1d7e
  LodePNG_Encoder_cleanup(&encoder);
Packit 1c1d7e
  free(buffer);
Packit 1c1d7e
  return TRUE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e