/* Ċ Ġ* Ġ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 Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// 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 . compose . ui . text . platform Ċ Ċ import Ġandroidx . compose . ui . text . Cache Ċ import Ġandroidx . compose . ui . text . Experimental Text Api Ċ import Ġandroidx . compose . ui . text . Expire After Access Cache Ċ import Ġandroidx . compose . ui . text . font . Font Ċ import Ġandroidx . compose . ui . text . font . Font Family Ċ import Ġandroidx . compose . ui . text . font . Font List Font Family Ċ import Ġandroidx . compose . ui . text . font . Font Loading Strategy Ċ import Ġandroidx . compose . ui . text . font . FontStyle Ċ import Ġandroidx . compose . ui . text . font . Font Weight Ċ import Ġandroidx . compose . ui . util . fast ForEach Ċ import Ġjava . io . File Ċ import Ġjava . security . Message Digest Ċ import Ġorg . jetbrains . sk ia . Data Ċ import Ġorg . jetbrains . sk ia . make FromFile Ċ import Ġorg . jetbrains . sk ia . Type face Ġas ĠSk Type face Ċ Ċ actual Ġsealed Ġclass ĠPlatform Font Ġ: ĠFont Ġ{ ĊĠĠĠ Ġactual Ġabstract Ġval Ġidentity : ĠString ĊĠĠĠ Ġinternal Ġactual Ġval Ġcache Key : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ"${ this :: class . qualified Name }| $ identity " Ċ } Ċ Ċ internal Ġval ĠGeneric Font F amilies Mapping Ġby Ġlazy Ġ{ ĊĠĠĠ Ġwhen Ġ( Platform . Current ) Ġ{ ĊĠĠĠĠĠĠĠ ĠPlatform . Windows Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFont Family . Sans Ser if . name Ġto ĠlistOf (" Arial "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFont Family . Ser if . name Ġto ĠlistOf (" Times ĠNew ĠRoman "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFont Family . Mono space . name Ġto ĠlistOf (" Con sol as "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFont Family . Cur s ive . name Ġto ĠlistOf (" Com ic ĠSans ĠMS ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠPlatform . MacOS Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFont Family . Sans Ser if . name Ġto ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Helvetica ĠNeue ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Helvetica " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFont Family . Ser if . name Ġto ĠlistOf (" Times "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFont Family . Mono space . name Ġto ĠlistOf (" Courier "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFont Family . Cur s ive . name Ġto ĠlistOf (" Apple ĠCh anc ery ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠPlatform . Linux Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFont Family . Sans Ser if . name Ġto ĠlistOf (" Noto ĠSans ", Ġ" De ja Vu ĠSans "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFont Family . Ser if . name Ġto ĠlistOf (" Noto ĠSerif ", Ġ" De ja Vu ĠSerif ", Ġ" Times ĠNew ĠRoman "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFont Family . Mono space . name Ġto ĠlistOf (" Noto ĠSans ĠMono ", Ġ" De ja Vu ĠSans ĠMono "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbetter Ġalternative ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFont Family . Cur s ive . name Ġto ĠlistOf (" Com ic ĠSans ĠMS ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠPlatform . Unknown Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFont Family . Sans Ser if . name Ġto ĠlistOf (" Arial "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFont Family . Ser if . name Ġto ĠlistOf (" Times ĠNew ĠRoman "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFont Family . Mono space . name Ġto ĠlistOf (" Con sol as "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFont Family . Cur s ive . name Ġto ĠlistOf (" Com ic ĠSans ĠMS ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠDefines Ġa ĠFont Ġusing Ġresource Ġname . Ċ Ġ* Ċ Ġ* Ġ@ param Ġname ĠThe Ġresource Ġname Ġin Ġclasspath . Ċ Ġ* Ġ@ param Ġweight ĠThe Ġweight Ġof Ġthe Ġfont . ĠThe Ġsystem Ġuses Ġthis Ġto Ġmatch Ġa Ġfont Ġto Ġa Ġfont Ġrequest Ċ Ġ* Ġthat Ġis Ġgiven Ġin Ġa Ġ[ android x . compose . ui . text . Span Style ]. Ċ Ġ* Ġ@ param Ġstyle ĠThe Ġstyle Ġof Ġthe Ġfont , Ġnormal Ġor Ġitalic . ĠThe Ġsystem Ġuses Ġthis Ġto Ġmatch Ġa Ġfont Ġto Ġa Ċ Ġ* Ġfont Ġrequest Ġthat Ġis Ġgiven Ġin Ġa Ġ[ android x . compose . ui . text . Span Style ]. Ċ Ġ* Ċ Ġ* Ġ@ see ĠFont Family Ċ Ġ*/ Ċ Ċ class ĠResource Font Ġinternal Ġconstructor ( ĊĠĠĠ Ġval Ġname : ĠString , ĊĠĠĠ Ġoverride Ġval Ġweight : ĠFontWeight Ġ= ĠFontWeight . Normal , ĊĠĠĠ Ġoverride Ġval Ġstyle : ĠFont Style Ġ= ĠFont Style . Normal Ċ ) Ġ: ĠPlatform Font () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġidentity ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġname ĊĊĠĠĠ Ġ@ Experimental Text Api ĊĠĠĠ Ġoverride Ġval Ġloading Strategy : ĠFont Loading Strategy Ġ= ĠFont Loading Strategy . Blocking ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( java Class Ġ!= Ġother ?. java Class ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġother Ġas ĠResource Font ĊĊĠĠĠĠĠĠĠ Ġif Ġ( name Ġ!= Ġother . name ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( weight Ġ!= Ġother . weight ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( style Ġ!= Ġother . style ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġname . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġweight . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġstyle . hashCode () ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Resource Font ( name ='$ name ', Ġweight =$ weight , Ġstyle =$ style )" ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCreates Ġa ĠFont Ġusing Ġresource Ġname . Ċ Ġ* Ċ Ġ* Ġ@ param Ġresource ĠThe Ġresource Ġname Ġin Ġclasspath . Ċ Ġ* Ġ@ param Ġweight ĠThe Ġweight Ġof Ġthe Ġfont . ĠThe Ġsystem Ġuses Ġthis Ġto Ġmatch Ġa Ġfont Ġto Ġa Ġfont Ġrequest Ċ Ġ* Ġthat Ġis Ġgiven Ġin Ġa Ġ[ android x . compose . ui . text . Span Style ]. Ċ Ġ* Ġ@ param Ġstyle ĠThe Ġstyle Ġof Ġthe Ġfont , Ġnormal Ġor Ġitalic . ĠThe Ġsystem Ġuses Ġthis Ġto Ġmatch Ġa Ġfont Ġto Ġa Ċ Ġ* Ġfont Ġrequest Ġthat Ġis Ġgiven Ġin Ġa Ġ[ android x . compose . ui . text . Span Style ]. Ċ Ġ* Ċ Ġ* Ġ@ see ĠFont Family Ċ Ġ*/ Ċ fun ĠFont ( ĊĠĠĠ Ġresource : ĠString , ĊĠĠĠ Ġweight : ĠFontWeight Ġ= ĠFontWeight . Normal , ĊĠĠĠ Ġstyle : ĠFont Style Ġ= ĠFont Style . Normal Ċ ): ĠFont Ġ= ĠResource Font ( resource , Ġweight , Ġstyle ) Ċ Ċ /** Ċ Ġ* ĠDefines Ġa ĠFont Ġusing Ġfile Ġpath . Ċ Ġ* Ċ Ġ* Ġ@ param Ġfile ĠFile Ġpath Ġto Ġfont . Ċ Ġ* Ġ@ param Ġweight ĠThe Ġweight Ġof Ġthe Ġfont . ĠThe Ġsystem Ġuses Ġthis Ġto Ġmatch Ġa Ġfont Ġto Ġa Ġfont Ġrequest Ċ Ġ* Ġthat Ġis Ġgiven Ġin Ġa Ġ[ android x . compose . ui . text . Span Style ]. Ċ Ġ* Ġ@ param Ġstyle ĠThe Ġstyle Ġof Ġthe Ġfont , Ġnormal Ġor Ġitalic . ĠThe Ġsystem Ġuses Ġthis Ġto Ġmatch Ġa Ġfont Ġto Ġa Ċ Ġ* Ġfont Ġrequest Ġthat Ġis Ġgiven Ġin Ġa Ġ[ android x . compose . ui . text . Span Style ]. Ċ Ġ* Ċ Ġ* Ġ@ see ĠFont Family Ċ Ġ*/ Ċ class ĠFile Font Ġinternal Ġconstructor ( ĊĠĠĠ Ġval Ġfile : ĠFile , ĊĠĠĠ Ġoverride Ġval Ġweight : ĠFontWeight Ġ= ĠFontWeight . Normal , ĊĠĠĠ Ġoverride Ġval Ġstyle : ĠFont Style Ġ= ĠFont Style . Normal , Ċ ) Ġ: ĠPlatform Font () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġidentity ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġfile . toString () ĊĊĠĠĠ Ġ@ Experimental Text Api ĊĠĠĠ Ġoverride Ġval Ġloading Strategy : ĠFont Loading Strategy Ġ= ĠFont Loading Strategy . Blocking ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( java Class Ġ!= Ġother ?. java Class ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġother Ġas ĠFile Font ĊĊĠĠĠĠĠĠĠ Ġif Ġ( file Ġ!= Ġother . file ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( weight Ġ!= Ġother . weight ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( style Ġ!= Ġother . style ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġfile . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġweight . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġstyle . hashCode () ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" File Font ( file =$ file , Ġweight =$ weight , Ġstyle =$ style )" ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCreates Ġa ĠFont Ġusing Ġfile Ġpath . Ċ Ġ* Ċ Ġ* Ġ@ param Ġfile ĠFile Ġpath Ġto Ġfont . Ċ Ġ* Ġ@ param Ġweight ĠThe Ġweight Ġof Ġthe Ġfont . ĠThe Ġsystem Ġuses Ġthis Ġto Ġmatch Ġa Ġfont Ġto Ġa Ġfont Ġrequest Ċ Ġ* Ġthat Ġis Ġgiven Ġin Ġa Ġ[ android x . compose . ui . text . Span Style ]. Ċ Ġ* Ġ@ param Ġstyle ĠThe Ġstyle Ġof Ġthe Ġfont , Ġnormal Ġor Ġitalic . ĠThe Ġsystem Ġuses Ġthis Ġto Ġmatch Ġa Ġfont Ġto Ġa Ċ Ġ* Ġfont Ġrequest Ġthat Ġis Ġgiven Ġin Ġa Ġ[ android x . compose . ui . text . Span Style ]. Ċ Ġ* Ċ Ġ* Ġ@ see ĠFont Family Ċ Ġ*/ Ċ fun ĠFont ( ĊĠĠĠ Ġfile : ĠFile , ĊĠĠĠ Ġweight : ĠFontWeight Ġ= ĠFontWeight . Normal , ĊĠĠĠ Ġstyle : ĠFont Style Ġ= ĠFont Style . Normal Ċ ): ĠFont Ġ= ĠFile Font ( file , Ġweight , Ġstyle ) Ċ Ċ internal Ġactual Ġfun ĠFont List Font Family . make Alias (): ĠString Ġ{ ĊĠĠĠ Ġval Ġdigest Ġ= ĠMessage Digest . getInstance (" SHA - 2 5 6 ") ĊĠĠĠ Ġfonts . fast ForEach Ġ{ Ġfont Ġ-> ĊĠĠĠĠĠĠĠ Ġwhen Ġ( font ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPlatform Font Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdigest . update ( font . identity . toByteArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġ"- compose -${ digest . digest (). to HexString () }" Ċ } Ċ Ċ private Ġfun ĠByteArray . to HexString () Ġ= Ġjoin ToString ("") Ġ{ Ġ"% 0 2 x ". format ( it ) Ġ} Ċ Ċ internal Ġactual Ġfun Ġload From Type faces Cache ( font : ĠFont ): ĠSk Type face Ġ{ ĊĠĠĠ Ġif Ġ( font Ġ! is ĠPlatform Font ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Unsupported Ġfont Ġtype : Ġ$ font ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtype faces Cache . get ( font . cacheKey ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( font ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResource Font Ġ-> Ġtype face Resource ( font . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFile Font Ġ-> ĠSk Type face . make FromFile ( font . file . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLoaded Font Ġ-> ĠSk Type face . make From Data ( Data . make From Bytes ( font . data )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġactual Ġval Ġtype faces Cache : ĠCache < String , ĠSk Type face > Ġ= ĊĠĠĠ ĠExp ire After Access Cache < String , ĠSk Type face >( ĊĠĠĠĠĠĠĠĠ 6 0 _ 0 0 0 _ 0 0 0 _ 0 0 0 Ġ// Ġ 1 Ġminute ĊĠĠĠ Ġ) Ċ Ċ private Ġfun Ġtype face Resource ( resourceName : ĠString ): ĠSk Type face Ġ{ ĊĠĠĠ Ġval Ġresource Ġ= ĠThread ĊĠĠĠĠĠĠĠ Ġ. currentThread () ĊĠĠĠĠĠĠĠ Ġ. context ClassLoader ĊĠĠĠĠĠĠĠ Ġ. getResource AsStream ( resourceName ) Ġ?: Ġerror (" Can 't Ġload Ġfont Ġfrom Ġ$ resourceName ") ĊĠĠĠ Ġval Ġbytes Ġ= Ġresource . read All Bytes () ĊĠĠĠ Ġreturn ĠSk Type face . make From Data ( Data . make From Bytes ( bytes )) Ċ } Ċ Ċ private Ġenum Ġclass ĠPlatform Ġ{ ĊĠĠĠ ĠLinux , ĊĠĠĠ ĠWindows , ĊĠĠĠ ĠMacOS , ĊĠĠĠ ĠUnknown ; ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠCurrent Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= ĠSystem . getProperty (" os . name ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname . startsWith (" Linux ") Ġ-> ĠLinux ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname . startsWith (" Win ") Ġ-> ĠWindows ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ== Ġ" Mac ĠOS ĠX " Ġ-> ĠMacOS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠUnknown ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