ניהול צבעים

‫Android 8.1 ומעלה כוללים תמיכה בניהול צבעים, שאפשר להשתמש בו כדי לספק חוויה עקבית בטכנולוגיות שונות של מסכים. אפליקציות שפועלות ב-Android יכולות לגשת לכל היכולות של מסך עם טווח צבעים רחב, כדי להפיק את המרב ממכשיר התצוגה.

בגרסאות קודמות של Android לא הייתה תמיכה בניהול צבעים, והמערכת הסתמכה על תאימות בין התוכן לבין הצגים (מטרה שלרוב נתמכת על ידי תעשיית הטלוויזיה). עם זאת, טכנולוגיות עדכניות של מסכים מאפשרות להציג טווח צבעים רחב בהרבה, ולכן התוכן הקיים לא מוצג כמו שציפינו. במכשירי Android מגרסה 8.1 ואילך, אפשר לראות תוכן עם טווח צבעים רחב מאפליקציות שמשתמשות בתצוגה עם טווח צבעים רחב (לדוגמה, דיודה אורגנית פולטת אור עם מטריצה פעילה או AMOLED, חלק ממסכי ה-LCD).

איך בודקים אם המכשיר נתמך

מכשירים עם מסכים רחבי-צבעים שמריצים Android מגרסה 8.1 ומעלה אמורים לתמוך בניהול צבעים (רחבי-צבעים). לפני שמפעילים את התכונה הזו, צריך לוודא שהמכשיר עומד בדרישות הבאות:

  • המסך של המכשיר עומד בדרישות החומרה, כולל מסך עם מאפיינים מוגדרים היטב שתומך במרחב הצבעים Display-P3. אם התצוגה לא עומדת בדרישה הזו, אל תפעילו את ניהול הצבעים. כדי להפחית את ההשפעה על CPU ו-GPU, מומלץ לתמוך ב-sRGB מורחב וב-HDR10 בצינור העיבוד של התצוגה.
  • המכשיר תומך בתהליך כיול להגדרות המקוריות שיוצר נתוני כיול (שנשמרים במכשיר) כדי להתאים את התנהגות התצוגה לשונות בתהליך הייצור. לפחות, נתוני הכיול צריכים לאפשר לתצוגה להציג בצורה מדויקת תוכן sRGB ונקודות לבנות D65 ו-D73.

אם המכשיר עומד בדרישות האלה, אפשר להפעיל בו את התכונה לניהול צבעים.

הטמעת ניהול צבע

כדי להטמיע ניהול צבעים, קודם צריך לעדכן את מנהל ההתקן של Hardware Composer 2 (HWC2) כדי להבין מצבי צבע ולהחיל את המצבים האלה על החומרה. באופן ספציפי, רכיב ה-composer של HWC2 צריך לדווח על מצבי הצבע Display-P3 ו-sRGB באמצעות HWCDisplay::GetColorModes.

לאחר מכן, מפעילים את התוספים הנדרשים של OpenGL ואת התמיכה בספרייה כדי לתרגם מרחבי צבעים של OpenGL למרחבי נתונים של HAL. תוספי OpenGL הנדרשים כוללים:

  • EGL_EXT_pixel_format_float. מאפשר לאפליקציות ליצור EGLSurfaces שניתן להציג עם רכיבי צבע של 16 ביט. עדיפות: גבוהה (הפורמט הזה הוא כנראה פורמט הפיקסלים שמוגדר כברירת מחדל באפליקציות עם תמיכה בצבעים רחבים). נדרשת תמיכה במנהל התקן.
  • EGL_KHR_gl_colorspace. אפליקציה שרוצה להשתמש ב-framebuffers של ברירת מחדל בפורמט sRGB כדי להשיג בקלות רבה יותר עיבוד sRGB למכשירי תצוגה, יכולה להשתמש בתוסף הזה כדי ליצור EGLSurfaces שייעבדו ב-sRGB על ידי הקשרים של OpenGL שתומכים ביכולת הזו. נדרשת תמיכה במנהל התקן להתנהגות sRGB.

ב-Android יש גם את התוספים האופציונליים הבאים:

  • EGL_EXT_colorspace_scrgb_linear. התוסף הזה מספק אפשרות חדשה למרחב צבעים, scRGB, שאפליקציות יכולות לבחור כשיוצרים EGLSurface. מרחב הצבעים scRGB מגדיר מרחב ליניארי שמוגדר לתצוגה עם אותה נקודה לבנה וצבעי יסוד כמו sRGB (ולכן הוא תואם לאחור ל-sRGB). הפעולה הזו לא אמורה לדרוש תמיכה במנהל התקן, ואפשר ליישם אותה ב-wrapper של Android EGL. כדי שהתוסף הזה יהיה שימושי, הוא צריך תמיכה בנקודה צפה (FP) של 16 ביט.
  • EGL_EXT_gl_colorspace_display_p3 וגם EGL_EXT_gl_colorspace_display_p3_linear. אם אתם רוצים להשתמש בפורמט Display-P3 ב-framebuffer כברירת מחדל באפליקציות כדי להשיג בקלות יותר עיבוד sRGB להצגה במכשירים, התוסף הזה מאפשר ליצור EGLSurfaces שייעבדו ב-Display-P3 על ידי הקשרים של OpenGL שתומכים ביכולת הזו. אפשר להטמיע את זה ב-wrapper של מנהל ההתקן של EGL.
  • VK_EXT_swapchain_colorspace (Vulkan). מאפשר לאפליקציות לתייג שרשראות החלפה עם מרחב הצבעים שבו הן משתמשות. כולל מספר מרחבי צבעים נפוצים כמו DCI-P3,‏ Display-P3,‏ AdobeRGB ו-BT2020.

התאמה אישית

אתם יכולים להתאים אישית את התכונה לניהול צבעים על ידי הוספת תמיכה במגוון תקני צבעים כמו DCI-P3,‏ AdobeRGB,‏ Rec709 ו-Rec2020. התאמות אישיות אחרות כוללות:

  • תמיכה בחומרה בהמרת צבעים בצינור העברת הנתונים של התצוגה. הפעלת תמיכה במספר המרות צבעים בחומרה.
  • תמיכה בהמרת צבע עצמאית בכמה שכבות (לדוגמה, חלק מהשכבות יכולות להיות sRGB ואחרות יכולות להיות sRGB מורחב, כל אחת עם צינור צבע משלה). אם מוצגים יותר ממרחב צבע אחד, צריך להמיר חלק ממרחבי הצבע למרחב הצבע של המסך. באופן אידיאלי, הטרנספורמציה הזו מסופקת על ידי מנוע התצוגה (אחרת מערכת Android צריכה לבצע קומפוזיציה של GPU).

בדיקה

כדי לבדוק את ניהול הצבעים, אפשר להשתמש במשאבים הבאים ב-opengl/tests:

  • gl2_basic היא הדגמה פשוטה של OpenGL שמבקשת מרחב צבעים Display-P3.
  • EGL_test בדיקות לתמיכה בהגדרות ובהרחבות הנדרשות (10:10:10:2 ו-FP16).
  • test_wide_color יוצר משטח באופן דומה ל-SurfaceFlinger (לדוגמה, הגדרה, מרחב צבעים ופורמט פיקסלים).

הטמעה לדוגמה

לדוגמה להטמעה, אפשר לעיין בframeworks/native. לגבי כותרות, אפשר לעיין במאמרים הבאים: