js-draw
Version: 
Draw pictures using a pen, touchscreen, or mouse! JS-draw is a drawing library for JavaScript and TypeScript.
52 lines (51 loc) • 2.22 kB
JavaScript
import { Rect2 } from '@js-draw/math';
import  RenderingCacheNode  from './RenderingCacheNode.mjs';
import  { CacheRecordManager }  from './CacheRecordManager.mjs';
export default class RenderingCache {
    constructor(cacheProps) {
        this.recordManager = new CacheRecordManager(cacheProps);
        this.sharedState = {
            props: cacheProps,
            currentRenderingCycle: 0,
            recordManager: this.recordManager,
            debugMode: false,
        };
        this.recordManager.setSharedState(this.sharedState);
    }
    render(screenRenderer, image, viewport) {
        const visibleRect = viewport.visibleRect;
        this.sharedState.currentRenderingCycle++;
        // If we can't use the cache,
        if (!this.sharedState.props.isOfCorrectType(screenRenderer)) {
            image.render(screenRenderer, visibleRect);
            return;
        }
        if (!this.rootNode) {
            // Adjust the node so that it has the correct aspect ratio
            const res = this.sharedState.props.blockResolution;
            const topLeft = visibleRect.topLeft;
            this.rootNode = new RenderingCacheNode(new Rect2(topLeft.x, topLeft.y, res.x, res.y), this.sharedState);
        }
        while (!this.rootNode.region.containsRect(visibleRect)) {
            this.rootNode = this.rootNode.generateParent();
        }
        this.rootNode = this.rootNode.smallestChildContaining(visibleRect) ?? this.rootNode;
        const visibleLeaves = image.getLeavesIntersectingRegion(viewport.visibleRect, (rect) => screenRenderer.isTooSmallToRender(rect));
        let approxVisibleRenderTime = 0;
        for (const leaf of visibleLeaves) {
            approxVisibleRenderTime += leaf.getContent().getProportionalRenderingTime();
        }
        if (approxVisibleRenderTime > this.sharedState.props.minProportionalRenderTimeToUseCache) {
            this.rootNode.renderItems(screenRenderer, [image], viewport);
        }
        else {
            image.render(screenRenderer, visibleRect);
        }
    }
    getDebugInfo() {
        return this.recordManager.getDebugInfo();
    }
    setIsDebugMode(debugMode) {
        this.sharedState.debugMode = debugMode;
    }
}