Mint_21.3 drawing-area和goocanvas的FB笔记(四)

2024-03-06 13:12

本文主要是介绍Mint_21.3 drawing-area和goocanvas的FB笔记(四),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Cairo图形输出

cairo的surface可以是pixbuf, 可以是screen, 可以是png图,也可以是pdf文件 、svg文件、ps文件,定义了surface就可以用cairo_create(surface)产生cairo context, 操作cairo context就可以方便地在surface上画图,如果surface是pdf, 则直接就输出pdf文件了,画图之前不妨按标准纸张设置图的尺寸,比如A4尺寸,这样即可生成A4尺寸的 pdf 文件。

下面的freebasic示例example输出 pdf svg ps 三种格式文件:

' This is file cairo_output.bas, an example for cairo library
' (C) 2011 by Thomas[ dot ]Freiherr[ at ]gmx{ dot }net
' License GPLv 3
'
' See for details
' http://www.freebasic.net/forum/viewtopic.php?p=163599&highlight=#163599
' http://cairographics.org/documentation/#INCLUDE ONCE "cairo/cairo.bi"
#INCLUDE ONCE "cairo/cairo-pdf.bi"
#INCLUDE ONCE "cairo/cairo-ps.bi"
#INCLUDE ONCE "cairo/cairo-svg.bi"'{612, 792},     /* PAGE_SIZE_LETTER */
'{612, 1008},    /* PAGE_SIZE_LEGAL */
'{841.89, 1199.551},    /* PAGE_SIZE_A3 */
'{595.276, 841.89},     /* PAGE_SIZE_A4 */
'{419.528, 595.276},     /* PAGE_SIZE_A5 */
'{708.661, 1000.63},     /* PAGE_SIZE_B4 */
'{498.898, 708.661},     /* PAGE_SIZE_B5 */
'{522, 756},     /* PAGE_SIZE_EXECUTIVE */
'{288, 432},     /* PAGE_SIZE_US4x6 */
'{288, 576},     /* PAGE_SIZE_US4x8 */
'{360, 504},     /* PAGE_SIZE_US5x7 */
'{297, 684}      /* PAGE_SIZE_COMM10 */CONST Pag_W = 595.276, Pag_H = 841.89 '                        A4 format
CONST M_PI = 4 * ATN(1) '                                             PiTYPE arc_seg_dataAS cairo_t PTR c_tAS DOUBLE xc, yc, ri, ra, a1, a2, fg, fb
END TYPE' draw a colored circle segment / farbiges Kreissegment zeichnen
SUB arc_seg(BYVAL seg AS arc_seg_data PTR)VAR pa = NEW cairo_path_tWITH *segcairo_arc_negative(.c_t, .xc, .yc, .ri, .a2, .a1)cairo_arc(.c_t, .xc, .yc, .ra, .a1, .a2)cairo_close_path(.c_t)pa = cairo_copy_path(.c_t)cairo_set_source_rgba(.c_t, 1, .fg, .fb, 0.9)cairo_fill(.c_t)cairo_append_path(.c_t, pa)cairo_set_source_rgb(.c_t, 0.0, 0.0, 0.0)cairo_stroke(.c_t)END WITHcairo_path_destroy(pa)
END SUB' draw / zeichnen
SUB DoDrawing(BYVAL C AS cairo_surface_t PTR)VAR seg = NEW arc_seg_data, t = "Press a key to output PS, PDF and SVG."WITH *seg.c_t = cairo_create(C)cairo_set_source_rgb(.c_t, 1.0, 1.0, 1.0) '         white backgroundcairo_paint(.c_t) '                                        fill pagecairo_set_line_width(.c_t, 0.5)VAR f = 0.3 * Pag_W.xc = f.yc = fFOR z AS INTEGER = 0 TO 1 '                        two center points.ri = 0.1 * fFOR j AS INTEGER = 1 TO 5 STEP 1 '                     five radius.ra = .ri + 0.35 * f / jFOR i AS INTEGER = 0 TO 5 STEP 2 '                three segments.a1 = 60.0 * M_PI / 180 * i.a2 = 60.0 * M_PI / 180 * (i + 1).fg = .ra / f.fb = .a1 / M_PI / 2arc_seg(seg)NEXT.ri = .raNEXT
'      cairo_stroke(.c_t).yc = Pag_H - f.xc = Pag_W - fNEXTcairo_set_font_size (.c_t, 0.15 * f)DIM AS cairo_font_extents_t fe '                         font datacairo_font_extents (.c_t, @fe)DIM AS cairo_text_extents_t te '                         text sizecairo_text_extents (.c_t, t, @te)cairo_move_to (.c_t, _ '                 lower left corner of textPag_W / 2 - (te.width / 2 + te.x_bearing), _Pag_H / 2 + (te.height / 2) - fe.descent)cairo_show_text(.c_t, t)cairo_show_page(.c_t)cairo_destroy(.c_t)END WITHcairo_surface_flush(C)cairo_surface_destroy(C)
END SUB' screen output / Bildschirmausgabe
SUB write_screen()VAR S_W = CUINT(Pag_W) + 1, S_H = CUINT(Pag_H) + 1SCREENRES S_W, S_H, 32VAR c_s_t = cairo_image_surface_create_for_data( _SCREENPTR, CAIRO_FORMAT_ARGB32, _S_W, S_H, S_W * LEN(single))SCREENLOCKDoDrawing(c_s_t)SCREENUNLOCKSLEEP
END SUB' file output / Schreibt eine Datei, pdf/svg/ps je nach Endung in fname
SUB write_file(BYREF fname AS STRING = "")DIM AS cairo_surface_t PTR c_s_tSELECT CASE LCASE(RIGHT(fname, 4))CASE ".pdf"c_s_t = cairo_pdf_surface_create(fname, Pag_W, Pag_H)CASE ".svg"c_s_t = cairo_svg_surface_create(fname, Pag_W, Pag_H)CASE ELSEc_s_t = cairo_ps_surface_create(fname, Pag_W, Pag_H)END SELECTDoDrawing(c_s_t)
END SUB' main / Hauptprogramm
write_screen()VAR f = "cairo_circle."
write_file(f & "pdf")
write_file(f & "ps")
write_file(f & "svg")
END 0

