我们从Python开源项目中,提取了以下50个代码示例,用于说明如何使用cairo.ImageSurface()。
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
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 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]
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 __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 _cache_bg_for_state(self, state): a = self.get_allocation() # tmp surface on which we render the button bg as per the gtk # theme engine _surf = cairo.ImageSurface(cairo.FORMAT_ARGB32, a.width, a.height) cr = cairo.Context(_surf) context = self.get_style_context() context.save() context.set_state(state) Gtk.render_background(context, cr, -5, -5, a.width + 10, a.height + 10) Gtk.render_frame(context, cr, -5, -5, a.width + 10, a.height + 10) del cr # new surface which will be cached which surf = cairo.ImageSurface(cairo.FORMAT_ARGB32, a.width, a.height) cr = cairo.Context(surf) # gradient for masking lin = cairo.LinearGradient(0, 0, 0, a.height) lin.add_color_stop_rgba(0.0, 1, 1, 1, 0.1) lin.add_color_stop_rgba(0.25, 1, 1, 1, 0.7) lin.add_color_stop_rgba(0.5, 1, 1, 1, 1.0) lin.add_color_stop_rgba(0.75, 1, 1, 1, 0.7) lin.add_color_stop_rgba(1.0, 1, 1, 1, 0.1) cr.set_source_surface(_surf, 0, 0) cr.mask(lin) del cr # cache the resulting surf... self._bg_cache[state] = surf
def setup_context(width, height, out_width=0): scale = 1 if out_width >= MIN_WIDTH: scale = out_width / width surface = cairo.ImageSurface( cairo.FORMAT_ARGB32, int(round(width * scale)), int(round(height * scale))) ctx = cairo.Context(surface) ctx.scale(scale, scale) ctx.set_source_rgba(0, 0, 0, 0) # transparent bg ctx.paint() return (ctx, surface)
def main(): # make the canvas sur = cairo.ImageSurface(cairo.FORMAT_ARGB32, SIZE, SIZE) ctx = cairo.Context(sur) # scale canvas so that x and y ranges from 0 to 1. ctx.scale(SIZE, SIZE) # set the background color of the canvas ctx.set_source_rgba(*BACK) ctx.rectangle(0.0, 0.0, 1.0, 1.0) ctx.fill() ctx.set_line_width(LINEWIDTH) circles = [] add_new_circles(NEW_COUNT, circles) for i in xrange(STEPS): increase_radius(circles) ok_count = test(circles) if ok_count < 1: add_new_circles(NEW_COUNT, circles) print(i, 'adding new circles, total count: ' + str(len(circles))) show(ctx, circles) sur.write_to_png(RES)
def do_draw(self, cr): Gtk.Window.do_draw(self, cr) if (self.transparent): width, height = self.get_size() surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height) cr = cairo.Context(surface) self.webview.draw(cr) region = cairo_region_create_from_surface(surface, mask_accuracy) self.input_shape_combine_region(None) self.input_shape_combine_region(region)
def cairo_region_create_from_surface(surface, mask_accuracy): rect = cairo.RectangleInt() extents = _cairo_surface_extents(surface) if extents != False: if surface.get_content() == cairo.CONTENT_COLOR: return cairo.Region(extents) if type(surface) != cairo.ImageSurface or surface.get_format != cairo.FORMAT_A1: image = cairo.ImageSurface(cairo.FORMAT_A1, extents.width, extents.height) cr = cairo.Context(image) cr.set_source_surface(surface, -extents.x, -extents.y) cr.paint() else: image = surface image.flush() data = image.get_data() stride = image.get_stride() region = cairo.Region() for y in range(0, extents.height, mask_accuracy): for x in range(0, extents.width, mask_accuracy): x0 = x; while x < extents.width: if sys.byteorder == 'little': if ((data[y*stride+x//8] >> (x%8)) & 1) == 0: break if sys.byteorder == 'big': if ((data[y*stride+x//8] >> (7-(x%8))) & 1) == 0: break x += mask_accuracy if x > x0: rect.x = x0 rect.width = x - x0 rect.y = y rect.height = mask_accuracy region.union(rect) region.translate(extents.x, extents.y) return region
def layout(self, width): surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 1, 1) ctx = cairo.Context(surface) max_text_height = ctx.text_extents("ABCDEFGHIJKLMNOPQRSTUVWXYZabcedefghijklmnopqrstuvwxyz0123456789")[3] left_width = 0 right_width = 0 left_n_lines = 0 range_n = 0 eventint_n = 0 eventstr_n = 0 for timeline in self.timelines.get_all(): left_n_lines += 1 t_width = ctx.text_extents(timeline.name)[2] left_width = max(left_width, t_width) for rang in timeline.get_ranges(): t_width = ctx.text_extents(rang.name)[2] right_width = max(right_width, t_width) range_n += 1 for events_int in timeline.get_events_int(): t_width = ctx.text_extents(events_int.name)[2] right_width = max(right_width, t_width) eventint_n += 1 for events_str in timeline.get_events_str(): t_width = ctx.text_extents(events_str.name)[2] right_width = max(right_width, t_width) eventstr_n += 1 left_height = left_n_lines * max_text_height + (left_n_lines - 1) * self.padding right_n_lines = range_n + eventint_n + eventstr_n right_height = (right_n_lines - 1) * self.padding + right_n_lines * max_text_height right_data_height = (eventint_n + eventstr_n) * (max_text_height + 5) + range_n * 10 right_data_height += (right_n_lines - 1) * self.padding height = max(left_height, right_height) height = max(height, right_data_height) self.left_width = left_width self.right_width = right_width self.max_text_height = max_text_height self.width = width self.height = height + self.padding
def expose(self, widget, event): if self.__force_full_redraw: self.__buffer_surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, self.__data.get_width(), self.__data.get_height()) ctx = cairo.Context(self.__buffer_surface) self.__data.draw(ctx) self.__force_full_redraw = False ctx = widget.window.cairo_create() ctx.rectangle(event.area.x, event.area.y, event.area.width, event.area.height) ctx.clip() ctx.set_source_surface(self.__buffer_surface) ctx.paint() (x, y, width, height) = self.__data.get_selection_rectangle() if self.__moving_left: ctx.move_to(max(self.__moving_left_cur, 2), y) ctx.rel_line_to(0, height) ctx.close_path() ctx.set_line_width(1) ctx.set_source_rgb(0, 0, 0) ctx.stroke() if self.__moving_right: ctx.move_to(min(self.__moving_right_cur, self.__width - 2), y) ctx.rel_line_to(0, height) ctx.close_path() ctx.set_line_width(1) ctx.set_source_rgb(0, 0, 0) ctx.stroke() if self.__moving_both: delta_x = self.__moving_both_cur - self.__moving_both_start left_x = x + delta_x ctx.move_to(x + delta_x, y) ctx.rel_line_to(0, height) ctx.close_path() ctx.move_to(x + width + delta_x, y) ctx.rel_line_to(0, height) ctx.close_path() ctx.set_source_rgb(0, 0, 0) ctx.set_line_width(1) ctx.stroke() return False
def drag_begin(self, widget, drag_context, data): self.dnd_data_received = False # get x,y co-ords of source square x, y = data if gv.verbose: print("in drag begin") print("data=", data) print("widget_name=", widget.get_name()) print("source sq=", x, y) stm = gv.jcchess.get_side_to_move() # convert the x, y co-ords into the shogi representation # (e.g. 8, 6 is 1g) sq = gv.board.get_square_posn(x, y) self.src = sq if gv.verbose: print("source square: (x, y) = (", x, ",", y, ") ", sq) self.src_x = x self.src_y = y # set the icon for the drag and drop to the piece that is being # dragged self.piece = gv.board.get_piece(x, y) # get width/height of board square a = gv.gui.get_event_box(x, y).get_allocation() surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, a.width, a.height) svghandle = gv.board.get_piece_handle(x, y) dim = svghandle.get_dimensions() cr = cairo.Context(surface) sfw = (a.width * 1.0 / dim.width) * SCALE sfh = (a.height * 1.0 / dim.height) * SCALE cr.scale(sfw, sfh) svghandle.render_cairo(cr) # set mouse pointer to be in middle of drag icon surface.set_device_offset(-a.width/2, -a.height/2) Gtk.drag_set_icon_surface(drag_context, surface) # clear the square where the piece is being moved from gv.board.set_square_as_unoccupied(x, y)
def cairo_render_string(s,fontname=None,fontfile=None,size=None,bg=(0.0,0.0,0.0),fg=(0.9,0.9,0.9),pad=5): """Render a string using Cairo and the Cairo text rendering interface. Fonts can either be given as a fontfile or as a fontname. Size should be in pixels (?). You can specify a background and foreground color as RGB floating point triples. Images are padded by pad pixels on all sides.""" face = None if fontfile is not None: # "/usr/share/fonts/truetype/msttcorefonts/comic.ttf" if fontfile in facecache: face = facecache[fontfile] else: face = create_cairo_font_face_for_file(fontfile,0) facecache[fontfile] = face # make a guess at the size w = max(100,int(size*len(s))) h = max(100,int(size*1.5)) # possibly run through twice to make sure we get the right size buffer for round in range(2): surface = cairo.ImageSurface(cairo.FORMAT_ARGB32,w,h) cr = cairo.Context(surface) if face is not None: cr.set_font_face(face) else: if fontname is None: fontname = "Helvetica" cr.select_font_face(fontname) if size is not None: cr.set_font_size(size) xbear,ybear,tw,th = cr.text_extents(s)[:4] tw += 2*pad th += 2*pad if tw<=w and th<=h: break w = tw h = th cr.set_source_rgb(*bg) cr.rectangle(0,0,w,h) cr.fill() cr.move_to(-xbear+pad,-ybear+pad) cr.set_source_rgb(*fg) cr.show_text(s) data = surface.get_data() data = bytearray(data) a = array(data,'B') a.shape = (h,w,4) a = a[:th,:tw,:3] a = a[:,:,::-1] return a
def pango_render_string(s,spec=None,fontfile=None,size=None,bg=(0.0,0.0,0.0),fg=(0.9,0.9,0.9),pad=5, markup=1,scale=2.0,aspect=1.0,rotation=0.0): """Render a string using Cairo and the Pango text rendering interface. Fonts can either be given as a fontfile or as a fontname. Size should be in pixels (?). You can specify a background and foreground color as RGB floating point triples. (Currently unimplemented.)""" S = pango.SCALE face = None if fontfile is not None: raise Exception("can't load ttf file into Pango yet; use fontname") # make a guess at the size w = max(100,int(scale*size*len(s))) h = max(100,int(scale*size*1.5)) # possibly run through twice to make sure we get the right size buffer for round in range(2): surface = cairo.ImageSurface(cairo.FORMAT_ARGB32,w,h) cr = cairo.Context(surface) if spec is not None: fd = pango.FontDescription(spec) else: fd = pango.FontDescription() if size is not None: fd.set_size(int(scale*size*S)) pcr = pangocairo.CairoContext(cr) layout = pcr.create_layout() layout.set_font_description(fd) if not markup: layout.set_text(s) else: layout.set_markup(s) ((xbear,ybear,tw,th),_) = layout.get_pixel_extents() # print(xbear, ybear, tw, th) tw = tw+2*pad th = th+2*pad if tw<=w and th<=h: break w = tw h = th cr.set_source_rgb(*bg) cr.rectangle(0,0,w,h) cr.fill() cr.move_to(-xbear+pad,-ybear+pad) cr.set_source_rgb(*fg) pcr.show_layout(layout) data = surface.get_data() data = bytearray(data) a = array(data,'B') a.shape = (h,w,4) a = a[:th,:tw,:3] a = a[:,:,::-1] if rotation!=0.0: a = rotate(a,rotation,order=1) a = zoom(a,(aspect/scale,1.0/scale/aspect,1.0),order=1) return a
def cairo_render_at(s,loc=None,shape=None, fontname=None,fontfile=None,size=None, slant=cairo.FONT_SLANT_NORMAL, weight=cairo.FONT_WEIGHT_NORMAL, bg=(0.0,0.0,0.0),fg=(0.9,0.9,0.9)): """Render a string using Cairo and the Cairo text rendering interface. Fonts can either be given as a fontfile or as a fontname. Size should be in pixels (?). You can specify a background and foreground color as RGB floating point triples. Images are padded by pad pixels on all sides.""" assert loc is not None assert shape is not None assert size is not None w,h = shape x,y = loc face = None if fontfile is not None: # "/usr/share/fonts/truetype/msttcorefonts/comic.ttf" if fontfile in facecache: face = facecache[fontfile] else: face = create_cairo_font_face_for_file(fontfile,0) facecache[fontfile] = face surface = cairo.ImageSurface(cairo.FORMAT_ARGB32,w,h) cr = cairo.Context(surface) if face is not None: cr.set_font_face(face) else: if fontname is None: fontname = "Helvetica" if type(slant)==str: if slant[0]=="i": slant = cairo.FONT_SLANT_ITALIC elif slant[0]=="o": slant = cairo.FONT_SLANT_OBLIQUE elif slant[0]=="n": slant = cairo.FONT_SLANT_NORMAL else: raise Exception("bad font slant specification (use n/i/o)") if type(weight)==str: if weight[0]=="b": weight = cairo.FONT_WEIGHT_BOLD elif weight[0]=="n": weight = cairo.FONT_WEIGHT_NORMAL else: raise Exception("bad font weight specification (use b/n)") cr.select_font_face(fontname,slant,weight) if size is not None: cr.set_font_size(size) cr.set_source_rgb(*bg) cr.rectangle(0,0,w,h) cr.fill() cr.move_to(x,y) cr.set_source_rgb(*fg) cr.show_text(s) data = surface.get_data() data = bytearray(data) a = array(data,'B') a.shape = (h,w,4) a = a[:,:,:3] a = a[:,:,::-1] return a
def render(self, canvas, transparent=False): x0,y0,x1,y1 = canvas.bbox('all') self.markers = canvas.markers W = int((x1 - x0 + 2*self.padding) * self.scale) H = int((y1 - y0 + 2*self.padding) * self.scale) ext = os.path.splitext(self.fname)[1].lower() if ext == '.svg': surf = cairo.SVGSurface(self.fname, W, H) elif ext == '.pdf': surf = cairo.PDFSurface(self.fname, W, H) elif ext in ('.ps', '.eps'): surf = cairo.PSSurface(self.fname, W, H) if ext == '.eps': surf.set_eps(True) else: # Bitmap surf = cairo.ImageSurface(cairo.FORMAT_ARGB32, W, H) self.ctx = cairo.Context(surf) ctx = self.ctx if not transparent: # Fill background ctx.rectangle(0,0, W,H) ctx.set_source_rgba(1.0,1.0,1.0) ctx.fill() ctx.scale(self.scale, self.scale) ctx.translate(-x0 + self.padding, -y0 + self.padding) if self.draw_bbox: last = len(canvas.shapes) for s in canvas.shapes[:last]: bbox = s.bbox r = canvas.create_rectangle(*bbox, line_color=(255,0,0, 127), fill=(0,255,0,90)) for s in canvas.shapes: self.draw_shape(s) if ext in ('.svg', '.pdf', '.ps', '.eps'): surf.show_page() else: surf.write_to_png(self.fname)
def cairo_text_bbox(text, font_params, spacing=0, 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: status, attrs, plain_text, _ = pango.parse_markup(text, len(text), '\0') 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_spacing(spacing * pango.SCALE) layout.set_text(plain_text, len(plain_text)) layout.set_attributes(attrs) li = layout.get_iter() # Get first line of text baseline = li.get_baseline() / pango.SCALE re = layout.get_pixel_extents()[1] # Get logical extents extents = (re.x, re.y, re.x + re.width, re.y + re.height) else: # pyGtk attrs, plain_text, _ = pango.parse_markup(text) pctx = pangocairo.CairoContext(ctx) pctx.set_antialias(cairo.ANTIALIAS_SUBPIXEL) layout = pctx.create_layout() layout.set_font_description(font) layout.set_spacing(spacing * pango.SCALE) layout.set_text(plain_text) layout.set_attributes(attrs) li = layout.get_iter() # Get first line of text baseline = li.get_baseline() / pango.SCALE #print('@@ EXTENTS:', layout.get_pixel_extents()[1], spacing) extents = layout.get_pixel_extents()[1] # Get logical extents return [extents[0], extents[1], extents[2], extents[3], baseline]
def renderTile(tx, ty, zoom, polygons, borders = True, width = 256, height = 256): """ renderTile -- return a numpy array of uint32 tx -- tile x coord ty -- tile y coord zoom -- tile zoom polygon -- a polygon locator """ # FORMAT_ARGB32 is premultiplied, which results in loss of precision and thus cannot be used. # FORMAT_RGB30 offers up 30bits, (1 billion uniques), # but isn't available until 1.12 (we have 1.10) # FORMAT_RGB24 will have to be used. # Another option would be to render a 2nd channel with the alpha info. #borders = False surface = cairo.ImageSurface(cairo.FORMAT_RGB24, width, height) ctx = getContext(surface, tx, ty, zoom) bsurface = cairo.ImageSurface(cairo.FORMAT_RGB24, width, height) ctx2 = getContext(bsurface, tx, ty, zoom) simple_level = zoom if zoom < 10 else -1 extents = ctx.clip_extents() for pid in polygons.overlapping(extents): polygon = polygons.source.get(pid) if simple_level > -1: polygon = simple(polygon, zoom) drawPoly(ctx, ctx2, polygon, pid) #if borders: # for width in range(10,0,-1): # ctx2.set_source_rgb(0.0,0.0,width/256.) # width = width/ctx2.get_matrix()[0] # ctx2.set_line_width(width) # ctx2.stroke_preserve() surface.flush() #make sure operations are finished #surface.write_to_png ("example.png") # Output to PNG a = numpy.frombuffer(surface.get_data(), 'uint32') & 0x00ffffff surface.finish() if borders: bsurface.flush() b = numpy.frombuffer(bsurface.get_data(), 'uint32') & 0x00ffffff #bsurface.write_to_png ("example2.png") # Output to PNG bsurface.finish() return a,b # get_data returns buffer # FORMAT_RGB24 consists of 32bit pixel in system byteorder # as A,R,G,B values. # The Alpha channel is present but unused, however # it still contains data and must be zeroed. return a,None