• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdepim API Reference
  • KDE Home
  • Contact Us
 

messageviewer

  • sources
  • kde-4.12
  • kdepim
  • messageviewer
  • header
kxface.cpp
Go to the documentation of this file.
1 /*
2  This file is part of libkdepim.
3 
4  Original compface:
5  Copyright (c) James Ashton - Sydney University - June 1990. //krazy:exclude=copyright
6 
7  Additions for KDE:
8  Copyright (c) 2004 Jakob Schröter <js@camaya.net>
9 
10  This library is free software; you can redistribute it and/or
11  modify it under the terms of the GNU Library General Public
12  License as published by the Free Software Foundation; either
13  version 2 of the License, or (at your option) any later version.
14 
15  This library is distributed in the hope that it will be useful,
16  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18  Library General Public License for more details.
19 
20  You should have received a copy of the GNU Library General Public License
21  along with this library; see the file COPYING.LIB. If not, write to
22  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
23  Boston, MA 02110-1301, USA.
24 */
25 
26 
27 
28 #include "kxface.h"
29 
30 #include <KDebug>
31 
32 #include <QBuffer>
33 #include <QImage>
34 #include <QRegExp>
35 #include <QString>
36 #include <QPainter>
37 
38 #include <stdlib.h>
39 #include <string.h>
40 
41 #define GEN(g) F[h] ^= G.g[k]; break
42 
43 #define BITSPERDIG 4
44 #define DIGITS (PIXELS / BITSPERDIG)
45 #define DIGSPERWORD 4
46 #define WORDSPERLINE (WIDTH / DIGSPERWORD / BITSPERDIG)
47 
48 /* compressed output uses the full range of printable characters.
49  * in ascii these are in a contiguous block so we just need to know
50  * the first and last. The total number of printables is needed too */
51 #define FIRSTPRINT '!'
52 #define LASTPRINT '~'
53 #define NUMPRINTS (LASTPRINT - FIRSTPRINT + 1)
54 
55 /* output line length for compressed data */
56 static const int MAXLINELEN = 78;
57 
58 /* Portable, very large unsigned integer arithmetic is needed.
59  * Implementation uses arrays of WORDs. COMPs must have at least
60  * twice as many bits as WORDs to handle intermediate results */
61 #define COMP unsigned long
62 #define WORDCARRY (1 << BITSPERWORD)
63 #define WORDMASK (WORDCARRY - 1)
64 
65 #define ERR_OK 0 /* successful completion */
66 #define ERR_EXCESS 1 /* completed OK but some input was ignored */
67 #define ERR_INSUFF -1 /* insufficient input. Bad face format? */
68 #define ERR_INTERNAL -2 /* Arithmetic overflow or buffer overflow */
69 
70 #define BLACK 0
71 #define GREY 1
72 #define WHITE 2
73 
74 static const int MAX_XFACE_LENGTH = 2048;
75 
76 using namespace MessageViewer;
77 
78 KXFace::KXFace()
79 {
80  NumProbs = 0;
81 }
82 
83 KXFace::~KXFace()
84 {
85 }
86 
87 QString KXFace::fromImage( const QImage &image )
88 {
89  if( image.isNull() )
90  return QString();
91 
92  QImage scaledImg = image.scaled( 48, 48, Qt::IgnoreAspectRatio, Qt::SmoothTransformation );
93  QByteArray ba;
94  QBuffer buffer( &ba, this );
95  buffer.open( QIODevice::WriteOnly );
96  scaledImg.save( &buffer, "XBM" );
97  QString xbm( QString::fromLatin1(ba) );
98  xbm.remove( 0, xbm.indexOf( QLatin1String("{") ) + 1 );
99  xbm.truncate( xbm.indexOf( QLatin1String("}") ) );
100  xbm.remove( QLatin1Char(' ') );
101  xbm.remove( QLatin1Char(',') );
102  xbm.remove( QLatin1String("0x") );
103  xbm.remove( QLatin1Char('\n') );
104  xbm.truncate( 576 );
105  QString tmp = QLatin1String(xbm.toLatin1());
106  int len = tmp.length();
107  for( int i=0; i<len; ++i )
108  {
109  switch( tmp[i].toLatin1() )
110  {
111  case '1': tmp[i] = '8'; break;
112  case '2': tmp[i] = '4'; break;
113  case '3': tmp[i] = 'c'; break;
114  case '4': tmp[i] = '2'; break;
115  case '5': tmp[i] = 'a'; break;
116  case '7': tmp[i] = 'e'; break;
117  case '8': tmp[i] = '1'; break;
118  case 'A':
119  case 'a': tmp[i] = '5'; break;
120  case 'B':
121  case 'b': tmp[i] = 'd'; break;
122  case 'C':
123  case 'c': tmp[i] = '3'; break;
124  case 'D':
125  case 'd': tmp[i] = 'b'; break;
126  case 'E':
127  case 'e': tmp[i] = '7'; break;
128  }
129  if ( i % 2 )
130  {
131  QChar t = tmp[i];
132  tmp[i] = tmp[i-1];
133  tmp[i-1] = t;
134  }
135  }
136  tmp.replace( QRegExp( QLatin1String("(\\w{12})") ), QLatin1String("\\1\n") );
137  tmp.replace( QRegExp( QLatin1String("(\\w{4})") ), QLatin1String("0x\\1,") );
138  len = tmp.length();
139  char *fbuf = (char *)malloc( len + 1 );
140  strncpy( fbuf, (const char *)tmp.toLatin1(), len );
141  fbuf[len] = '\0';
142  if ( !( status = setjmp( comp_env ) ) )
143  {
144  ReadFace( fbuf );
145  GenFace();
146  CompAll( fbuf );
147  }
148  QString ret( QString::fromLatin1(fbuf) );
149  free( fbuf );
150 
151  return ret;
152 }
153 
154 QImage KXFace::toImage(const QString &xface)
155 {
156  if ( xface.length() > MAX_XFACE_LENGTH )
157  return QImage();
158 
159  char *fbuf = (char *)malloc( MAX_XFACE_LENGTH );
160  memset( fbuf, '\0', MAX_XFACE_LENGTH );
161  strncpy( fbuf, xface.toLatin1(), xface.length() );
162  QByteArray img;
163  if ( !( status = setjmp( comp_env ) ) )
164  {
165  UnCompAll( fbuf );/* compress otherwise */
166  UnGenFace();
167  img = WriteFace();
168  }
169  free( fbuf );
170  QImage p;
171  p.loadFromData( img, "XBM" );
172 
173  return p;
174 }
175 
176 //============================================================================
177 // more or less original compface 1.4 source
178 
179 void KXFace::RevPush(const Prob *p)
180 {
181  if (NumProbs >= PIXELS * 2 - 1)
182  longjmp(comp_env, ERR_INTERNAL);
183  ProbBuf[NumProbs++] = (Prob *) p;
184 }
185 
186 void KXFace::BigPush(Prob *p)
187 {
188  static unsigned char tmp;
189 
190  BigDiv(p->p_range, &tmp);
191  BigMul(0);
192  BigAdd(tmp + p->p_offset);
193 }
194 
195 int KXFace::BigPop(register const Prob *p)
196 {
197  static unsigned char tmp;
198  register int i;
199 
200  BigDiv(0, &tmp);
201  i = 0;
202  while ((tmp < p->p_offset) || (tmp >= p->p_range + p->p_offset))
203  {
204  p++;
205  ++i;
206  }
207  BigMul(p->p_range);
208  BigAdd(tmp - p->p_offset);
209  return i;
210 }
211 
212 
213 /* Divide B by a storing the result in B and the remainder in the word
214  * pointer to by r
215  */
216 void KXFace::BigDiv(register unsigned char a, register unsigned char *r)
217 {
218  register int i;
219  register unsigned char *w;
220  register COMP c, d;
221 
222  a &= WORDMASK;
223  if ((a == 1) || (B.b_words == 0))
224  {
225  *r = 0;
226  return;
227  }
228  if (a == 0) /* treat this as a == WORDCARRY */
229  { /* and just shift everything right a WORD (unsigned char)*/
230  i = --B.b_words;
231  w = B.b_word;
232  *r = *w;
233  while (i--)
234  {
235  *w = *(w + 1);
236  w++;
237  }
238  *w = 0;
239  return;
240  }
241  w = B.b_word + (i = B.b_words);
242  c = 0;
243  while (i--)
244  {
245  c <<= BITSPERWORD;
246  c += (COMP)*--w;
247  d = c / (COMP)a;
248  c = c % (COMP)a;
249  *w = (unsigned char)(d & WORDMASK);
250  }
251  *r = c;
252  if (B.b_word[B.b_words - 1] == 0)
253  B.b_words--;
254 }
255 
256 /* Multiply a by B storing the result in B
257  */
258 void KXFace::BigMul(register unsigned char a)
259 {
260  register int i;
261  register unsigned char *w;
262  register COMP c;
263 
264  a &= WORDMASK;
265  if ((a == 1) || (B.b_words == 0))
266  return;
267  if (a == 0) /* treat this as a == WORDCARRY */
268  { /* and just shift everything left a WORD (unsigned char) */
269  if ((i = B.b_words++) >= MAXWORDS - 1)
270  longjmp(comp_env, ERR_INTERNAL);
271  w = B.b_word + i;
272  while (i--)
273  {
274  *w = *(w - 1);
275  w--;
276  }
277  *w = 0;
278  return;
279  }
280  i = B.b_words;
281  w = B.b_word;
282  c = 0;
283  while (i--)
284  {
285  c += (COMP)*w * (COMP)a;
286  *(w++) = (unsigned char)(c & WORDMASK);
287  c >>= BITSPERWORD;
288  }
289  if (c)
290  {
291  if (B.b_words++ >= MAXWORDS)
292  longjmp(comp_env, ERR_INTERNAL);
293  *w = (COMP)(c & WORDMASK);
294  }
295 }
296 
297 /* Add to a to B storing the result in B
298  */
299 void KXFace::BigAdd(unsigned char a)
300 {
301  register int i;
302  register unsigned char *w;
303  register COMP c;
304 
305  a &= WORDMASK;
306  if (a == 0)
307  return;
308  i = 0;
309  w = B.b_word;
310  c = a;
311  while ((i < B.b_words) && c)
312  {
313  c += (COMP)*w;
314  *w++ = (unsigned char)(c & WORDMASK);
315  c >>= BITSPERWORD;
316  ++i;
317  }
318  if ((i == B.b_words) && c)
319  {
320  if (B.b_words++ >= MAXWORDS)
321  longjmp(comp_env, ERR_INTERNAL);
322  *w = (COMP)(c & WORDMASK);
323  }
324 }
325 
326 void KXFace::BigClear()
327 {
328  B.b_words = 0;
329 }
330 
331 QByteArray KXFace::WriteFace()
332 {
333  register char *s;
334  register int i, j, bits, digits, words;
335  //int digsperword = DIGSPERWORD;
336  //int wordsperline = WORDSPERLINE;
337  QByteArray t( "#define noname_width 48\n#define noname_height 48\nstatic char noname_bits[] = {\n " );
338  j = t.length() - 1;
339 
340  s = F;
341  bits = digits = words = i = 0;
342  t.resize( MAX_XFACE_LENGTH );
343  int digsperword = 2;
344  int wordsperline = 15;
345  while ( s < F + PIXELS )
346  {
347  if ( ( bits == 0 ) && ( digits == 0 ) )
348  {
349  t[j++] = '0';
350  t[j++] = 'x';
351  }
352  if ( *(s++) )
353  i = ( i >> 1 ) | 0x8;
354  else
355  i >>= 1;
356  if ( ++bits == BITSPERDIG )
357  {
358  j++;
359  t[j-( ( digits & 1 ) * 2 )] = *(i + HexDigits);
360  bits = i = 0;
361  if ( ++digits == digsperword )
362  {
363  if ( s >= F + PIXELS )
364  break;
365  t[j++] = ',';
366  digits = 0;
367  if ( ++words == wordsperline )
368  {
369  t[j++] = '\n';
370  t[j++] = ' ';
371  words = 0;
372  }
373  }
374  }
375  }
376  t.resize( j + 1 );
377  t += "};\n";
378  return t;
379 }
380 
381 void KXFace::UnCompAll(char *fbuf)
382 {
383  register char *p;
384 
385  BigClear();
386  BigRead(fbuf);
387  p = F;
388  while (p < F + PIXELS)
389  *(p++) = 0;
390  UnCompress(F, 16, 16, 0);
391  UnCompress(F + 16, 16, 16, 0);
392  UnCompress(F + 32, 16, 16, 0);
393  UnCompress(F + WIDTH * 16, 16, 16, 0);
394  UnCompress(F + WIDTH * 16 + 16, 16, 16, 0);
395  UnCompress(F + WIDTH * 16 + 32, 16, 16, 0);
396  UnCompress(F + WIDTH * 32, 16, 16, 0);
397  UnCompress(F + WIDTH * 32 + 16, 16, 16, 0);
398  UnCompress(F + WIDTH * 32 + 32, 16, 16, 0);
399 }
400 
401 void KXFace::UnCompress(char *f, int wid, int hei, int lev)
402 {
403  switch (BigPop(&levels[lev][0]))
404  {
405  case WHITE :
406  return;
407  case BLACK :
408  PopGreys(f, wid, hei);
409  return;
410  default :
411  wid /= 2;
412  hei /= 2;
413  lev++;
414  UnCompress(f, wid, hei, lev);
415  UnCompress(f + wid, wid, hei, lev);
416  UnCompress(f + hei * WIDTH, wid, hei, lev);
417  UnCompress(f + wid + hei * WIDTH, wid, hei, lev);
418  return;
419  }
420 }
421 
422 void KXFace::BigWrite(register char *fbuf)
423 {
424  static unsigned char tmp;
425  static char buf[DIGITS];
426  register char *s;
427  register int i;
428 
429  s = buf;
430  while (B.b_words > 0)
431  {
432  BigDiv(NUMPRINTS, &tmp);
433  *(s++) = tmp + FIRSTPRINT;
434  }
435  i = 7; // leave room for the field name on the first line
436  *(fbuf++) = ' ';
437  while (s-- > buf)
438  {
439  if (i == 0)
440  *(fbuf++) = ' ';
441  *(fbuf++) = *s;
442  if (++i >= MAXLINELEN)
443  {
444  *(fbuf++) = '\n';
445  i = 0;
446  }
447  }
448  if (i > 0)
449  *(fbuf++) = '\n';
450  *(fbuf++) = '\0';
451 }
452 
453 void KXFace::BigRead(register char *fbuf)
454 {
455  register int c;
456 
457  while (*fbuf != '\0')
458  {
459  c = *(fbuf++);
460  if ((c < FIRSTPRINT) || (c > LASTPRINT))
461  continue;
462  BigMul(NUMPRINTS);
463  BigAdd((unsigned char)(c - FIRSTPRINT));
464  }
465 }
466 
467 void KXFace::ReadFace(char *fbuf)
468 {
469  register int c, i;
470  register char *s, *t;
471 
472  t = s = fbuf;
473  for(i = strlen(s); i > 0; --i)
474  {
475  c = (int)*(s++);
476  if ((c >= '0') && (c <= '9'))
477  {
478  if (t >= fbuf + DIGITS)
479  {
480  status = ERR_EXCESS;
481  break;
482  }
483  *(t++) = c - '0';
484  }
485  else if ((c >= 'A') && (c <= 'F'))
486  {
487  if (t >= fbuf + DIGITS)
488  {
489  status = ERR_EXCESS;
490  break;
491  }
492  *(t++) = c - 'A' + 10;
493  }
494  else if ((c >= 'a') && (c <= 'f'))
495  {
496  if (t >= fbuf + DIGITS)
497  {
498  status = ERR_EXCESS;
499  break;
500  }
501  *(t++) = c - 'a' + 10;
502  }
503  else if (((c == 'x') || (c == 'X')) && (t > fbuf) && (*(t-1) == 0))
504  t--;
505  }
506  if (t < fbuf + DIGITS)
507  longjmp(comp_env, ERR_INSUFF);
508  s = fbuf;
509  t = F;
510  c = 1 << (BITSPERDIG - 1);
511  while (t < F + PIXELS)
512  {
513  *(t++) = (*s & c) ? 1 : 0;
514  if ((c >>= 1) == 0)
515  {
516  s++;
517  c = 1 << (BITSPERDIG - 1);
518  }
519  }
520 }
521 
522 void KXFace::GenFace()
523 {
524  static char newp[PIXELS];
525  register char *f1;
526  register char *f2;
527  register int i;
528 
529  f1 = newp;
530  f2 = F;
531  i = PIXELS;
532  while (i-- > 0)
533  *(f1++) = *(f2++);
534  Gen(newp);
535 }
536 
537 void KXFace::UnGenFace()
538 {
539  Gen(F);
540 }
541 
542 // static
543 void KXFace::Gen(register char *f)
544 {
545  register int m, l, k, j, i, h;
546 
547  for (j = 0; j < HEIGHT; ++j)
548  {
549  for (i = 0; i < WIDTH; ++i)
550  {
551  h = i + j * WIDTH;
552  k = 0;
553  for (l = i - 2; l <= i + 2; ++l)
554  for (m = j - 2; m <= j; ++m)
555  {
556  if ((l >= i) && (m == j))
557  continue;
558  if ((l > 0) && (l <= WIDTH) && (m > 0))
559  k = *(f + l + m * WIDTH) ? k * 2 + 1 : k * 2;
560  }
561  switch (i)
562  {
563  case 1 :
564  switch (j)
565  {
566  case 1 : GEN(g_22);
567  case 2 : GEN(g_21);
568  default : GEN(g_20);
569  }
570  break;
571  case 2 :
572  switch (j)
573  {
574  case 1 : GEN(g_12);
575  case 2 : GEN(g_11);
576  default : GEN(g_10);
577  }
578  break;
579  case WIDTH - 1 :
580  switch (j)
581  {
582  case 1 : GEN(g_42);
583  case 2 : GEN(g_41);
584  default : GEN(g_40);
585  }
586  break;
587  /* i runs from 0 to WIDTH-1, so case can never occur. I leave the code in
588  because it appears exactly like this in the original compface code.
589  case WIDTH :
590  switch (j)
591  {
592  case 1 : GEN(g_32);
593  case 2 : GEN(g_31);
594  default : GEN(g_30);
595  }
596  break;
597  */
598  default :
599  switch (j)
600  {
601  case 1 : GEN(g_02);
602  case 2 : GEN(g_01);
603  default : GEN(g_00);
604  }
605  break;
606  }
607  }
608  }
609 }
610 
611 void KXFace::PopGreys(char *f, int wid, int hei)
612 {
613  if (wid > 3)
614  {
615  wid /= 2;
616  hei /= 2;
617  PopGreys(f, wid, hei);
618  PopGreys(f + wid, wid, hei);
619  PopGreys(f + WIDTH * hei, wid, hei);
620  PopGreys(f + WIDTH * hei + wid, wid, hei);
621  }
622  else
623  {
624  wid = BigPop(freqs);
625  if (wid & 1)
626  *f = 1;
627  if (wid & 2)
628  *(f + 1) = 1;
629  if (wid & 4)
630  *(f + WIDTH) = 1;
631  if (wid & 8)
632  *(f + WIDTH + 1) = 1;
633  }
634 }
635 
636 void KXFace::CompAll(char *fbuf)
637 {
638  Compress(F, 16, 16, 0);
639  Compress(F + 16, 16, 16, 0);
640  Compress(F + 32, 16, 16, 0);
641  Compress(F + WIDTH * 16, 16, 16, 0);
642  Compress(F + WIDTH * 16 + 16, 16, 16, 0);
643  Compress(F + WIDTH * 16 + 32, 16, 16, 0);
644  Compress(F + WIDTH * 32, 16, 16, 0);
645  Compress(F + WIDTH * 32 + 16, 16, 16, 0);
646  Compress(F + WIDTH * 32 + 32, 16, 16, 0);
647  BigClear();
648  while (NumProbs > 0)
649  BigPush(ProbBuf[--NumProbs]);
650  BigWrite(fbuf);
651 }
652 
653 void KXFace::Compress(register char *f, register int wid, register int hei, register int lev)
654 {
655  if (AllWhite(f, wid, hei))
656  {
657  RevPush(&levels[lev][WHITE]);
658  return;
659  }
660  if (AllBlack(f, wid, hei))
661  {
662  RevPush(&levels[lev][BLACK]);
663  PushGreys(f, wid, hei);
664  return;
665  }
666  RevPush(&levels[lev][GREY]);
667  wid /= 2;
668  hei /= 2;
669  lev++;
670  Compress(f, wid, hei, lev);
671  Compress(f + wid, wid, hei, lev);
672  Compress(f + hei * WIDTH, wid, hei, lev);
673  Compress(f + wid + hei * WIDTH, wid, hei, lev);
674 }
675 
676 int KXFace::AllWhite(char *f, int wid, int hei)
677 {
678  return ((*f == 0) && Same(f, wid, hei));
679 }
680 
681 int KXFace::AllBlack(char *f, int wid, int hei)
682 {
683  if (wid > 3)
684  {
685  wid /= 2;
686  hei /= 2;
687  return (AllBlack(f, wid, hei) && AllBlack(f + wid, wid, hei) &&
688  AllBlack(f + WIDTH * hei, wid, hei) &&
689  AllBlack(f + WIDTH * hei + wid, wid, hei));
690  }
691  else
692  return (*f || *(f + 1) || *(f + WIDTH) || *(f + WIDTH + 1));
693 }
694 
695 int KXFace::Same(register char *f, register int wid, register int hei)
696 {
697  register char val, *row;
698  register int x;
699 
700  val = *f;
701  while (hei--)
702  {
703  row = f;
704  x = wid;
705  while (x--)
706  if (*(row++) != val)
707  return(0);
708  f += WIDTH;
709  }
710  return 1;
711 }
712 
713 void KXFace::PushGreys(char *f, int wid, int hei)
714 {
715  if (wid > 3)
716  {
717  wid /= 2;
718  hei /= 2;
719  PushGreys(f, wid, hei);
720  PushGreys(f + wid, wid, hei);
721  PushGreys(f + WIDTH * hei, wid, hei);
722  PushGreys(f + WIDTH * hei + wid, wid, hei);
723  }
724  else
725  RevPush(freqs + *f + 2 * *(f + 1) + 4 * *(f + WIDTH) +
726  8 * *(f + WIDTH + 1));
727 }
728 
729 
730 #include "kxface.moc"
MAXLINELEN
static const int MAXLINELEN
Definition: kxface.cpp:56
BITSPERDIG
#define BITSPERDIG
Definition: kxface.cpp:43
GREY
#define GREY
Definition: kxface.cpp:71
LASTPRINT
#define LASTPRINT
Definition: kxface.cpp:52
MessageViewer::HeaderStyleUtil::xface
xfaceSettings xface(const MessageViewer::HeaderStyle *style, KMime::Message *message)
Definition: headerstyle_util.cpp:262
WHITE
#define WHITE
Definition: kxface.cpp:72
DIGITS
#define DIGITS
Definition: kxface.cpp:44
kxface.h
freqs
static const Prob freqs[16]
Definition: kxface.h:506
MessageViewer::KXFace::~KXFace
~KXFace()
Definition: kxface.cpp:83
FIRSTPRINT
#define FIRSTPRINT
Definition: kxface.cpp:51
BLACK
#define BLACK
Definition: kxface.cpp:70
MessageViewer::KXFace::toImage
QImage toImage(const QString &xface)
creates a pixmap from xface
Definition: kxface.cpp:154
WORDMASK
#define WORDMASK
Definition: kxface.cpp:63
MAX_XFACE_LENGTH
static const int MAX_XFACE_LENGTH
Definition: kxface.cpp:74
prob
Definition: kxface.h:491
prob::p_offset
int p_offset
Definition: kxface.h:494
MessageViewer::KXFace::fromImage
QString fromImage(const QImage &image)
generates the xface string from image
Definition: kxface.cpp:87
ERR_INSUFF
#define ERR_INSUFF
Definition: kxface.cpp:67
levels
static const Prob levels[4][3]
Definition: kxface.h:499
ERR_INTERNAL
#define ERR_INTERNAL
Definition: kxface.cpp:68
HexDigits
static const char HexDigits[]
Definition: kxface.h:513
prob::p_range
int p_range
Definition: kxface.h:493
MessageViewer::KXFace::KXFace
KXFace()
Definition: kxface.cpp:78
COMP
#define COMP
Definition: kxface.cpp:61
NUMPRINTS
#define NUMPRINTS
Definition: kxface.cpp:53
ERR_EXCESS
#define ERR_EXCESS
Definition: kxface.cpp:66
GEN
#define GEN(g)
Definition: kxface.cpp:41
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:55:57 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

messageviewer

Skip menu "messageviewer"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdepim API Reference

Skip menu "kdepim API Reference"
  • akonadi_next
  • akregator
  • blogilo
  • calendarsupport
  • console
  •   kabcclient
  •   konsolekalendar
  • kaddressbook
  • kalarm
  •   lib
  • kdgantt2
  • kjots
  • kleopatra
  • kmail
  • knode
  • knotes
  • kontact
  • korgac
  • korganizer
  • ktimetracker
  • libkdepim
  • libkleo
  • libkpgp
  • mailcommon
  • messagelist
  • messageviewer

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal