Skip to content

Commit 3848666

Browse files
authored
Merge pull request #768 from ecomfe/master
Prepare to release 5.1.1
2 parents 30a3fd8 + 9780bd8 commit 3848666

24 files changed

+1051
-196
lines changed

.github/workflows/nightly.yaml

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
name: Publish Nightly
2+
3+
on:
4+
schedule:
5+
- cron: '0 8 * * *'
6+
workflow_dispatch: {}
7+
repository_dispatch:
8+
types: publish-nightly
9+
10+
jobs:
11+
build:
12+
runs-on: ubuntu-latest
13+
14+
strategy:
15+
matrix:
16+
node-version: [12.x]
17+
18+
steps:
19+
- uses: actions/checkout@v2
20+
- name: Use Node.js ${{ matrix.node-version }}
21+
uses: actions/setup-node@v1
22+
with:
23+
registry-url: https://registry.npmjs.org/
24+
- name: Setup and publish nightly
25+
run: |
26+
npm ci
27+
npm run release
28+
npm run prepare:nightly
29+
npm publish
30+
env:
31+
NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}

build/build.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ const path = require('path');
55
const processs = require('process');
66
const chalk = require('chalk');
77
const progress = require('./progress');
8-
const UglifyJS = require("uglify-js");
8+
const UglifyJS = require('uglify-js');
99
const fs = require('fs');
1010

1111
function current() {

build/prepareNightly.js

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
const fs = require('fs');
2+
const packageJsonPath = __dirname + '/../package.json';
3+
const nightlyPackageName = 'zrender-nightly';
4+
5+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
6+
const version = packageJson.version;
7+
const parts = /(\d+)\.(\d+)\.(\d+)($|\-)/.exec(version);
8+
if (!parts) {
9+
throw new Error(`Invalid version number ${version}`);
10+
}
11+
// Add date to version.
12+
const major = +parts[1];
13+
const minor = +parts[2];
14+
let patch = +parts[3];
15+
const isStable = !parts[4];
16+
if (isStable) {
17+
// It's previous stable version. Dev version should be higher.
18+
patch++;
19+
}
20+
21+
const date = new Date().toISOString().replace(/:|T|\.|-/g, '').slice(0, 8);
22+
const nightlyVersion = `${major}.${minor}.${patch}-dev.${date}`;
23+
24+
packageJson.name = nightlyPackageName;
25+
packageJson.version = nightlyVersion;
26+
27+
fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2), 'utf-8');

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
"prepublish": "npm run release",
1515
"build": "npm run build:bundle && npm run build:lib",
1616
"release": "node build/build.js --minify && npm run build:lib",
17+
"prepare:nightly": "node build/prepareNightly.js",
1718
"build:bundle": "node build/build.js",
1819
"build:lib": "npx tsc -m ES2015 --outDir lib",
1920
"watch:bundle": "node build/build.js --watch",

src/Element.ts

+28-23
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import Point from './core/Point';
2828
import { LIGHT_LABEL_COLOR, DARK_LABEL_COLOR } from './config';
2929
import { parse, stringify } from './tool/color';
3030
import env from './core/env';
31+
import { REDARAW_BIT, STYLE_CHANGED_BIT } from './graphic/constants';
3132

3233
export interface ElementAnimateConfig {
3334
duration?: number
@@ -658,13 +659,14 @@ class Element<Props extends ElementProps = ElementProps> {
658659
textEl.setDefaultTextStyle(innerTextDefaultStyle);
659660
}
660661

662+
// Mark textEl to update transform.
663+
// DON'T use markRedraw. It will cause Element itself to dirty again.
664+
textEl.__dirty |= REDARAW_BIT;
665+
661666
if (textStyleChanged) {
662667
// Only mark style dirty if necessary. Update ZRText is costly.
663-
textEl.dirtyStyle();
668+
textEl.dirtyStyle(true);
664669
}
665-
666-
// Mark textEl to update transform.
667-
textEl.markRedraw();
668670
}
669671
}
670672

