在我的Gtk-Gdk-Cairo-Pango应用程序的开头,我创建了窗口:
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
Run Code Online (Sandbox Code Playgroud)
首先,有GtkWindow
,但gtk_create_window
返回GtkWidget
,不是GtkWindow
,为什么?
然后,一些功能,如gdk_window_process_updates(..)
要求GdkWindow*
.
gtk_window_set_geometry_hints()
另一方面要求GtkWindow*
.
在文档中也GdkWindow* gdk_window_new()
有返回GdkWindow
.
当然有文件说:
GdkWindow是屏幕上的矩形区域.它是一个低级对象,用于在GTK +级别实现高级对象,如GtkWidget和GtkWindow.GtkWindow是一个顶层窗口,用户可能会认为它是一个带有标题栏的"窗口"等等; 一个GtkWindow可能包含许多GdkWindow.
但它仍然没有告诉我,何时以及为什么我应该创建Gtk或Gdk窗口?这里的模式是什么?
现在你问,我想解决什么特别的问题?当然,我尝试在gtk + gdk之上使用cairo + pango在鼠标移动后立即绘制文本.问题是虽然实际绘图似乎表现得很快,但我无法像鼠标移动那样完成它.在我motion_notify_event
刚刚调用的gtk_widget_queue_draw(GtkWidget)
时候,实际鼠标在屏幕上移动有明显的滞后,即使我绘制单个字符,它在移动阶段也没有与鼠标指针对齐,只在鼠标停止后捕获它.
我尝试的是通过调用加速更新gdk_window_process_updates(GDK_WINDOW(window), false);
,编译器吃它,但我得到了运行时断言:Gdk-CRITICAL **: gdk_window_process_updates: assertion 'GDK_IS_WINDOW (window)' failed
.我找不到有关此宏的任何信息以及如何/何时使用它.
#include <gtk/gtk.h>
#define TXT "1234567890"
int X = 0, Y = 0;
static void do_drawing(cairo_t *);
GtkWidget *window; …
Run Code Online (Sandbox Code Playgroud) 我制作的任何地图:
ggplot() + geom_sf()
生成预期的地图,但未正确显示度数符号,如下图所示。
这个答案中给出的答案 -地图轴标签中的度数符号不正确- 没有帮助,当我看到不同的标志时,我发布了一个单独的问题。
更改字体无济于事。
我还尝试sf
在一个单独的项目中从 Github安装当前版本的(0.9) renv
,但结果相同。
我在 Linux 上,Fedora 31。
复制:
library("ggplot2")
library("sf")
nc <- st_read(system.file("shape/nc.shp", package="sf"))
ggplot() +
geom_sf(data = nc)
Run Code Online (Sandbox Code Playgroud)
2019-03-15 更新
该问题并非特定于 ggplot/geom_sf;正如评论中所建议的,我遇到了同样的问题plot.new(); text(0.5,0.5, bquote(120*degree*N), cex=5)
另外,澄清一下,我没有在?X11()
. 如果我在我的终端中运行fc-match Symbol
,我会得到:
StandardSymbolsPS.t1:“标准符号 PS”“常规”
更新 2019-03-19
在全新的 Fedora 31 和 Fedora 32 beta 安装中得到确认。可能是 Fedora 的问题。
我尝试使用不同的语言环境(包括例如“en_US.UTF-8”或“German”)和设备(例如cairo_pdf()
, cairo_ps()
),结果相同。
X11.options() 将“cairo”显示为类型(将其更改为 Xlib,或者 dbcairo 不会更改结果)。
使用TestChars()
dww在下面的答案中提出的函数显示如下:
但是,如果我用 knitr 编织到 pdf,我会得到大多数符号,包括°。
如果我编织到 …
我发现有人在Pango Cairo上移植了Android NDK(博客文章,源代码)。但是,我在编译他的示例项目方面还没有成功。有没有人设法做到这一点,并且可以告诉我我做错了什么?
到目前为止,这是我尝试过的:
我收到以下错误:
checking for arm-linux-eabi-gcc... arm-linux-androideabi-gcc --sysroot /cygdrive/f/android-ndk-r8b/platforms/android-9/arch-arm -fpic -ffunction-sections -funwind-tables -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -mfpu=vfp …
Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我使用 Pango 和 Cairo 来创建文本纹理。这些纹理的宽度是固定的,但应缩放其高度以适合文本内容。然后,涉及这种情况的父对象将缩放其高度以匹配文本。
问题是,我初始化 Pango 和 Cairo 的方式不允许这样做。目前,该系统的设置是:
cairo_surface_t* cairoSurface = cairo_image_surface_create( CAIRO_FORMAT_ARGB32, sizeX, sizeY );
cairo_t* cairoContext = cairo_create( cairoSurface );
PangoLayout* pangoLayout = pango_cairo_create_layout( cairoContext );
Run Code Online (Sandbox Code Playgroud)
这固定了高度,至少是表面的高度——这是我不想做的事情,至少不是一直如此。
我的理解是,如果不指定布局高度,它会自动缩放高度,然后可以通过 找到pango_layout_get_size()
。我想首先创建布局,然后使用此函数的输出来创建表面。
但是,pango_cairo_create_layout()
需要已经创建表面,并且我一直无法找到通过开罗渲染布局的方法pango_layout_new()
。API 文档中的渲染函数之一pango_cairo_update_layout()
,指定pango_cairo_create_layout()
必须用于创建布局;然而,更重要的功能,pango_cairo_show_layout()
,没有这样的要求,我不确定这是否意味着允许任何 Pango 布局。虽然我可以测试它是否有效,但我担心反复试验可能会导致我出现未定义的行为。
我觉得我陷入了先有鸡还是先有蛋的困境,Pango 的文档主要是 API 参考,几乎没有解释该库的用途。有没有办法正确地做到这一点?
我正在移植一个使用 Pango 将文本绘制到开罗表面的 Python2 脚本。使用带有pangocairo
包的旧 PyGtk API 可以正常工作。我的系统 (Debian Jesse) 没有用于 PyGtk 的 Python3 软件包,而是使用带有 PyGObject API 的较新的 Gtk+ 库。
我想创建一个pangocairo.CairoContext
对象,但新 API 中似乎缺少它。该PangoCairo
包有一个create_context()
函数,但它生成的PangoContext
对象没有我需要的方法。
到目前为止,我有这个:
import cairo
from gi.repository import Pango
from gi.repository import PangoCairo
surf = cairo.ImageSurface(cairo.FORMAT_ARGB32, 8, 8)
ctx = cairo.Context(surf)
pctx = PangoCairo.create_context(ctx) # Creates a PangoContext
pctx.set_antialias(cairo.ANTIALIAS_SUBPIXEL) # This fails
Run Code Online (Sandbox Code Playgroud)
有效的旧 Python2 代码:
import cairo
import pango
import pangocairo
surf = cairo.ImageSurface(cairo.FORMAT_ARGB32, 8, 8)
ctx = cairo.Context(surf) …
Run Code Online (Sandbox Code Playgroud) 我在让Pango Cairo自言自语方面遇到了问题.下面是一些演示代码.我将布局的宽度设置为与红色矩形相同,所以我希望它包裹到红色矩形.实际上,它只是在每一行上放置一个单词,就好像宽度设置得非常小.如果我使用pango.WRAP_WORD_CHAR,我只能获得一行字符.
我究竟做错了什么?如何将布局包装到我指定的宽度?
编辑如果我将宽度设置为100000,则单词正确包装.这意味着set_width和构造参数使用不同的单位.有任何想法吗?
# -*- coding: utf-8 -*-
import sys
import cairo
import pango
import pangocairo
SIZE = 200
HALF = 100
QUARTER = 50
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, SIZE, SIZE)
context = cairo.Context(surface)
context.set_source_rgb(1, 0, 0)
context.rectangle(QUARTER, QUARTER, HALF, HALF)
context.fill()
context.set_source_rgb(1, 1, 0)
context.translate(QUARTER, QUARTER)
pangocairo_context = pangocairo.CairoContext(context)
layout = pangocairo_context.create_layout()
layout.set_width(HALF)
layout.set_alignment(pango.ALIGN_LEFT)
layout.set_wrap(pango.WRAP_WORD)
layout.set_font_description(pango.FontDescription("Arial 10"))
layout.set_text("The Quick Brown Fox Jumps Over The Piqued Gymnast")
pangocairo_context.update_layout(layout)
pangocairo_context.show_layout(layout)
context.show_page()
with file("test.png", "w") as op:
surface.write_to_png(op)
Run Code Online (Sandbox Code Playgroud)
如果我尝试从 cairo 网站运行此示例,则会得到:
AttributeError: 'module' object has no attribute 'cairo_font_map_get_default'
Run Code Online (Sandbox Code Playgroud)
我想我错过了一些包裹?(我在 Ubuntu 14.04 上)
但是,我试图找到我需要的开发包,我找到的唯一答案是this,它从 GTK2 堆栈中推荐了一些东西,但如果有的话,我对 GTK3 感兴趣,而不是 2。
我正在使用 c# 和 Cairo 创建一个 pdf 文件。我想制作一个多页的 pdf,但我找不到任何样本。我只找到了这个:http : //lists.cairographics.org/archives/cairo/ 2008-9月/014949.html
任何帮助或建议将不胜感激。