package Ġapp . rig s . ml kit . processor Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . graphics . Paint Ċ import Ġandroid . graphics . Rect F Ċ import Ġandroidx . core . graphics . with Rotation Ċ import Ġandroidx . core . graphics . with Save Ċ import Ġandroidx . core . graphics . with Translation Ċ import Ġcom . example . sh ir az . firebase ml kit demo . R Ċ import Ġapp . rig s . ml kit . ui . Bitmap Utils Ċ import Ġcom . google . firebase . ml . vision . face . Firebase Vision Face Ċ import Ġcom . google . firebase . ml . vision . face . Firebase Vision Face Land mark Ċ Ċ class ĠSnap chat ify Bitmap Processor ( val Ġcontext : ĠContext ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġm outh Bitmap : ĠBitmap Ġ= ĠBitmap Utils . load Bitmap ( context , Ġnull , ĠR . drawable . m outh ) ĊĠĠĠ Ġprivate Ġval Ġeye Bitmap : ĠBitmap Ġ= ĠBitmap Utils . load Bitmap ( context , Ġnull , ĠR . drawable . heart ) ĊĊĠĠĠ Ġprivate Ġval Ġm outh Paint Ġ= ĊĠĠĠĠĠĠĠ ĠPaint (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Filter Bitmap Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġval Ġrect Paint Ġ= ĊĠĠĠĠĠĠĠ ĠPaint (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstrokeWidth Ġ= Ġ 5 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= ĠColor . CY AN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Ġ= ĠPaint . Style . ST RO KE ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġannotate Face ( bitmap : ĠBitmap , Ġfaces : ĠList < Firebase Vision Face >): ĠBitmap Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtemporary Bitmap Ġ= ĠBitmap . create Bitmap ( bitmap . width , Ġbitmap . height , ĠBitmap . Config . RGB _ 5 6 5 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcanvas Ġ= ĠCanvas ( temporary Bitmap ) ĊĠĠĠĠĠĠĠ Ġcanvas . draw Bitmap ( bitmap , Ġ 0 f , Ġ 0 f , Ġnull ) ĊĊĊĠĠĠĠĠĠĠ Ġfor Ġ( face Ġin Ġfaces ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbounds Ġ= Ġface . bounding Box ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrot Y Ġ= Ġface . head Euler Angle Y Ġ Ġ// ĠHead Ġis Ġrotated Ġto Ġthe Ġright Ġrot Y Ġdegrees ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrot Z Ġ= Ġface . head Euler Angle Z Ġ Ġ// ĠHead Ġis Ġtil ted Ġside ways Ġrot Z Ġdegrees ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// m outh ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw M outh ( canvas , Ġface , Ġrot Y ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġeye Size Ġ= Ġ( bounds . width ()) Ġ* Ġ 0 . 1 5 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġright Eye Ġ= Ġface . get Land mark ( Firebase Vision Face Land mark . RIGHT _ EY E ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( right Eye Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Eye ( canvas , Ġright Eye , Ġeye Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft Eye Ġ= Ġface . get Land mark ( Firebase Vision Face Land mark . LEFT _ EY E ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( left Eye Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Eye ( canvas , Ġleft Eye , Ġeye Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġ// ĠTo Ġdraw Ġa Ġbounding Ġbox Ġover Ġthe ĠFace Ġuncomment Ġbelow ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . with Save Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Round Rect ( Rect F ( bounds ), Ġrot Y , Ġrot Z , Ġrect Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}*/ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtemporary Bitmap ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Eye ( canvas : ĠCanvas , Ġeye : ĠFirebase Vision Face Land mark , Ġeye Size : ĠFloat ){ ĊĠĠĠĠĠĠĠ Ġeye . position ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . with Save Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Translation ( it . x , Ġit . y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeye Bitmap . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Bitmap ( it , Ġnull , ĠRect F (- eye Size , Ġ- eye Size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeye Size , Ġeye Size ), Ġm outh Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw M outh ( canvas : ĠCanvas , Ġface : ĠFirebase Vision Face , Ġrot Y : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġleft M outh Ġ= Ġface . get Land mark ( Firebase Vision Face Land mark . LEFT _ MO UTH ) ĊĠĠĠĠĠĠĠ Ġleft M outh ?. position ?. let Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Circle ( it . x , Ġit . y , Ġ 4 f , Ġrect Paint ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġright M outh Ġ= Ġface . get Land mark ( Firebase Vision Face Land mark . RIGHT _ MO UTH ) ĊĠĠĠĠĠĠĠ Ġright M outh ?. position ?. let Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Circle ( it . x , Ġit . y , Ġ 4 f , Ġrect Paint ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġbottom M outh Ġ= Ġface . get Land mark ( Firebase Vision Face Land mark . BOTTOM _ MO UTH ) ĊĠĠĠĠĠĠĠ Ġbottom M outh ?. position ?. let Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Circle ( it . x , Ġit . y , Ġ 4 f , Ġrect Paint ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġbottom No se Ġ= Ġface . get Land mark ( Firebase Vision Face Land mark . NO SE _ BASE ) ĊĊĠĠĠĠĠĠĠ Ġbottom No se ?. position ?. let Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Circle ( it . x , Ġit . y , Ġ 4 f , Ġrect Paint ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġif Ġ( left M outh Ġ!= Ġnull Ġ&& Ġright M outh Ġ!= Ġnull Ġ&& Ġbottom M outh Ġ!= Ġnull Ġ&& Ġbottom No se Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm outh Size Width Ġ= Ġleft M outh . position . x Ġ- Ġright M outh . position . x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm outh Size Height Ġ= Ġbottom M outh . position . y Ġ- Ġbottom No se . position . y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcentre X Ġ= Ġm outh Size Width Ġ/ Ġ 2 Ġ+ Ġright M outh . position . x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcentre Y Ġ= Ġm outh Size Height Ġ/ Ġ 2 Ġ+ Ġbottom No se . position . y Ġ- Ġ 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . with Save Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Rotation ( rot Y , Ġleft M outh . position . x , Ġleft M outh . position . y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Translation ( centre X , Ġcentre Y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm outh Bitmap . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Bitmap ( it , Ġnull , ĠRect F (- m outh Size Width Ġ/ Ġ 2 f Ġ* Ġ 1 . 5 f , Ġ- m outh Size Height Ġ/ Ġ 2 f Ġ* Ġ 1 . 5 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm outh Size Width Ġ/ Ġ 2 f Ġ* Ġ 1 . 5 f , Ġm outh Size Height Ġ/ Ġ 2 f Ġ* Ġ 1 . 5 f ), Ġm outh Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }