/** * Get the composited canvas. * */ public function getCompositeCanvas() { // Create our target canvas $canvas = new Canvas($this->width, $this->height, 0x0); $crect = $canvas->getRect(); // Precalculate some stuff for performance $samesize = []; foreach ($this->layers as $i => $layer) { $samesize[$i] = $layer->position == $layer->canvas->getRect(); } // Process the composite canvas for ($n = 0; $n < $this->width; $n++) { for ($m = 0; $m < $this->height; $m++) { if ($this->background) { $co = $this->background->getPixel($n, $m); } else { $co = 0x0; } foreach ($this->layers as $i => $layer) { //printf("Pre [%d] (mode=%d): 0x%06x ", $i, $layer->blend, $co); if ($layer->position->isXYWithin($n, $m)) { $co = $this->blend($co, $layer->canvas->getPixel($n, $m), $layer->blend, $layer->opacity); } //printf("Post: 0x%06x\n", $co); } $canvas->setPixel($n, $m, $co); } } return $canvas; }