with text_io ; separate (Drei_D) procedure Lies_Tiefeninfo (SIRDS : in out SIRDS_RT) is Datei : text_io.file_type ; Zeile : string (1..255) ; Ende : natural ; Checksumme : natural := 0 ; Zeichen : character ; Breite : positive range 8..512 ; Hoehe : positive range 8..512 ; x_Offset : positive ; x_Faktor : positive ; y_Faktor : positive ; subtype Wert_T is natural range 0..93 ; type Wertepaar_T is record Tiefe : Pixel_T := 0 ; Lauflaenge : Wert_T := 0 ; end record ; type Puffer_T is array (0..29) of Wertepaar_T ; Wertepaar : Wertepaar_T ; Puffer : Puffer_T ; Index : natural range Puffer_T'range := 0 ; function Lies_Wert return Wert_T is Zeichen : character ; Wert : Wert_T ; begin loop text_io.get (Datei, Zeichen) ; exit when Zeichen > ' ' ; end loop ; Wert := character'pos (Zeichen) - 33 ; Checksumme := Checksumme + Wert ; return Wert ; end Lies_Wert ; function Lies_Wertepaar return Wertepaar_T is Wert : Wert_T ; Wertepaar : Wertepaar_T ; begin Index := (Index + 1) mod 30 ; Wert := Lies_Wert ; if Wert <= 63 then Wertepaar := (Wert, Lies_Wert) ; else Wertepaar := Puffer ((Index - Wert + 93) mod 30) ; end if ; Puffer (Index) := Wertepaar ; return Wertepaar ; end Lies_Wertepaar ; procedure Trage_Tiefeninfo_ein (x, y : in positive ; Tiefe : in Pixel_T) is x_max : constant positive := x * x_Faktor + x_Offset ; x_min : constant positive := x_max - (x_Faktor - 1) ; y_max : constant positive := y * y_Faktor ; y_min : constant positive := y_max - (y_Faktor - 1) ; begin for i in x_min..x_max loop for j in y_min..y_max loop SIRDS.Bild (i, j) := Tiefe ; end loop ; end loop ; end Trage_Tiefeninfo_ein ; begin text_io.new_line ; text_io.put ("Welche Datei soll ich einlesen ? => ") ; text_io.get_line (Zeile, Ende) ; text_io.new_line (2) ; loop exit when Zeile (Ende) > ' ' ; Ende := Ende - 1 ; end loop ; SIRDS.Name := new string (1..Ende) ; SIRDS.Name.all := Zeile (1..Ende) ; text_io.put_line ("Einlesen von """ & SIRDS.Name.all & """: Start") ; text_io.open (Datei, text_io.in_file, SIRDS.Name.all & ".rle") ; text_io.get_line (Datei, Zeile, Ende) ; loop exit when Zeile (Ende) > ' ' ; Ende := Ende - 1 ; end loop ; SIRDS.Titel := new string (1..Ende) ; SIRDS.Titel.all := Zeile (1..Ende) ; for i in SIRDS.Titel'range loop if SIRDS.Titel (i) > ' ' then Checksumme := Checksumme + character'pos (SIRDS.Titel (i)) - 33 ; end if ; end loop ; SIRDS.Bild := new Bild_AT (1..1280, 1..1024) ; SIRDS.Bild.all := (others => (others => 0)) ; Breite := 512 / Lies_Wert ; Hoehe := 512 / Lies_Wert ; x_Offset := SIRDS.Bild'last (1) / 10 ; x_Faktor := (4 * SIRDS.Bild'last (1)) / (5 * Breite) ; y_Faktor := SIRDS.Bild'last (2) / Hoehe ; for y in 1..Hoehe loop for x in 1..Breite loop if Wertepaar.Lauflaenge <= 0 then Wertepaar := Lies_Wertepaar ; else Wertepaar.Lauflaenge := Wertepaar.Lauflaenge - 1 ; end if ; Trage_Tiefeninfo_ein (x, y, Wertepaar.Tiefe) ; end loop ; end loop ; Checksumme := Checksumme mod 64 + 33 ; loop text_io.get (Datei, Zeichen) ; exit when Zeichen > ' ' ; end loop ; if Zeichen /= character'val (Checksumme) then text_io.put_line ("Falsche Checksumme : " & character'val (Checksumme) & " (" & integer'image (Checksumme) & ")" ) ; text_io.put_line ("Richtige Checksumme : " & Zeichen & " (" & integer'image (character'pos (Zeichen)) & ")" ) ; end if ; text_io.close (Datei) ; text_io.put_line ("Einlesen von """ & SIRDS.Name.all & """: Ende") ; text_io.new_line ; end Lies_Tiefeninfo ;