function canvasImage(Blockly) {
const name = BlocklyCanvasConstants.Image;
Blockly.Blocks[name] = {
init: function() {
this.appendValueInput("next")
.setCheck(null)
.setAlign(Blockly.ALIGN_CENTRE)
.appendField("图像");
this.appendValueInput("image")
.setCheck("String")
.setAlign(Blockly.ALIGN_CENTRE)
.appendField("URL");
this.appendValueInput("sx")
.setCheck("Number")
.setAlign(Blockly.ALIGN_CENTRE)
.appendField("SX");
this.appendValueInput("sy")
.setCheck("Number")
.setAlign(Blockly.ALIGN_CENTRE)
.appendField("SY");
this.appendValueInput("sWidth")
.setCheck("Number")
.setAlign(Blockly.ALIGN_CENTRE)
.appendField("SWidth");
this.appendValueInput("sHeight")
.setCheck("Number")
.setAlign(Blockly.ALIGN_CENTRE)
.appendField("SHeight")
this.appendValueInput("dx")
.setCheck("Number")
.setAlign(Blockly.ALIGN_CENTRE)
.appendField("DX")
this.appendValueInput("dy")
.setCheck("Number")
.setAlign(Blockly.ALIGN_CENTRE)
.appendField("DY")
this.appendValueInput("dWidth")
.setCheck("Number")
.setAlign(Blockly.ALIGN_CENTRE)
.appendField("DWidth")
this.appendValueInput("dHeight")
.setCheck("Number")
.setAlign(Blockly.ALIGN_CENTRE)
.appendField("DHeight")
this.setInputsInline(false);
this.setOutput(true, null);
this.setColour(275);
this.setTooltip("");
this.setHelpUrl("https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/drawImage");
}
};
Blockly.JavaScript[name] = function(block) {
let next = Blockly.JavaScript.valueToCode(
block,
'next',
Blockly.JavaScript.ORDER_NONE
);
let image = Blockly.JavaScript.valueToCode(
block,
'image',
Blockly.JavaScript.ORDER_ATOMIC
);
let sx = Blockly.JavaScript.valueToCode(
block,
'sx',
Blockly.JavaScript.ORDER_ATOMIC
);
let sy = Blockly.JavaScript.valueToCode(
block,
'sy',
Blockly.JavaScript.ORDER_ATOMIC
);
let sWidth = Blockly.JavaScript.valueToCode(
block,
'sWidth',
Blockly.JavaScript.ORDER_ATOMIC
);
let sHeight = Blockly.JavaScript.valueToCode(
block,
'sHeight',
Blockly.JavaScript.ORDER_ATOMIC
);
let dx = Blockly.JavaScript.valueToCode(
block,
'dx',
Blockly.JavaScript.ORDER_ATOMIC
);
let dy = Blockly.JavaScript.valueToCode(
block,
'dy',
Blockly.JavaScript.ORDER_ATOMIC
);
let dWidth = Blockly.JavaScript.valueToCode(
block,
'dWidth',
Blockly.JavaScript.ORDER_ATOMIC
);
let dHeight = Blockly.JavaScript.valueToCode(
block,
'dHeight',
Blockly.JavaScript.ORDER_ATOMIC
);
let code = `
var img = new Image();
img.src = ${image};
img.onload = function(){
context.drawImage(img, ${sx}, ${sy}, ${sWidth}, ${sHeight}, ${dx}, ${dy}, ${dWidth}, ${dHeight});
}
${next}
`;
return [code, Blockly.JavaScript.ORDER_NONE];
};
return {
kind: "block",
blockxml: `<block type="${name}">
<value name="image">
<shadow type="text_multiline">
<field name="TEXT">https://mdn.mozillademos.org/files/5397/rhino.jpg</field>
</shadow>
</value>
<value name="sx">
<shadow type="math_number">
<field name="NUM">0</field>
</shadow>
</value>
<value name="sy">
<shadow type="math_number">
<field name="NUM">0</field>
</shadow>
</value>
<value name="sWidth">
<shadow type="math_number">
<field name="NUM">400</field>
</shadow>
</value>
<value name="sHeight">
<shadow type="math_number">
<field name="NUM">500</field>
</shadow>
</value>
<value name="dx">
<shadow type="math_number">
<field name="NUM">50</field>
</shadow>
</value>
<value name="dy">
<shadow type="math_number">
<field name="NUM">30</field>
</shadow>
</value>
<value name="dWidth">
<shadow type="math_number">
<field name="NUM">300</field>
</shadow>
</value>
<value name="dHeight">
<shadow type="math_number">
<field name="NUM">400</field>
</shadow>
</value>
</block>`
};
}