def _render_offscreen(self, drawable, data, dst_x, dst_y, width, height): # NOTE [A] daht, dawd, depth = data.shape self.logger.debug("data shape is %dx%dx%d" % (dawd, daht, depth)) # Get qimage for copying pixel data qimage = self._get_qimage(data) painter = QPainter(drawable) painter.setWorldMatrixEnabled(True) # fill pixmap with background color imgwin_wd, imgwin_ht = self.get_window_size() bgclr = self._get_color(*self.img_bg) painter.fillRect(QtCore.QRect(0, 0, imgwin_wd, imgwin_ht), bgclr) # draw image data from buffer to offscreen pixmap painter.drawImage(QtCore.QRect(dst_x, dst_y, width, height), qimage, QtCore.QRect(0, 0, width, height)) # Draw a cross in the center of the window in debug mode if self.t_['show_pan_position']: clr = QColor() clr.setRgbF(1.0, 0.0, 0.0) painter.setPen(clr) ctr_x, ctr_y = self.get_center() painter.drawLine(ctr_x - 10, ctr_y, ctr_x + 10, ctr_y) painter.drawLine(ctr_x, ctr_y - 10, ctr_x, ctr_y + 10) # render self.message if self.message: self._draw_message(painter, imgwin_wd, imgwin_ht, self.message)
def render_image(self, rgbobj, dst_x, dst_y): """Render the image represented by (rgbobj) at dst_x, dst_y in the pixel space. *** internal method-- do not use *** """ self.logger.debug("redraw surface=%s" % (self.surface)) if self.surface is None: return self.logger.debug("drawing to surface") # Prepare array for rendering # TODO: what are options for high bit depth under Qt? data = rgbobj.get_array(self.rgb_order, dtype=np.uint8) (height, width) = data.shape[:2] daht, dawd, depth = data.shape self.logger.debug("data shape is %dx%dx%d" % (dawd, daht, depth)) # Get qimage for copying pixel data qimage = self._get_qimage(data) drawable = self.surface painter = QPainter(drawable) #painter.setWorldMatrixEnabled(True) # fill surface with background color size = drawable.size() sf_wd, sf_ht = size.width(), size.height() bg = self.viewer.img_bg bgclr = self._get_color(*bg) painter.fillRect(QtCore.QRect(0, 0, sf_wd, sf_ht), bgclr) # draw image data from buffer to offscreen pixmap painter.drawImage(QtCore.QRect(dst_x, dst_y, width, height), qimage, QtCore.QRect(0, 0, width, height))
def setup_cr(self): cr = QPainter(self.viewer.pixmap) pen = QPen() pen.setWidth(getattr(self, 'linewidth', 1)) if hasattr(self, 'linestyle'): if self.linestyle == 'dash': pen.setDashPattern([3.0, 4.0, 6.0, 4.0]) pen.setDashOffset(5.0) alpha = getattr(self, 'alpha', 1.0) color = self.__get_color(self.color, alpha) pen.setColor(color) cr.setPen(pen) fill = getattr(self, 'fill', False) if fill: if hasattr(self, 'fillcolor') and self.fillcolor: color = self.fillcolor else: color = self.color if not color: cr.setBrush(QtCore.Qt.NoBrush) else: alpha = getattr(self, 'fillalpha', alpha) color = self.__get_color(color, alpha) cr.setBrush(color) else: cr.setBrush(QtCore.Qt.NoBrush) return cr
def setup_cr(self): cr = QPainter(self.fitsimage.pixmap) pen = QPen() if hasattr(self, 'linewidth'): pen.setWidth(self.linewidth) else: pen.setWidth(1) if hasattr(self, 'linestyle'): if self.linestyle == 'dash': pen.setDashPattern([3.0, 4.0, 6.0, 4.0]) pen.setDashOffset(5.0) color = self.__get_color(self.color) pen.setColor(color) cr.setPen(pen) if hasattr(self, 'fill') and self.fill: if hasattr(self, 'fillcolor') and self.fillcolor: color = self.fillcolor else: color = self.color if not color: cr.setBrush(QtCore.Qt.NoBrush) else: color = self.__get_color(color) cr.setBrush(color) else: cr.setBrush(QtCore.Qt.NoBrush) return cr
def repaint(self, rect): x1, y1, x2, y2 = rect.getCoords() width = x2 - x1 height = y2 - y1 # redraw the screen from backing pixmap #print "copying pixmap to widget" painter = QPainter(self) rect = QtCore.QRect(x1, y1, width, height) painter.drawPixmap(rect, self.pixmap, rect)
def paintEvent(self, event): """When an area of the window is exposed, we just copy out of the server-side, off-screen pixmap to that area. """ if not self.pixmap: return rect = event.rect() x1, y1, x2, y2 = rect.getCoords() width = x2 - x1 height = y2 - y1 # redraw the screen from backing pixmap painter = QPainter(self) rect = QtCore.QRect(x1, y1, width, height) painter.drawPixmap(rect, self.pixmap, rect)
def update_image(self): if (not self.pixmap) or (not self.imgwin): return if isinstance(self.renderer.surface, QPixmap): # optimization when Qt is used as the renderer: # if renderer surface is already an offscreen QPixmap # then we can update the window directly from it #self.pixmap = self.renderer.surface pass else: if isinstance(self.renderer.surface, QImage): # optimization when Qt is used as the renderer: # renderer surface is already a QImage qimage = self.renderer.surface else: # otherwise, get the render surface as an array and # convert to a QImage try: arr = self.renderer.get_surface_as_array(order='BGRA') qimage = self._get_qimage(arr, QImage.Format_RGB32) except Exception as e: self.logger.error("Error from renderer: %s" % (str(e))) return # copy image from renderer to offscreen pixmap painter = QPainter(self.pixmap) #painter.setWorldMatrixEnabled(True) # fill surface with background color size = self.pixmap.size() width, height = size.width(), size.height() # draw image data from buffer to offscreen pixmap painter.drawImage(QtCore.QRect(0, 0, width, height), qimage, QtCore.QRect(0, 0, width, height)) self.logger.debug("updating window from pixmap") if hasattr(self, 'scene'): imgwin_wd, imgwin_ht = self.get_window_size() self.scene.invalidate(0, 0, imgwin_wd, imgwin_ht, QtGui.QGraphicsScene.BackgroundLayer) else: self.imgwin.update()
def _render_offscreen(self, drawable, data, dst_x, dst_y, width, height): # NOTE [A] daht, dawd, depth = data.shape self.logger.debug("data shape is %dx%dx%d" % (dawd, daht, depth)) # Get qimage for copying pixel data qimage = self._get_qimage(data) painter = QPainter(drawable) painter.setWorldMatrixEnabled(True) # fill pixmap with background color imgwin_wd, imgwin_ht = self.get_window_size() bgclr = self._get_color(*self.img_bg) painter.fillRect(QtCore.QRect(0, 0, imgwin_wd, imgwin_ht), bgclr) # draw image data from buffer to offscreen pixmap painter.drawImage(QtCore.QRect(dst_x, dst_y, width, height), qimage, QtCore.QRect(0, 0, width, height))
def resize(self, dims): """Resize our drawing area to encompass a space defined by the given dimensions. """ width, height = dims[:2] self.logger.debug("renderer reconfigured to %dx%d" % (width, height)) if self.surface_type == 'qpixmap': self.surface = QPixmap(width, height) else: self.surface = QImage(width, height, self.qimg_fmt) # fill surface with background color; # this reduces unwanted garbage in the resizing window painter = QPainter(self.surface) size = self.surface.size() sf_wd, sf_ht = size.width(), size.height() bg = self.viewer.img_bg bgclr = self._get_color(*bg) painter.fillRect(QtCore.QRect(0, 0, sf_wd, sf_ht), bgclr)
def __init__(self, viewer): self.viewer = viewer # TODO: encapsulate this drawable self.cr = QPainter(self.viewer.pixmap)
def __init__(self, renderer, viewer, surface): render.RenderContextBase.__init__(self, renderer, viewer) self.cr = QPainter(surface) self.cr.setRenderHint(QPainter.Antialiasing)
def __init__(self, viewer): self.viewer = viewer # TODO: encapsulate this drawable self.cr = QPainter(self.viewer.pixmap) self.cr.setRenderHint(QPainter.Antialiasing)
def setup_cr(self): cr = QPainter(self.pixmap) pen = QPen() pen.setWidth(1) cr.setPen(pen) return cr