Commit 2d1c963c authored by dmMaze's avatar dmMaze
Browse files

optimize stroke rendering

parent 79cb3b2d
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -54,6 +54,12 @@ def set_textblk_color(blkitem: TextBlkItem, cursor: QTextCursor, rgb: List):
    
@restore_textcursor
def set_textblk_fontsize(blkitem: TextBlkItem, cursor: QTextCursor, fontsize):
    need_repaint = blkitem.stroke_width != 0
    if need_repaint:
        fs = pt2px(max(blkitem.layout.max_font_size(), fontsize))
        blkitem.layout.relayout_on_changed = False
        blkitem.setPadding(fs * blkitem.stroke_width / 2)
        blkitem.layout.relayout_on_changed = True
    format = QTextCharFormat()
    format.setFontPointSize(fontsize)
    cursor.mergeCharFormat(format)
@@ -65,7 +71,6 @@ def set_textblk_fontsize(blkitem: TextBlkItem, cursor: QTextCursor, fontsize):
        font.setPointSizeF(fontsize)
        doc.setDefaultFont(font)
    cursor.mergeBlockCharFormat(format)
    # blkitem.setPadding(pt2px(fontsize))

@restore_textcursor
def set_textblk_weight(blkitem, cursor: QTextCursor, weight):
+4 −0
Original line number Diff line number Diff line
@@ -150,6 +150,8 @@ class SceneTextLayout(QAbstractTextDocumentLayout):
        self.foreground_pixmap: QPixmap = None
        self.draw_foreground_only = False

        self.relayout_on_changed = True

    def setMaxSize(self, max_width: int, max_height: int, relayout=True):
        self.max_height = max_height
        self.max_width = max_width
@@ -184,6 +186,8 @@ class SceneTextLayout(QAbstractTextDocumentLayout):
        return QSizeF(self.max_width, self.max_height)

    def documentChanged(self, position: int, charsRemoved: int, charsAdded: int) -> None:
        if not self.relayout_on_changed:
            return
        self._max_font_size = -1
        block = self.document().firstBlock()
        self.block_charfmt_lst = []
+28 −23
Original line number Diff line number Diff line
@@ -57,7 +57,7 @@ class TextBlkItem(QGraphicsTextItem):
    def is_editting(self):
        return self.textInteractionFlags() == Qt.TextInteractionFlag.TextEditorInteraction

    def documentContentChanged(self):
    def onDocumentContentChanged(self):
        if self.hasFocus():   
            self.content_changed.emit(self)
        if self.stroke_width != 0 and not self.repainting:
@@ -78,6 +78,7 @@ class TextBlkItem(QGraphicsTextItem):
        layout.setMaxSize(rect.width(), rect.height(), False)
        doc.setDocumentLayout(layout)

        layout.relayout_on_changed = False
        cursor = QTextCursor(doc)
        block = doc.firstBlock()
        stroke_pen = QPen(self.stroke_color, 0, Qt.PenStyle.SolidLine, Qt.PenCapStyle.RoundCap, Qt.PenJoinStyle.RoundJoin)
@@ -132,18 +133,21 @@ class TextBlkItem(QGraphicsTextItem):
        if blk.translation:
            set_char_fmt = True

        if set_format:
        font_fmt = FontFormat()
        font_fmt.from_textblock(blk)
            self.set_fontformat(font_fmt, set_char_format=set_char_fmt)
        if set_format:
            self.set_fontformat(font_fmt, set_char_format=set_char_fmt, set_stroke_width=False)

        if not blk.rich_text:
            if blk.translation:
                self.setPlainText(blk.translation)
            
            self.setStrokeWidth(font_fmt.stroke_width)
        else:
            self.setHtml(blk.rich_text)
            self.letter_spacing = 1.
            self.setLetterSpacing(font_fmt.letter_spacing)
            self.setLetterSpacing(font_fmt.letter_spacing, repaint_background=False)
            self.setStrokeWidth(font_fmt.stroke_width)

    def setCenterTransform(self):
        center = self.boundingRect().center()
