kopia lustrzana https://github.com/backface/turtlestitch
recycle cached Canvasses in Morphic
rodzic
6fde4c4781
commit
5103b07977
|
|
@ -8,6 +8,7 @@
|
|||
|
||||
### 2020-01-03
|
||||
* new dev version
|
||||
* Morphic: recycle cached Canvasses
|
||||
|
||||
## 5.4.0:
|
||||
* **New Features:**
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<title>Snap! Build Your Own Blocks 5.4.1 - dev -</title>
|
||||
<link rel="shortcut icon" href="src/favicon.ico">
|
||||
<script type="text/javascript" src="src/morphic.js?version=2019-11-12"></script>
|
||||
<script type="text/javascript" src="src/morphic.js?version=2020-01-03"></script>
|
||||
<script type="text/javascript" src="src/widgets.js?version=2019-10-16"></script>
|
||||
<script type="text/javascript" src="src/blocks.js?version=2019-12-13"></script>
|
||||
<script type="text/javascript" src="src/threads.js?version=2019-12-19"></script>
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
written by Jens Mönig
|
||||
jens@moenig.org
|
||||
|
||||
Copyright (C) 2019 by Jens Mönig
|
||||
Copyright (C) 2010-2020 by Jens Mönig
|
||||
|
||||
This file is part of Snap!.
|
||||
|
||||
|
|
@ -1178,7 +1178,7 @@
|
|||
|
||||
/*global window, HTMLCanvasElement, FileReader, Audio, FileList, Map*/
|
||||
|
||||
var morphicVersion = '2019-November-12';
|
||||
var morphicVersion = '2020-January-03';
|
||||
var modules = {}; // keep track of additional loaded modules
|
||||
var useBlurredShadows = getBlurredShadowSupport(); // check for Chrome-bug
|
||||
|
||||
|
|
@ -1335,14 +1335,18 @@ function newCanvas(extentPoint, nonRetina, recycleMe) {
|
|||
// answer a new empty instance of Canvas, don't display anywhere
|
||||
// nonRetina - optional Boolean "false"
|
||||
// by default retina support is automatic
|
||||
// optional existing canvas to be used again
|
||||
// optional existing canvas to be used again, unless it is marked as
|
||||
// being shared among Morphs (dataset property "morphicShare")
|
||||
var canvas, ext;
|
||||
nonRetina = nonRetina || false;
|
||||
ext = (extentPoint ||
|
||||
(recycleMe ? new Point(recycleMe.width, recycleMe.height)
|
||||
: new Point(0, 0))).floor();
|
||||
if (recycleMe && (recycleMe.isRetinaEnabled || false) !== nonRetina &&
|
||||
ext.x === recycleMe.width && ext.y === recycleMe.height) {
|
||||
if (recycleMe &&
|
||||
!recycleMe.dataset.morphicShare &&
|
||||
(recycleMe.isRetinaEnabled || false) !== nonRetina &&
|
||||
ext.x === recycleMe.width && ext.y === recycleMe.height
|
||||
) {
|
||||
canvas = recycleMe;
|
||||
canvas.getContext("2d").clearRect(0, 0, canvas.width, canvas.height);
|
||||
return canvas;
|
||||
|
|
@ -1449,6 +1453,14 @@ function copy(target) {
|
|||
var value, c, property, keys, l, i;
|
||||
|
||||
if (typeof target !== 'object') {
|
||||
if (target instanceof HTMLCanvasElement) {
|
||||
// tag canvas elements as being shared,
|
||||
// so the next time when rerendering a Morph
|
||||
// instead of recycling the shared canvas a
|
||||
// new unshared one get created
|
||||
// see newCanvas() function
|
||||
target.dataset.morphicShare = 'true';
|
||||
}
|
||||
return target;
|
||||
}
|
||||
value = target.valueOf();
|
||||
|
|
@ -3392,7 +3404,7 @@ Morph.prototype.setColor = function (aColor) {
|
|||
|
||||
Morph.prototype.drawNew = function () {
|
||||
// initialize my surface property
|
||||
this.image = newCanvas(this.extent());
|
||||
this.image = newCanvas(this.extent(), false, this.image);
|
||||
var context = this.image.getContext('2d');
|
||||
context.fillStyle = this.color.toString();
|
||||
context.fillRect(0, 0, this.width(), this.height());
|
||||
|
|
@ -4627,8 +4639,8 @@ HandleMorph.prototype.init = function (
|
|||
// HandleMorph drawing:
|
||||
|
||||
HandleMorph.prototype.drawNew = function () {
|
||||
this.normalImage = newCanvas(this.extent());
|
||||
this.highlightImage = newCanvas(this.extent());
|
||||
this.normalImage = newCanvas(this.extent(), false, this.normalImage);
|
||||
this.highlightImage = newCanvas(this.extent(), false, this.highlightImage);
|
||||
if (this.type === 'movePivot') {
|
||||
this.drawCrosshairsOnCanvas(this.normalImage, 0.6);
|
||||
this.drawCrosshairsOnCanvas(this.highlightImage, 0.5);
|
||||
|
|
@ -5182,7 +5194,7 @@ ColorPaletteMorph.prototype.drawNew = function () {
|
|||
var context, ext, x, y, h, l;
|
||||
|
||||
ext = this.extent();
|
||||
this.image = newCanvas(this.extent());
|
||||
this.image = newCanvas(this.extent(), false, this.image);
|
||||
context = this.image.getContext('2d');
|
||||
this.choice = new Color();
|
||||
for (x = 0; x <= ext.x; x += 1) {
|
||||
|
|
@ -5291,7 +5303,7 @@ GrayPaletteMorph.prototype.drawNew = function () {
|
|||
var context, ext, gradient;
|
||||
|
||||
ext = this.extent();
|
||||
this.image = newCanvas(this.extent());
|
||||
this.image = newCanvas(this.extent(), false, this.image);
|
||||
context = this.image.getContext('2d');
|
||||
this.choice = new Color();
|
||||
gradient = context.createLinearGradient(0, 0, ext.x, ext.y);
|
||||
|
|
@ -6079,7 +6091,7 @@ BoxMorph.prototype.init = function (edge, border, borderColor) {
|
|||
BoxMorph.prototype.drawNew = function () {
|
||||
var context;
|
||||
|
||||
this.image = newCanvas(this.extent());
|
||||
this.image = newCanvas(this.extent(), false, this.image);
|
||||
context = this.image.getContext('2d');
|
||||
if ((this.edge === 0) && (this.border === 0)) {
|
||||
BoxMorph.uber.drawNew.call(this);
|
||||
|
|
@ -6641,7 +6653,7 @@ DialMorph.prototype.drawNew = function () {
|
|||
inner = face * 0.85,
|
||||
outer = face * 0.95;
|
||||
|
||||
this.image = newCanvas(this.extent());
|
||||
this.image = newCanvas(this.extent(), false, this.image);
|
||||
ctx = this.image.getContext('2d');
|
||||
|
||||
// draw a light border:
|
||||
|
|
@ -6905,7 +6917,7 @@ CircleBoxMorph.prototype.drawNew = function () {
|
|||
if (this.autoOrient) {
|
||||
this.autoOrientation();
|
||||
}
|
||||
this.image = newCanvas(this.extent());
|
||||
this.image = newCanvas(this.extent(), false, this.image);
|
||||
context = this.image.getContext('2d');
|
||||
|
||||
if (this.orientation === 'vertical') {
|
||||
|
|
@ -7022,6 +7034,7 @@ SliderButtonMorph.prototype.drawNew = function () {
|
|||
}
|
||||
this.normalImage = this.image;
|
||||
|
||||
this.image = null; // make sure not to reuse ther image canvas
|
||||
this.color = this.highlightColor.copy();
|
||||
SliderButtonMorph.uber.drawNew.call(this);
|
||||
if (this.is3D || !MorphicPreferences.isFlat) {
|
||||
|
|
@ -7029,6 +7042,7 @@ SliderButtonMorph.prototype.drawNew = function () {
|
|||
}
|
||||
this.highlightImage = this.image;
|
||||
|
||||
this.image = null; // make sure not to reuse ther image canvas
|
||||
this.color = this.pressColor.copy();
|
||||
SliderButtonMorph.uber.drawNew.call(this);
|
||||
if (this.is3D || !MorphicPreferences.isFlat) {
|
||||
|
|
@ -8673,6 +8687,11 @@ StringMorph.prototype = new Morph();
|
|||
StringMorph.prototype.constructor = StringMorph;
|
||||
StringMorph.uber = Morph.prototype;
|
||||
|
||||
// StringMorph shared properties:
|
||||
|
||||
// context for measuring text dimensions, used by StringMorphs and TextMorphs
|
||||
StringMorph.prototype.measureCtx = newCanvas().getContext("2d");
|
||||
|
||||
// StringMorph instance creation:
|
||||
|
||||
function StringMorph(
|
||||
|
|
@ -8784,14 +8803,10 @@ StringMorph.prototype.drawNew = function () {
|
|||
txt = this.isPassword ?
|
||||
this.password('*', this.text.length) : this.text;
|
||||
|
||||
// initialize my surface property
|
||||
this.image = newCanvas();
|
||||
context = this.image.getContext('2d');
|
||||
context.font = this.font();
|
||||
|
||||
// set my extent
|
||||
// determine my extent
|
||||
this.measureCtx.font = this.font();
|
||||
width = Math.max(
|
||||
context.measureText(txt).width + Math.abs(shadowOffset.x),
|
||||
this.measureCtx.measureText(txt).width + Math.abs(shadowOffset.x),
|
||||
1
|
||||
);
|
||||
this.bounds.corner = this.bounds.origin.add(
|
||||
|
|
@ -8800,8 +8815,10 @@ StringMorph.prototype.drawNew = function () {
|
|||
fontHeight(this.fontSize) + Math.abs(shadowOffset.y)
|
||||
)
|
||||
);
|
||||
this.image.width = width;
|
||||
this.image.height = this.height();
|
||||
|
||||
// initialize my surface property
|
||||
this.image = newCanvas(this.extent(), false, this.image);
|
||||
context = this.image.getContext('2d');
|
||||
|
||||
// prepare context for drawing text
|
||||
context.font = this.font();
|
||||
|
|
@ -9377,6 +9394,11 @@ TextMorph.prototype = new Morph();
|
|||
TextMorph.prototype.constructor = TextMorph;
|
||||
TextMorph.uber = Morph.prototype;
|
||||
|
||||
// TextMorph shared properties:
|
||||
|
||||
// context for measuring text dimensions, shared with StringMorph prototype
|
||||
TextMorph.prototype.measureCtx = StringMorph.prototype.measureCtx;
|
||||
|
||||
// TextMorph instance creation:
|
||||
|
||||
function TextMorph(
|
||||
|
|
@ -9464,8 +9486,7 @@ TextMorph.prototype.font = StringMorph.prototype.font;
|
|||
TextMorph.prototype.parse = function () {
|
||||
var myself = this,
|
||||
paragraphs = this.text.split('\n'),
|
||||
canvas = newCanvas(),
|
||||
context = canvas.getContext('2d'),
|
||||
context = this.measureCtx,
|
||||
oldline = '',
|
||||
newline,
|
||||
w,
|
||||
|
|
@ -9518,9 +9539,6 @@ TextMorph.prototype.drawNew = function () {
|
|||
var context, height, i, line, width, shadowHeight, shadowWidth,
|
||||
offx, offy, x, y, start, stop, p, c;
|
||||
|
||||
this.image = newCanvas();
|
||||
context = this.image.getContext('2d');
|
||||
context.font = this.font();
|
||||
this.parse();
|
||||
|
||||
// set my extent
|
||||
|
|
@ -9536,8 +9554,8 @@ TextMorph.prototype.drawNew = function () {
|
|||
new Point(this.maxWidth + shadowWidth, height)
|
||||
);
|
||||
}
|
||||
this.image.width = this.width();
|
||||
this.image.height = this.height();
|
||||
|
||||
this.image = newCanvas(this.extent(), false, this.image);
|
||||
|
||||
// prepare context for drawing text
|
||||
context = this.image.getContext('2d');
|
||||
|
|
@ -10018,17 +10036,17 @@ TriggerMorph.prototype.createBackgrounds = function () {
|
|||
var context,
|
||||
ext = this.extent();
|
||||
|
||||
this.normalImage = newCanvas(ext);
|
||||
this.normalImage = newCanvas(ext, false, this.normalImage);
|
||||
context = this.normalImage.getContext('2d');
|
||||
context.fillStyle = this.color.toString();
|
||||
context.fillRect(0, 0, ext.x, ext.y);
|
||||
|
||||
this.highlightImage = newCanvas(ext);
|
||||
this.highlightImage = newCanvas(ext, false, this.highlightImage);
|
||||
context = this.highlightImage.getContext('2d');
|
||||
context.fillStyle = this.highlightColor.toString();
|
||||
context.fillRect(0, 0, ext.x, ext.y);
|
||||
|
||||
this.pressImage = newCanvas(ext);
|
||||
this.pressImage = newCanvas(ext, false, this.pressImage);
|
||||
context = this.pressImage.getContext('2d');
|
||||
context.fillStyle = this.pressColor.toString();
|
||||
context.fillRect(0, 0, ext.x, ext.y);
|
||||
|
|
|
|||
Ładowanie…
Reference in New Issue