|
楼主 |
发表于 2023-1-19 16:30:14
|
显示全部楼层
本帖最后由 zmlalalala 于 2023-1-29 18:20 编辑
4.2 图像
还是稍微写一点吧,把这个补全了。
同上,详细内容参考该帖子:
Casio Forum - Tutorials on using gint by Lephenixnoir · Planet Casio (planet-casio.com)
ok我们开始
首先我们用到的头文件就是gint/display.h,当然还有后缀fx和cg版本的里面定义了具体的颜色
里面的几乎所有函数:
- void dupdate(void);
- void dupdate_set_hook(gint_call_t function);
- gint_call_t dupdate_get_hook(void);
- void dclear(color_t color);
- void drect(int x1, int y1, int x2, int y2, int color);
- void drect_border(int x1, int y1, int x2, int y2,
- int fill_color, int border_width, int border_color);
- void dpixel(int x, int y, int color);
- void dline(int x1, int y1, int x2, int y2, int color);
- void dhline(int y, int color);
- void dvline(int x, int color);
- font_t const *dfont(font_t const *font);
- font_t const *dfont_default(void);
- void dsize(char const *str, font_t const *font, int *w, int *h);
- void dnsize(char const *str, int size, font_t const *font, int *w, int *h);
- char const *drsize(char const *str, font_t const *font, int width, int *w);
- enum {
- /* Horizontal settings: default in dtext() is DTEXT_LEFT */
- DTEXT_LEFT = 0,
- DTEXT_CENTER = 1,
- DTEXT_RIGHT = 2,
- /* Vertical settings: default in dtext() is DTEXT_TOP */
- DTEXT_TOP = 0,
- DTEXT_MIDDLE = 1,
- DTEXT_BOTTOM = 2,
- };
- void dtext_opt(int x, int y, int fg, int bg, int halign, int valign,
- char const *str, int size);
- #define dtext_opt8(x,y,fg,bg,h,v,str,sz,...) dtext_opt(x,y,fg,bg,h,v,str,sz)
- #define dtext_opt(...) dtext_opt8(__VA_ARGS__, -1)
- void dtext(int x, int y, int fg, char const *str);
- void dprint_opt(int x, int y, int fg, int bg, int halign, int valign,
- char const *format, ...);
- void dprint(int x, int y, int fg, char const *format, ...);
- void dimage(int x, int y, bopti_image_t const *image);
- enum {
- /* No option */
- DIMAGE_NONE = 0x00,
- /* Disable clipping, ie. adjustments to the specified subrectangle and
- screen location such that any part that overflows from the image or
- the screen is ignored. Slightly faster. */
- DIMAGE_NOCLIP = 0x01,
- };
- void dsubimage(int x, int y, bopti_image_t const *image, int left, int top,
- int width, int height, int flags);
复制代码
一个一个来
1、dupdate
这个和putdisp_DD功能几乎一致
这里的话整个都没有直接打印到DD的功能,也就是说所有显示函数在用完之后都得update一次
否则屏幕上是没有图像的
2、set_hook
这两个是说,你可以搞一个函数,在每次刷新屏幕缓冲区之后都使用一次,比如说可以用下面的函数
- // gint/usb-ff-bulk.h
- void usb_fxlink_screenshot(bool onscreen);
复制代码 来做到每刷新一次都截一次屏幕
3、dclear,dline,drect。。
dclear 对全屏幕做一次染色, 这里color和下面所有的都一样,定义在了-fx和-cg文件中,最基本的有比如说C_WHITE, C_BLACK, C_INVERT
所以可以用它来清空屏幕,或者反转屏幕(C_INVERT),做到reverse的功效
甚至在灰度引擎开启的情况下还可以用C_LIGHTEN或者C_DARKEN
drect 是包含四周的正方形区域内做染色,而drect_border还能指定一个边框宽度,以及边框颜色
dpixel和dline就不说了,一个点一个线
dvline和dhline看可以直接画全屏的竖直线或水平线
4、font
font前面一堆函数暂时不讨论它,大致意思是你可以用你自己的图片来指定一个字体。。等会讨论图片的时候在说它
这里只讨论下面几个函数
dtext, dprint:前两个是像素坐标!128 * 64如果是9860,不是21 * 8哈,
第三个是字体颜色
然后如果你只是一段文字,那就dtext就好了,如果是格式化输出那就用print,从第四位开始和printf用法一致。
dtext_opt, dprint_opt:这俩是更细致的参数版本,fg是文字颜色,bg是底色
然后halign和valign,这俩是说你的坐标是在哪里的,比如说dtext默认你的x,y是你的左上角,但这里可以设置比如说向右上对齐,右下对齐等等
dtext还有一个size是最大的输出文字量,这个参数可以不加因为是新版本引入的,他为了兼容性默认设置成了-1
有一个要提的是dtext(.., .., C_BLACK, " ")并不能用白色覆盖,同样,如果你强制设置底色是白色,也不管用
换而言之,如果你要在一个地方显示变小的数字,你得用drect把底下清空了再写。。
这个和9860sdk里的print就不太一样
5、dimage
image怎么添加呢?之后再说,总而言之,不需要用一个转换器把它搞成二进制代码然后再copy进去了
我们可以简单的这样写
- extern bopti_image_t my_image;
复制代码 就非常爽
dimage很简单,就是xy处打印图像
dsubimage可以截取图像上的一小块打印,自己指定left和top(包含在内)也就是子图像的左上角和高度宽度,
这也就是说,如果需要在好几个图标之间切换,可以简单地拼成一张图,对齐,然后就可以用dsubimage很简单的打印了
最后一个参数是个优化参数,不太重要。
ok那么image怎么添加呢?
简而言之,我们只要把我们的图片放进assets文件夹里就好了,我以我的9860为例,我就只需要把我的图片放入assets-fx文件夹里
然后编辑fxconv-matadata.txt
往里面添加一行字
- my.png:
- type: bopti-image
- name: my_image
复制代码 就可以了,到时候链接的时候就会有一个小程序处理你的文件并且生成可执行文件,然后前面的extern就能找到这个了
那如果很多图片怎么办,这里也可以用正则表达式,比如说
- *.png:
- type: bopti-image
- name_regex: (.*)\.png img_\1
复制代码 这样子所有的png文件都会被自动的转换成img_...(文件名)的格式,当然你也可以把img_删掉。
注意不要加空格
然后提一嘴之前的font,我也不是太懂其实。原作者教程里举了个例子
他做了这样一张png,然后在metadata里面加了这样几行字
- font_mystere.png: type: font
- charset: print
- grid.size: 5x7
- grid.padding: 1
- proportional:true
复制代码
然后你就可以用dfont(&font)来设置自己的字体了。。
grid.padding表示每个字符周围的边框大小,这里每个字符都是有一格边框分隔的
proportional表示显示的时候按每个字符大小来,大概是可以缩进?比如说I比W窄,那么显示的时候也是如此
这大概就是为什么他会有一堆dsize函数来确认对应的字符串的长度,比如说dsize("abcd", font, &w, &h)大概就会告诉你abcd在font字符下是多长多宽
更新:有一个很有用的东西,原作者提供了一个一部分Unicode的字符集,参考如下网址:
Lephenixnoir/unicode-fonts: General purposes Unicode fonts (fixed 5x7, proportional 8x9). - unicode-fonts - Forge de Planète Casio (planet-casio.com)
这里有非常多的奇怪的字符,可以很大程度替代原有的FONTCHARACTER,9860和cg-50的都有
使用方法点进去就能看到,下载对应的文件夹然后在assets里添几行,程序里再添几行就行了。
最后在提一嘴gray
有一个文件叫gint/dgray.h
- enum {
- /* Start or stop the engine */
- DGRAY_ON,
- DGRAY_OFF,
- /* Start or stop the engine, but remember previous state */
- DGRAY_PUSH_ON,
- DGRAY_PUSH_OFF,
- /* Restore previous state remembered by DGRAY_PUSH_* */
- DGRAY_POP,
- };
- int dgray(int mode);
复制代码 这个函数会在dupdate之后生效,也就是先dgray(DGRAY_ON),然后dupdate就有灰度效果了
可以用来画灰度图像
比如说如果在画图软件里面生成一个128*64的png,调成彩色,然后只用黑笔画,这时候图片其实是有灰度的,正常计算器是显示不出来的,但如果你把dgray给打开,就能了
图像就差不多这么多,基本只写了函数的解释,如果你想看一段很流畅的教程,建议去看原帖翻译或者是diameter的9860sdk教程
下个楼在写点getkey和time的就差不多了。
|
|