@@ -170,7 +174,7 @@ class TextBlkItem(QGraphicsTextItem):
        P = p * 2
        return QRectF(rect.x() - p, rect.y() - p, rect.width() + P, rect.height() + P)

    def setRect(self, rect: Union[List, QRectF], padding=True) -> None:
    def setRect(self, rect: Union[List, QRectF], padding=True, repaint=True) -> None:
        
        if isinstance(rect, List):
            rect = QRectF(*rect)
@@ -180,8 +184,8 @@ class TextBlkItem(QGraphicsTextItem):
        self.prepareGeometryChange()
        self._display_rect = rect
        self.layout.setMaxSize(rect.width(), rect.height())
        self.document().setPageSize(QSizeF(rect.width(), rect.height()))
        self.setCenterTransform()
        if repaint:
            self.repaint_background()

    def documentSize(self):
@@ -199,15 +203,14 @@ class TextBlkItem(QGraphicsTextItem):
        return self.document().documentMargin()

    def setPadding(self, p: float):
        # _p = self.padding()
        # if _p > p:
        #     return
        _p = self.padding()
        if _p == p:
            return
        abr = self.absBoundingRect()
        if self.layout is not None:
        self.layout.relayout_on_changed = False
        self.layout.updateDocumentMargin(p)
        else:
            self.document().setDocumentMargin(p)
        self.setRect(abr)
        self.layout.relayout_on_changed = True
        self.setRect(abr, repaint=False)

    def absBoundingRect(self, max_h=None, max_w=None, qrect=False) -> Union[List, QRectF]:
        br = self.boundingRect()
@@ -291,7 +294,7 @@ class TextBlkItem(QGraphicsTextItem):
        layout.documentSizeChanged.connect(self.docSizeChanged)
        doc.setDocumentLayout(layout)
        doc.setDefaultFont(default_font)
        doc.contentsChanged.connect(self.documentContentChanged)
        doc.contentsChanged.connect(self.onDocumentContentChanged)
        
        if valid_layout:
            layout.setMaxSize(rect.width(), rect.height())
@@ -328,11 +331,11 @@ class TextBlkItem(QGraphicsTextItem):
                pos.setY(pos.y() + delta_x * np.sin(rad))
            self.setPos(pos)

    def setStrokeWidth(self, stroke_width: float):
    def setStrokeWidth(self, stroke_width: float, padding=True):
        if self.stroke_width == stroke_width:
            return

        if stroke_width > 0:
        if stroke_width > 0 and padding:
            p = self.layout.max_font_size(to_px=True) * stroke_width / 2
            self.setPadding(p)

@@ -510,7 +513,7 @@ class TextBlkItem(QGraphicsTextItem):
        )
        return font_format

    def set_fontformat(self, ffmat: FontFormat, set_char_format=False):
    def set_fontformat(self, ffmat: FontFormat, set_char_format=False, set_stroke_width=True):
        if self.is_vertical != ffmat.vertical:
            self.setVertical(ffmat.vertical)

@@ -543,6 +546,7 @@ class TextBlkItem(QGraphicsTextItem):
        cursor.movePosition(QTextCursor.MoveOperation.Start)
        self.setTextCursor(cursor)
        self.stroke_color = QColor(ffmat.srgb[0], ffmat.srgb[1], ffmat.srgb[2])
        if set_stroke_width:
            self.setStrokeWidth(ffmat.stroke_width)
        
        alignment = [Qt.AlignmentFlag.AlignLeft, Qt.AlignmentFlag.AlignCenter, Qt.AlignmentFlag.AlignRight][ffmat.alignment]
@@ -572,7 +576,7 @@ class TextBlkItem(QGraphicsTextItem):
        self.layout.setLineSpacing(self.line_spacing)
        self.repaint_background()

    def setLetterSpacing(self, letter_spacing: float):
    def setLetterSpacing(self, letter_spacing: float, repaint_background=True):
        if self.letter_spacing == letter_spacing:
            return
        self.letter_spacing = letter_spacing
@@ -586,6 +590,7 @@ class TextBlkItem(QGraphicsTextItem):
            cursor.select(QTextCursor.SelectionType.Document)
            cursor.mergeCharFormat(char_fmt)
            # cursor.mergeBlockCharFormat(char_fmt)
        if repaint_background:
            self.repaint_background()

    def get_char_fmts(self) -> List[QTextCharFormat]: