diff --git a/cpdfpng.ml b/cpdfpng.ml index 1b423ae..3d7813d 100644 --- a/cpdfpng.ml +++ b/cpdfpng.ml @@ -1,21 +1,59 @@ (* Read a non-interlaced, non-transparent 24 bit PNG for inclusion in a PDF file *) +open Pdfutil +open Pdfio + type t = {width : int; height : int; - idat : Pdfio.bytes} + idat : bytes} exception BadPNG of string +let string_of_tag t = + Printf.sprintf "%c%c%c%c" + (char_of_int (i32toi (Int32.shift_right t 24))) + (char_of_int (i32toi (Int32.logand 0x000000FFl (Int32.shift_right t 16)))) + (char_of_int (i32toi (Int32.logand 0x000000FFl (Int32.shift_right t 8)))) + (char_of_int (i32toi (Int32.logand 0x000000FFl t))) + +let read_unsigned_4byte i = 0l + +let read_data l i = bytes_of_string "" + +let read_chunk i = + let chunklen = read_unsigned_4byte i in + let chunktype = read_unsigned_4byte i in + let chunkdata = read_data chunklen i in + let _ (* crc *) = read_unsigned_4byte i in + (string_of_tag chunktype, chunkdata) + let read_png i = - (* File signature *) - (* IHDR *) - (* IDAT *) - (* IEND *) - {width = 0; - height = 0; - idat = Pdfio.bytes_of_string ""} + try + i.seek_in 8; + let ihdr, ihdrdata = read_chunk i in + if ihdr <> "IHDR" then raise (Pdf.PDFError "read_png: first table not IHDR") else + let width = 0 in + let height = 0 in + let bitdepth = 0 in + let colortype = 0 in + let compressionmethod = 0 in + let filtermethod = 0 in + let interlacemethod = 0 in + let idat = ref None in + begin try + while true do + let chunkname, chunkdata = read_chunk i in + if chunkname = "IDAT" then + idat := Some chunkdata + done + with + _ -> () + end; + {width; height; idat = unopt !idat} + with + e -> raise (Pdf.PDFError (Printf.sprintf "read_png: failed on %s" (Printexc.to_string e))) let _ = read_png - (Pdfio.input_of_string + (input_of_string (Pdfutil.contents_of_file "/Users/john/Desktop/cpdfdraw/Untitled.png"))