fix: adjust the order of rich text rendering
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
import { version } from '../../../../package.json'
|
||||
import { ZERO } from '../../dataset/constant/Common'
|
||||
import { PUNCTUATION_LIST, ZERO } from '../../dataset/constant/Common'
|
||||
import { RowFlex } from '../../dataset/enum/Row'
|
||||
import {
|
||||
IAppendElementListOption,
|
||||
@@ -1616,14 +1616,52 @@ export class Draw {
|
||||
return pageRowList
|
||||
}
|
||||
|
||||
private _drawRichText(ctx: CanvasRenderingContext2D) {
|
||||
this.underline.render(ctx)
|
||||
this.strikeout.render(ctx)
|
||||
this.highlight.render(ctx)
|
||||
this.textParticle.complete()
|
||||
private _drawHighlight(
|
||||
ctx: CanvasRenderingContext2D,
|
||||
payload: IDrawRowPayload
|
||||
) {
|
||||
const { rowList, positionList } = payload
|
||||
for (let i = 0; i < rowList.length; i++) {
|
||||
const curRow = rowList[i]
|
||||
for (let j = 0; j < curRow.elementList.length; j++) {
|
||||
const element = curRow.elementList[j]
|
||||
const preElement = curRow.elementList[j - 1]
|
||||
if (element.highlight) {
|
||||
// 高亮元素相连需立即绘制,并记录下一元素坐标
|
||||
if (
|
||||
preElement &&
|
||||
preElement.highlight &&
|
||||
preElement.highlight !== element.highlight
|
||||
) {
|
||||
this.highlight.render(ctx)
|
||||
}
|
||||
// 当前元素位置信息记录
|
||||
const {
|
||||
coordinate: {
|
||||
leftTop: [x, y]
|
||||
}
|
||||
} = positionList[curRow.startIndex + j]
|
||||
this.highlight.recordFillInfo(
|
||||
ctx,
|
||||
x,
|
||||
y,
|
||||
element.metrics.width,
|
||||
curRow.height,
|
||||
element.highlight
|
||||
)
|
||||
} else if (preElement?.highlight) {
|
||||
// 之前是高亮元素,当前不是需立即绘制
|
||||
this.highlight.render(ctx)
|
||||
}
|
||||
}
|
||||
this.highlight.render(ctx)
|
||||
}
|
||||
}
|
||||
|
||||
public drawRow(ctx: CanvasRenderingContext2D, payload: IDrawRowPayload) {
|
||||
// 优先绘制高亮元素
|
||||
this._drawHighlight(ctx, payload)
|
||||
// 绘制元素、下划线、删除线、选区
|
||||
const { rowList, pageNo, elementList, positionList, startIndex, zone } =
|
||||
payload
|
||||
const isPrintMode = this.mode === EditorMode.PRINT
|
||||
@@ -1657,30 +1695,9 @@ export class Draw {
|
||||
}
|
||||
} = positionList[curRow.startIndex + j]
|
||||
const preElement = curRow.elementList[j - 1]
|
||||
// 元素高亮记录
|
||||
if (element.highlight) {
|
||||
// 高亮元素相连需立即绘制,并记录下一元素坐标
|
||||
if (
|
||||
preElement &&
|
||||
preElement.highlight &&
|
||||
preElement.highlight !== element.highlight
|
||||
) {
|
||||
this.highlight.render(ctx)
|
||||
}
|
||||
this.highlight.recordFillInfo(
|
||||
ctx,
|
||||
x,
|
||||
y,
|
||||
metrics.width,
|
||||
curRow.height,
|
||||
element.highlight
|
||||
)
|
||||
} else if (preElement?.highlight) {
|
||||
this.highlight.render(ctx)
|
||||
}
|
||||
// 元素绘制
|
||||
if (element.type === ElementType.IMAGE) {
|
||||
this._drawRichText(ctx)
|
||||
this.textParticle.complete()
|
||||
// 浮动图片单独绘制
|
||||
if (
|
||||
element.imgDisplay !== ImageDisplay.FLOAT_TOP &&
|
||||
@@ -1689,7 +1706,7 @@ export class Draw {
|
||||
this.imageParticle.render(ctx, element, x, y + offsetY)
|
||||
}
|
||||
} else if (element.type === ElementType.LATEX) {
|
||||
this._drawRichText(ctx)
|
||||
this.textParticle.complete()
|
||||
this.laTexParticle.render(ctx, element, x, y + offsetY)
|
||||
} else if (element.type === ElementType.TABLE) {
|
||||
if (isCrossRowCol) {
|
||||
@@ -1699,24 +1716,26 @@ export class Draw {
|
||||
}
|
||||
this.tableParticle.render(ctx, element, x, y)
|
||||
} else if (element.type === ElementType.HYPERLINK) {
|
||||
this._drawRichText(ctx)
|
||||
this.textParticle.complete()
|
||||
this.hyperlinkParticle.render(ctx, element, x, y + offsetY)
|
||||
} else if (element.type === ElementType.DATE) {
|
||||
const nextElement = curRow.elementList[j + 1]
|
||||
// 释放之前的
|
||||
if (!preElement || preElement.dateId !== element.dateId) {
|
||||
this._drawRichText(ctx)
|
||||
this.textParticle.complete()
|
||||
}
|
||||
this.textParticle.record(ctx, element, x, y + offsetY)
|
||||
if (!nextElement || nextElement.dateId !== element.dateId) {
|
||||
// 手动触发渲染
|
||||
this._drawRichText(ctx)
|
||||
this.textParticle.complete()
|
||||
}
|
||||
} else if (element.type === ElementType.SUPERSCRIPT) {
|
||||
this._drawRichText(ctx)
|
||||
this.underline.render(ctx)
|
||||
this.textParticle.complete()
|
||||
this.superscriptParticle.render(ctx, element, x, y + offsetY)
|
||||
} else if (element.type === ElementType.SUBSCRIPT) {
|
||||
this._drawRichText(ctx)
|
||||
this.underline.render(ctx)
|
||||
this.textParticle.complete()
|
||||
this.subscriptParticle.render(ctx, element, x, y + offsetY)
|
||||
} else if (element.type === ElementType.SEPARATOR) {
|
||||
this.separatorParticle.render(ctx, element, x, y)
|
||||
@@ -1728,16 +1747,16 @@ export class Draw {
|
||||
element.type === ElementType.CHECKBOX ||
|
||||
element.controlComponent === ControlComponent.CHECKBOX
|
||||
) {
|
||||
this._drawRichText(ctx)
|
||||
this.textParticle.complete()
|
||||
this.checkboxParticle.render(ctx, element, x, y + offsetY)
|
||||
} else if (element.type === ElementType.TAB) {
|
||||
this._drawRichText(ctx)
|
||||
this.textParticle.complete()
|
||||
} else if (element.rowFlex === RowFlex.ALIGNMENT) {
|
||||
// 如果是两端对齐,因canvas目前不支持letterSpacing需单独绘制文本
|
||||
this.textParticle.record(ctx, element, x, y + offsetY)
|
||||
this._drawRichText(ctx)
|
||||
this.textParticle.complete()
|
||||
} else if (element.type === ElementType.BLOCK) {
|
||||
this._drawRichText(ctx)
|
||||
this.textParticle.complete()
|
||||
this.blockParticle.render(pageNo, element, x, y)
|
||||
} else {
|
||||
// 如果当前元素设置左偏移,则上一元素立即绘制
|
||||
@@ -1745,8 +1764,12 @@ export class Draw {
|
||||
this.textParticle.complete()
|
||||
}
|
||||
this.textParticle.record(ctx, element, x, y + offsetY)
|
||||
// 如果设置字宽、字间距需单独绘制
|
||||
if (element.width || element.letterSpacing) {
|
||||
// 如果设置字宽、字间距、标点符号(避免浏览器排版缩小间距)需单独绘制
|
||||
if (
|
||||
element.width ||
|
||||
element.letterSpacing ||
|
||||
PUNCTUATION_LIST.includes(element.value)
|
||||
) {
|
||||
this.textParticle.complete()
|
||||
}
|
||||
}
|
||||
@@ -1879,8 +1902,10 @@ export class Draw {
|
||||
positionList[curRow.startIndex]
|
||||
)
|
||||
}
|
||||
// 绘制富文本及文字
|
||||
this._drawRichText(ctx)
|
||||
// 绘制文字、下划线、删除线
|
||||
this.textParticle.complete()
|
||||
this.underline.render(ctx)
|
||||
this.strikeout.render(ctx)
|
||||
// 绘制批注样式
|
||||
this.group.render(ctx)
|
||||
// 绘制选区
|
||||
|
||||
Reference in New Issue
Block a user