Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(sheet): render viewport wrong size #1727

Closed
wants to merge 13 commits into from
Prev Previous commit
Next Next commit
fix: viewport make dirty false
chore: eslint fix
  • Loading branch information
lumixraku committed May 24, 2024
commit 5f5a6fc4088c831e964a559e680aa6f789b8c8f2
1 change: 0 additions & 1 deletion packages/engine-render/src/basics/tools.ts
Original file line number Diff line number Diff line change
Expand Up @@ -825,7 +825,6 @@ export function mergeRangeIfIntersects(mainRanges: IRange[], ranges: IRange[]) {
return mainRanges;
}


export function clampRanges(range: IRange) {
return {
startRow: Math.max(0, range.startRow),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,6 @@ export class Font extends SheetExtension {
return true;
}


if (isMergedMainCell) {
startY = mergeInfo.startY;
endY = mergeInfo.endY;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@ export class Marker extends SheetExtension {

const mergeCellRendered = new Set<string>();


Range.foreach(rowColumnSegment, (row, col) => {
let cellData = worksheet.getCell(row, col);
const cellInfo = this.getCellIndex(
Expand Down
6 changes: 0 additions & 6 deletions packages/engine-render/src/components/sheets/spreadsheet.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
import type { IRange, ISelectionCellWithCoord, Nullable, ObjectMatrix } from '@univerjs/core';
import { BooleanNumber, sortRules } from '@univerjs/core';


import { FIX_ONE_PIXEL_BLUR_OFFSET, RENDER_CLASS_TYPE } from '../../basics/const';

// import { clearLineByBorderType } from '../../basics/draw';
Expand Down Expand Up @@ -204,7 +203,6 @@ export class Spreadsheet extends SheetComponent {
};
}


isForceDirty(): boolean {
return this._forceDirty;
}
Expand Down Expand Up @@ -316,7 +314,6 @@ export class Spreadsheet extends SheetComponent {
const h = diffBottom - diffTop + onePixelFix;
cacheCtx.rectByPrecision(x, y, w, h);


// 使用 clearRect 后, 很浅很细的白色线(even not zoom has blank line)
const onePixelFix2 = FIX_ONE_PIXEL_BLUR_OFFSET;
cacheCtx.clearRect(x + onePixelFix2, y + onePixelFix2, w - onePixelFix2 * 2, h - onePixelFix2 * 2);
Expand All @@ -338,7 +335,6 @@ export class Spreadsheet extends SheetComponent {
this._refreshIncrementalState = false;
}


/**
* 整个 viewport 重绘
*/
Expand Down Expand Up @@ -393,11 +389,9 @@ export class Spreadsheet extends SheetComponent {
}
mainCtx.save();


const { rowHeaderWidth, columnHeaderHeight } = spreadsheetSkeleton;
mainCtx.translateWithPrecision(rowHeaderWidth, columnHeaderHeight);


const { viewPortKey } = viewportInfo;
// scene --> layer, getObjects --> viewport.render(object) --> spreadsheet
// zIndex 0 spreadsheet this.getObjectsByOrder() ---> [spreadsheet]
Expand Down
11 changes: 8 additions & 3 deletions packages/engine-render/src/layer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -251,10 +251,15 @@ export class Layer extends Disposable {
}

private _draw(mainCtx: UniverRenderingContext, isMaxLayer: boolean) {
const viewports = this._scene.getViewports();
for (const [index, vp] of viewports.entries()) {
vp.render(mainCtx, this.getObjectsByOrder(), isMaxLayer, index === viewports.length - 1);
const viewports = this._scene.getViewports().filter((vp) => vp.shouldIntoRender());
const objects = this.getObjectsByOrder();
for (const [_index, vp] of viewports.entries()) {
vp.render(mainCtx, objects, isMaxLayer);
}
objects.forEach((o) => {
o.makeDirty(false);
(o as unknown as { makeForceDirty?: (state: boolean) => void }).makeForceDirty?.(false);
});
}

private _applyCache(ctx?: UniverRenderingContext) {
Expand Down
1 change: 0 additions & 1 deletion packages/engine-render/src/shape/shape.ts
Original file line number Diff line number Diff line change
Expand Up @@ -304,7 +304,6 @@ export abstract class Shape<T> extends BaseObject {
ctx.strokeStyle = stroke!;
}


override render(mainCtx: UniverRenderingContext, bounds?: IViewportInfo) {
if (!this.visible) {
this.makeDirty(false);
Expand Down
39 changes: 16 additions & 23 deletions packages/engine-render/src/viewport.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ import type { IBoundRectNoAngle, IViewportInfo } from './basics/vector2';
import { Vector2 } from './basics/vector2';
import { subtractViewportRange } from './basics/viewport-subtract';
import { Canvas as UniverCanvas } from './canvas';
import { Spreadsheet } from './components/sheets/spreadsheet';
import type { UniverRenderingContext } from './context';
import type { Scene } from './scene';
import type { BaseScrollBar } from './shape/base-scroll-bar';
Expand Down Expand Up @@ -168,7 +167,6 @@ export class Viewport {

private _preViewportInfo: Nullable<IViewportInfo>;


/**
* viewbound of cache area, cache area is slightly bigger than viewbound.
*/
Expand Down Expand Up @@ -202,7 +200,6 @@ export class Viewport {
bufferEdgeX: number = 0;
bufferEdgeY: number = 0;


constructor(viewportKey: string, scene: ThinScene, props?: IViewProps) {
this._viewportKey = viewportKey;

Expand Down Expand Up @@ -649,22 +646,29 @@ export class Viewport {
return composeResult;
}

/**
* engine.renderLoop ---> scene.render ---> layer.render ---> viewport.render
* that means each layer call all viewports to render !!!
* @param parentCtx 如果 layer._allowCache true, 那么 parentCtx 是 layer 中的 cacheCtx
* @param objects
* @param isMaxLayer
* @param isLast
*/
render(parentCtx?: UniverRenderingContext, objects: BaseObject[] = [], isMaxLayer = false, isLast = false) {
shouldIntoRender() {
if (
this.isActive === false ||
this.width == null ||
this.height == null ||
this.width <= 1 ||
this.height <= 1
) {
return false;
}
return true;
}

/**
* engine.renderLoop ---> scene.render ---> layer.render ---> viewport.render
* that means each layer call all viewports to render
* @param parentCtx 如果 layer._allowCache true, 那么 parentCtx 是 layer 中的 cacheCtx
* @param objects
* @param isMaxLayer
* @param isLast last viewport would
*/
render(parentCtx?: UniverRenderingContext, objects: BaseObject[] = [], isMaxLayer = false) {
if (!this.shouldIntoRender()) {
return;
}
const mainCtx = parentCtx || (this._scene.getEngine()?.getCanvas().getContext() as UniverRenderingContext);
Expand Down Expand Up @@ -694,12 +698,6 @@ export class Viewport {
o.render(mainCtx, viewPortInfo);
});

if (isLast) {
objects.forEach((o) => {
o.makeDirty(false);
if (o instanceof Spreadsheet) o.makeForceDirty?.(false);
});
}
this.markDirty(false);
this.markForceDirty(false);

Expand All @@ -721,7 +719,6 @@ export class Viewport {
this._scrollRendered();
}


private _makeDefaultViewport() {
return {
viewBound: {
Expand Down Expand Up @@ -806,7 +803,6 @@ export class Viewport {
const topLeft = this.getRelativeVector(Vector2.FromArray([xFrom, yFrom]));
const bottomRight = this.getRelativeVector(Vector2.FromArray([xTo, yTo]));


const viewBound = {
left: topLeft.x,
right: bottomRight.x,
Expand Down Expand Up @@ -880,7 +876,6 @@ export class Viewport {
return svCoord;
}


// eslint-disable-next-line complexity, max-lines-per-function
onMouseWheel(evt: IWheelEvent, state: EventState) {
if (!this._scrollBar || this.isActive === false) {
Expand Down Expand Up @@ -1246,7 +1241,6 @@ export class Viewport {
isTrigger,
});


if (this._scrollBar) {
this._scrollBar.makeDirty(true);
}
Expand Down Expand Up @@ -1311,7 +1305,6 @@ export class Viewport {

const shouldCacheUpdate = nearEdge | viewBoundOutCacheArea;


// 这样判断不足, 例如当 viewBound 在 cache top 的边缘但是往下滑动
// 只要是在 cacheBounds 核心区域内就利用 cache
// if (viewBound.left - edge > cacheBounds.left &&
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -731,7 +731,6 @@ export class HeaderFreezeRenderController extends Disposable implements IRenderC
return;
}


const {
viewMain,
viewMainLeftTop,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,6 @@ export class SheetRenderController extends RxDisposable {
return;
}


if (command.id !== SetWorksheetActiveOperation.id) {
this._sheetSkeletonManagerService.makeDirty(
{
Expand Down