// ĠCopyright Ġ 2 0 1 8 ĠHP ĠDevelopment ĠCompany , ĠL . P . Ċ // ĠSPDX - License - Identifier : ĠMIT Ċ Ċ package Ġcom . hp . j ipp . p dl . pw g Ċ Ċ import Ġcom . hp . j ipp . p dl . Render able Document Ċ import Ġcom . hp . j ipp . p dl . Render able Page Ċ import Ġjava . io . ByteArray InputStream Ċ import Ġjava . io . ByteArray OutputStream Ċ import Ġjava . io . Data OutputStream Ċ import Ġjava . io . OutputStream Ċ Ċ /** Ċ Ġ* ĠAn Ġ[ OutputStream ] Ġthat Ġcan Ġwrite Ġa Ġ[ Render able Document ] Ġin ĠP WG - Raster Ġformat . Ċ Ġ*/ Ċ class ĠP wg Writer Ċ @ Jvm Over loads Ġconstructor ( ĊĠĠĠ ĠoutputStream : ĠOutputStream , ĊĠĠĠ Ġprivate Ġval Ġsettings : ĠP wg Settings Ġ= ĠP wg Settings (), ĊĠĠĠ Ġ/** ĠSup ply Ġa Ġconverter Ġhere Ġif Ġyou Ġwould Ġlike Ġto Ġreturn Ġa Ġcustomized Ġheader . Ġ*/ ĊĠĠĠ Ġval Ġheader Customizer : Ġ( Render able Page , ĠP wg Header ) Ġ-> ĠP wg Header Ġ= Ġ{ Ġ_, Ġheader Ġ-> Ġheader Ġ} Ċ ) Ġ: ĠData OutputStream ( output Stream ) Ġ{ ĊĊĠĠĠ Ġ/** ĠWrite Ġa Ġdocument Ġto Ġthis Ġ[ output Stream ]. Ġ*/ ĊĠĠĠ Ġfun Ġwrite ( doc : ĠRender able Document ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwrite ( MAGIC _ NUMBER ) ĊĠĠĠĠĠĠĠ Ġdoc . map Pages Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . map Indexed Ġ{ Ġnum , Ġpage Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheader Ġ= Ġsettings . build Header ( doc , Ġpage , Ġnum ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( header . feed Transform Ġto Ġheader . cross Feed Transform ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- 1 Ġto Ġ- 1 Ġ-> Ġpage . rot ated () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġto Ġ- 1 Ġ-> Ġpage . flip X () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- 1 Ġto Ġ 1 Ġ-> Ġpage . flip Y () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġpage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. handle Side s ( settings . output ). forEach Indexed Ġ{ Ġnum , Ġpage Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheader Ġ= Ġheader Customizer ( page , Ġsettings . build Header ( doc , Ġpage , Ġnum )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheader . write ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Page Content ( page , Ġheader ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Page Content ( page : ĠRender able Page , Ġheader : ĠP wg Header ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠPack Ġand Ġwrite Ġthe Ġcontent Ġbytes ĊĠĠĠĠĠĠĠ Ġvar Ġy Offset Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġsize Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar ĠbyteArray : ĠByteArray ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġwhile Ġ( y Offset Ġ< Ġpage . height Pixels ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheight Ġ= ĠMath . min ( MAX _ SW ATH _ HEIGHT , Ġpage . height Pixels Ġ- Ġy Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrender Size Ġ= Ġpage . render Size ( height , Ġsettings . output . color Space ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( byteArray ?. size Ġ!= Ġrender Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠbyteArray Ġ= ĠByteArray ( render Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpage . render ( y Offset , Ġheight , Ġsettings . output . color Space , ĠbyteArray ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġencoded Bytes Ġ= ĠByteArrayOutputStream () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheader . pack Bits . encode ( ByteArray InputStream ( byteArray ), Ġencoded Bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite ( encoded Bytes . toByteArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ+= Ġencoded Bytes . size () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy Offset Ġ+= Ġheight ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠMAG IC _ NUMBER Ġ= Ġ" Ra S 2 ". toByteArray () ĊĊĠĠĠĠĠĠĠ Ġ// ĠPack Ġand Ġencode Ġonly Ġthis Ġmany Ġlines Ġat Ġa Ġtime Ġto Ġcon serve ĠRAM ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMAX _ SW ATH _ HEIGHT Ġ= Ġ 6 4 ĊĠĠĠ Ġ} Ċ } Ċ