summaryrefslogtreecommitdiffstats
path: root/src/qlcdraw.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/qlcdraw.cpp')
-rw-r--r--src/qlcdraw.cpp275
1 files changed, 275 insertions, 0 deletions
diff --git a/src/qlcdraw.cpp b/src/qlcdraw.cpp
new file mode 100644
index 0000000..26c68d4
--- /dev/null
+++ b/src/qlcdraw.cpp
@@ -0,0 +1,275 @@
+/***************************************************************************
+ lcddraw.cpp - description
+ -------------------
+ begin : Tue Nov 27 2001
+ copyright : (C) 2001 by Miguel Novas
+ email : michaell@teleline.es
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "qlcddraw.h"
+
+
+const uint QLcd::asciiSegments[128]=
+ {
+ 0x00000000, // 0
+ 0x00000000, // 1 // From 1-31 maybe for future use (to draw symbols)
+ 0x00000000, // 2
+ 0x00000000, // 3
+ 0x00000000, // 4
+ 0x00000000, // 5
+ 0x00000000, // 6
+ 0x00000000, // 7
+ 0x00000000, // 8
+ 0x00000000, // 9
+ 0x00000000, // 10
+ 0x00000000, // 11
+ 0x00000000, // 12
+ 0x00000000, // 13
+ 0x00000000, // 14
+ 0x00000000, // 15
+ 0x00000000, // 16
+ 0x00000000, // 17
+ 0x00000000, // 18
+ 0x00000000, // 19
+ 0x00000000, // 20
+ 0x00000000, // 21
+ 0x00000000, // 22
+ 0x00000000, // 23
+ 0x00000000, // 24
+ 0x00000000, // 25
+ 0x00000000, // 26
+ 0x00000000, // 27
+ 0x00000000, // 28
+ 0x00000000, // 29
+ 0x00000000, // 30
+ 0x00000000, // 31
+ 0x00000000, // 32
+ 0x21C00000, // 33 !
+ 0x00400800, // 34 "
+ 0x01BC3618, // 35 #
+ 0x03C03CF3, // 36 $
+ 0x18028000, // 37 %
+ 0x00440801, // 38 &
+ 0x00400000, // 39 '
+ 0x03C00042, // 40 (
+ 0x03C00081, // 41 )
+ 0x03C3C000, // 42 *
+ 0x01803000, // 43 +
+ 0x00010000, // 44 ,
+ 0x00003000, // 45 -
+ 0x20000000, // 46 .
+ 0x00028000, // 47 /
+ 0x00000FFF, // 48 0
+ 0x0000003C, // 49 1
+ 0x000033CF, // 50 2
+ 0x000030FF, // 51 3
+ 0x00003C3C, // 52 4
+ 0x00003CF3, // 53 5
+ 0x00003FF3, // 54 6
+ 0x0000003F, // 55 7
+ 0x00003FFF, // 56 8
+ 0x00003CFF, // 57 9
+ 0x18000000, // 58 :
+ 0x18000000, // 59 ;
+ 0x00028000, // 60 <
+ 0x003C0000, // 61 =
+ 0x00024000, // 62 >
+ 0x2100200F, // 63 ?
+ 0x00882FCF, // 64 @
+ 0x00003F3F, // 65 A
+ 0x00003FFF, // 66 B
+ 0x00000FC3, // 67 C
+ 0x00000FFF, // 68 D
+ 0x00003FC3, // 69 E
+ 0x00001F03, // 70 F
+ 0x00002FF3, // 71 G
+ 0x00003F3C, // 72 H
+ 0x03C00000, // 73 I
+ 0x000001FC, // 74 J
+ 0x40000F00, // 75 K Especial segment bit 30 to draw <
+ 0x00000FC0, // 76 L
+ 0x0000CF3C, // 77 M
+ 0x00014F3C, // 78 N
+ 0x00000FFF, // 79 O
+ 0x00003F0F, // 80 P
+ 0x00010FFF, // 81 Q
+ 0x00013F0F, // 82 R
+ 0x00003CF3, // 83 S
+ 0x03C00003, // 84 T
+ 0x00000FFC, // 85 U
+ 0x80000000, // 86 V Especial segment bit 31 to draw this letter
+ 0x00030F3C, // 87 W
+ 0x0003C000, // 88 X
+ 0x0300C000, // 89 Y
+ 0x000280C3, // 90 Z
+ 0x03C00042, // 91 [
+ 0x00014000, // 92
+ 0x03C00081, // 93 ]
+ 0x00003C0F, // 94 ^
+ 0x000000C0, // 95 _
+ 0x00004000, // 96 `
+ 0x00003F3F, // 97 A
+ 0x00003FFF, // 98 B
+ 0x00000FC3, // 99 C
+ 0x00000FFF, //100 D
+ 0x00003FC3, //101 E
+ 0x00001F03, //102 F
+ 0x00002FF3, //103 G
+ 0x00003F3C, //104 H
+ 0x03C00000, //105 I
+ 0x000001FC, //106 J
+ 0x40000F00, //107 K Especial segment bit 30 to draw <
+ 0x00000FC0, //108 L
+ 0x0000CF3C, //109 M
+ 0x00014F3C, //110 N
+ 0x00000FFF, //111 O
+ 0x00003F0F, //112 P
+ 0x00010FFF, //113 Q
+ 0x00013F0F, //114 R
+ 0x00003CF3, //115 S
+ 0x03C00003, //116 T
+ 0x00000FFC, //117 U
+ 0x80000000, //118 V Especial segment bit 31 to draw this letter
+ 0x00030F3C, //119 W
+ 0x0003C000, //120 X
+ 0x0300C000, //121 Y
+ 0x000280C3, //122 Z
+ 0x03C00042, //123 {
+ 0x03C00000, //124 |
+ 0x03C00081, //125 }
+ 0x00000003, //126 ~
+ 0x003C0518 //127
+ };
+
+
+const int QLcd::segmentsCoords[32][8]=
+ {
+ { 0,0, 1,0, -1 }, // 00
+ { 1,0, 2,0, -1 },
+ { 2,0, 2,1, -1 },
+ { 2,1, 2,2, -1 },
+ { 2,2, 2,3, -1 },
+ { 2,3, 2,4, -1 },
+ { 2,4, 1,4, -1 },
+ { 1,4, 0,4, -1 },
+ { 0,4, 0,3, -1 },
+ { 0,3, 0,2, -1 },
+ { 0,2, 0,1, -1 },
+ { 0,1, 0,0, -1 },
+ { 0,2, 1,2, -1 },
+ { 1,2, 2,2, -1 },
+ { 0,0, 1,2, -1 },
+ { 2,0, 1,2, -1 },
+ { 2,4, 1,2, -1 }, // 16
+ { 0,4, 1,2, -1 },
+ { 0,1, 1,1, -1 },
+ { 1,1, 2,1, -1 },
+ { 0,3, 1,3, -1 },
+ { 1,3, 2,3, -1 },
+ { 1,0, 1,1, -1 },
+ { 1,1, 1,2, -1 },
+ { 1,2, 1,3, -1 },
+ { 1,3, 1,4, -1 },
+ { 1,0, 1,0, -1 },
+ { 1,1, 1,1, -1 },
+ { 1,3, 1,3, -1 },
+ { 2,4, 2,4, -1 },
+ { 2,0, 0,2, 2,4, -1 }, // 30 -> <
+ { 0,0, 1,4, 2,0, -1 } // 31 -> V
+ };
+
+
+
+void QLcd::drawSegment(QPainter *p,const int *c, int x, int y, int w, int h)
+{
+ h--;
+ p->moveTo( x+(c[0]*w)/2 , y+(c[1]*h)/4 );
+ c+= 2;
+ do {
+ p->lineTo( x+(c[0]*w)/2 , y+(c[1]*h)/4 );
+ c+= 2;
+ } while(*c>=0);
+}
+
+
+void QLcd::draw(QPainter *p,int x,int y,int w,int h, char c)
+{
+uint mask= asciiSegments[(uint)c&0x007F];
+
+ if (mask) {
+ int i= 0;
+ do {
+ if(mask&1) drawSegment(p, segmentsCoords[i & 0x001F], x,y,w,h);
+ mask>>= 1;
+ i++;
+ } while(mask);
+ }
+}
+
+
+
+int QLcd::draw(QPainter *painter,int x, int y, int w, int h,const char *str, int options, const QColor *color, const QColor *colorShadow)
+{
+ int len= strlen(str)<<1;
+
+ bool point= false;
+ if(options & drawNumber)
+ for(const char *ptr=str; *ptr!=0; ptr++)
+ if(*ptr=='.') { point= true; len--; break; }
+
+ int cww= charWidth(h);
+ int tww= cww*len;
+
+ if((options & alignMask)==alignJustify || tww>(w<<1)) {
+ cww= (w<<1)/len;
+ tww= cww*len;
+ }
+
+ len>>= 1;
+ tww>>= 1;
+
+ int sep= (cww+4)/4;
+ if(options & drawShadow) {
+ h--;
+ if(sep<=2) sep= 3;
+ }
+
+ int cw= cww - sep;
+
+ switch( options & alignMask ) {
+ case alignLeft : break;
+ case alignRight : x+= w - tww; break;
+ default : x+= (w - tww) / 2; break;
+ }
+
+ if(options & drawShadow) {
+ if(colorShadow) painter->setPen( *colorShadow );
+ int px = x+1;
+ int py = y+1;
+ const char *ptr= str;
+ while(*ptr) {
+ draw(painter,px,py,cw,h,*ptr++);
+ px+= (point && *ptr=='.') ? cww/2 : cww;
+ }
+ }
+
+ if(color) painter->setPen( *color );
+ while(*str) {
+ draw(painter,x,y,cw,h,*str++);
+ x+= (point && *str=='.') ? cww/2 : cww;
+ }
+
+ return x;
+}
+
+
+