以往pdf格式输出的pdflib库在windows下非常受欢迎(协议:个人可用,但商业使用需交license费,QT应该也是类似的协议约束)。freebasic对初期的pdflib-lite.h做了bi重写,这样在freebasic下能够直接操作pdflib库进行pdf编程,和cairo的surface做图有些相似之处,也是move_to , line_to 的画线,show_text写字。

网上已经找不到编译好的 pdflib.so 库了,高版本的库与自带的.bi不匹配。意味着,使用高版本的pdflib需要改写 pdflib.bi ; 使用pdflib-lite, 则需要自己编译,也需要稍改动一下 pdflib.bi。

编译:

打开终端,进入PDFlib-Lite目录,执行:

./configure

make

sudo make install

编译完成后,在/usr/local/include/freebasic下找到 pdflib.bi, 用任意一款文本编辑器打开它,然后,替换所有的 as single 为 as double

库放在 /usr/local/lib下应该可以找到,如果找不到的话,在/etc/ld.so.conf.d下写一个自己的配置文件,系统的lib搜寻路径就会带上它去找lib 。它是个文本文件,里面放的是库的路径,文件名自己起,符合操作系统要求即可。

下面的freebasic的示例程序,生成 pdflib_test.pdf 文件。

#include once "pdflib.bi"dim as PDF ptr p
dim as integer font, textx, texty, x, y, w, h, fontsize, c, image
dim as string textp = PDF_new()
'' open new PDF file
if (PDF_open_file(p, "pdflib_test.pdf") = -1) thenprint "Error: could not open PDF file. Check to see if it is open by another application"print "Press any key to end..."  '' pause to allow error message to be readsleepend 1
end if'' some document information
PDF_set_info(p, "Creator", "pdflib_test.bas")
PDF_set_info(p, "Author", "GOK")
PDF_set_info(p, "Title", "FreeBASIC")'' start a new page, set font and size
PDF_begin_page(p, a4_width, a4_height)
font = PDF_findfont(p, "Helvetica-Bold", "host", 0)PDF_setfont(p, font, 12)'' Insert the logo
dim as string logofilename = exepath() & "/../../fblogo.gif"
image = PDF_open_image_file(p, "gif", logofilename, "", 0)
if image = -1  thenprint "Error: Couldn't read image file """ & logofilename & """"
elsew = PDF_get_value(p, "imagewidth", image)h = PDF_get_value(p, "imageheight", image)PDF_place_image(p, image, (a4_width - w)/2, a4_height-h-50, 1)'' Note: only close the image when you are finished with it. Keep it in'' memory if you plan on reusing it.PDF_close_image(p, image)
end if'' line drawing test
PDF_moveto(p, 25, a4_height-50 - h)
PDF_lineto(p, a4_width-50, a4_height-50 - h)
PDF_stroke(p)'' some output
texty = a4_height-50 - h -50                              '' Move down from line by 50
PDF_set_text_pos(p, 50, texty)
PDF_show(p, "This is horizontal text in Helvetica-Bold")  '' output texttextx = PDF_get_value(p, "textx", 0)                      '' determine text position
texty = PDF_get_value(p, "texty", 0)                      '' determine text position'' save state
PDF_save(p)
PDF_translate(p, textx, texty)                            '' move origin to end of text'' change coordinate system
PDF_rotate(p, -90)                                        '' rotate coordinates
PDF_set_text_pos(p, 30, 100)                              '' provide for distance from horiz. text
PDF_show(p, "vertical text")'' restore saved state
PDF_restore(p)PDF_continue_text(p, "horizontal text continues")'' text in red
PDF_save(p)
PDF_set_text_pos(p, 50, 440)
PDF_setcolor(p, "both", "rgb", 1, 0, 0, 0)
PDF_show(p, "Write some text in a box (Courier 10 - left justified)")
PDF_restore(p)'' Print in a box
text = "PDF Viewers support a set of 14 core fonts which need not be embedded in any PDF file. They are:" + chr(10) + chr(13) + _"Courier, Courier-Bold, Courier-Oblique, Courier-BoldOblique, Helvetica, Helvetica-Bold, Helvetica-Oblique, " + _"Helvetica-BoldOblique, Times-Roman, Times-Bold, Times-Italic, Times-BoldItalic, Symbol & ZapfDingbats"fontsize = 10
font = PDF_findfont(p, "Courier", "host", 0)PDF_setfont(p, font, fontsize)x = 50
y = 350
w = 500
h = 7 * fontsize
c = PDF_show_boxed(p, text, x, y, w, h, "left", "")
if (c > 0 ) then'' C = number of characters truncated (0 means a fit)print "Not all characters could be placed in the box"
end if'' draw a box around text
PDF_rect(p, x-2, y-2, w+4, h+4)
PDF_stroke(p)'' tidy up
PDF_end_page(p)                                           '' close page
PDF_close(p)                                              '' close PDF document
PDF_delete(p)                                             '' delete the PDF "object"print
print "pdflib_test.pdf generated."
print
print "Press any key to continue..."                      '' pause to allow error message to be read
sleep

用它做个简历应该还行,可能也只是方便而已,现在的浏览器差不多都可以选中后保存为pdf文件,各种office也是直接就生成了。pdf虽有许多其它功能(水印、文本框等),但用的地方好像并不多,如果只是少量页面,cairo画图生成pdf方便,它是free的。

PDFlib-Lite 源码及编译库放在CSDN 了, lib-and-so文件夹中放的是freebasic用的修改好的pdflib.bi头文件和编译好的 libpdflib.so 库及软链接 libpdf.so ,没安装编译环境的话可直接将它们分别放在 /usr/local/include/freebasic下和/usr/lib/x86_64-linux-gnu下使用。

点击链接下载PDFlib-Lite 源码及编译库

这篇关于Mint_21.3 drawing-area和goocanvas的FB笔记(四)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/780166

相关文章

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

忽略某些文件 —— Git 学习笔记 05

忽略某些文件 忽略某些文件 通过.gitignore文件其他规则源如何选择规则源参考资料 对于某些文件,我们不希望把它们纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常它们都是些自动生成的文件,比如日志文件、编译过程中创建的临时文件等。 通过.gitignore文件 假设我们要忽略 lib.a 文件,那我们可以在 lib.a 所在目录下创建一个名为 .gi

取得 Git 仓库 —— Git 学习笔记 04

取得 Git 仓库 —— Git 学习笔记 04 我认为, Git 的学习分为两大块:一是工作区、索引、本地版本库之间的交互;二是本地版本库和远程版本库之间的交互。第一块是基础,第二块是难点。 下面,我们就围绕着第一部分内容来学习,先不考虑远程仓库,只考虑本地仓库。 怎样取得项目的 Git 仓库? 有两种取得 Git 项目仓库的方法。第一种是在本地创建一个新的仓库,第二种是把其他地方的某个

Git 的特点—— Git 学习笔记 02

文章目录 Git 简史Git 的特点直接记录快照,而非差异比较近乎所有操作都是本地执行保证完整性一般只添加数据 参考资料 Git 简史 众所周知,Linux 内核开源项目有着为数众多的参与者。这么多人在世界各地为 Linux 编写代码,那Linux 的代码是如何管理的呢?事实是在 2002 年以前,世界各地的开发者把源代码通过 diff 的方式发给 Linus,然后由 Linus