@@ -850,7 +852,7 @@ class Element<Props extends ElementProps = ElementProps> {
850852
* @param keepCurrentState If keep current states.
851853
* If not, it will inherit from the normal state.
852854
*/
853-
useState(stateName: string, keepCurrentStates?: boolean, noAnimation?: boolean) {
855+
useState(stateName: string, keepCurrentStates?: boolean, noAnimation?: boolean, forceUseHoverLayer?: boolean) {
854856
// Use preserved word __normal__
855857
// TODO: Only restore changed properties when restore to normal???
856858
const toNormalState = stateName === PRESERVED_NORMAL_STATE;
@@ -889,7 +891,7 @@ class Element<Props extends ElementProps = ElementProps> {
889891
this.saveCurrentToNormalState(state);
890892
}
891893

892-
const useHoverLayer = !!(state && state.hoverLayer);
894+
const useHoverLayer = !!((state && state.hoverLayer) || forceUseHoverLayer);
893895

894896
if (useHoverLayer) {
895897
// Enter hover layer before states update.
@@ -906,11 +908,14 @@ class Element<Props extends ElementProps = ElementProps> {
906908
);
907909

908910
// Also set text content.
909-
if (this._textContent) {
910-
this._textContent.useState(stateName, keepCurrentStates);
911+
const textContent = this._textContent;
912+
const textGuide = this._textGuide;
913+
if (textContent) {
914+
// Force textContent use hover layer if self is using it.
915+
textContent.useState(stateName, keepCurrentStates, noAnimation, useHoverLayer);
911916
}
912-
if (this._textGuide) {
913-
this._textGuide.useState(stateName, keepCurrentStates);
917+
if (textGuide) {
918+
textGuide.useState(stateName, keepCurrentStates, noAnimation, useHoverLayer);
914919
}
915920

916921
if (toNormalState) {
@@ -938,7 +943,7 @@ class Element<Props extends ElementProps = ElementProps> {
938943
this._toggleHoverLayerFlag(false);
939944
// NOTE: avoid unexpected refresh when moving out from hover layer!!
940945
// Only clear from hover layer.
941-
this.__dirty &= ~Element.REDARAW_BIT;
946+
this.__dirty &= ~REDARAW_BIT;
942947
}
943948

944949
// Return used state.
@@ -949,7 +954,7 @@ class Element<Props extends ElementProps = ElementProps> {
949954
* Apply multiple states.
950955
* @param states States list.
951956
*/
952-
useStates(states: string[], noAnimation?: boolean) {
957+
useStates(states: string[], noAnimation?: boolean, forceUseHoverLayer?: boolean) {
953958
if (!states.length) {
954959
this.clearStates();
955960
}
@@ -984,7 +989,8 @@ class Element<Props extends ElementProps = ElementProps> {
984989
}
985990
}
986991

987-
const useHoverLayer = !!(stateObjects[len - 1] && stateObjects[len - 1].hoverLayer);
992+
const lastStateObj = stateObjects[len - 1];
993+
const useHoverLayer = !!((lastStateObj && lastStateObj.hoverLayer) || forceUseHoverLayer);
988994
if (useHoverLayer) {
989995
// Enter hover layer before states update.
990996
this._toggleHoverLayerFlag(true);
@@ -1004,11 +1010,13 @@ class Element<Props extends ElementProps = ElementProps> {
10041010
animationCfg
10051011
);
10061012

1007-
if (this._textContent) {
1008-
this._textContent.useStates(states);
1013+
const textContent = this._textContent;
1014+
const textGuide = this._textGuide;
1015+
if (textContent) {
1016+
textContent.useStates(states, noAnimation, useHoverLayer);
10091017
}
1010-
if (this._textGuide) {
1011-
this._textGuide.useStates(states);
1018+
if (textGuide) {
1019+
textGuide.useStates(states, noAnimation, useHoverLayer);
10121020
}
10131021

10141022
this._updateAnimationTargets();
@@ -1022,7 +1030,7 @@ class Element<Props extends ElementProps = ElementProps> {
10221030
this._toggleHoverLayerFlag(false);
10231031
// NOTE: avoid unexpected refresh when moving out from hover layer!!
10241032
// Only clear from hover layer.
1025-
this.__dirty &= ~Element.REDARAW_BIT;
1033+
this.__dirty &= ~REDARAW_BIT;
10261034
}
10271035
}
10281036
}
@@ -1352,7 +1360,7 @@ class Element<Props extends ElementProps = ElementProps> {
13521360
* Mark element needs to be repainted
13531361
*/
13541362
markRedraw() {
1355-
this.__dirty |= Element.REDARAW_BIT;
1363+
this.__dirty |= REDARAW_BIT;
13561364
const zr = this.__zr;
13571365
if (zr) {
13581366
if (this.__inHover) {
@@ -1604,9 +1612,6 @@ class Element<Props extends ElementProps = ElementProps> {
16041612
out: TextPositionCalculationResult, style: ElementTextConfig, rect: RectLike
16051613
) => TextPositionCalculationResult
16061614

1607-
1608-
static REDARAW_BIT = 1;
1609-
16101615
protected static initDefaultProps = (function () {
16111616
const elProto = Element.prototype;
16121617
elProto.type = 'element';
@@ -1618,7 +1623,7 @@ class Element<Props extends ElementProps = ElementProps> {
16181623
elProto.dragging = false;
16191624
elProto.ignoreClip = false;
16201625
elProto.__inHover = false;
1621-
elProto.__dirty = Element.REDARAW_BIT;
1626+
elProto.__dirty = REDARAW_BIT;
16221627

16231628

16241629
const logs: Dictionary<boolean> = {};

src/Storage.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import Element from './Element';
88
import timsort from './core/timsort';
99
import Displayable from './graphic/Displayable';
1010
import Path from './graphic/Path';
11+
import { REDARAW_BIT } from './graphic/constants';
1112

1213
let invalidZErrorLogged = false;
1314
function logInvalidZError() {
@@ -140,7 +141,7 @@ export default class Storage {
140141

141142
// Force to mark as dirty if group is dirty
142143
if (el.__dirty) {
143-
child.__dirty |= Element.REDARAW_BIT;
144+
child.__dirty |= REDARAW_BIT;
144145
}
145146

146147
this._updateAndAddDisplayable(child, clipPaths, includeIgnore);

src/canvas/Layer.ts

+11-10
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
import * as util from '../core/util';
22
import {devicePixelRatio} from '../config';
3-
import { PatternObject } from '../graphic/Pattern';
3+
import { ImagePatternObject } from '../graphic/Pattern';
44
import CanvasPainter from './Painter';
55
import { GradientObject, InnerGradientObject } from '../graphic/Gradient';
66
import { ZRCanvasRenderingContext } from '../core/types';
77
import Eventful from '../core/Eventful';
8-
import Element, { ElementEventCallback } from '../Element';
8+
import { ElementEventCallback } from '../Element';
99
import { getCanvasGradient } from './helper';
1010
import { createCanvasPattern } from './graphic';
1111
import Displayable from '../graphic/Displayable';
1212
import BoundingRect from '../core/BoundingRect';
13+
import { REDARAW_BIT } from '../graphic/constants';
1314

1415
function returnFalse() {
1516
return false;
@@ -39,7 +40,7 @@ function createDom(id: string, painter: CanvasPainter, dpr: number) {
3940

4041
export interface LayerConfig {
4142
// 每次清空画布的颜色
42-
clearColor?: string | GradientObject | PatternObject
43+
clearColor?: string | GradientObject | ImagePatternObject
4344
// 是否开启动态模糊
4445
motionBlur?: boolean
4546
// 在开启动态模糊的时候使用,与上一帧混合的alpha值,值越大尾迹越明显
@@ -62,7 +63,7 @@ export default class Layer extends Eventful {
6263
/**
6364
* 每次清空画布的颜色
6465
*/
65-
clearColor: string | GradientObject | PatternObject
66+
clearColor: string | GradientObject | ImagePatternObject
6667
/**
6768
* 是否开启动态模糊
6869
*/
@@ -280,7 +281,7 @@ export default class Layer extends Eventful {
280281
* or not painted this frame.
281282
*/
282283
const shouldPaint = el.shouldBePainted(viewWidth, viewHeight, true, true);
283-
const prevRect = el.__isRendered && ((el.__dirty & Element.REDARAW_BIT) || !shouldPaint)
284+
const prevRect = el.__isRendered && ((el.__dirty & REDARAW_BIT) || !shouldPaint)
284285
? el.getPrevPaintRect()
285286
: null;
286287
if (prevRect) {
@@ -292,7 +293,7 @@ export default class Layer extends Eventful {
292293
* if the element should be brushed this frame and either being
293294
* dirty or not rendered before.
294295
*/
295-
const curRect = shouldPaint && ((el.__dirty & Element.REDARAW_BIT) || !el.__isRendered)
296+
const curRect = shouldPaint && ((el.__dirty & REDARAW_BIT) || !el.__isRendered)
296297
? el.getPaintRect()
297298
: null;
298299
if (curRect) {
@@ -352,7 +353,7 @@ export default class Layer extends Eventful {
352353
}
353354
i++;
354355
}
355-
} while (hasIntersections)
356+
} while (hasIntersections);
356357

357358
this._paintRects = mergedRepaintRects;
358359

@@ -396,7 +397,7 @@ export default class Layer extends Eventful {
396397
*/
397398
clear(
398399
clearAll?: boolean,
399-
clearColor?: string | GradientObject | PatternObject,
400+
clearColor?: string | GradientObject | ImagePatternObject,
400401
repaintRects?: BoundingRect[]
401402
) {
402403
const dom = this.dom;
@@ -444,7 +445,7 @@ export default class Layer extends Eventful {
444445
(clearColor as InnerGradientObject).__canvasGradient = clearColorGradientOrPattern;
445446
}
446447
// Pattern
447-
else if (util.isPatternObject(clearColor)) {
448+
else if (util.isImagePatternObject(clearColor)) {
448449
clearColorGradientOrPattern = createCanvasPattern(
449450
ctx, clearColor, {
450451
dirty() {
@@ -487,7 +488,7 @@ export default class Layer extends Eventful {
487488
}
488489

489490
// Iterface of refresh
490-
refresh: (clearColor?: string | GradientObject | PatternObject) => void
491+
refresh: (clearColor?: string | GradientObject | ImagePatternObject) => void
491492

492493
// Interface of renderToCanvas in getRenderedCanvas
493494
renderToCanvas: (ctx: CanvasRenderingContext2D) => void

0 commit comments

Comments
 (0)