/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġandroidx . camera . integration . core . util Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Image Format Ċ import Ġandroid . graphics . Rect Ċ import Ġandroid . media . Image Ċ import Ġandroid . rend erscript . Allocation Ċ import Ġandroid . rend erscript . Element Ċ import Ġandroid . rend erscript . Render Script Ċ import Ġandroid . rend erscript . Script Intr insic Y uv To RGB Ċ import Ġandroid . rend erscript . Type Ċ Ċ /** Ċ Ġ* ĠCopy Ġfrom Ġthe Ġgithub Ġfor Ġtesting . Ċ Ġ* ĠPlease Ġreference : Ġhttps :// github . com / android / camera - samples / Ċ Ġ* Ċ Ġ* ĠHelper Ġclass Ġused Ġto Ġefficiently Ġconvert Ġa ĠMedia . Image Ġobject Ġfrom Ċ Ġ* Ġ[ Image Format . Y UV _ 4 2 0 _ 8 8 8 ] Ġformat Ġto Ġan ĠRGB Ġ[ Bitmap ] Ġobject . Ċ Ġ* Ċ Ġ* ĠThe Ġ[ y uv To Rgb ] Ġmethod Ġis Ġable Ġto Ġachieve Ġthe Ġsame ĠF PS Ġas Ġthe ĠCamera X Ġimage Ċ Ġ* Ġanalysis Ġuse Ġcase Ġon Ġa ĠPixel Ġ 3 ĠX L Ġdevice Ġat Ġthe Ġdefault Ġanalyzer Ġresolution , Ċ Ġ* Ġwhich Ġis Ġ 3 0 ĠF PS Ġwith Ġ 6 4 0 x 4 8 0 . Ċ Ġ* Ċ Ġ* ĠNOTE : ĠThis Ġhas Ġbeen Ġtested Ġin Ġa Ġlimited Ġnumber Ġof Ġdevices Ġand Ġis Ġnot Ċ Ġ* Ġconsidered Ġproduction - ready Ġcode . ĠIt Ġwas Ġcreated Ġfor Ġillustr ation Ġpurposes , Ċ Ġ* Ġsince Ġthis Ġis Ġnot Ġan Ġefficient Ġcamera Ġpipeline Ġdue Ġto Ġthe Ġmultiple Ġcopies Ċ Ġ* Ġrequired Ġto Ġconvert Ġeach Ġframe . Ċ Ġ*/ Ċ @ Suppress (" DE PREC ATION ") Ċ class ĠY uv To Rgb Converter ( context : ĠContext ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġrs Ġ= ĠRender Script . create ( context ) ĊĠĠĠ Ġprivate Ġval Ġscript Y uv To Rgb Ġ= ĠScript Intr insic Y uv To RGB . create ( rs , ĠElement . U 8 _ 4 ( rs )) ĊĊĠĠĠ Ġprivate Ġvar Ġpixel Count : ĠInt Ġ= Ġ- 1 ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġy uv Buffer : ĠByteArray ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġinput Allocation : ĠAl location ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġoutput Allocation : ĠAl location ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġy uv To Rgb ( image : ĠImage , Ġoutput : ĠBitmap ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠEnsure Ġthat Ġthe Ġintermediate Ġoutput Ġbyte Ġbuffer Ġis Ġallocated ĊĠĠĠĠĠĠĠ Ġif Ġ(! :: y uv Buffer . isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpixel Count Ġ= Ġimage . crop Rect . width () Ġ* Ġimage . crop Rect . height () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBits Ġper Ġpixel Ġis Ġan Ġaverage Ġfor Ġthe Ġwhole Ġimage , Ġso Ġit 's Ġuseful Ġto Ġcompute Ġthe Ġsize ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġof Ġthe Ġfull Ġbuffer Ġbut Ġshould Ġnot Ġbe Ġused Ġto Ġdetermine Ġpixel Ġoffsets ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpixel Size Bits Ġ= ĠImage Format . get Bits Per Pixel ( Image Format . Y UV _ 4 2 0 _ 8 8 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy uv Buffer Ġ= ĠByteArray ( pixel Count Ġ* Ġpixel Size Bits Ġ/ Ġ 8 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġthe ĠY UV Ġdata Ġin Ġbyte Ġarray Ġform Ġusing ĠNV 2 1 Ġformat ĊĠĠĠĠĠĠĠ Ġimage To ByteArray ( image , Ġy uv Buffer ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠEnsure Ġthat Ġthe ĠRender Script Ġinputs Ġand Ġoutputs Ġare Ġallocated ĊĠĠĠĠĠĠĠ Ġif Ġ(! :: input Allocation . isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠExplicit ly Ġcreate Ġan Ġelement Ġwith Ġtype ĠNV 2 1 , Ġsince Ġthat 's Ġthe Ġpixel Ġformat Ġwe Ġuse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelem Type Ġ= ĠType . Builder ( rs , ĠElement . Y UV ( rs )). set Y uv Format ( Image Format . NV 2 1 ). create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput Allocation Ġ= ĠAl location . create Sized ( rs , Ġelem Type . element , Ġy uv Buffer . size ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! :: output Allocation . isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Allocation Ġ= ĠAl location . createFrom Bitmap ( rs , Ġoutput ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠConvert ĠNV 2 1 Ġformat ĠY UV Ġto ĠRGB ĊĠĠĠĠĠĠĠ Ġinput Allocation . copyFrom ( y uv Buffer ) ĊĠĠĠĠĠĠĠ Ġscript Y uv To Rgb . setInput ( input Allocation ) ĊĠĠĠĠĠĠĠ Ġscript Y uv To Rgb . forEach ( output Allocation ) ĊĠĠĠĠĠĠĠ Ġoutput Allocation . copy To ( output ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġimage To ByteArray ( image : ĠImage , Ġoutput Buffer : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠ Ġassert ( image . format Ġ== ĠImage Format . Y UV _ 4 2 0 _ 8 8 8 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġimage Crop Ġ= Ġimage . crop Rect ĊĠĠĠĠĠĠĠ Ġval Ġimage Planes Ġ= Ġimage . planes ĊĊĠĠĠĠĠĠĠ Ġimage Planes . forEach Indexed Ġ{ Ġplane Index , Ġplane Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHow Ġmany Ġvalues Ġare Ġread Ġin Ġinput Ġfor Ġeach Ġoutput Ġvalue Ġwritten ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOnly Ġthe ĠY Ġplane Ġhas Ġa Ġvalue Ġfor Ġevery Ġpixel , ĠU Ġand ĠV Ġhave Ġhalf Ġthe Ġresolution Ġi . e . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠY ĠPlane ĠĠĠĠĠĠĠĠĠĠĠ ĠU ĠPlane ĠĠĠ ĠV ĠPlane ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ= ============== ĠĠĠ Ġ======= ĠĠĠ Ġ======= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠY ĠY ĠY ĠY ĠY ĠY ĠY ĠY ĠĠĠ ĠU ĠU ĠU ĠU ĠĠĠ ĠV ĠV ĠV ĠV ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠY ĠY ĠY ĠY ĠY ĠY ĠY ĠY ĠĠĠ ĠU ĠU ĠU ĠU ĠĠĠ ĠV ĠV ĠV ĠV ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠY ĠY ĠY ĠY ĠY ĠY ĠY ĠY ĠĠĠ ĠU ĠU ĠU ĠU ĠĠĠ ĠV ĠV ĠV ĠV ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠY ĠY ĠY ĠY ĠY ĠY ĠY ĠY ĠĠĠ ĠU ĠU ĠU ĠU ĠĠĠ ĠV ĠV ĠV ĠV ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠY ĠY ĠY ĠY ĠY ĠY ĠY ĠY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠY ĠY ĠY ĠY ĠY ĠY ĠY ĠY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠY ĠY ĠY ĠY ĠY ĠY ĠY ĠY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Stride : ĠInt ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġindex Ġin Ġthe Ġoutput Ġbuffer Ġthe Ġnext Ġvalue Ġwill Ġbe Ġwritten Ġat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFor ĠY Ġit 's Ġzero , Ġfor ĠU Ġand ĠV Ġwe Ġstart Ġat Ġthe Ġend Ġof ĠY Ġand Ġinter leave Ġthem Ġi . e . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFirst Ġchunk ĠĠĠĠĠĠĠ ĠSecond Ġchunk ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ= ============== ĠĠĠ Ġ= ============== ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠY ĠY ĠY ĠY ĠY ĠY ĠY ĠY ĠĠĠ ĠV ĠU ĠV ĠU ĠV ĠU ĠV ĠU ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠY ĠY ĠY ĠY ĠY ĠY ĠY ĠY ĠĠĠ ĠV ĠU ĠV ĠU ĠV ĠU ĠV ĠU ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠY ĠY ĠY ĠY ĠY ĠY ĠY ĠY ĠĠĠ ĠV ĠU ĠV ĠU ĠV ĠU ĠV ĠU ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠY ĠY ĠY ĠY ĠY ĠY ĠY ĠY ĠĠĠ ĠV ĠU ĠV ĠU ĠV ĠU ĠV ĠU ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠY ĠY ĠY ĠY ĠY ĠY ĠY ĠY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠY ĠY ĠY ĠY ĠY ĠY ĠY ĠY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠY ĠY ĠY ĠY ĠY ĠY ĠY ĠY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġoutput Offset : ĠInt ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( plane Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Stride Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Offset Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Stride Ġ= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFor ĠNV 2 1 Ġformat , ĠU Ġis Ġin Ġodd - number ed Ġindices ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Offset Ġ= Ġpixel Count Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Stride Ġ= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFor ĠNV 2 1 Ġformat , ĠV Ġis Ġin Ġeven - number ed Ġindices ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Offset Ġ= Ġpixel Count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠImage Ġcontains Ġmore Ġthan Ġ 3 Ġplanes , Ġsomething Ġstrange Ġis Ġgoing Ġon ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach Indexed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplane Buffer Ġ= Ġplane . buffer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrow Stride Ġ= Ġplane . row Stride ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpixel Stride Ġ= Ġplane . pixel Stride ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġhave Ġto Ġdivide Ġthe Ġwidth Ġand Ġheight Ġby Ġtwo Ġif Ġit 's Ġnot Ġthe ĠY Ġplane ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplane Crop Ġ= Ġif Ġ( plane Index Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Crop ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRect ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Crop . left Ġ/ Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Crop . top Ġ/ Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Crop . right Ġ/ Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Crop . bottom Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplane Width Ġ= Ġplane Crop . width () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplane Height Ġ= Ġplane Crop . height () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠInter mediate Ġbuffer Ġused Ġto Ġstore Ġthe Ġbytes Ġof Ġeach Ġrow ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrow Buffer Ġ= ĠByteArray ( plane . row Stride ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSize Ġof Ġeach Ġrow Ġin Ġbytes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrow Length Ġ= Ġif Ġ( pixel Stride Ġ== Ġ 1 Ġ&& Ġoutput Stride Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplane Width ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTake Ġinto Ġaccount Ġthat Ġthe Ġstride Ġmay Ġinclude Ġdata Ġfrom Ġpixels Ġother Ġthan Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġparticular Ġplane Ġand Ġrow , Ġand Ġthat Ġcould Ġbe Ġbetween Ġpixels Ġand Ġnot Ġafter Ġevery ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġpixel : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ| ---- ĠPixel Ġstride Ġ---- | ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRow Ġends Ġhere Ġ--> Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ| ĠPixel Ġ 1 Ġ| ĠOther ĠData Ġ| ĠPixel Ġ 2 Ġ| ĠOther ĠData Ġ| Ġ... Ġ| ĠPixel ĠN Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġneed Ġto Ġget Ġ( N - 1 ) Ġ* Ġ( pixel Ġstride Ġbytes ) Ġper Ġrow Ġ+ Ġ 1 Ġbyte Ġfor Ġthe Ġlast Ġpixel ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( plane Width Ġ- Ġ 1 ) Ġ* Ġpixel Stride Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( row Ġin Ġ 0 Ġuntil Ġplane Height ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMove Ġbuffer Ġposition Ġto Ġthe Ġbeginning Ġof Ġthis Ġrow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplane Buffer . position ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( row Ġ+ Ġplane Crop . top ) Ġ* Ġrow Stride Ġ+ Ġplane Crop . left Ġ* Ġpixel Stride ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pixel Stride Ġ== Ġ 1 Ġ&& Ġoutput Stride Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen Ġthere Ġis Ġa Ġsingle Ġstride Ġvalue Ġfor Ġpixel Ġand Ġoutput , Ġwe Ġcan Ġjust Ġcopy ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġentire Ġrow Ġin Ġa Ġsingle Ġstep ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplane Buffer . get ( output Buffer , Ġoutput Offset , Ġrow Length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Offset Ġ+= Ġrow Length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen Ġeither Ġpixel Ġor Ġoutput Ġhave Ġa Ġstride Ġ> Ġ 1 Ġwe Ġmust Ġcopy Ġpixel Ġby Ġpixel ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplane Buffer . get ( row Buffer , Ġ 0 , Ġrow Length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( col Ġin Ġ 0 Ġuntil Ġplane Width ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Buffer [ output Offset ] Ġ= Ġrow Buffer [ col Ġ* Ġpixel Stride ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Offset Ġ+= Ġoutput Stride ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