def drawTextMode(self, qp, row=0, howMany=1): # draw background qp.fillRect(0, row * self.fontHeight, self.COLUMNS * self.fontWidth, howMany * self.fontHeight + self.SPACER, self.backgroundBrush) # set text pen&font qp.setFont(self.font) qp.setPen(self.textPen) cemu = ConsoleEmulator(qp, self.ROWS, self.COLUMNS) self.page = self.transformationEngine.decorate() cemu.gotoXY(0, row) for i, c in enumerate(self.getDisplayablePage()[row * self.COLUMNS:(row + howMany) * self.COLUMNS]): x = i + row * self.COLUMNS c = self.transformationEngine.getChar(x) qp.setPen(self.transformationEngine.choosePen(x)) if self.transformationEngine.chooseBrush(x) is not None: qp.setBackgroundMode(1) qp.setBackground(self.transformationEngine.chooseBrush(x)) cemu.write(self.cp437(c)) qp.setBackgroundMode(0)
def drawTextMode(self, qp): # draw background qp.fillRect(0, 0, self.COLUMNS * self.fontWidth, self.ROWS * self.fontHeight, self.backgroundBrush) # set text pen&font qp.setFont(self.font) qp.setPen(self.textPen) cemu = ConsoleEmulator(qp, self.ROWS, self.COLUMNS) # ast = self.dataModel.current_class.get_ast() for i in range(self.ROWS): if i < len(self.LINES): line = self.LINES[i] cemu.writeAt(0, i, line)
def scroll_h(self, dx): self.qpix.scroll(dx * self.fontWidth, 0, self.qpix.rect()) qp = QtGui.QPainter() qp.begin(self.qpix) qp.setFont(self.font) qp.setPen(self.textPen) factor = abs(dx) if dx < 0: qp.fillRect((self.COLUMNS - 1 * factor) * self.fontWidth, 0, factor * self.fontWidth, self.ROWS * self.fontHeight + self.SPACER, self.backgroundBrush) if dx > 0: qp.fillRect(0, 0, factor * self.fontWidth, self.ROWS * self.fontHeight + self.SPACER, self.backgroundBrush) cemu = ConsoleEmulator(qp, self.ROWS, self.COLUMNS) page = self.transformationEngine.decorate() # scriem pe fiecare coloana in parte for column in range(factor): # fiecare caracter de pe coloana for i in range(self.ROWS): if dx < 0: # cu (column) selectam coloana idx = (i + 1) * self.COLUMNS - (column + 1) if dx > 0: idx = i * self.COLUMNS + column # c = self.dataModel.getDisplayablePage()[idx] c = self.transformationEngine.getChar(idx) qp.setPen(self.transformationEngine.choosePen(idx)) if self.transformationEngine.chooseBrush(idx) is not None: qp.setBackgroundMode(1) qp.setBackground(self.transformationEngine.chooseBrush(idx)) # self.decorate(qp, (idx, c), self.dataModel.getDisplayablePage()) if dx < 0: cemu.writeAt(self.COLUMNS - (column + 1), i, self.cp437(c)) if dx > 0: cemu.writeAt(column, i, self.cp437(c)) qp.setBackgroundMode(0) qp.end()
def scroll_v(self, dy, cachePix=None, pageOffset=None): start = time() if not cachePix: self.qpix.scroll(0, dy * self.fontHeight, self.qpix.rect()) qp = QtGui.QPainter() if cachePix: qp.begin(cachePix) else: qp.begin(self.qpix) # self.font.setStyleHint(QtGui.QFont.AnyStyle, QtGui.QFont.PreferAntialias) qp.setFont(self.font) qp.setPen(self.textPen) # TODO: while the characters are not all the same hight, when scrolling up on y axis, trails remains. We should also erase a Rect with SPACER in hight # same problem when scrolling up. factor = abs(dy) if dy < 0: qp.fillRect(0, (self.ROWS - factor) * self.fontHeight, self.fontWidth * self.COLUMNS, factor * self.fontHeight + self.SPACER, self.backgroundBrush) if dy > 0: qp.fillRect(0, 0, self.fontWidth * self.COLUMNS, factor * self.fontHeight, self.backgroundBrush) cemu = ConsoleEmulator(qp, self.ROWS, self.COLUMNS) # page = self.dataModel.getDisplayablePage() page = self.transformationEngine.decorate(pageOffset=pageOffset) lastPen = None lastBrush = None # cate linii desenam k = time() for row in range(factor): # desenam caracterele # cemu.writeAt(0, row, str(page[row*self.COLUMNS:row*self.COLUMNS+self.COLUMNS])) for i in range(self.COLUMNS): if dy < 0: idx = (self.ROWS - (row + 1)) * self.COLUMNS + i if dy > 0: idx = i + (self.COLUMNS * row) c = self.transformationEngine.getChar(idx) nextPen = self.transformationEngine.choosePen(idx) if nextPen != lastPen: qp.setPen(nextPen) lastPen = nextPen qp.setBackgroundMode(0) nextBrush = self.transformationEngine.chooseBrush(idx) if nextBrush is not None: qp.setBackgroundMode(1) if nextBrush != lastBrush: qp.setBackground(nextBrush) lastBrush = nextBrush if dy < 0: cemu.writeAt_c(i, self.ROWS - 1 - row, self.cp437(c)) if dy > 0: cemu.writeAt_c(i, row, self.cp437(c)) # TODO: text decorator is taking too much! print time() - k qp.end() end = time() - start
def drawTextMode(self, qp, row=0, howMany=1): # draw background qp.fillRect(0, row * self.fontHeight, self.CON_COLUMNS * self.fontWidth, howMany * self.fontHeight + self.SPACER, self.backgroundBrush) # set text pen&font qp.setFont(self.font) qp.setPen(self.textPen) cemu = ConsoleEmulator(qp, self.ROWS, self.CON_COLUMNS) page = self.transformationEngine.decorate() cemu.gotoXY(0, row) for i, c in enumerate( self.getDisplayablePage() [row * self.COLUMNS:(row + howMany) * self.COLUMNS]): # TODO: does not apply all decorators w = i + row * self.COLUMNS if (w + 1) % self.COLUMNS == 0: hex_s = str(hex(c)[2:]).zfill(2) else: hex_s = str(hex(c)[2:]).zfill(2) + ' ' qp.setPen(self.transformationEngine.choosePen(w)) if self.transformationEngine.chooseBrush(w) is not None: qp.setBackgroundMode(1) qp.setBackground(self.transformationEngine.chooseBrush(w)) # write hex representation cemu.write(hex_s, noBackgroudOnSpaces=True) # save hex position x, y = cemu.getXY() # write text cemu.writeAt(self.COLUMNS * 3 + self.gap + (w % self.COLUMNS), y, self.cp437(c)) # go back to hex chars cemu.gotoXY(x, y) if (w + 1) % self.COLUMNS == 0: cemu.writeLn() qp.setBackgroundMode(0)
def scroll_v(self, dy): self.qpix.scroll(0, dy * self.fontHeight, self.qpix.rect()) qp = QtGui.QPainter() qp.begin(self.qpix) qp.setFont(self.font) qp.setPen(self.textPen) factor = abs(dy) cemu = ConsoleEmulator(qp, self.ROWS, self.CON_COLUMNS) if dy < 0: cemu.gotoXY(0, self.ROWS - factor) qp.fillRect(0, (self.ROWS - factor) * self.fontHeight, self.fontWidth * self.CON_COLUMNS, factor * self.fontHeight + self.SPACER, self.backgroundBrush) if dy > 0: cemu.gotoXY(0, 0) qp.fillRect(0, 0, self.fontWidth * self.CON_COLUMNS, factor * self.fontHeight, self.backgroundBrush) page = self.transformationEngine.decorate() # how many rows for row in range(factor): # for every column for i in range(self.COLUMNS): if dy < 0: # we write from top-down, so get index of the first row that will be displayed # this is why we have factor - row idx = i + (self.ROWS - (factor - row)) * self.COLUMNS if dy > 0: idx = i + (self.COLUMNS * row) qp.setPen(self.transformationEngine.choosePen(idx)) if self.transformationEngine.chooseBrush(idx) is not None: qp.setBackgroundMode(1) qp.setBackground( self.transformationEngine.chooseBrush(idx)) if len(self.getDisplayablePage()) > idx: c = self.getDisplayablePage()[idx] else: break if i == self.COLUMNS - 1: hex_s = str(hex(c)[2:]).zfill(2) else: hex_s = str(hex(c)[2:]).zfill(2) + ' ' # write hex representation cemu.write(hex_s, noBackgroudOnSpaces=True) # save hex position x, y = cemu.getXY() # write text cemu.writeAt(self.COLUMNS * 3 + self.gap + (i % self.COLUMNS), y, self.cp437(c)) # go back to hex chars cemu.gotoXY(x, y) qp.setBackgroundMode(0) cemu.writeLn() qp.end()
def scroll_h(self, dx): gap = self.gap # hex part self.qpix.scroll( dx * 3 * self.fontWidth, 0, QtCore.QRect(0, 0, self.COLUMNS * 3 * self.fontWidth, self.ROWS * self.fontHeight + self.SPACER)) # text part self.qpix.scroll( dx * self.fontWidth, 0, QtCore.QRect((self.COLUMNS * 3 + gap) * self.fontWidth, 0, self.COLUMNS * self.fontWidth, self.ROWS * self.fontHeight + self.SPACER)) qp = QtGui.QPainter() qp.begin(self.qpix) qp.setFont(self.font) qp.setPen(self.textPen) factor = abs(dx) # There are some trails from the characters, when scrolling. trail == number of pixel to erase near the character trail = 5 textBegining = self.COLUMNS * 3 + gap if dx < 0: # hex qp.fillRect((self.COLUMNS - 1 * factor) * 3 * self.fontWidth, 0, factor * self.fontWidth * 3, self.ROWS * self.fontHeight + self.SPACER, self.backgroundBrush) # text qp.fillRect( (textBegining + self.COLUMNS - 1 * factor) * self.fontWidth, 0, factor * self.fontWidth + trail, self.ROWS * self.fontHeight + self.SPACER, self.backgroundBrush) if dx > 0: # hex qp.fillRect(0, 0, factor * 3 * self.fontWidth, self.ROWS * self.fontHeight + self.SPACER, self.backgroundBrush) # text qp.fillRect(textBegining * self.fontWidth - trail, 0, factor * self.fontWidth + trail, self.ROWS * self.fontHeight + self.SPACER, self.backgroundBrush) cemu = ConsoleEmulator(qp, self.ROWS, self.CON_COLUMNS) page = self.transformationEngine.decorate() # scriem pe fiecare coloana in parte for column in range(factor): # fiecare caracter de pe coloana for i in range(self.ROWS): if dx < 0: # cu (column) selectam coloana idx = (i + 1) * self.COLUMNS - (column + 1) if dx > 0: idx = i * self.COLUMNS + column if len(self.getDisplayablePage()) > idx: qp.setPen(self.transformationEngine.choosePen(idx)) else: break if self.transformationEngine.chooseBrush(idx) is not None: qp.setBackgroundMode(1) qp.setBackground( self.transformationEngine.chooseBrush(idx)) c = self.getDisplayablePage()[idx] hex_s = str(hex(c)[2:]).zfill(2) + ' ' if dx < 0: cemu.writeAt((self.COLUMNS - (column + 1)) * 3, i, hex_s, noBackgroudOnSpaces=True) cemu.writeAt(textBegining + self.COLUMNS - (column + 1), i, self.cp437(c)) if dx > 0: cemu.writeAt(column * 3, i, hex_s, noBackgroudOnSpaces=True) cemu.writeAt(textBegining + column, i, self.cp437(c)) qp.setBackgroundMode(0) qp.end()
def scroll_v(self, dy, cachePix=None, pageOffset=None): log.debug('scroll_v %s %s %s %s', dy, cachePix, pageOffset, hex(self.getCursorAbsolutePosition())) RowsToDraw = [] factor = abs(dy) # repeat as many rows we have scrolled for row in range(factor): current_idx = None if dy < 0: tsize = sum([asm.get_length() for asm in self.OPCODES]) current_offset = self.dataModel.getOffset() + tsize if current_offset not in self.CACHE_IDX_OPCODES_OFF: log.debug('INVALID OFFSET %s', hex(current_offset)) return current_idx = self.CACHE_IDX_OPCODES_OFF[current_offset] - 1 log.debug("IDX %s %s", current_idx, hex(current_offset)) if current_idx + 1 >= len(self.CACHE_OPCODES): log.debug('END OF DATA') return current_idx += 1 if dy >= 0: current_offset = self.dataModel.getOffset() current_idx = self.CACHE_IDX_OPCODES_OFF[current_offset] log.debug("IDX %s %s", current_idx, hex(current_offset)) # start = self.CACHE_OPCODES[self.CACHE_IDX_OPCODES_OFF[self.getCursorAbsolutePosition()]-1] current_idx -= 1 newins = self.CACHE_OPCODES[current_idx] if dy < 0: self.dataModel.slide(self.OPCODES[0].get_length()) del self.OPCODES[0] if dy >= 0: self.dataModel.slide(-newins.get_length()) del self.OPCODES[len(self.OPCODES) - 1] if dy < 0: self.OPCODES.append(newins) if dy > 0: self.OPCODES.insert(0, newins) if dy < 0: RowsToDraw.append((self.ROWS + row, newins)) if dy > 0: RowsToDraw.append((-row - 1, newins)) log.debug('ROW TO DRAW %s', RowsToDraw) if len(RowsToDraw) < abs(dy): # maybe we couldn't draw dy rows (possible we reached the beginning of the data to early), recalculate dy dy = len(RowsToDraw) * dy / abs(dy) factor = abs(dy) if not cachePix: self.qpix.scroll(0, dy * self.fontHeight, self.qpix.rect()) qp = QtGui.QPainter() if cachePix: qp.begin(cachePix) else: qp.begin(self.qpix) qp.setFont(self.font) qp.setPen(self.textPen) # erase rows that will disappear if dy < 0: qp.fillRect(0, (self.ROWS - factor) * self.fontHeight, self.fontWidth * self.COLUMNS, factor * self.fontHeight, self.backgroundBrush) if dy > 0: qp.fillRect(0, 0, self.fontWidth * self.COLUMNS, factor * self.fontHeight, self.backgroundBrush) cemu = ConsoleEmulator(qp, self.ROWS, self.COLUMNS) for row, asm in RowsToDraw: asm.Load() self._drawRow(qp, cemu, dy + row, asm) qp.end()
def drawTextMode(self, qp, row=0, howMany=1): # draw background qp.fillRect(0, row * self.fontHeight, self.CON_COLUMNS * self.fontWidth, howMany * self.fontHeight + self.SPACER, self.backgroundBrush) # set text pen&font qp.setFont(self.font) qp.setPen(self.textPen) cemu = ConsoleEmulator(qp, self.ROWS, self.CON_COLUMNS) page = self.transformationEngine.decorate() cemu.gotoXY(0, row) for i, c in enumerate(self.getDisplayablePage()[row * self.COLUMNS:( row + howMany) * self.COLUMNS]): # TODO: does not apply all decorators w = i + row * self.COLUMNS if (w + 1) % self.COLUMNS == 0: hex_s = str(hex(c)[2:]).zfill(2) else: hex_s = str(hex(c)[2:]).zfill(2) + ' ' qp.setPen(self.transformationEngine.choosePen(w)) if self.transformationEngine.chooseBrush(w) is not None: qp.setBackgroundMode(1) qp.setBackground(self.transformationEngine.chooseBrush(w)) # write hex representation cemu.write(hex_s, noBackgroudOnSpaces=True) # save hex position x, y = cemu.getXY() # write text cemu.writeAt(self.COLUMNS * 3 + self.gap + (w % self.COLUMNS), y, self.cp437(c)) # go back to hex chars cemu.gotoXY(x, y) if (w + 1) % self.COLUMNS == 0: cemu.writeLn() qp.setBackgroundMode(0)
def scroll_v(self, dy): self.qpix.scroll(0, dy * self.fontHeight, self.qpix.rect()) qp = QtGui.QPainter() qp.begin(self.qpix) qp.setFont(self.font) qp.setPen(self.textPen) factor = abs(dy) cemu = ConsoleEmulator(qp, self.ROWS, self.CON_COLUMNS) if dy < 0: cemu.gotoXY(0, self.ROWS - factor) qp.fillRect(0, (self.ROWS - factor) * self.fontHeight, self.fontWidth * self.CON_COLUMNS, factor * self.fontHeight + self.SPACER, self.backgroundBrush) if dy > 0: cemu.gotoXY(0, 0) qp.fillRect(0, 0, self.fontWidth * self.CON_COLUMNS, factor * self.fontHeight, self.backgroundBrush) page = self.transformationEngine.decorate() # how many rows for row in range(factor): # for every column for i in range(self.COLUMNS): if dy < 0: # we write from top-down, so get index of the first row that will be displayed # this is why we have factor - row idx = i + (self.ROWS - (factor - row)) * self.COLUMNS if dy > 0: idx = i + (self.COLUMNS * row) qp.setPen(self.transformationEngine.choosePen(idx)) if self.transformationEngine.chooseBrush(idx) is not None: qp.setBackgroundMode(1) qp.setBackground(self.transformationEngine.chooseBrush(idx)) if len(self.getDisplayablePage()) > idx: c = self.getDisplayablePage()[idx] else: break if i == self.COLUMNS - 1: hex_s = str(hex(c)[2:]).zfill(2) else: hex_s = str(hex(c)[2:]).zfill(2) + ' ' # write hex representation cemu.write(hex_s, noBackgroudOnSpaces=True) # save hex position x, y = cemu.getXY() # write text cemu.writeAt(self.COLUMNS * 3 + self.gap + (i % self.COLUMNS), y, self.cp437(c)) # go back to hex chars cemu.gotoXY(x, y) qp.setBackgroundMode(0) cemu.writeLn() qp.end()
def scroll_h(self, dx): gap = self.gap # hex part self.qpix.scroll(dx * 3 * self.fontWidth, 0, QtCore.QRect(0, 0, self.COLUMNS * 3 * self.fontWidth, self.ROWS * self.fontHeight + self.SPACER)) # text part self.qpix.scroll(dx * self.fontWidth, 0, QtCore.QRect((self.COLUMNS * 3 + gap) * self.fontWidth, 0, self.COLUMNS * self.fontWidth, self.ROWS * self.fontHeight + self.SPACER)) qp = QtGui.QPainter() qp.begin(self.qpix) qp.setFont(self.font) qp.setPen(self.textPen) factor = abs(dx) # There are some trails from the characters, when scrolling. trail == number of pixel to erase near the character trail = 5 textBegining = self.COLUMNS * 3 + gap if dx < 0: # hex qp.fillRect((self.COLUMNS - 1 * factor) * 3 * self.fontWidth, 0, factor * self.fontWidth * 3, self.ROWS * self.fontHeight + self.SPACER, self.backgroundBrush) # text qp.fillRect((textBegining + self.COLUMNS - 1 * factor) * self.fontWidth, 0, factor * self.fontWidth + trail, self.ROWS * self.fontHeight + self.SPACER, self.backgroundBrush) if dx > 0: # hex qp.fillRect(0, 0, factor * 3 * self.fontWidth, self.ROWS * self.fontHeight + self.SPACER, self.backgroundBrush) # text qp.fillRect(textBegining * self.fontWidth - trail, 0, factor * self.fontWidth + trail, self.ROWS * self.fontHeight + self.SPACER, self.backgroundBrush) cemu = ConsoleEmulator(qp, self.ROWS, self.CON_COLUMNS) page = self.transformationEngine.decorate() # scriem pe fiecare coloana in parte for column in range(factor): # fiecare caracter de pe coloana for i in range(self.ROWS): if dx < 0: # cu (column) selectam coloana idx = (i + 1) * self.COLUMNS - (column + 1) if dx > 0: idx = i * self.COLUMNS + column if len(self.getDisplayablePage()) > idx: qp.setPen(self.transformationEngine.choosePen(idx)) else: break if self.transformationEngine.chooseBrush(idx) is not None: qp.setBackgroundMode(1) qp.setBackground(self.transformationEngine.chooseBrush(idx)) c = self.getDisplayablePage()[idx] hex_s = str(hex(c)[2:]).zfill(2) + ' ' if dx < 0: cemu.writeAt((self.COLUMNS - (column + 1)) * 3, i, hex_s, noBackgroudOnSpaces=True) cemu.writeAt(textBegining + self.COLUMNS - (column + 1), i, self.cp437(c)) if dx > 0: cemu.writeAt(column * 3, i, hex_s, noBackgroudOnSpaces=True) cemu.writeAt(textBegining + column, i, self.cp437(c)) qp.setBackgroundMode(0) qp.end()
def draw(self): qp = QtGui.QPainter() qp.begin(self.qpix) qp.fillRect(0, 0, self.width, self.height, self.backgroundBrush) qp.setPen(self.textPen) qp.setFont(self.font) cemu = ConsoleEmulator(qp, self.height // self.fontHeight, self.width // self.fontWidth) dword = self.dataModel.getDWORD( self.viewMode.getCursorAbsolutePosition(), asString=True) if dword is None: dword = '----' sd = 'DWORD: {}'.format(dword) pos = 'POS: {:08x}'.format(self.viewMode.getCursorAbsolutePosition()) qword = self.dataModel.getQWORD( self.viewMode.getCursorAbsolutePosition(), asString=True) if qword is None: qword = '----' sq = 'QWORD: {}'.format(qword) byte = self.dataModel.getBYTE( self.viewMode.getCursorAbsolutePosition(), asString=True) if byte is None: byte = '-' sb = 'BYTE: {}'.format(byte) cemu.writeAt(1, 0, pos) cemu.writeAt(17, 0, sd) cemu.writeAt(35, 0, sq) cemu.writeAt(62, 0, sb) qp.drawLine(15 * self.fontWidth + 5, 0, 15 * self.fontWidth + 5, 50) qp.drawLine(33 * self.fontWidth + 5, 0, 33 * self.fontWidth + 5, 50) qp.drawLine(59 * self.fontWidth + 5, 0, 59 * self.fontWidth + 5, 50) qp.drawLine(71 * self.fontWidth + 5, 0, 71 * self.fontWidth + 5, 50) if self.viewMode.selector.getCurrentSelection(): u, v = self.viewMode.selector.getCurrentSelection() if u != v: pen = QtGui.QPen(QtGui.QColor(51, 153, 255), 0, QtCore.Qt.SolidLine) qp.setPen(pen) cemu.writeAt(73, 0, 'Selection: ') cemu.write('{:x}:{}'.format(u, v - u)) else: pen = QtGui.QPen(QtGui.QColor(128, 128, 128), 0, QtCore.Qt.SolidLine) qp.setPen(pen) cemu.writeAt(73, 0, '<no selection>') """ qp.drawLine(self.fontWidth*(len(pos) + 1) + 15, 0, self.fontWidth*(len(pos) + 1) + 15, 50) qp.drawLine(self.fontWidth*(len(pos + sd) + 1) + 3*15, 0, self.fontWidth*(len(pos + sd) + 1) + 3*15, 50) qp.drawLine(self.fontWidth*(len(pos + sd + sq) + 1) + 5*15, 0, self.fontWidth*(len(pos + sd + sq) + 1) + 5*15, 50) qp.drawLine(self.fontWidth*(len(pos + sd + sq + sb) + 1) + 8*15, 0, self.fontWidth*(len(pos + sd + sq + sb) + 1) + 8*15, 50) """ # qp.drawLine(270, 0, 270, 50) # qp.drawLine(480, 0, 480, 50) # qp.drawLine(570, 0, 570, 50) """ # position qp.drawText(0 + 5, self.fontHeight, pos) # separator qp.drawLine(120, 0, 120, 50) # dword qp.drawText(130 + 5, self.fontHeight, sd) # separator qp.drawLine(270, 0, 270, 50) # qword qp.drawText(280 + 5, self.fontHeight, sq) # separator qp.drawLine(480, 0, 480, 50) # byte qp.drawText(490 + 5, self.fontHeight, sb) # separator qp.drawLine(570, 0, 570, 50) """ qp.end() pass