def cairo_text_bbox(text, font_params, scale=1.0):
surf = cairo.ImageSurface(cairo.FORMAT_ARGB32, 8, 8)
ctx = cairo.Context(surf)
# The scaling must match the final context.
# If not there can be a mismatch between the computed extents here
# and those generated for the final render.
ctx.scale(scale, scale)
font = cairo_font(font_params)
if use_pygobject:
layout = pangocairo.create_layout(ctx)
pctx = layout.get_context()
fo = cairo.FontOptions()
fo.set_antialias(cairo.ANTIALIAS_SUBPIXEL)
pangocairo.context_set_font_options(pctx, fo)
layout.set_font_description(font)
layout.set_text(text, len(text))
re = layout.get_pixel_extents()[1]
extents = (re.x, re.y, re.x + re.width, re.y + re.height)
else: # pyGtk
pctx = pangocairo.CairoContext(ctx)
pctx.set_antialias(cairo.ANTIALIAS_SUBPIXEL)
layout = pctx.create_layout()
layout.set_font_description(font)
layout.set_text(text)
#print('@@ EXTENTS:', layout.get_pixel_extents()[1])
extents = layout.get_pixel_extents()[1]
w = extents[2] - extents[0]
h = extents[3] - extents[1]
x0 = - w // 2.0
y0 = - h // 2.0
return [x0,y0, x0+w,y0+h]
python类Context()的实例源码
client_smi_appindicator.py 文件源码
项目:nvidia-multiple-smi
作者: ClementPinard
项目源码
文件源码
阅读 23
收藏 0
点赞 0
评论 0
def draw_icon(machine,color1,color2):
'''Draws a graph with 2 columns 1 for each percentage (1 is full, 0 is empty)'''
WIDTH, HEIGHT = 22, 22
if machine['nGPUs'] > 2:
WIDTH = 11*machine['nGPUs'] #if more than 1 GPU on a machine, each column is 11px wide (and not 22px)
surface = cairo.ImageSurface (cairo.FORMAT_ARGB32, WIDTH, HEIGHT)
ctx = cairo.Context (surface)
ctx.scale (WIDTH/machine['nGPUs'], HEIGHT) # Normalizing the canvas coordinates go from (0,0) to (nGPUs,1)
for i in range(machine['nGPUs']):
gpu = machine['GPUs'][i]
percentage1,percentage2 = gpu['utilization']/100,gpu['used_mem']/gpu['memory']
ctx.rectangle (i, 1-percentage1, 0.5, percentage1) # Rectangle(x0, y0, x1, y1)
ctx.set_source_rgb(color1[0]/255,color1[1]/255,color1[2]/255)
ctx.fill ()
ctx.rectangle (i+0.5, 1-percentage2, 0.5, percentage2) # Rectangle(x0, y0, x1, y1)
ctx.set_source_rgb(color2[0]/255,color2[1]/255,color2[2]/255)
ctx.fill ()
if 'i' not in machine.keys():
machine['i'] = 0
png_name = os.path.join(config_folder,machine['name']+str(machine['i'])+'.png')
machine['i'] = (machine['i']+1)%2
surface.write_to_png (png_name) # Output to PNG
return(png_name)
def populate(self):
"""populate
Populates the file list with data from the global var 'files'.
It reads in their image data and gives them an icon from that.
"""
main_window = self.get_toplevel()
for name in files:
image = files[name]['image']
pix_width = len(image[0])
pix_height = len(image)
if pix_width < 6:
pix_width = 6
if pix_height < 6:
pix_height = 6
pix_surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, pix_width,
pix_height)
pix_context = cairo.Context(pix_surface)
pix_context.set_source_rgba(*main_window.paint_background.get_rgba())
for yi, yv in enumerate(image):
for xi, xv in enumerate(yv):
rgb, var = xv
if rgb is not None:
pix_context.set_source_rgba(*rgb)
pix_context.rectangle(xi, yi, 1, 1)
pix_context.fill()
pixbuf = Gdk.pixbuf_get_from_surface(pix_surface, 0, 0, pix_width,
pix_height)
icon = Gtk.IconTheme.get_default().load_icon('image-x-generic', 40, 0)
self.list.append([pixbuf, name])
return None
def get_numpy_array(self, size=256, scale=0.333):
"""
using rsvg library, render the svg into a cairo surface with memory
defined by a numpy array, effectively rendering the svg to an array
"""
if self.tree_root is None:
self.tree_root = self.tree_org.getroot()
# get the result into a svg object (using rsvg lib)
svg_object = rsvg.Handle(ET.tostring(self.tree_root))
# create a numpy array to use as our canvas
data = np.zeros((size, size, 4), dtype=np.uint8)
surface = cairo.ImageSurface.create_for_data(
data, cairo.FORMAT_ARGB32, size, size)
cr = cairo.Context(surface)
# fill with solid white and set scale (magic scale number)
cr.set_source_rgb(1.0, 1.0, 1.0)
cr.paint()
cr.scale(scale, scale)
# render our manipulated svg into cairo surface
svg_object.render_cairo(cr)
return data
def create_cairo_font_face_for_file(filename, faceindex=0, loadoptions=0):
global _initialized
global _freetype_so
global _cairo_so
global _ft_lib
global _surface
CAIRO_STATUS_SUCCESS = 0
FT_Err_Ok = 0
if not _initialized:
# find shared objects
_freetype_so = ctypes.CDLL("libfreetype.so.6")
_cairo_so = ctypes.CDLL("libcairo.so.2")
# initialize freetype
_ft_lib = ctypes.c_void_p()
if FT_Err_Ok != _freetype_so.FT_Init_FreeType(ctypes.byref(_ft_lib)):
raise OSError("Error initialising FreeType library.")
_surface = cairo.ImageSurface(cairo.FORMAT_A8, 0, 0)
_initialized = True
# create freetype face
ft_face = ctypes.c_void_p()
cairo_ctx = cairo.Context(_surface)
cairo_t = PycairoContext.from_address(id(cairo_ctx)).ctx
_cairo_so.cairo_ft_font_face_create_for_ft_face.restype = ctypes.c_void_p
if FT_Err_Ok != _freetype_so.FT_New_Face(_ft_lib, filename, faceindex, ctypes.byref(ft_face)):
raise Exception("Error creating FreeType font face for " + filename)
# create cairo font face for freetype face
cr_face = _cairo_so.cairo_ft_font_face_create_for_ft_face(ft_face, loadoptions)
if CAIRO_STATUS_SUCCESS != _cairo_so.cairo_font_face_status(cr_face):
raise Exception("Error creating cairo font face for " + filename)
_cairo_so.cairo_set_font_face(cairo_t, cr_face)
if CAIRO_STATUS_SUCCESS != _cairo_so.cairo_status(cairo_t):
raise Exception("Error creating cairo font face for " + filename)
face = cairo_ctx.get_font_face()
return face
def pango_families():
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32,1,1)
cr = cairo.Context(surface)
pcr = pangocairo.CairoContext(cr)
layout = pcr.create_layout()
pcx = layout.get_context()
return [f.get_name() for f in pcx.list_families()]
def create_cairo_font_face_for_file(filename, faceindex=0, loadoptions=0):
global _initialized
global _freetype_so
global _cairo_so
global _ft_lib
global _surface
CAIRO_STATUS_SUCCESS = 0
FT_Err_Ok = 0
if not _initialized:
# find shared objects
_freetype_so = ctypes.CDLL("libfreetype.so.6")
_cairo_so = ctypes.CDLL("libcairo.so.2")
# initialize freetype
_ft_lib = ctypes.c_void_p()
if FT_Err_Ok != _freetype_so.FT_Init_FreeType(ctypes.byref(_ft_lib)):
raise OSError("Error initialising FreeType library.")
_surface = cairo.ImageSurface(cairo.FORMAT_A8, 0, 0)
_initialized = True
# create freetype face
ft_face = ctypes.c_void_p()
cairo_ctx = cairo.Context(_surface)
cairo_t = PycairoContext.from_address(id(cairo_ctx)).ctx
_cairo_so.cairo_ft_font_face_create_for_ft_face.restype = ctypes.c_void_p
if FT_Err_Ok != _freetype_so.FT_New_Face(_ft_lib, filename, faceindex, ctypes.byref(ft_face)):
raise Exception("Error creating FreeType font face for " + filename)
# create cairo font face for freetype face
cr_face = _cairo_so.cairo_ft_font_face_create_for_ft_face(ft_face, loadoptions)
if CAIRO_STATUS_SUCCESS != _cairo_so.cairo_font_face_status(cr_face):
raise Exception("Error creating cairo font face for " + filename)
_cairo_so.cairo_set_font_face(cairo_t, cr_face)
if CAIRO_STATUS_SUCCESS != _cairo_so.cairo_status(cairo_t):
raise Exception("Error creating cairo font face for " + filename)
face = cairo_ctx.get_font_face()
return face
def pango_families():
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32,1,1)
cr = cairo.Context(surface)
pcr = pangocairo.CairoContext(cr)
layout = pcr.create_layout()
pcx = layout.get_context()
return [f.get_name() for f in pcx.list_families()]
def drawTrace(self):
data = np.zeros((256, 256), dtype=np.uint8)
surface = cairo.ImageSurface.create_for_data(data,cairo.FORMAT_A8,256,256)
context = cairo.Context(surface)
t = [np.zeros((256,256))]
for l in self.lines:
l.draw(context)
t.append(np.flip(data, 0)/255.0)
return t
def __init__(self,n):
sur = cairo.ImageSurface(cairo.FORMAT_ARGB32,n,n)
ctx = cairo.Context(sur)
ctx.scale(n,n)
ctx.set_source_rgb(BACK,BACK,BACK)
ctx.rectangle(0,0,1,1)
ctx.fill()
self.sur = sur
self.ctx = ctx
self.colors = ((0,0,0))
self.ncolors = 1
def convert_svg2png(infile, outfile, w, h):
"""
Converts svg files to png using Cairosvg or Inkscape
@file_path : String; the svg file absolute path
@dest_path : String; the png file absolute path
"""
if use_inkscape:
p = Popen(["inkscape", "-z", "-f", infile, "-e", outfile,
"-w", str(w), "-h", str(h)],
stdout=PIPE, stderr=PIPE)
output, err = p.communicate()
else:
handle = Rsvg.Handle()
svg = handle.new_from_file(infile)
dim = svg.get_dimensions()
img = cairo.ImageSurface(cairo.FORMAT_ARGB32, w, h)
ctx = cairo.Context(img)
ctx.scale(w / dim.width, h / dim.height)
svg.render_cairo(ctx)
png_io = BytesIO()
img.write_to_png(png_io)
with open(outfile, 'wb') as fout:
fout.write(png_io.getvalue())
svg.close()
png_io.close()
img.finish()
def __save(self, target_path, pages, progress_cb=dummy_export_progress_cb):
# XXX(Jflesch): This is a problem. It will fails if someone tries
# to export to a non-local directory. We should use
# cairo_pdf_surface_create_for_stream()
target_path = self.doc.fs.unsafe(target_path)
pdf_surface = cairo.PDFSurface(target_path,
self.__page_format[0],
self.__page_format[1])
pdf_context = cairo.Context(pdf_surface)
pages = [self.doc.pages[x] for x in range(pages[0], pages[1])]
for page_idx, page in enumerate(pages):
progress_cb(page_idx, len(pages))
img = page.img
if (img.size[0] < img.size[1]):
(x, y) = (min(self.__page_format[0], self.__page_format[1]),
max(self.__page_format[0], self.__page_format[1]))
else:
(x, y) = (max(self.__page_format[0], self.__page_format[1]),
min(self.__page_format[0], self.__page_format[1]))
pdf_surface.set_size(x, y)
logger.info("Adding text to PDF page {} ...".format(page))
self.__paint_txt(pdf_surface, (x, y), pdf_context, page)
logger.info("Adding image to PDF page {} ...".format(page))
self.__paint_img(pdf_surface, (x, y), pdf_context, page)
pdf_context.show_page()
logger.info("Page {} ready".format(page))
progress_cb(len(pages), len(pages))
return self.doc.fs.safe(target_path)
def refresh(self):
# make the preview
(tmpfd, tmppath) = tempfile.mkstemp(
suffix=".pdf",
prefix="paperwork_export_"
)
os.close(tmpfd)
path = self.__save(tmppath, pages=(self.page_nb, self.page_nb + 1))
# reload the preview
file = Gio.File.new_for_uri(path)
pdfdoc = Poppler.Document.new_from_gfile(file, password=None)
assert(pdfdoc.get_n_pages() > 0)
pdfpage = pdfdoc.get_page(0)
pdfpage_size = pdfpage.get_size()
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32,
int(pdfpage_size[0]),
int(pdfpage_size[1]))
ctx = cairo.Context(surface)
pdfpage.render(ctx)
img = surface2image(surface)
self.__preview = (path, img)
def __init_cairo(self):
sur = cairo.ImageSurface(cairo.FORMAT_ARGB32, self.n, self.n)
ctx = cairo.Context(sur)
ctx.scale(self.n, self.n)
self.sur = sur
self.ctx = ctx
self.clear_canvas()
def __init_cairo(self):
sur = cairo.ImageSurface(cairo.FORMAT_ARGB32, self.n, self.n)
ctx = cairo.Context(sur)
ctx.scale(self.n, self.n)
self.sur = sur
self.ctx = ctx
self.clear_canvas()
def get_ball_im(radius=40, fColor=Color(0.0, 0.0, 1.0), sThick=2, sColor=None):
'''
fColor: fill color
sColor: stroke color
sThick: stroke thickness
'''
sz = 2*(radius + sThick)
data = np.zeros((sz, sz, 4), dtype=np.uint8)
surface = cairo.ImageSurface.create_for_data(data,
cairo.FORMAT_ARGB32, sz, sz)
cr = cairo.Context(surface)
#Create a transparent source
cr.set_source_rgba(1.0, 1.0, 1.0, 0.0)
cr.paint()
#Create the border
cx, cy = radius + sThick, radius + sThick
cr.arc(cx, cy, radius, 0, 2*math.pi)
cr.set_line_width(sThick)
if sColor is not None:
cr.set_source_rgba(sColor.b, sColor.g, sColor.r, sColor.a)
else:
cr.set_source_rgba(0.0, 0.0, 0.0, 1.0)
cr.stroke()
#Fill in the desired color
cr.set_source_rgba(fColor.b, fColor.g, fColor.r, fColor.a)
cr.arc(cx, cy, radius, 0, 2*math.pi)
cr.fill()
#cr.destroy()
return cr, data
def get_rectangle_im(sz=gm.Point(4,100), fColor=Color(1.0, 0.0, 0.0)):
data = np.zeros((sz.y_asint(), sz.x_asint(), 4), dtype=np.uint8)
surface = cairo.ImageSurface.create_for_data(data,
cairo.FORMAT_ARGB32, sz.x_asint(), sz.y_asint())
cr = cairo.Context(surface)
#Create a transparent source
cr.set_source_rgba(1.0, 1.0, 1.0, 0.0)
cr.paint()
# Make rectangle and fill in the desired color
cr.set_source_rgba(fColor.b, fColor.g, fColor.r, fColor.a)
cr.rectangle(0, 0, sz.x_asint(), sz.y_asint())
cr.fill()
#cr.destroy()
return cr, data
def get_arrow_im(pt, fColor=Color(0.0, 0.0, 0.0), arrowWidth=3.0):
x, y = pt.x(), pt.y()
sz = int(np.ceil(max(abs(x), abs(y))))
data = np.zeros((sz, sz, 4), dtype=np.uint8)
surface = cairo.ImageSurface.create_for_data(data,
cairo.FORMAT_ARGB32, sz, sz)
cr = cairo.Context(surface)
#Create a transparent source
cr.set_source_rgba(1.0, 1.0, 1.0, 0.0)
cr.paint()
#Start making the arrow
cr.set_source_rgba(fColor.b, fColor.g, fColor.r, fColor.a)
if x>=0 and y>=0:
xSt, ySt = 0, 0
elif x>0 and y < 0:
xSt, ySt = 0, sz
elif x <0 and y<0:
xSt, ySt = sz, sz
else:
xSt, ySt = sz, 0
stPoint = gm.Point(xSt, ySt)
cr.move_to(xSt, ySt)
pt = pt + stPoint
dirVec = pt - stPoint
mag = dirVec.mag()
cr.line_to(pt.x(), pt.y())
cr.set_line_width(arrowWidth)
side1 = dirVec.rotate_point(-150)
side1.scale(0.2)
ang1 = pt + side1
cr.line_to(ang1.x(), ang1.y())
side2 = dirVec.rotate_point(150)
side2.scale(0.2)
ang2 = pt + side2
cr.move_to(pt.x(), pt.y())
cr.line_to(ang2.x(), ang2.y())
cr.stroke()
return cr, data, stPoint
def cairo_context_from_gi(gicr):
#assert isinstance(gicr, GObject.GBoxed)
offset = sys.getsizeof(object()) # size of PyObject_HEAD
# Pull the "boxed" pointer off out and use it as a cairo_t*
cr_ptr = ctypes.c_void_p.from_address(id(gicr) + offset)
cr = pycairo_dll.PycairoContext_FromContext(cr_ptr, cairo.Context, None)
# Add a new ref because the pycairo context will attempt to manage this
cairo_dll.cairo_reference(cr_ptr)
return cr
def getContext(surface, tx=0, ty=0, zoom=0):
ctx = cairo.Context(surface)
ctx.set_antialias(cairo.ANTIALIAS_NONE)
ctx.set_line_join(cairo.LINE_JOIN_BEVEL)
return ctx