You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
237 lines
6.3 KiB
C++
237 lines
6.3 KiB
C++
/*
|
|
This file is part of Konsole, an X terminal.
|
|
Copyright (C) 1997,1998 by Lars Doelle <lars.doelle@on-line.de>
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
02110-1301 USA.
|
|
*/
|
|
|
|
/*! \file TECommon.h
|
|
\brief Definitions shared between TEScreen and TEWidget.
|
|
*/
|
|
|
|
#ifndef TECOMMON_H
|
|
#define TECOMMON_H
|
|
|
|
#include <tqcolor.h>
|
|
|
|
#ifndef UINT8
|
|
typedef unsigned char UINT8;
|
|
#endif
|
|
|
|
#ifndef UINT16
|
|
typedef unsigned short UINT16;
|
|
#endif
|
|
|
|
// Color Table Elements ///////////////////////////////////////////////
|
|
|
|
/*!
|
|
*/
|
|
struct ColorEntry
|
|
{
|
|
ColorEntry(TQColor c, bool tr, bool b) : color(c), transparent(tr), bold(b) {}
|
|
ColorEntry() : transparent(false), bold(false) {} // default constructors
|
|
void operator=(const ColorEntry& rhs) {
|
|
color = rhs.color;
|
|
transparent = rhs.transparent;
|
|
bold = rhs.bold;
|
|
}
|
|
TQColor color;
|
|
bool transparent; // if used on bg
|
|
bool bold; // if used on fg
|
|
};
|
|
|
|
// Attributed Character Representations ///////////////////////////////
|
|
|
|
// Colors
|
|
|
|
#define BASE_COLORS (2+8)
|
|
#define INTENSITIES 2
|
|
#define TABLE_COLORS (INTENSITIES*BASE_COLORS)
|
|
|
|
#define DEFAULT_FORE_COLOR 0
|
|
#define DEFAULT_BACK_COLOR 1
|
|
|
|
#define DEFAULT_RENDITION 0
|
|
#define RE_BOLD (1 << 0)
|
|
#define RE_BLINK (1 << 1)
|
|
#define RE_UNDERLINE (1 << 2)
|
|
#define RE_REVERSE (1 << 3) // Screen only
|
|
#define RE_INTENSIVE (1 << 3) // Widget only
|
|
#define RE_CURSOR (1 << 4)
|
|
|
|
|
|
/* cacol is a union of the various color spaces.
|
|
|
|
Assignment is as follows:
|
|
|
|
Type - Space - Values
|
|
|
|
0 - Undefined - u: 0, v:0 w:0
|
|
1 - Default - u: 0..1 v:intense w:0
|
|
2 - System - u: 0..7 v:intense w:0
|
|
3 - Index(256) - u: 16..255 v:0 w:0
|
|
4 - RGB - u: 0..255 v:0..256 w:0..256
|
|
|
|
Default colour space has two separate colours, namely
|
|
default foreground and default background colour.
|
|
*/
|
|
|
|
#define CO_UND 0
|
|
#define CO_DFT 1
|
|
#define CO_SYS 2
|
|
#define CO_256 3
|
|
#define CO_RGB 4
|
|
|
|
class cacol
|
|
{
|
|
public:
|
|
cacol();
|
|
cacol(UINT8 space, int color);
|
|
UINT8 t; // color space indicator
|
|
UINT8 u; // various bytes representing the data in the respective ...
|
|
UINT8 v; // ... color space. C++ does not do unions, so we cannot ...
|
|
UINT8 w; // ... express ourselfs here, properly.
|
|
void toggleIntensive(); // Hack or helper?
|
|
TQColor color(const ColorEntry* base) const;
|
|
friend bool operator == (cacol a, cacol b);
|
|
friend bool operator != (cacol a, cacol b);
|
|
};
|
|
|
|
#if 0
|
|
inline cacol::cacol(UINT8 _t, UINT8 _u, UINT8 _v, UINT8 _w)
|
|
: t(_t), u(_u), v(_v), w(_w)
|
|
{
|
|
}
|
|
#else
|
|
inline cacol::cacol(UINT8 ty, int co)
|
|
: t(ty), u(0), v(0), w(0)
|
|
{
|
|
switch (t)
|
|
{
|
|
case CO_UND: break;
|
|
case CO_DFT: u = co& 1; break;
|
|
case CO_SYS: u = co& 7; v = (co>>3)&1; break;
|
|
case CO_256: u = co&255; break;
|
|
case CO_RGB: u = co>>16; v = co>>8; w = co; break;
|
|
default : t = 0; break;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
inline cacol::cacol() // undefined, really
|
|
: t(CO_UND), u(0), v(0), w(0)
|
|
{
|
|
}
|
|
|
|
inline bool operator == (cacol a, cacol b)
|
|
{
|
|
return a.t == b.t && a.u == b.u && a.v == b.v && a.w == b.w;
|
|
}
|
|
|
|
inline bool operator != (cacol a, cacol b)
|
|
{
|
|
return a.t != b.t || a.u != b.u || a.v != b.v || a.w != b.w;
|
|
}
|
|
|
|
inline const TQColor color256(UINT8 u, const ColorEntry* base)
|
|
{
|
|
// 0.. 16: system colors
|
|
if (u < 8) return base[u+2 ].color;
|
|
u -= 8;
|
|
if (u < 8) return base[u+2+BASE_COLORS].color;
|
|
u -= 8;
|
|
|
|
// 16..231: 6x6x6 rgb color cube
|
|
if (u < 216) return TQColor(255*((u/36)%6)/5,
|
|
255*((u/ 6)%6)/5,
|
|
255*((u/ 1)%6)/5); u -= 216;
|
|
|
|
// 232..255: gray, leaving out black and white
|
|
int gray = u*10+8; return TQColor(gray,gray,gray);
|
|
}
|
|
|
|
inline TQColor cacol::color(const ColorEntry* base) const
|
|
{
|
|
switch (t)
|
|
{
|
|
case CO_DFT: return base[u+0+(v?BASE_COLORS:0)].color;
|
|
case CO_SYS: return base[u+2+(v?BASE_COLORS:0)].color;
|
|
case CO_256: return color256(u,base);
|
|
case CO_RGB: return TQColor(u,v,w);
|
|
default : return TQColor(255,0,0); // diagnostic catch all
|
|
}
|
|
}
|
|
|
|
inline void cacol::toggleIntensive()
|
|
{
|
|
if (t == CO_SYS || t == CO_DFT)
|
|
{
|
|
v = !v;
|
|
}
|
|
}
|
|
|
|
/*! \class ca
|
|
* \brief a character with rendition attributes.
|
|
*/
|
|
|
|
class ca
|
|
{
|
|
public:
|
|
inline ca(UINT16 _c = ' ',
|
|
cacol _f = cacol(CO_DFT,DEFAULT_FORE_COLOR),
|
|
cacol _b = cacol(CO_DFT,DEFAULT_BACK_COLOR),
|
|
UINT8 _r = DEFAULT_RENDITION)
|
|
: c(_c), r(_r), f(_f), b(_b) {}
|
|
public:
|
|
UINT16 c; // character
|
|
UINT8 r; // rendition
|
|
cacol f; // foreground color
|
|
cacol b; // background color
|
|
public:
|
|
//FIXME: following a hack to cope with various color spaces
|
|
// it brings the rendition pipeline further out of balance,
|
|
// which it was anyway as the result of various additions.
|
|
bool isTransparent(const ColorEntry* base) const;
|
|
bool isBold(const ColorEntry* base) const;
|
|
public:
|
|
friend bool operator == (ca a, ca b);
|
|
friend bool operator != (ca a, ca b);
|
|
};
|
|
|
|
inline bool operator == (ca a, ca b)
|
|
{
|
|
return a.c == b.c && a.f == b.f && a.b == b.b && a.r == b.r;
|
|
}
|
|
|
|
inline bool operator != (ca a, ca b)
|
|
{
|
|
return a.c != b.c || a.f != b.f || a.b != b.b || a.r != b.r;
|
|
}
|
|
|
|
inline bool ca::isTransparent(const ColorEntry* base) const
|
|
{
|
|
return ((b.t == CO_DFT) && base[b.u+0+(b.v?BASE_COLORS:0)].transparent)
|
|
|| ((b.t == CO_SYS) && base[b.u+2+(b.v?BASE_COLORS:0)].transparent);
|
|
}
|
|
|
|
inline bool ca::isBold(const ColorEntry* base) const
|
|
{
|
|
return ((f.t == CO_DFT) && base[f.u+0+(f.v?BASE_COLORS:0)].bold)
|
|
|| ((f.t == CO_SYS) && base[f.u+2+(f.v?BASE_COLORS:0)].bold);
|
|
}
|
|
|
|
#endif // TECOMMON_H
|