epaper 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,779 @@
1
+ /******************************************************************************
2
+ * | File : GUI_Paint.c
3
+ * | Author : Waveshare electronics
4
+ * | Function : Achieve drawing: draw points, lines, boxes, circles and
5
+ * their size, solid dotted line, solid rectangle hollow
6
+ * rectangle, solid circle hollow circle.
7
+ * | Info :
8
+ * Achieve display characters: Display a single character, string, number
9
+ * Achieve time display: adaptive size display time minutes and seconds
10
+ *----------------
11
+ * | This version: V3.2
12
+ * | Date : 2020-07-10
13
+ * | Info :
14
+ * -----------------------------------------------------------------------------
15
+ * V3.2(2020-07-10):
16
+ * 1.Change: Paint_SetScale(UBYTE scale)
17
+ * Add scale 7 for 5.65f e-Parper
18
+ * 2.Change: Paint_SetPixel(UWORD Xpoint, UWORD Ypoint, UWORD Color)
19
+ * Add the branch for scale 7
20
+ * 3.Change: Paint_Clear(UWORD Color)
21
+ * Add the branch for scale 7
22
+ * -----------------------------------------------------------------------------
23
+ * V3.1(2019-10-10):
24
+ * 1. Add gray level
25
+ * PAINT Add Scale
26
+ * 2. Add void Paint_SetScale(UBYTE scale);
27
+ * -----------------------------------------------------------------------------
28
+ * V3.0(2019-04-18):
29
+ * 1.Change:
30
+ * Paint_DrawPoint(..., DOT_STYLE DOT_STYLE)
31
+ * => Paint_DrawPoint(..., DOT_STYLE Dot_Style)
32
+ * Paint_DrawLine(..., LINE_STYLE Line_Style, DOT_PIXEL Dot_Pixel)
33
+ * => Paint_DrawLine(..., DOT_PIXEL Line_width, LINE_STYLE Line_Style)
34
+ * Paint_DrawRectangle(..., DRAW_FILL Filled, DOT_PIXEL Dot_Pixel)
35
+ * => Paint_DrawRectangle(..., DOT_PIXEL Line_width, DRAW_FILL Draw_Fill)
36
+ * Paint_DrawCircle(..., DRAW_FILL Draw_Fill, DOT_PIXEL Dot_Pixel)
37
+ * => Paint_DrawCircle(..., DOT_PIXEL Line_width, DRAW_FILL Draw_Filll)
38
+ *
39
+ * -----------------------------------------------------------------------------
40
+ * V2.0(2018-11-15):
41
+ * 1.add: Paint_NewImage()
42
+ * Create an image's properties
43
+ * 2.add: Paint_SelectImage()
44
+ * Select the picture to be drawn
45
+ * 3.add: Paint_SetRotate()
46
+ * Set the direction of the cache
47
+ * 4.add: Paint_RotateImage()
48
+ * Can flip the picture, Support 0-360 degrees,
49
+ * but only 90.180.270 rotation is better
50
+ * 4.add: Paint_SetMirroring()
51
+ * Can Mirroring the picture, horizontal, vertical, origin
52
+ * 5.add: Paint_DrawString_CN()
53
+ * Can display Chinese(GB1312)
54
+ *
55
+ * -----------------------------------------------------------------------------
56
+ * V1.0(2018-07-17):
57
+ * Create library
58
+ *
59
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
60
+ * of this software and associated documnetation files (the "Software"), to deal
61
+ * in the Software without restriction, including without limitation the rights
62
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
63
+ * copies of the Software, and to permit persons to whom the Software is
64
+ * furished to do so, subject to the following conditions:
65
+ *
66
+ * The above copyright notice and this permission notice shall be included in
67
+ * all copies or substantial portions of the Software.
68
+ *
69
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
70
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
71
+ * FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
72
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
73
+ * LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
74
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
75
+ * THE SOFTWARE.
76
+ *
77
+ ******************************************************************************/
78
+ #include "GUI_Paint.h"
79
+ #include "DEV_Config.h"
80
+ #include "Debug.h"
81
+ #include <stdint.h>
82
+ #include <stdlib.h>
83
+ #include <string.h> //memset()
84
+ #include <math.h>
85
+
86
+ PAINT Paint;
87
+
88
+ /******************************************************************************
89
+ function: Create Image
90
+ parameter:
91
+ image : Pointer to the image cache
92
+ width : The width of the picture
93
+ Height : The height of the picture
94
+ Color : Whether the picture is inverted
95
+ ******************************************************************************/
96
+ void Paint_NewImage(UBYTE *image, UWORD Width, UWORD Height, UWORD Rotate, UWORD Color)
97
+ {
98
+ Paint.Image = NULL;
99
+ Paint.Image = image;
100
+
101
+ Paint.WidthMemory = Width;
102
+ Paint.HeightMemory = Height;
103
+ Paint.Color = Color;
104
+ Paint.Scale = 2;
105
+ Paint.WidthByte = (Width % 8 == 0)? (Width / 8 ): (Width / 8 + 1);
106
+ Paint.HeightByte = Height;
107
+ // printf("WidthByte = %d, HeightByte = %d\r\n", Paint.WidthByte, Paint.HeightByte);
108
+ // printf(" EPD_WIDTH / 8 = %d\r\n", 122 / 8);
109
+
110
+ Paint.Rotate = Rotate;
111
+ Paint.Mirror = MIRROR_NONE;
112
+
113
+ if(Rotate == ROTATE_0 || Rotate == ROTATE_180) {
114
+ Paint.Width = Width;
115
+ Paint.Height = Height;
116
+ } else {
117
+ Paint.Width = Height;
118
+ Paint.Height = Width;
119
+ }
120
+ }
121
+
122
+ /******************************************************************************
123
+ function: Select Image
124
+ parameter:
125
+ image : Pointer to the image cache
126
+ ******************************************************************************/
127
+ void Paint_SelectImage(UBYTE *image)
128
+ {
129
+ Paint.Image = image;
130
+ }
131
+
132
+ /******************************************************************************
133
+ function: Select Image Rotate
134
+ parameter:
135
+ Rotate : 0,90,180,270
136
+ ******************************************************************************/
137
+ void Paint_SetRotate(UWORD Rotate)
138
+ {
139
+ if(Rotate == ROTATE_0 || Rotate == ROTATE_90 || Rotate == ROTATE_180 || Rotate == ROTATE_270) {
140
+ Debug("Set image Rotate %d\r\n", Rotate);
141
+ Paint.Rotate = Rotate;
142
+ } else {
143
+ Debug("rotate = 0, 90, 180, 270\r\n");
144
+ }
145
+ }
146
+
147
+ /******************************************************************************
148
+ function: Select Image mirror
149
+ parameter:
150
+ mirror :Not mirror,Horizontal mirror,Vertical mirror,Origin mirror
151
+ ******************************************************************************/
152
+ void Paint_SetMirroring(UBYTE mirror)
153
+ {
154
+ if(mirror == MIRROR_NONE || mirror == MIRROR_HORIZONTAL ||
155
+ mirror == MIRROR_VERTICAL || mirror == MIRROR_ORIGIN) {
156
+ Debug("mirror image x:%s, y:%s\r\n",(mirror & 0x01)? "mirror":"none", ((mirror >> 1) & 0x01)? "mirror":"none");
157
+ Paint.Mirror = mirror;
158
+ } else {
159
+ Debug("mirror should be MIRROR_NONE, MIRROR_HORIZONTAL, \
160
+ MIRROR_VERTICAL or MIRROR_ORIGIN\r\n");
161
+ }
162
+ }
163
+
164
+ void Paint_SetScale(UBYTE scale)
165
+ {
166
+ if(scale == 2){
167
+ Paint.Scale = scale;
168
+ Paint.WidthByte = (Paint.WidthMemory % 8 == 0)? (Paint.WidthMemory / 8 ): (Paint.WidthMemory / 8 + 1);
169
+ }else if(scale == 4){
170
+ Paint.Scale = scale;
171
+ Paint.WidthByte = (Paint.WidthMemory % 4 == 0)? (Paint.WidthMemory / 4 ): (Paint.WidthMemory / 4 + 1);
172
+ }else if(scale == 7){//Only applicable with 5in65 e-Paper
173
+ Paint.Scale = scale;
174
+ Paint.WidthByte = (Paint.WidthMemory % 2 == 0)? (Paint.WidthMemory / 2 ): (Paint.WidthMemory / 2 + 1);;
175
+ }else{
176
+ Debug("Set Scale Input parameter error\r\n");
177
+ Debug("Scale Only support: 2 4 7\r\n");
178
+ }
179
+ }
180
+ /******************************************************************************
181
+ function: Draw Pixels
182
+ parameter:
183
+ Xpoint : At point X
184
+ Ypoint : At point Y
185
+ Color : Painted colors
186
+ ******************************************************************************/
187
+ void Paint_SetPixel(UWORD Xpoint, UWORD Ypoint, UWORD Color)
188
+ {
189
+ if(Xpoint > Paint.Width || Ypoint > Paint.Height){
190
+ Debug("Exceeding display boundaries\r\n");
191
+ return;
192
+ }
193
+ UWORD X, Y;
194
+ switch(Paint.Rotate) {
195
+ case 0:
196
+ X = Xpoint;
197
+ Y = Ypoint;
198
+ break;
199
+ case 90:
200
+ X = Paint.WidthMemory - Ypoint - 1;
201
+ Y = Xpoint;
202
+ break;
203
+ case 180:
204
+ X = Paint.WidthMemory - Xpoint - 1;
205
+ Y = Paint.HeightMemory - Ypoint - 1;
206
+ break;
207
+ case 270:
208
+ X = Ypoint;
209
+ Y = Paint.HeightMemory - Xpoint - 1;
210
+ break;
211
+ default:
212
+ return;
213
+ }
214
+
215
+ switch(Paint.Mirror) {
216
+ case MIRROR_NONE:
217
+ break;
218
+ case MIRROR_HORIZONTAL:
219
+ X = Paint.WidthMemory - X - 1;
220
+ break;
221
+ case MIRROR_VERTICAL:
222
+ Y = Paint.HeightMemory - Y - 1;
223
+ break;
224
+ case MIRROR_ORIGIN:
225
+ X = Paint.WidthMemory - X - 1;
226
+ Y = Paint.HeightMemory - Y - 1;
227
+ break;
228
+ default:
229
+ return;
230
+ }
231
+
232
+ if(X > Paint.WidthMemory || Y > Paint.HeightMemory){
233
+ Debug("Exceeding display boundaries\r\n");
234
+ return;
235
+ }
236
+
237
+ if(Paint.Scale == 2){
238
+ UDOUBLE Addr = X / 8 + Y * Paint.WidthByte;
239
+ UBYTE Rdata = Paint.Image[Addr];
240
+ if(Color == BLACK)
241
+ Paint.Image[Addr] = Rdata & ~(0x80 >> (X % 8));
242
+ else
243
+ Paint.Image[Addr] = Rdata | (0x80 >> (X % 8));
244
+ }else if(Paint.Scale == 4){
245
+ UDOUBLE Addr = X / 4 + Y * Paint.WidthByte;
246
+ Color = Color % 4;//Guaranteed color scale is 4 --- 0~3
247
+ UBYTE Rdata = Paint.Image[Addr];
248
+
249
+ Rdata = Rdata & (~(0xC0 >> ((X % 4)*2)));//Clear first, then set value
250
+ Paint.Image[Addr] = Rdata | ((Color << 6) >> ((X % 4)*2));
251
+ }else if(Paint.Scale == 7){
252
+ UDOUBLE Addr = X / 2 + Y * Paint.WidthByte;
253
+ UBYTE Rdata = Paint.Image[Addr];
254
+ Rdata = Rdata & (~(0xF0 >> ((X % 2)*4)));//Clear first, then set value
255
+ Paint.Image[Addr] = Rdata | ((Color << 4) >> ((X % 2)*4));
256
+ // printf("Add = %d ,data = %d\r\n",Addr,Rdata);
257
+ }
258
+ }
259
+
260
+ /******************************************************************************
261
+ function: Clear the color of the picture
262
+ parameter:
263
+ Color : Painted colors
264
+ ******************************************************************************/
265
+ void Paint_Clear(UWORD Color)
266
+ {
267
+ if(Paint.Scale == 2 || Paint.Scale == 4){
268
+ for (UWORD Y = 0; Y < Paint.HeightByte; Y++) {
269
+ for (UWORD X = 0; X < Paint.WidthByte; X++ ) {//8 pixel = 1 byte
270
+ UDOUBLE Addr = X + Y*Paint.WidthByte;
271
+ Paint.Image[Addr] = Color;
272
+ }
273
+ }
274
+ }else if(Paint.Scale == 7){
275
+ for (UWORD Y = 0; Y < Paint.HeightByte; Y++) {
276
+ for (UWORD X = 0; X < Paint.WidthByte; X++ ) {
277
+ UDOUBLE Addr = X + Y*Paint.WidthByte;
278
+ Paint.Image[Addr] = (Color<<4)|Color;
279
+ }
280
+ }
281
+ }
282
+
283
+ }
284
+
285
+ /******************************************************************************
286
+ function: Clear the color of a window
287
+ parameter:
288
+ Xstart : x starting point
289
+ Ystart : Y starting point
290
+ Xend : x end point
291
+ Yend : y end point
292
+ Color : Painted colors
293
+ ******************************************************************************/
294
+ void Paint_ClearWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color)
295
+ {
296
+ UWORD X, Y;
297
+ for (Y = Ystart; Y < Yend; Y++) {
298
+ for (X = Xstart; X < Xend; X++) {//8 pixel = 1 byte
299
+ Paint_SetPixel(X, Y, Color);
300
+ }
301
+ }
302
+ }
303
+
304
+ /******************************************************************************
305
+ function: Draw Point(Xpoint, Ypoint) Fill the color
306
+ parameter:
307
+ Xpoint : The Xpoint coordinate of the point
308
+ Ypoint : The Ypoint coordinate of the point
309
+ Color : Painted color
310
+ Dot_Pixel : point size
311
+ Dot_Style : point Style
312
+ ******************************************************************************/
313
+ void Paint_DrawPoint(UWORD Xpoint, UWORD Ypoint, UWORD Color,
314
+ DOT_PIXEL Dot_Pixel, DOT_STYLE Dot_Style)
315
+ {
316
+ if (Xpoint > Paint.Width || Ypoint > Paint.Height) {
317
+ Debug("Paint_DrawPoint Input exceeds the normal display range\r\n");
318
+ return;
319
+ }
320
+
321
+ int16_t XDir_Num , YDir_Num;
322
+ if (Dot_Style == DOT_FILL_AROUND) {
323
+ for (XDir_Num = 0; XDir_Num < 2 * Dot_Pixel - 1; XDir_Num++) {
324
+ for (YDir_Num = 0; YDir_Num < 2 * Dot_Pixel - 1; YDir_Num++) {
325
+ if(Xpoint + XDir_Num - Dot_Pixel < 0 || Ypoint + YDir_Num - Dot_Pixel < 0)
326
+ break;
327
+ // printf("x = %d, y = %d\r\n", Xpoint + XDir_Num - Dot_Pixel, Ypoint + YDir_Num - Dot_Pixel);
328
+ Paint_SetPixel(Xpoint + XDir_Num - Dot_Pixel, Ypoint + YDir_Num - Dot_Pixel, Color);
329
+ }
330
+ }
331
+ } else {
332
+ for (XDir_Num = 0; XDir_Num < Dot_Pixel; XDir_Num++) {
333
+ for (YDir_Num = 0; YDir_Num < Dot_Pixel; YDir_Num++) {
334
+ Paint_SetPixel(Xpoint + XDir_Num - 1, Ypoint + YDir_Num - 1, Color);
335
+ }
336
+ }
337
+ }
338
+ }
339
+
340
+ /******************************************************************************
341
+ function: Draw a line of arbitrary slope
342
+ parameter:
343
+ Xstart :Starting Xpoint point coordinates
344
+ Ystart :Starting Xpoint point coordinates
345
+ Xend :End point Xpoint coordinate
346
+ Yend :End point Ypoint coordinate
347
+ Color :The color of the line segment
348
+ Line_width : Line width
349
+ Line_Style: Solid and dotted lines
350
+ ******************************************************************************/
351
+ void Paint_DrawLine(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend,
352
+ UWORD Color, DOT_PIXEL Line_width, LINE_STYLE Line_Style)
353
+ {
354
+ if (Xstart > Paint.Width || Ystart > Paint.Height ||
355
+ Xend > Paint.Width || Yend > Paint.Height) {
356
+ Debug("Paint_DrawLine Input exceeds the normal display range\r\n");
357
+ return;
358
+ }
359
+
360
+ UWORD Xpoint = Xstart;
361
+ UWORD Ypoint = Ystart;
362
+ int dx = (int)Xend - (int)Xstart >= 0 ? Xend - Xstart : Xstart - Xend;
363
+ int dy = (int)Yend - (int)Ystart <= 0 ? Yend - Ystart : Ystart - Yend;
364
+
365
+ // Increment direction, 1 is positive, -1 is counter;
366
+ int XAddway = Xstart < Xend ? 1 : -1;
367
+ int YAddway = Ystart < Yend ? 1 : -1;
368
+
369
+ //Cumulative error
370
+ int Esp = dx + dy;
371
+ char Dotted_Len = 0;
372
+
373
+ for (;;) {
374
+ Dotted_Len++;
375
+ //Painted dotted line, 2 point is really virtual
376
+ if (Line_Style == LINE_STYLE_DOTTED && Dotted_Len % 3 == 0) {
377
+ //Debug("LINE_DOTTED\r\n");
378
+ Paint_DrawPoint(Xpoint, Ypoint, IMAGE_BACKGROUND, Line_width, DOT_STYLE_DFT);
379
+ Dotted_Len = 0;
380
+ } else {
381
+ Paint_DrawPoint(Xpoint, Ypoint, Color, Line_width, DOT_STYLE_DFT);
382
+ }
383
+ if (2 * Esp >= dy) {
384
+ if (Xpoint == Xend)
385
+ break;
386
+ Esp += dy;
387
+ Xpoint += XAddway;
388
+ }
389
+ if (2 * Esp <= dx) {
390
+ if (Ypoint == Yend)
391
+ break;
392
+ Esp += dx;
393
+ Ypoint += YAddway;
394
+ }
395
+ }
396
+ }
397
+
398
+ /******************************************************************************
399
+ function: Draw a rectangle
400
+ parameter:
401
+ Xstart :Rectangular Starting Xpoint point coordinates
402
+ Ystart :Rectangular Starting Xpoint point coordinates
403
+ Xend :Rectangular End point Xpoint coordinate
404
+ Yend :Rectangular End point Ypoint coordinate
405
+ Color :The color of the Rectangular segment
406
+ Line_width: Line width
407
+ Draw_Fill : Whether to fill the inside of the rectangle
408
+ ******************************************************************************/
409
+ void Paint_DrawRectangle(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend,
410
+ UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill)
411
+ {
412
+ if (Xstart > Paint.Width || Ystart > Paint.Height ||
413
+ Xend > Paint.Width || Yend > Paint.Height) {
414
+ Debug("Input exceeds the normal display range\r\n");
415
+ return;
416
+ }
417
+
418
+ if (Draw_Fill) {
419
+ UWORD Ypoint;
420
+ for(Ypoint = Ystart; Ypoint < Yend; Ypoint++) {
421
+ Paint_DrawLine(Xstart, Ypoint, Xend, Ypoint, Color , Line_width, LINE_STYLE_SOLID);
422
+ }
423
+ } else {
424
+ Paint_DrawLine(Xstart, Ystart, Xend, Ystart, Color, Line_width, LINE_STYLE_SOLID);
425
+ Paint_DrawLine(Xstart, Ystart, Xstart, Yend, Color, Line_width, LINE_STYLE_SOLID);
426
+ Paint_DrawLine(Xend, Yend, Xend, Ystart, Color, Line_width, LINE_STYLE_SOLID);
427
+ Paint_DrawLine(Xend, Yend, Xstart, Yend, Color, Line_width, LINE_STYLE_SOLID);
428
+ }
429
+ }
430
+
431
+ /******************************************************************************
432
+ function: Use the 8-point method to draw a circle of the
433
+ specified size at the specified position->
434
+ parameter:
435
+ X_Center :Center X coordinate
436
+ Y_Center :Center Y coordinate
437
+ Radius :circle Radius
438
+ Color :The color of the :circle segment
439
+ Line_width: Line width
440
+ Draw_Fill : Whether to fill the inside of the Circle
441
+ ******************************************************************************/
442
+ void Paint_DrawCircle(UWORD X_Center, UWORD Y_Center, UWORD Radius,
443
+ UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill)
444
+ {
445
+ if (X_Center > Paint.Width || Y_Center >= Paint.Height) {
446
+ Debug("Paint_DrawCircle Input exceeds the normal display range\r\n");
447
+ return;
448
+ }
449
+
450
+ //Draw a circle from(0, R) as a starting point
451
+ int16_t XCurrent, YCurrent;
452
+ XCurrent = 0;
453
+ YCurrent = Radius;
454
+
455
+ //Cumulative error,judge the next point of the logo
456
+ int16_t Esp = 3 - (Radius << 1 );
457
+
458
+ int16_t sCountY;
459
+ if (Draw_Fill == DRAW_FILL_FULL) {
460
+ while (XCurrent <= YCurrent ) { //Realistic circles
461
+ for (sCountY = XCurrent; sCountY <= YCurrent; sCountY ++ ) {
462
+ Paint_DrawPoint(X_Center + XCurrent, Y_Center + sCountY, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);//1
463
+ Paint_DrawPoint(X_Center - XCurrent, Y_Center + sCountY, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);//2
464
+ Paint_DrawPoint(X_Center - sCountY, Y_Center + XCurrent, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);//3
465
+ Paint_DrawPoint(X_Center - sCountY, Y_Center - XCurrent, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);//4
466
+ Paint_DrawPoint(X_Center - XCurrent, Y_Center - sCountY, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);//5
467
+ Paint_DrawPoint(X_Center + XCurrent, Y_Center - sCountY, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);//6
468
+ Paint_DrawPoint(X_Center + sCountY, Y_Center - XCurrent, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);//7
469
+ Paint_DrawPoint(X_Center + sCountY, Y_Center + XCurrent, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT);
470
+ }
471
+ if (Esp < 0 )
472
+ Esp += 4 * XCurrent + 6;
473
+ else {
474
+ Esp += 10 + 4 * (XCurrent - YCurrent );
475
+ YCurrent --;
476
+ }
477
+ XCurrent ++;
478
+ }
479
+ } else { //Draw a hollow circle
480
+ while (XCurrent <= YCurrent ) {
481
+ Paint_DrawPoint(X_Center + XCurrent, Y_Center + YCurrent, Color, Line_width, DOT_STYLE_DFT);//1
482
+ Paint_DrawPoint(X_Center - XCurrent, Y_Center + YCurrent, Color, Line_width, DOT_STYLE_DFT);//2
483
+ Paint_DrawPoint(X_Center - YCurrent, Y_Center + XCurrent, Color, Line_width, DOT_STYLE_DFT);//3
484
+ Paint_DrawPoint(X_Center - YCurrent, Y_Center - XCurrent, Color, Line_width, DOT_STYLE_DFT);//4
485
+ Paint_DrawPoint(X_Center - XCurrent, Y_Center - YCurrent, Color, Line_width, DOT_STYLE_DFT);//5
486
+ Paint_DrawPoint(X_Center + XCurrent, Y_Center - YCurrent, Color, Line_width, DOT_STYLE_DFT);//6
487
+ Paint_DrawPoint(X_Center + YCurrent, Y_Center - XCurrent, Color, Line_width, DOT_STYLE_DFT);//7
488
+ Paint_DrawPoint(X_Center + YCurrent, Y_Center + XCurrent, Color, Line_width, DOT_STYLE_DFT);//0
489
+
490
+ if (Esp < 0 )
491
+ Esp += 4 * XCurrent + 6;
492
+ else {
493
+ Esp += 10 + 4 * (XCurrent - YCurrent );
494
+ YCurrent --;
495
+ }
496
+ XCurrent ++;
497
+ }
498
+ }
499
+ }
500
+
501
+ /******************************************************************************
502
+ function: Show English characters
503
+ parameter:
504
+ Xpoint :X coordinate
505
+ Ypoint :Y coordinate
506
+ Acsii_Char :To display the English characters
507
+ Font :A structure pointer that displays a character size
508
+ Color_Foreground : Select the foreground color
509
+ Color_Background : Select the background color
510
+ ******************************************************************************/
511
+ void Paint_DrawChar(UWORD Xpoint, UWORD Ypoint, const char Acsii_Char,
512
+ sFONT* Font, UWORD Color_Foreground, UWORD Color_Background)
513
+ {
514
+ UWORD Page, Column;
515
+
516
+ if (Xpoint > Paint.Width || Ypoint > Paint.Height) {
517
+ Debug("Paint_DrawChar Input exceeds the normal display range\r\n");
518
+ return;
519
+ }
520
+
521
+ uint32_t Char_Offset = (Acsii_Char - ' ') * Font->Height * (Font->Width / 8 + (Font->Width % 8 ? 1 : 0));
522
+ const unsigned char *ptr = &Font->table[Char_Offset];
523
+
524
+ for (Page = 0; Page < Font->Height; Page ++ ) {
525
+ for (Column = 0; Column < Font->Width; Column ++ ) {
526
+
527
+ //To determine whether the font background color and screen background color is consistent
528
+ if (FONT_BACKGROUND == Color_Background) { //this process is to speed up the scan
529
+ if (*ptr & (0x80 >> (Column % 8)))
530
+ Paint_SetPixel(Xpoint + Column, Ypoint + Page, Color_Foreground);
531
+ // Paint_DrawPoint(Xpoint + Column, Ypoint + Page, Color_Foreground, DOT_PIXEL_DFT, DOT_STYLE_DFT);
532
+ } else {
533
+ if (*ptr & (0x80 >> (Column % 8))) {
534
+ Paint_SetPixel(Xpoint + Column, Ypoint + Page, Color_Foreground);
535
+ // Paint_DrawPoint(Xpoint + Column, Ypoint + Page, Color_Foreground, DOT_PIXEL_DFT, DOT_STYLE_DFT);
536
+ } else {
537
+ Paint_SetPixel(Xpoint + Column, Ypoint + Page, Color_Background);
538
+ // Paint_DrawPoint(Xpoint + Column, Ypoint + Page, Color_Background, DOT_PIXEL_DFT, DOT_STYLE_DFT);
539
+ }
540
+ }
541
+ //One pixel is 8 bits
542
+ if (Column % 8 == 7)
543
+ ptr++;
544
+ }// Write a line
545
+ if (Font->Width % 8 != 0)
546
+ ptr++;
547
+ }// Write all
548
+ }
549
+
550
+ /******************************************************************************
551
+ function: Display the string
552
+ parameter:
553
+ Xstart :X coordinate
554
+ Ystart :Y coordinate
555
+ pString :The first address of the English string to be displayed
556
+ Font :A structure pointer that displays a character size
557
+ Color_Foreground : Select the foreground color
558
+ Color_Background : Select the background color
559
+ ******************************************************************************/
560
+ void Paint_DrawString_EN(UWORD Xstart, UWORD Ystart, const char * pString,
561
+ sFONT* Font, UWORD Color_Foreground, UWORD Color_Background)
562
+ {
563
+ UWORD Xpoint = Xstart;
564
+ UWORD Ypoint = Ystart;
565
+
566
+ if (Xstart > Paint.Width || Ystart > Paint.Height) {
567
+ Debug("Paint_DrawString_EN Input exceeds the normal display range\r\n");
568
+ return;
569
+ }
570
+
571
+ while (* pString != '\0') {
572
+ //if X direction filled , reposition to(Xstart,Ypoint),Ypoint is Y direction plus the Height of the character
573
+ if ((Xpoint + Font->Width ) > Paint.Width ) {
574
+ Xpoint = Xstart;
575
+ Ypoint += Font->Height;
576
+ }
577
+
578
+ // If the Y direction is full, reposition to(Xstart, Ystart)
579
+ if ((Ypoint + Font->Height ) > Paint.Height ) {
580
+ Xpoint = Xstart;
581
+ Ypoint = Ystart;
582
+ }
583
+ Paint_DrawChar(Xpoint, Ypoint, * pString, Font, Color_Background, Color_Foreground);
584
+
585
+ //The next character of the address
586
+ pString ++;
587
+
588
+ //The next word of the abscissa increases the font of the broadband
589
+ Xpoint += Font->Width;
590
+ }
591
+ }
592
+
593
+
594
+ /******************************************************************************
595
+ function: Display the string
596
+ parameter:
597
+ Xstart :X coordinate
598
+ Ystart :Y coordinate
599
+ pString :The first address of the Chinese string and English
600
+ string to be displayed
601
+ Font :A structure pointer that displays a character size
602
+ Color_Foreground : Select the foreground color
603
+ Color_Background : Select the background color
604
+ ******************************************************************************/
605
+ void Paint_DrawString_CN(UWORD Xstart, UWORD Ystart, const char * pString, cFONT* font,
606
+ UWORD Color_Foreground, UWORD Color_Background)
607
+ {
608
+ const char* p_text = pString;
609
+ int x = Xstart, y = Ystart;
610
+ int i, j,Num;
611
+
612
+ /* Send the string character by character on EPD */
613
+ while (*p_text != 0) {
614
+ if(*p_text <= 0x7F) { //ASCII < 126
615
+ for(Num = 0; Num < font->size; Num++) {
616
+ if(*p_text== font->table[Num].index[0]) {
617
+ const char* ptr = &font->table[Num].matrix[0];
618
+
619
+ for (j = 0; j < font->Height; j++) {
620
+ for (i = 0; i < font->Width; i++) {
621
+ if (FONT_BACKGROUND == Color_Background) { //this process is to speed up the scan
622
+ if (*ptr & (0x80 >> (i % 8))) {
623
+ Paint_SetPixel(x + i, y + j, Color_Foreground);
624
+ // Paint_DrawPoint(x + i, y + j, Color_Foreground, DOT_PIXEL_DFT, DOT_STYLE_DFT);
625
+ }
626
+ } else {
627
+ if (*ptr & (0x80 >> (i % 8))) {
628
+ Paint_SetPixel(x + i, y + j, Color_Foreground);
629
+ // Paint_DrawPoint(x + i, y + j, Color_Foreground, DOT_PIXEL_DFT, DOT_STYLE_DFT);
630
+ } else {
631
+ Paint_SetPixel(x + i, y + j, Color_Background);
632
+ // Paint_DrawPoint(x + i, y + j, Color_Background, DOT_PIXEL_DFT, DOT_STYLE_DFT);
633
+ }
634
+ }
635
+ if (i % 8 == 7) {
636
+ ptr++;
637
+ }
638
+ }
639
+ if (font->Width % 8 != 0) {
640
+ ptr++;
641
+ }
642
+ }
643
+ break;
644
+ }
645
+ }
646
+ /* Point on the next character */
647
+ p_text += 1;
648
+ /* Decrement the column position by 16 */
649
+ x += font->ASCII_Width;
650
+ } else { //Chinese
651
+ for(Num = 0; Num < font->size; Num++) {
652
+ if((*p_text== font->table[Num].index[0]) && (*(p_text+1) == font->table[Num].index[1])) {
653
+ const char* ptr = &font->table[Num].matrix[0];
654
+
655
+ for (j = 0; j < font->Height; j++) {
656
+ for (i = 0; i < font->Width; i++) {
657
+ if (FONT_BACKGROUND == Color_Background) { //this process is to speed up the scan
658
+ if (*ptr & (0x80 >> (i % 8))) {
659
+ Paint_SetPixel(x + i, y + j, Color_Foreground);
660
+ // Paint_DrawPoint(x + i, y + j, Color_Foreground, DOT_PIXEL_DFT, DOT_STYLE_DFT);
661
+ }
662
+ } else {
663
+ if (*ptr & (0x80 >> (i % 8))) {
664
+ Paint_SetPixel(x + i, y + j, Color_Foreground);
665
+ // Paint_DrawPoint(x + i, y + j, Color_Foreground, DOT_PIXEL_DFT, DOT_STYLE_DFT);
666
+ } else {
667
+ Paint_SetPixel(x + i, y + j, Color_Background);
668
+ // Paint_DrawPoint(x + i, y + j, Color_Background, DOT_PIXEL_DFT, DOT_STYLE_DFT);
669
+ }
670
+ }
671
+ if (i % 8 == 7) {
672
+ ptr++;
673
+ }
674
+ }
675
+ if (font->Width % 8 != 0) {
676
+ ptr++;
677
+ }
678
+ }
679
+ break;
680
+ }
681
+ }
682
+ /* Point on the next character */
683
+ p_text += 2;
684
+ /* Decrement the column position by 16 */
685
+ x += font->Width;
686
+ }
687
+ }
688
+ }
689
+
690
+ /******************************************************************************
691
+ function: Display nummber
692
+ parameter:
693
+ Xstart :X coordinate
694
+ Ystart : Y coordinate
695
+ Nummber : The number displayed
696
+ Font :A structure pointer that displays a character size
697
+ Color_Foreground : Select the foreground color
698
+ Color_Background : Select the background color
699
+ ******************************************************************************/
700
+ #define ARRAY_LEN 255
701
+ void Paint_DrawNum(UWORD Xpoint, UWORD Ypoint, int32_t Nummber,
702
+ sFONT* Font, UWORD Color_Foreground, UWORD Color_Background)
703
+ {
704
+
705
+ int16_t Num_Bit = 0, Str_Bit = 0;
706
+ uint8_t Str_Array[ARRAY_LEN] = {0}, Num_Array[ARRAY_LEN] = {0};
707
+ uint8_t *pStr = Str_Array;
708
+
709
+ if (Xpoint > Paint.Width || Ypoint > Paint.Height) {
710
+ Debug("Paint_DisNum Input exceeds the normal display range\r\n");
711
+ return;
712
+ }
713
+
714
+ //Converts a number to a string
715
+ while (Nummber) {
716
+ Num_Array[Num_Bit] = Nummber % 10 + '0';
717
+ Num_Bit++;
718
+ Nummber /= 10;
719
+ }
720
+
721
+ //The string is inverted
722
+ while (Num_Bit > 0) {
723
+ Str_Array[Str_Bit] = Num_Array[Num_Bit - 1];
724
+ Str_Bit ++;
725
+ Num_Bit --;
726
+ }
727
+
728
+ //show
729
+ Paint_DrawString_EN(Xpoint, Ypoint, (const char*)pStr, Font, Color_Background, Color_Foreground);
730
+ }
731
+
732
+ /******************************************************************************
733
+ function: Display time
734
+ parameter:
735
+ Xstart :X coordinate
736
+ Ystart : Y coordinate
737
+ pTime : Time-related structures
738
+ Font :A structure pointer that displays a character size
739
+ Color_Foreground : Select the foreground color
740
+ Color_Background : Select the background color
741
+ ******************************************************************************/
742
+ void Paint_DrawTime(UWORD Xstart, UWORD Ystart, PAINT_TIME *pTime, sFONT* Font,
743
+ UWORD Color_Foreground, UWORD Color_Background)
744
+ {
745
+ uint8_t value[10] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
746
+
747
+ UWORD Dx = Font->Width;
748
+
749
+ //Write data into the cache
750
+ Paint_DrawChar(Xstart , Ystart, value[pTime->Hour / 10], Font, Color_Background, Color_Foreground);
751
+ Paint_DrawChar(Xstart + Dx , Ystart, value[pTime->Hour % 10], Font, Color_Background, Color_Foreground);
752
+ Paint_DrawChar(Xstart + Dx + Dx / 4 + Dx / 2 , Ystart, ':' , Font, Color_Background, Color_Foreground);
753
+ Paint_DrawChar(Xstart + Dx * 2 + Dx / 2 , Ystart, value[pTime->Min / 10] , Font, Color_Background, Color_Foreground);
754
+ Paint_DrawChar(Xstart + Dx * 3 + Dx / 2 , Ystart, value[pTime->Min % 10] , Font, Color_Background, Color_Foreground);
755
+ Paint_DrawChar(Xstart + Dx * 4 + Dx / 2 - Dx / 4, Ystart, ':' , Font, Color_Background, Color_Foreground);
756
+ Paint_DrawChar(Xstart + Dx * 5 , Ystart, value[pTime->Sec / 10] , Font, Color_Background, Color_Foreground);
757
+ Paint_DrawChar(Xstart + Dx * 6 , Ystart, value[pTime->Sec % 10] , Font, Color_Background, Color_Foreground);
758
+ }
759
+
760
+ /******************************************************************************
761
+ function: Display monochrome bitmap
762
+ parameter:
763
+ image_buffer :A picture data converted to a bitmap
764
+ info:
765
+ Use a computer to convert the image into a corresponding array,
766
+ and then embed the array directly into Imagedata.cpp as a .c file.
767
+ ******************************************************************************/
768
+ void Paint_DrawBitMap(const unsigned char* image_buffer)
769
+ {
770
+ UWORD x, y;
771
+ UDOUBLE Addr = 0;
772
+
773
+ for (y = 0; y < Paint.HeightByte; y++) {
774
+ for (x = 0; x < Paint.WidthByte; x++) {//8 pixel = 1 byte
775
+ Addr = x + y * Paint.WidthByte;
776
+ Paint.Image[Addr] = (unsigned char)image_buffer[Addr];
777
+ }
778
+ }
779
+ }