This commit is contained in:
parent
a754a9eaa0
commit
5679d3fbba
|
@ -0,0 +1,15 @@
|
|||
CC = gcc-4.8
|
||||
# CFLAGS = -g -pg -Wall -I../../../csrc/. -DNO_SDL
|
||||
CFLAGS = -g -pg -Wall -I../../../csrc/. `sdl2-config --cflags`
|
||||
|
||||
SRC = $(shell ls ../../../csrc/*.c) $(shell ls ../common/*.c ) main.c
|
||||
|
||||
OBJ = $(SRC:.c=.o)
|
||||
|
||||
helloworld: $(OBJ)
|
||||
# $(CC) $(CFLAGS) $(LDFLAGS) $(OBJ) -o u8g2_sdl
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) $(OBJ) `sdl2-config --libs` -o u8g2_sdl
|
||||
|
||||
clean:
|
||||
-rm $(OBJ) u8g2_sdl
|
||||
|
|
@ -0,0 +1,219 @@
|
|||
|
||||
/* Shennong */
|
||||
|
||||
|
||||
#include "u8g2.h"
|
||||
#include <stdio.h>
|
||||
|
||||
u8g2_t u8g2;
|
||||
|
||||
/*
|
||||
|
||||
The Farmer God Shen Nong Tastes All the Plants
|
||||
|
||||
http://chinesereadingpractice.com/2012/08/22/the-farmer-god-shen-nong-tastes-all-the-plants/
|
||||
|
||||
|
||||
|
||||
All his life, Shen Nong had a crystal abdomen, and one could
|
||||
clearly see all of his internal organs. At that time, humans were
|
||||
often getting sick and even dying because they ate things
|
||||
indiscriminately [not knowing if they were good or bad]. Shen
|
||||
Nong determinedly tasted everything everywhere; the
|
||||
good-tasting things he put in a bag on his left side, those were
|
||||
for people to eat; the bad-tasting things he put in a bag on his
|
||||
right side, and those were used for medicine.
|
||||
|
||||
The first time, Shen Nong tasted a small fresh leaf. As this leaf
|
||||
fell into his stomach, it cleaned every inch of his insides so that
|
||||
every organ top and bottom was fresh and cool, as if [the leaf]
|
||||
was somehow on patrol [making the rounds], so Shen Nong
|
||||
called it “chá” [to investigate / check], and later generations of
|
||||
men called it “chá” [tea]. Shen Nong put it in the bag on the
|
||||
right. The second time, Shen Nong tasted a little light red flower
|
||||
that looked like a butterfly, which was sweet and delicious, with
|
||||
an exotic smell that filled his nostrils, so he called it “licorice”. He
|
||||
put it in the bag on the left. In this way, Shen Nong diligently
|
||||
tasted all manner of flora, and every time he was poisoned, he
|
||||
used tea to rescue himself. Before long, the bag on his left
|
||||
contained 47,000 kinds of flowers, grasses, roots and leaves,
|
||||
and the right side had 398,000 kinds.
|
||||
|
||||
But one day, Shen Nong tasted “heartbreak grass”, and this
|
||||
poison was too terrible, so there wasn’t enough time to eat the
|
||||
tea leaves to detoxify and he died. He sacrificed himself to save
|
||||
humanity, so people call him the “Bodhisattva of Medicine”, and
|
||||
people forever commemorate him through this story.
|
||||
*/
|
||||
|
||||
/* The Farmer God Shen Nong Tastes All the Plants */
|
||||
const char c_str[] =
|
||||
"Shen Nong\n\n"
|
||||
"神农一生下来就是\n"
|
||||
"个水晶肚子,五脏\n"
|
||||
"六腑全都能看得一\n"
|
||||
"清二楚。那时侯,\n"
|
||||
"人们经常因为乱吃\n"
|
||||
"东西而生病,甚至\n"
|
||||
"丧命。神农决心尝\n"
|
||||
"遍所有的东西,好\n"
|
||||
"吃的放在身边左边\n"
|
||||
"的袋子里,给人吃\n"
|
||||
";\n"
|
||||
"不好吃的就放在身\n"
|
||||
"子右边的袋子里,\n"
|
||||
"作药用。\n"
|
||||
"第一次,神农尝了\n"
|
||||
"一片小嫩叶。这叶\n"
|
||||
"片一落进肚里,就\n"
|
||||
"上上下下地把里面\n"
|
||||
"各器官擦洗得清清\n"
|
||||
"爽爽,\n"
|
||||
"象巡查似的,\n"
|
||||
"神农把它叫做\n"
|
||||
"“查”,\n"
|
||||
"就是后人所称的\n"
|
||||
"“茶”。\n"
|
||||
"神农将它放进右边\n"
|
||||
"袋子里。第二次,\n"
|
||||
"神农尝了朵蝴蝶样\n"
|
||||
"的淡红小花,甜津\n"
|
||||
"津的,香味扑鼻,\n"
|
||||
"这是“甘草”。他把\n"
|
||||
"它放进了左边袋子\n"
|
||||
"里。就这样,神农\n"
|
||||
"辛苦地尝遍百草,\n"
|
||||
"每次中毒,都靠茶\n"
|
||||
"来解救。后来,\n"
|
||||
"他左边的袋子里花\n"
|
||||
"草根叶有四万七千\n"
|
||||
"种,右边有三十九\n"
|
||||
"万八千种。\n"
|
||||
"但有一天,神农尝\n"
|
||||
"到了“断肠草”,这\n"
|
||||
"种毒草太厉害了,\n"
|
||||
"他还来不及吃茶解\n"
|
||||
"毒就死了。\n"
|
||||
"他是为了拯救人们\n"
|
||||
"而牺牲的,人们称\n"
|
||||
"他为“药王菩萨”,\n"
|
||||
"人间以这个神话故\n"
|
||||
"事永远地纪念他。\n";
|
||||
|
||||
#define SCROLL_DELTA 1
|
||||
|
||||
/* return number of unkown glyphs */
|
||||
|
||||
/*
|
||||
uint16_t check_str(const char *str)
|
||||
{
|
||||
uint16_t e, cnt;
|
||||
|
||||
u8g2.u8x8.next_cb = u8x8_utf8_next;
|
||||
u8x8_utf8_init(u8g2_GetU8x8(&u8g2));
|
||||
|
||||
cnt = 0;
|
||||
for(;;)
|
||||
{
|
||||
e = u8g2.u8x8.next_cb(u8g2_GetU8x8(&u8g2), (uint8_t)*str);
|
||||
if ( e == 0x0ffff )
|
||||
break;
|
||||
str++;
|
||||
if ( e != 0x0fffe )
|
||||
{
|
||||
if ( u8g2_IsGlyph(&u8g2, e) != 0 )
|
||||
{
|
||||
cnt++;
|
||||
}
|
||||
}
|
||||
}
|
||||
return cnt;
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
int main(void)
|
||||
{
|
||||
static char buf[128];
|
||||
|
||||
uint8_t total_lines; // the total number of lines in the story
|
||||
uint8_t i; // loop variable for the lines
|
||||
uint8_t line_cnt; // number of lines to draw, usually equal to lines_per_draw
|
||||
uint8_t start_line; // topmost visible line, derived from top_window_pos
|
||||
uint8_t lines_per_draw; // how many lines to draw on the screen, derived from font and display height
|
||||
uint16_t glyph_height; // height of the glyphs
|
||||
|
||||
uint16_t top_window_pos; // defines the display position in pixel within the text
|
||||
uint16_t total_height; // total height in pixel, derived from font height and total_lines
|
||||
u8g2_uint_t top_offset; // offset between the first visible line and the display
|
||||
|
||||
u8g2_SetupBuffer_SDL_128x64_4(&u8g2, &u8g2_cb_r0);
|
||||
u8x8_InitDisplay(u8g2_GetU8x8(&u8g2));
|
||||
u8x8_SetPowerSave(u8g2_GetU8x8(&u8g2), 0);
|
||||
//u8g2_SetFont(&u8g2, u8g2_font_wqy12_t_chinese1); // two unknown glyphs
|
||||
//u8g2_SetFont(&u8g2, u8g2_font_wqy12_t_chinese3); // two unknown glyphs
|
||||
|
||||
//u8g2_SetFont(&u8g2, u8g2_font_wqy12_t_gb2312a); // ";" is missing
|
||||
u8g2_SetFont(&u8g2, u8g2_font_wqy12_t_gb2312b); // all glyphs available
|
||||
|
||||
/* calculate the length of the text in lines */
|
||||
total_lines = u8x8_GetStringLineCnt(c_str);
|
||||
|
||||
/* get the height of the glyphs */
|
||||
glyph_height = u8g2_GetMaxCharHeight(&u8g2);
|
||||
|
||||
/* calculate the height of the text in pixel */
|
||||
total_height = (uint16_t)total_lines * (uint16_t)glyph_height;
|
||||
|
||||
|
||||
/* calculate how many lines must be drawn on the screen */
|
||||
lines_per_draw = u8g2_GetDisplayHeight(&u8g2) / glyph_height;
|
||||
lines_per_draw += 2;
|
||||
|
||||
printf("Total lines: %d\n", (int)total_lines);
|
||||
printf("Glyph height: %d\n", (int)glyph_height);
|
||||
printf("Number of lines to draw: %d\n", (int)lines_per_draw);
|
||||
|
||||
top_window_pos = 0;
|
||||
for(;;)
|
||||
{
|
||||
|
||||
//printf("Pos: %d\n", (int)top_window_pos);
|
||||
|
||||
start_line = top_window_pos / glyph_height;
|
||||
top_offset = top_window_pos % glyph_height;
|
||||
|
||||
line_cnt = total_lines - start_line;
|
||||
if ( line_cnt > lines_per_draw )
|
||||
line_cnt = lines_per_draw;
|
||||
|
||||
u8g2_FirstPage(&u8g2);
|
||||
do
|
||||
{
|
||||
u8g2_SetFontDirection(&u8g2, 0);
|
||||
|
||||
for( i = 0; i < line_cnt; i++ )
|
||||
{
|
||||
u8x8_CopyStringLine(buf, i+start_line, c_str);
|
||||
u8g2_DrawUTF8(&u8g2, 0, i*glyph_height-top_offset +glyph_height, buf);
|
||||
}
|
||||
|
||||
|
||||
} while( u8g2_NextPage(&u8g2) );
|
||||
|
||||
|
||||
if ( top_window_pos < total_height )
|
||||
{
|
||||
top_window_pos+=SCROLL_DELTA;
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -3,7 +3,9 @@
|
|||
*/
|
||||
|
||||
#include "u8g2.h"
|
||||
#ifndef NO_SDL
|
||||
#include "SDL.h"
|
||||
#endif
|
||||
#include <assert.h>
|
||||
|
||||
//#define HEIGHT (64)
|
||||
|
@ -11,19 +13,21 @@
|
|||
|
||||
#define W(x,w) (((x)*(w))/100)
|
||||
|
||||
#ifndef NO_SDL
|
||||
SDL_Window *u8g_sdl_window;
|
||||
SDL_Surface *u8g_sdl_screen;
|
||||
#endif
|
||||
|
||||
int u8g_sdl_multiple = 3;
|
||||
Uint32 u8g_sdl_color[256];
|
||||
uint32_t u8g_sdl_color[256];
|
||||
int u8g_sdl_height, u8g_sdl_width;
|
||||
|
||||
|
||||
|
||||
static void u8g_sdl_set_pixel(int x, int y, int idx)
|
||||
{
|
||||
Uint32 *ptr;
|
||||
Uint32 offset;
|
||||
uint32_t *ptr;
|
||||
uint32_t offset;
|
||||
int i, j;
|
||||
|
||||
if ( y >= u8g_sdl_height )
|
||||
|
@ -38,13 +42,16 @@ static void u8g_sdl_set_pixel(int x, int y, int idx)
|
|||
for( i = 0; i < u8g_sdl_multiple; i++ )
|
||||
for( j = 0; j < u8g_sdl_multiple; j++ )
|
||||
{
|
||||
#ifndef NO_SDL
|
||||
offset = (
|
||||
((y * u8g_sdl_multiple) + i) * (u8g_sdl_width * u8g_sdl_multiple) +
|
||||
((x * u8g_sdl_multiple) + j)) * u8g_sdl_screen->format->BytesPerPixel;
|
||||
|
||||
assert( offset < (Uint32)(u8g_sdl_width * u8g_sdl_multiple * u8g_sdl_height * u8g_sdl_multiple * u8g_sdl_screen->format->BytesPerPixel) );
|
||||
|
||||
ptr = u8g_sdl_screen->pixels + offset;
|
||||
*ptr = u8g_sdl_color[idx];
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -88,6 +95,7 @@ static void u8g_sdl_init(int width, int height)
|
|||
u8g_sdl_height = height;
|
||||
u8g_sdl_width = width;
|
||||
|
||||
#ifndef NO_SDL
|
||||
|
||||
if (SDL_Init(SDL_INIT_VIDEO) != 0)
|
||||
{
|
||||
|
@ -130,6 +138,7 @@ static void u8g_sdl_init(int width, int height)
|
|||
SDL_UpdateWindowSurface(u8g_sdl_window);
|
||||
|
||||
atexit(SDL_Quit);
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -290,8 +299,9 @@ uint8_t u8x8_d_sdl_128x64(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg_
|
|||
} while( arg_int > 0 );
|
||||
|
||||
/* update all */
|
||||
#ifndef NO_SDL
|
||||
SDL_UpdateWindowSurface(u8g_sdl_window);
|
||||
|
||||
#endif
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
|
@ -334,8 +344,10 @@ uint8_t u8x8_d_sdl_240x160(u8x8_t *u8g2, uint8_t msg, uint8_t arg_int, void *arg
|
|||
arg_int--;
|
||||
} while( arg_int > 0 );
|
||||
|
||||
#ifndef NO_SDL
|
||||
/* update all */
|
||||
SDL_UpdateWindowSurface(u8g_sdl_window);
|
||||
#endif
|
||||
|
||||
break;
|
||||
default:
|
||||
|
|
|
@ -1,10 +1,13 @@
|
|||
|
||||
#ifndef NO_SDL
|
||||
#include "SDL.h"
|
||||
|
||||
#endif
|
||||
|
||||
/* return ascii key value or -1 */
|
||||
int u8g_sdl_get_key(void)
|
||||
{
|
||||
#ifndef NO_SDL
|
||||
|
||||
SDL_Event event;
|
||||
/* http://www.libsdl.org/cgi/docwiki.cgi/SDL_PollEvent */
|
||||
if ( SDL_PollEvent(&event) != 0 )
|
||||
|
@ -54,5 +57,6 @@ int u8g_sdl_get_key(void)
|
|||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return -1;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue