source: asp3_tinet_ecnl_arm/trunk/ntshell/lcd/draw_font.c@ 352

Last change on this file since 352 was 352, checked in by coas-nagasima, 6 years ago

arm向けASP3版ECNLを追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 7.3 KB
Line 
1/*
2 * TOPPERS ECHONET Lite Communication Middleware
3 *
4 * Copyright (C) 2018 Cores Co., Ltd. Japan
5 *
6 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
7 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
8 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
9 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
10 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
11 * スコード中に含まれていること.
12 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
13 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
14 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
15 * の無保証規定を掲載すること.
16 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
17 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
18 * と.
19 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
20 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
21 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
22 * 報告すること.
23 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
24 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
25 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
26 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
27 * 免責すること.
28 *
29 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
30 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
31 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
32 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
33 * の責任を負わない.
34 *
35 * @(#) $Id$
36 */
37
38#include <kernel.h>
39#include <t_syslog.h>
40#include <t_stdlib.h>
41#include <string.h>
42#include <target_syssvc.h>
43#include "adafruit_st7735.h"
44#include "draw_font.h"
45#include "misaki_font.h"
46
47void get_bitmap_font(char *string, unsigned char *bitmap_data, unsigned long *use_chars)
48{
49 unsigned long len, code;
50 unsigned char i,j,k;
51 unsigned long totalj, totalk;
52
53 *use_chars = 0;
54 len = 0;
55 if ((string[0] & 0x80) == 0) { len = 1; }
56 else if ((string[0] & 0xE0) == 0xC0) { len = 2; }
57 else if ((string[0] & 0xF0) == 0xE0) { len = 3; }
58 else if ((string[0] & 0xF8) == 0xF0) { len = 4; }
59 else { return; }
60
61 j = k = totalj = totalk = 0;
62
63 if( len == 1 ) {
64 code = string[0];
65 memcpy(bitmap_data, &UTF8_1B_CODE_BITMAP[code][0], 8 );
66 *use_chars = 1;
67 return;
68 }
69
70 if( len == 2 ) {
71 code = string[0];
72 // 1バイト目サーチ
73 for(i = 0; i < UTF8_CODE_2B_1_NUM; i++ ) {
74 if ( Utf8CodeTable_2B_1st[i][0] == code ) {
75 code = string[1];
76 for( j = 0; j < Utf8CodeTable_2B_1st[i][1]; j++ ) {
77 if ( UTF8_2B_CODE_BITMAP[totalk].code == code ) {
78 memcpy(bitmap_data, UTF8_2B_CODE_BITMAP[totalk].bitmap, 8 );
79 *use_chars = 2;
80 return;
81 }
82 totalk++;
83 }
84 }
85 else {
86 totalk += Utf8CodeTable_2B_1st[i][1];
87 }
88 }
89 return;
90 }
91
92 if( len == 3 ) {
93 code = string[0];
94 // 1バイト目サーチ
95 for(i = 0; i < UTF8_CODE_3B_1_NUM; i++ ) {
96 if ( Utf8CodeTable_3B_1st[i][0] == code ) {
97 code = string[1];
98 // 2バイト目サーチ
99 for( j = 0; j < Utf8CodeTable_3B_1st[i][1]; j++ ){
100 if ( Utf8CodeTable_3B_2nd[totalj][0] == code ) {
101 code = string[2];
102 // 3バイト目サーチ
103 for( k = 0; k < Utf8CodeTable_3B_2nd[totalj][1]; k++) {
104 if (UTF8_3B_CODE_BITMAP[totalk].code == code) {
105 memcpy(bitmap_data, UTF8_3B_CODE_BITMAP[totalk].bitmap, 8 );
106 *use_chars = 3;
107 return;
108 }
109 totalk++;
110 }
111 return;
112 }
113 else{/*読み飛ばすbitmap個数を蓄積*/
114 totalk += Utf8CodeTable_3B_2nd[totalj][1];
115 }
116 totalj++;
117 }
118 }
119 else {/*読み飛ばすbitmap個数を蓄積*/
120 for( j = 0; j < Utf8CodeTable_3B_1st[i][1]; j++ ) {
121 totalk += Utf8CodeTable_3B_2nd[totalj][1];
122 totalj++;
123 }
124 }
125 }
126 return;
127 }
128}
129
130void lcd_drawFont(LCD_Handler_t *hlcd, unsigned char *bitmap_data, int x, int y, unsigned short color, unsigned short back_color)
131{
132 int i, j;
133
134 for(i = 0; i < 8; i++ ) {
135 for(j = 0; j < 8; j++ ) {
136 if (((bitmap_data[i] >> j) & 0x01) == 1){
137 lcd_drawPixel(hlcd, x - j, y + i, color);
138 }
139 else {
140 lcd_drawPixel(hlcd, x - j, y + i, back_color);
141 }
142 }
143 }
144}
145
146void lcd_drawFontHalf(LCD_Handler_t *hlcd, unsigned char *bitmap_data, int x, int y, unsigned short color, unsigned short back_color)
147{
148 int i, j;
149
150 for(i = 0; i < 8; i++ ) {
151 for(j = 4; j < 8; j++ ) {
152 if (((bitmap_data[i] >> j) & 0x01) == 1){
153 lcd_drawPixel(hlcd, x - j, y + i, color);
154 }
155 else {
156 lcd_drawPixel(hlcd, x - j, y + i, back_color);
157 }
158 }
159 }
160}
161
162void lcd_drawString(LCD_Handler_t *hlcd, char *string, int x, int y, unsigned short color, unsigned short back_color )
163{
164 unsigned long current_top, use_chars, for_3B_hankaku_code;
165 unsigned char bitmap_data[8], ctrl_code;
166 int local_x, local_y;
167
168 local_x = x;
169 local_y = y;
170
171 current_top = 0;
172 while( current_top < strlen(string) )
173 {
174 memset(bitmap_data,0x0,8);
175 ctrl_code = string[current_top];
176 get_bitmap_font(&string[current_top], bitmap_data, &use_chars);
177 if(use_chars == 0)
178 return;
179
180 //3バイトコード半角文字用
181 if(use_chars == 3) {
182 for_3B_hankaku_code = 0;
183 for_3B_hankaku_code = ( (string[current_top] << 16) |
184 (string[current_top+1] << 8) |
185 (string[current_top+2] ) );
186 }
187
188 current_top += use_chars;
189
190 //1バイトコード半角文字
191 if ( use_chars == 1 ) {
192 if(ctrl_code == 0x0D) { // CR
193 local_x = X_LINE_TO_PIX(hlcd, 0);
194 continue;
195 }
196 if(ctrl_code == 0x0A) { // LF
197 local_y = local_y + 8;
198 continue;
199 }
200
201 if ( local_x >= hlcd->_width + 4 ) {
202 local_x = X_LINE_HALF_TO_PIX(hlcd, 0);
203 local_y = local_y + 8;
204 }
205 lcd_drawFontHalf(hlcd, bitmap_data, local_x, local_y, color, back_color);
206 local_x += 4;
207 continue;
208 }
209
210 //3バイトコード半角文字
211 if( use_chars == 3 ) {
212 if ( ( (0xEFBDA1 <= for_3B_hankaku_code) && (for_3B_hankaku_code <= 0xEFBDBF) ) ||
213 ( (0xEFBE80 <= for_3B_hankaku_code) && (for_3B_hankaku_code <= 0xEFBE9F) ) ) {
214 //3バイトコード半角文字
215 if ( local_x >= hlcd->_width + 4 ) {
216 local_x = X_LINE_HALF_TO_PIX(hlcd, 0);
217 local_y = local_y + 8;
218 }
219 lcd_drawFontHalf(hlcd, bitmap_data, local_x, local_y, color, back_color);
220 local_x += 4;
221 continue;
222 }
223 }
224
225 //全角文字
226 if ( local_x >= hlcd->_width + 8 ) {
227 local_x = X_LINE_TO_PIX(hlcd, 0);
228 local_y = local_y + 8;
229 }
230 lcd_drawFont(hlcd, bitmap_data, local_x, local_y, color, back_color);
231 local_x += 8;
232 }
233}
234
Note: See TracBrowser for help on using the repository browser.