@@ -30,6 +30,14 @@ def __init__(
3030
3131class DynamicColor :
3232 hct_cache = dict [DynamicScheme , Hct ]
33+ name = str
34+ palette = None
35+ tone = int
36+ is_background = bool
37+ background = None
38+ second_background = None
39+ contrast_curve = None
40+ tone_delta_pair = None
3341
3442 def __init__ (
3543 self ,
@@ -217,153 +225,6 @@ def get_tone(self, scheme):
217225
218226 return answer
219227
220- @staticmethod
221- def get_argb_static (scheme ):
222- return DynamicColor .get_hct_static (scheme ).to_int ()
223-
224- @staticmethod
225- def get_hct_static (scheme ):
226- cached_answer = DynamicColor .hct_cache_static .get (scheme )
227- if cached_answer is not None :
228- return cached_answer
229-
230- tone = DynamicColor .get_tone_static (scheme )
231- answer = DynamicColor .palette_static (scheme ).get_hct (tone )
232- if len (DynamicColor .hct_cache_static ) > 4 :
233- DynamicColor .hct_cache_static .clear ()
234- DynamicColor .hct_cache_static [scheme ] = answer
235- return answer
236-
237- @staticmethod
238- def get_tone_static (scheme ):
239- decreasing_contrast = scheme .contrast_level < 0
240-
241- if DynamicColor .tone_delta_pair_static :
242- tone_delta_pair = DynamicColor .tone_delta_pair_static (scheme )
243- role_a , role_b = tone_delta_pair .role_a , tone_delta_pair .role_b
244- delta , polarity , stay_together = (
245- tone_delta_pair .delta ,
246- tone_delta_pair .polarity ,
247- tone_delta_pair .stay_together ,
248- )
249-
250- bg = DynamicColor .background_static (scheme )
251- bg_tone = bg .get_tone (scheme )
252-
253- a_is_nearer = (
254- polarity == "nearer"
255- or (polarity == "lighter" and not scheme .is_dark )
256- or (polarity == "darker" and scheme .is_dark )
257- )
258- nearer , farther = (role_a , role_b ) if a_is_nearer else (role_b , role_a )
259- expansion_dir = 1 if scheme .is_dark else - 1
260-
261- n_contrast = nearer .contrast_curve .get (scheme .contrast_level )
262- f_contrast = farther .contrast_curve .get (scheme .contrast_level )
263-
264- n_initial_tone = nearer .get_tone (scheme )
265- n_tone = (
266- n_initial_tone
267- if Contrast .ratio_of_tones (bg_tone , n_initial_tone ) >= n_contrast
268- else DynamicColor .foreground_tone (bg_tone , n_contrast )
269- )
270-
271- f_initial_tone = farther .get_tone (scheme )
272- f_tone = (
273- f_initial_tone
274- if Contrast .ratio_of_tones (bg_tone , f_initial_tone ) >= f_contrast
275- else DynamicColor .foreground_tone (bg_tone , f_contrast )
276- )
277-
278- if decreasing_contrast :
279- n_tone = DynamicColor .foreground_tone (bg_tone , n_contrast )
280- f_tone = DynamicColor .foreground_tone (bg_tone , f_contrast )
281-
282- if (f_tone - n_tone ) * expansion_dir >= delta :
283- pass
284- else :
285- f_tone = (
286- min (max (n_tone + delta * expansion_dir , 0 ), 100 )
287- if (f_tone - n_tone ) * expansion_dir >= delta
288- else min (max (f_tone - delta * expansion_dir , 0 ), 100 )
289- )
290-
291- if 50 <= n_tone < 60 :
292- if expansion_dir > 0 :
293- n_tone , f_tone = 60 , max (f_tone , n_tone + delta * expansion_dir )
294- else :
295- n_tone , f_tone = 49 , min (f_tone , n_tone + delta * expansion_dir )
296- elif 50 <= f_tone < 60 :
297- if stay_together :
298- if expansion_dir > 0 :
299- n_tone , f_tone = 60 , max (f_tone , n_tone + delta * expansion_dir )
300- else :
301- n_tone , f_tone = 49 , min (f_tone , n_tone + delta * expansion_dir )
302- else :
303- if expansion_dir > 0 :
304- f_tone = 60
305- else :
306- f_tone = 49
307-
308- return n_tone if DynamicColor .name_static == nearer .name else f_tone
309-
310- else :
311- answer = DynamicColor .get_tone_static (scheme )
312-
313- if DynamicColor .background_static is None :
314- return answer
315-
316- bg_tone = DynamicColor .background_static (scheme ).get_tone (scheme )
317- desired_ratio = DynamicColor .contrast_curve_static .get (
318- scheme .contrast_level
319- )
320-
321- if Contrast .ratio_of_tones (bg_tone , answer ) >= desired_ratio :
322- pass
323- else :
324- answer = DynamicColor .foreground_tone (bg_tone , desired_ratio )
325-
326- if decreasing_contrast :
327- answer = DynamicColor .foreground_tone (bg_tone , desired_ratio )
328-
329- if DynamicColor .is_background_static and 50 <= answer < 60 :
330- answer = (
331- 49 if Contrast .ratio_of_tones (49 , bg_tone ) >= desired_ratio else 60
332- )
333-
334- if DynamicColor .second_background_static :
335- bg1 , bg2 = (
336- DynamicColor .background_static ,
337- DynamicColor .second_background_static ,
338- )
339- bg_tone1 , bg_tone2 = bg1 (scheme ).get_tone (scheme ), bg2 (scheme ).get_tone (
340- scheme
341- )
342- upper , lower = max (bg_tone1 , bg_tone2 ), min (bg_tone1 , bg_tone2 )
343-
344- if (
345- Contrast .ratio_of_tones (upper , answer ) >= desired_ratio
346- and Contrast .ratio_of_tones (lower , answer ) >= desired_ratio
347- ):
348- return answer
349-
350- light_option = Contrast .lighter (upper , desired_ratio )
351- dark_option = Contrast .darker (lower , desired_ratio )
352- availables = [light_option ] if light_option != - 1 else []
353- if dark_option != - 1 :
354- availables .append (dark_option )
355-
356- prefers_light = DynamicColor .tone_prefers_light_foreground (
357- bg_tone1
358- ) or DynamicColor .tone_prefers_light_foreground (bg_tone2 )
359- return (
360- light_option
361- if prefers_light and (light_option == - 1 or dark_option == - 1 )
362- else dark_option
363- )
364-
365- return answer
366-
367228 @staticmethod
368229 def foreground_tone (bg_tone , ratio ):
369230 lighter_tone = Contrast .lighter_unsafe (bg_tone , ratio )
0 commit comments