Skip to content

Commit

Permalink
Merge pull request #311 from idrawjs/dev-v0.4
Browse files Browse the repository at this point in the history
feat: enhance text element
  • Loading branch information
chenshenhai committed May 19, 2024
2 parents e4b3620 + 39f2734 commit b07117b
Show file tree
Hide file tree
Showing 4 changed files with 5,196 additions and 4,284 deletions.
2 changes: 1 addition & 1 deletion packages/renderer/src/draw/path.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ export function drawPath(ctx: ViewContext2D, elem: Element<'path'>, opts: Render
const { detail } = elem;
const { originX, originY, originW, originH } = detail;
const { viewScaleInfo, viewSizeInfo, parentOpacity } = opts;
const { x, y, w, h, angle } = calcViewElementSize(elem, { viewScaleInfo, viewSizeInfo }) || elem;
const { x, y, w, h, angle } = calcViewElementSize(elem, { viewScaleInfo }) || elem;
const scaleW = w / originW;
const scaleH = h / originH;
const viewOriginX = originX * scaleW;
Expand Down
68 changes: 40 additions & 28 deletions packages/renderer/src/draw/text.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,48 +34,60 @@ export function drawText(ctx: ViewContext2D, elem: Element<'text'>, opts: Render
fontSize: fontSize,
fontFamily: detail.fontFamily
});
const detailText = detail.text.replace(/\r\n/gi, '\n');
let detailText = detail.text.replace(/\r\n/gi, '\n');
if (detail.textTransform === 'lowercase') {
detailText = detailText.toLowerCase();
} else if (detail.textTransform === 'uppercase') {
detailText = detailText.toUpperCase();
}

const fontHeight = lineHeight;
const detailTextList = detailText.split('\n');
const lines: { text: string; width: number }[] = [];

let lineNum = 0;
detailTextList.forEach((tempText: string, idx: number) => {
let lineText = '';

if (tempText.length > 0) {
for (let i = 0; i < tempText.length; i++) {
if (ctx.measureText(lineText + (tempText[i] || '')).width <= ctx.$doPixelRatio(w)) {
lineText += tempText[i] || '';
} else {
lines.push({
text: lineText,
width: ctx.$undoPixelRatio(ctx.measureText(lineText).width)
});
lineText = tempText[i] || '';
lineNum++;
}
if ((lineNum + 1) * fontHeight > h) {
break;
}
if (tempText.length - 1 === i) {
if ((lineNum + 1) * fontHeight <= h) {
if (detail.minInlineSize === 'maxContent') {
lines.push({
text: tempText,
width: ctx.$undoPixelRatio(ctx.measureText(tempText).width)
});
} else {
let lineText = '';
if (tempText.length > 0) {
for (let i = 0; i < tempText.length; i++) {
if (ctx.measureText(lineText + (tempText[i] || '')).width <= ctx.$doPixelRatio(w)) {
lineText += tempText[i] || '';
} else {
lines.push({
text: lineText,
width: ctx.$undoPixelRatio(ctx.measureText(lineText).width)
});
if (idx < detailTextList.length - 1) {
lineNum++;
}
lineText = tempText[i] || '';
lineNum++;
}
if ((lineNum + 1) * fontHeight > h) {
break;
}
if (tempText.length - 1 === i) {
if ((lineNum + 1) * fontHeight <= h) {
lines.push({
text: lineText,
width: ctx.$undoPixelRatio(ctx.measureText(lineText).width)
});
if (idx < detailTextList.length - 1) {
lineNum++;
}
break;
}
}
}
} else {
lines.push({
text: '',
width: 0
});
}
} else {
lines.push({
text: '',
width: 0
});
}
});

Expand Down
2 changes: 2 additions & 0 deletions packages/types/src/lib/element.ts
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,8 @@ export interface ElementTextDetail extends ElementBaseDetail {
textShadowOffsetX?: number;
textShadowOffsetY?: number;
textShadowBlur?: number;
minInlineSize?: 'maxContent' | 'auto';
textTransform?: 'none' | 'uppercase' | 'lowercase';
}

export interface ElementCircleDetail extends ElementBaseDetail {
Expand Down
Loading

0 comments on commit b07117b

Please sign in to comment.