def layout(self, width):
self.__width = width
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 1, 1)
ctx = cairo.Context(surface)
line_height = 0
total_height = self.__padding
line_used = self.__padding
for legend in self.__legends:
(t_width, t_height) = ctx.text_extents(legend)[2:4]
item_width = self.__padding + self.__padding + t_width + self.__padding
item_height = t_height + self.__padding
if item_height > line_height:
line_height = item_height
if line_used + item_width > self.__width:
line_used = self.__padding + item_width
total_height += line_height
else:
line_used += item_width
x = line_used - item_width
total_height += line_height
self.__height = total_height
python类ImageSurface()的实例源码
def render(self):
col_labels = ColLabels(self)
row_labels = RowLabels(self)
chart = Chart(self)
title = Title(self)
grid = sizers.GridSizer(3, 2, self.padding, self.padding)
grid.add_spacer()
grid.add(col_labels)
grid.add(row_labels)
grid.add(chart)
grid.add_spacer()
grid.add(title)
sizer = sizers.VerticalSizer()
sizer.add(grid, border=self.padding)
sizer.fit()
surface = cairo.ImageSurface(
cairo.FORMAT_RGB24, int(sizer.width), int(sizer.height))
dc = cairo.Context(surface)
dc.set_source_rgb(1, 1, 1)
dc.paint()
col_labels.render(dc)
row_labels.render(dc)
chart.render(dc)
title.render(dc)
return surface
def svg2png(svg_file, output_file, scale=1):
# Get the svg files content
svg_data = open(svg_file).read()
# Get the width / height inside of the SVG
doc = minidom.parseString(svg_data)
width = [path.getAttribute('width') for path in doc.getElementsByTagName('svg')][0]
height = [path.getAttribute('height') for path in doc.getElementsByTagName('svg')][0]
width = int(round(float(re.compile('(\d+\.*\d*)\w*').findall(width)[0])))
height = int(round(float(re.compile('(\d+\.*\d*)\w*').findall(height)[0])))
doc.unlink()
# Create the png
img = cairo.ImageSurface(
cairo.FORMAT_ARGB32, width * scale, height * scale)
ctx = cairo.Context(img)
ctx.scale(scale, scale)
handler = rsvg.Handle(None, str(svg_data))
handler.render_cairo(ctx)
img.write_to_png(output_file)
print("{} ==> {}".format(svg_file, output_file))
def __render_img(self, size, pdf_page=None):
# TODO(Jflesch): In a perfect world, we shouldn't use ImageSurface.
# we should draw directly on the GtkImage.window.cairo_create()
# context. It would be much more efficient.
logger.debug('Building img from pdf: {}'.format(size))
if pdf_page is None:
pdf_page = self.pdf_page
base_size = self.get_base_size(pdf_page)
width = int(size[0])
height = int(size[1])
factor_w = width / base_size[0]
factor_h = height / base_size[1]
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
ctx = cairo.Context(surface)
ctx.scale(factor_w, factor_h)
pdf_page.render(ctx)
return surface2image(surface)
def __init__(self, width=None, height=None, name=None, bounds=None, bg=(1, 1, 1), format=None):
"""Create a new Cairo drawing.
If `bounds` is provided, it's a Bounds describing the extend of the
drawing. Otherwise, provide `width` and `height` to specify a size
explicitly.
`bg` is the background color to paint initially.
"""
if bounds is None:
assert width is not None
assert height is not None
bounds = Bounds(0, 0, width, height)
self.bounds = bounds
self.width = int(self.bounds.width)
self.height = int(self.bounds.height)
self.name, self.format = name_and_format(name, format)
if self.format == 'png':
self.surface = cairo.ImageSurface(cairo.Format.ARGB32, self.width, self.height)
elif self.format == 'svg':
self.surface = cairo.SVGSurface(self.name, self.width, self.height)
self.ctx = cairo.Context(self.surface)
self.ctx.set_antialias(cairo.Antialias.BEST)
self.ctx.set_line_cap(cairo.LineCap.ROUND)
self.ctx.set_line_join(cairo.LineJoin.MITER)
self.translate(-self.bounds.llx, -self.bounds.lly)
# Start with a solid-color canvas.
if bg:
with self.style(rgb=bg):
self.rectangle(self.bounds.llx, self.bounds.lly, self.width, self.height)
self.fill()
def get_surface_from_pixbuf(pixbuf):
surface = cairo.ImageSurface(
cairo.FORMAT_ARGB32, pixbuf.get_width(), pixbuf.get_height())
micairo = cairo.Context(surface)
micairo.save()
Gdk.cairo_set_source_pixbuf(micairo, pixbuf, 0, 0)
micairo.paint()
micairo.restore()
return surface
def get_surface_from_file(filename):
if os.path.exists(filename):
pixbuf = GdkPixbuf.Pixbuf.new_from_file(filename)
if pixbuf:
surface = cairo.ImageSurface(
cairo.FORMAT_ARGB32, pixbuf.get_width(), pixbuf.get_height())
context = cairo.Context(surface)
Gdk.cairo_set_source_pixbuf(context, pixbuf, 0, 0)
context.paint()
return surface
return None
def layout(self, width):
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 1, 1)
ctx = cairo.Context(surface)
# calculate scale delta
data_delta = self.__hi - self.__lo
closest = 1
while (closest*10) < data_delta:
closest *= 10
if (data_delta / closest) == 0:
delta = closest
elif(data_delta / closest) == 1:
delta = closest / 10
else:
delta = closest
start = self.__lo - (self.__lo % delta) + delta
end = self.__hi - (self.__hi % delta)
self.__delta = delta
self.__width = width
# calculate text height
max_text_height = ctx.text_extents("ABCDEFGHIJKLMNOPQRSTUVWXYZabcedefghijklmnopqrstuvwxyz0123456789")[3]
self.max_text_height = max_text_height
height = max_text_height + 10
self.__height = height
def output_png(self, filename):
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32,
self.__data.get_width(),
self.__data.get_height())
ctx = cairo.Context(self.__buffer_surface)
self.__data.draw(ctx)
surface.write_to_png(filename)
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 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 _parse_font(font, cr=None):
if not cr:
ims = cairo.ImageSurface(cairo.FORMAT_RGB24, 300, 300)
cr = cairo.Context(ims)
fd = Pango.font_description_from_string(font)
layout = PangoCairo.create_layout(cr)
layout.set_font_description(fd)
layout.set_alignment(Pango.Alignment.LEFT)
layout.set_markup('<span font_weight="bold">A</span>')
bold_width, _ = layout.get_size()
layout.set_markup('<span>A</span>')
pixels = layout.get_pixel_size()
normal_width, _ = layout.get_size()
return fd, pixels, normal_width, bold_width
def draw(self, context):
rect = self.get_allocation()
self._surface = cairo.ImageSurface(cairo.FORMAT_ARGB32,
rect.width, rect.height)
self.plot()
context.set_source_surface(self._surface, 0, 0)
context.paint()
def _init_cairo(self):
'''
Initialize context and image
'''
sur = cairo.ImageSurface(cairo.FORMAT_ARGB32, SIZE, SIZE)
ctx = cairo.Context(sur)
ctx.scale(SIZE, SIZE)
ctx.set_source_rgb(BACK, BACK, BACK)
ctx.rectangle(0, 0, 1, 1)
ctx.fill()
self.sur = sur
self.ctx = ctx
def _init_cairo(self):
'''
Initialize context and image
'''
sur = cairo.ImageSurface(cairo.FORMAT_ARGB32, SIZE, SIZE)
ctx = cairo.Context(sur)
ctx.scale(SIZE, SIZE)
ctx.set_source_rgb(BACK, BACK, BACK)
ctx.rectangle(0, 0, 1, 1)
ctx.fill()
self.sur = sur
self.ctx = ctx
def render_string_to_image(string, height):
surf = cairo.ImageSurface(cairo.FORMAT_RGB24, height * 4 * len(string), height)
context = cairo.Context(surf)
# Do some font metrics wizardry
pangocairo_context = pangocairo.CairoContext(context)
layout = pangocairo_context.create_layout()
font = pango.FontDescription("Sans")
font.set_absolute_size(height * pango.SCALE)
layout.set_font_description(font)
layout.set_text(string)
exts = layout.get_pixel_extents()
width = exts[1][2] + -exts[0][0]
# Draw a background rectangle:
context.rectangle(0, 0, width, height)
context.set_source_rgb(1, 1, 1)
context.fill()
# Draw the text
context.translate(-exts[0][0], -exts[0][1])
context.set_source_rgb(0, 0, 0)
pangocairo_context.update_layout(layout)
pangocairo_context.show_layout(layout)
# Crop the rendered image
cropped = cairo.ImageSurface(cairo.FORMAT_RGB24, width, height)
cropped_context = cairo.Context(cropped)
cropped_context.rectangle(0, 0, width, height)
cropped_context.set_source_surface(surf, 0, 0);
cropped_context.fill()
return cropped
def __init__(self, dc=None):
self.dc = dc or cairo.Context(
cairo.ImageSurface(cairo.FORMAT_RGB24, 1, 1))
self.pc = pangocairo.CairoContext(self.dc)
self.layout = self.pc.create_layout()
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]
client_smi_appindicator.py 文件源码
项目:nvidia-multiple-smi
作者: ClementPinard
项目源码
文件源码
阅读 21
收藏 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 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 __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 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()