Das Attribut globalCompositeOperation
legt fest, wie neu erstellte Formen und Bilder
mit zuvor erstellten Elementen kombiniert werden.
In der Standardeinstellung werden neue Elemente über (= eine Ebene höher) dem bishrigen Inhalt angeordnet. Alles, was sich unter dem neuen Element befindet, wird verdeckt.
Initialwert ist source-over
.
Die IE-Erweiterung ExplorerCanvas
zeigt Kombinationen/Verknüpfungen nicht korrekt an
(Demonstation).
globalCompositeOperation = type
Dem Attribut wird ein String zugewiesen, der den gewünschten Typ beschreibt. Die Zeichenkette ist case-sensitive, es wird also zwischen Gross- und Kleinschreibung unterschieden.
Im Folgenden werden die zur Verfügung stehenden Typen beschrieben. Der grüne Kreis ist jeweils das Element, das zuerst gezeichnet wurde.
source-over
ist der Standardwert. Jedes neue Element wird über dem bereits existierenden
Canvasinhalt angeordnet.
Das neue Element wird nur dort gezeichnet, wo es mit dem existierenden Canvasinhalt überlappt. Der restliche bereits existende Inhalt wird unverändert gezeichnet.
Das neue Element wird nur dort gezeichnet, wo es mit dem existierenden Canvasinhalt überlappt. Der Rest wird transparent.
Das neue Element wird ohne den existierenden Canvasinhalt gezeichnet.
Der existierenden Canvasinhalt wird nur dort gezeichnet, wo er mit dem neuen Element überlappt. Der restliche neue Inhalt wird unverändert gezeichnet.
Der existierenden Canvasinhalt wird nur dort gezeichnet, wo er mit dem neuen Element überlappt. Der Rest wird transparent.
Der existierende Canvasinhalt wird ohne das neue Element gezeichnet.
Jedes neue Element wird hinter dem bereits existierenden Canvasinhalt angeordnet.
Gezeichnet wird lediglich das neue Element. Der Rest wird entfernt.
Der Schnittbereich des neuen Elements mit dem bereits existenten Canvasinhalt wird abgedunkelt, indem die Farbwerte subtrahiert werden.
Der Schnittbereich des neuen Elements mit dem bereits existenten Canvasinhalt wird aufgehellt, indem die Farbwerte addiert werden.
Bereiche, die in der Schnittmenge von neuen Element und bestehendem Canvasinhalt liegen, werden transparent. Der restliche Bereich wird gezeichnet.
// Breite und Höhe eines Canvas-Elements var intDim = 120; function drawIt(){ var objCanvas = document.createElement("canvas"); // Falls das Objekt unterstützt wird if(objCanvas.getContext){ // Typenarray var arrTypes = new Array(["source-over", "source-atop", "source-in", "source-out"], ["destination-atop", "destination-in", "destination-out", "destination-over"], ["copy", "darker", "lighter", "xor"]); // Typenarray durchlaufen for(var i=0; i<arrTypes.length; i++){ // Alle Typen in einer Zeile durchlaufen for(var j=0; j<arrTypes[i].length; j++){ // Canvaselement erstellen und Grösse anpassen objCanvas = document.createElement("canvas"); objCanvas.width = intDim; objCanvas.height = intDim; objCanvas.style.width = intDim + "px"; objCanvas.style.height = intDim + "px"; // Kontext var objContext = objCanvas.getContext('2d'); // Kreis zeichnen drawEllipse(objContext, "#0c0"); // Verknüpfungstyp zuweien objContext.globalCompositeOperation = arrTypes[i][j]; // Dreieck zeichnen drawTriangle(objContext, "#30f"); // Beschriftungselement erstellen, formatieren und beschriften var objLabel = document.createElement("div"); objLabel.style.position = "absolute"; objLabel.style.zIndex = 99; objLabel.style.top = ((i+1)*intDim - 30) + "px"; objLabel.style.left = (j*intDim) + "px"; objLabel.style.width = intDim + "px"; objLabel.style.textAlign = "center"; objLabel.style.lineHeight = "150%"; objLabel.style.backgroundColor = "#999"; objLabel.innerHTML = arrTypes[i][j]; // Canvas und Label in DOM einhängen document.getElementById("canvasContainer").appendChild(objCanvas); document.getElementById("canvasContainer").appendChild(objLabel); } // Zeilenumbruch document.getElementById("canvasContainer").appendChild(document.createElement("br")); } }else{ // Sonstiger Code document.getElementById("canvasContainer").innerHTML = "Ihr Browser unterstützt das canvas-Element leider nicht."; } } function drawTriangle(objContext, strCol){ // Höhe des Dreiecks (Grundseite = Höhe) var intHoehe = 50; objContext.beginPath(); objContext.moveTo(parseInt(intDim/2), 10); objContext.lineTo(parseInt(intDim/2) + parseInt(intHoehe/2), 10 + intHoehe); objContext.lineTo(parseInt(intDim/2) - parseInt(intHoehe/2), 10 + intHoehe); objContext.lineTo(parseInt(intDim/2), 10) objContext.fillStyle = strCol; objContext.fill(); } function drawEllipse(objContext, strCol){ // Radius des Kreises var intRadius = 25; objContext.beginPath(); objContext.moveTo(parseInt(intDim/2) + intRadius, 15 + intRadius); //objContext.arc(35, 40, 25, 0, 2*Math.PI, true); objContext.arc(parseInt(intDim/2), 15 + intRadius, intRadius, 0, 2*Math.PI, true); objContext.fillStyle = strCol; objContext.fill(); }
Im Beispiel wird für jeden Verknüpfungstyp ein eigenes Canvaselement erstellt. Die Typen selbst werden in einem Array verwaltet, das in zwei for-Schleifen komponentenweise durchlaufen wird. Dabei wird für jeden Typ ein eigenes Canvaselement erstellt, in dem die aktuelle Verknüpfung zwischen einem Kreis und einem Dreieck optisch dargestellt wird.
Zudem wird jeweil ein Beschriftungsfeld mit der Bezeichnung des Typs erstellt. Sind die beiden Elemente mit Inhalten gefüllt, werden sie in einen Container (canvasContainer) eingehängt.
Es ist zu beachten, dass das Script entweder nach dem Container mit der ID canvasContainer oder im onload-Event eingebunden wird, da die Existenz des Containers Voraussetzung für das Einhängen weiter Knoten ist.