private function _loadLBM($file) { $lbm = fopen($file, "rb"); if (!$lbm) { return false; } fseek($lbm, 0, SEEK_END); $size = ftell($lbm); fseek($lbm, 0, SEEK_SET); $form = file_helpers::freadstring($lbm, 4, false); if ($form != "FORM") { return $this->_error("not a LBM file"); } $length = file_helpers::freadint($lbm); $pbm = file_helpers::freadstring($lbm, 4, false); if ($pbm != "PBM ") { return $this->_error("not a LBM file with PBM structure"); } while (!feof($lbm) && ftell($lbm) < $size) { $chunk = file_helpers::freadstring($lbm, 4, false); // Länge einlesen $length = file_helpers::freadbint($lbm); #echo $chunk." = ".$length."<br>\n"; // Bei ungerader Zahl aufrunden if ($length & 1) { ++$length; } switch ($chunk) { case "BMHD": // Breite & Höhe einlesen $this->image['header']['width'] = file_helpers::freadbshort($lbm); $this->image['header']['height'] = file_helpers::freadbshort($lbm); // Unbekannte Daten ( 4 Byte ) berspringen fseek($lbm, 4, SEEK_CUR); // Farbtiefe einlesen $this->image['header']['depth'] = file_helpers::freadshort($lbm); // Nur 256 Farben und nicht mehr! if ($this->image['header']['depth'] != 8) { $this->_error("Invalid File: LBM with 8bit colors are supported only"); return false; } // Kompressionflag lesen $this->image['header']['compression'] = file_helpers::freadshort($lbm); if ($this->image['header']['compression'] != 1) { $this->_error("Invalid File: LBM has unknown compression flag: " . $this->image['header']['compression']); return false; } $length -= 12; // Rest überspringen fseek($lbm, $length, SEEK_CUR); break; case "BODY": switch ($this->image['header']['compression']) { case 0: // uncompressed return false; case 1: $pos = 0; // Solange einlesen, bis Block zuende bzw. Datei zuende ist while ($length >= 0 && !feof($lbm) && ftell($lbm) < $size) { // Typ lesen $ctype = file_helpers::freadchar($lbm); --$length; if ($length == 0) { continue; } if ($ctype < 128) { for ($i = 0; $i <= $ctype; ++$i) { $this->image['body'][$pos] = file_helpers::freadchar($lbm); --$length; ++$pos; } } else { $count = 0xff - $ctype + 1; $color = file_helpers::freadchar($lbm); --$length; for ($i = 0; $i <= $count; ++$i) { $this->image['body'][$pos] = $color; ++$pos; } } } if ($pos < $this->image['header']['width'] * $this->image['header']['height']) { $this->_error("ooops? {$pos} " . $this->image['header']['width'] * $this->image['header']['height']); return false; } break; } break; case "CMAP": if ($length != 256 * 3) { $this->_error("Invalid Chunk: {$chunk} with length {$length} does not have 256 rgb values"); return false; } $this->palette->set_256rgb(s2pal::read_256rgb($lbm)); break; case "DPPS": // known but unused // known but unused case "CRNG": case "TINY": fseek($lbm, $length, SEEK_CUR); break; default: $this->_error("Unknown Chunk: {$chunk} with length {$length}"); // Rest überspringen fseek($lbm, $length, SEEK_CUR); break; } } fclose($lbm); return true; }
static function freadbint($file) { $a = file_helpers::freadbshort($file); $b = file_helpers::freadbshort($file); return $b + $a * 256 * 256; }