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) כדי להבין מצבי צבע ולהחיל את המצבים האלה על החומרה.
באופן ספציפי, כלי ההלחנה HWC2 צריך לדווח על מצבי הצבע Display-P3 ו-sRGB
באמצעות HWCDisplay::GetColorModes
.
לאחר מכן, מפעילים את התמיכה בספריות ובתוספי OpenGL הנדרשים כדי לתרגם מרחבי צבעים של OpenGL למרחבי נתונים של HAL. תוספי OpenGL הנדרשים כוללים:
-
EGL_EXT_pixel_format_float
. מאפשר לאפליקציות ליצור EGLSurfaces שניתן להציג עם רכיבי צבע של 16 ביט float. עדיפות: גבוהה (הפורמט הזה הוא פורמט הפיקסלים שמוגדר כברירת מחדל באפליקציות עם תמיכה בצבעים רחבים). נדרשת תמיכה במנהל התקן. -
EGL_KHR_gl_colorspace
. אפליקציות שרוצות להשתמש בפורמט sRGB של מאגרי מסגרות ברירת מחדל כדי להשיג בקלות רבה יותר עיבוד sRGB להצגה במכשירי תצוגה, יכולות להשתמש בתוסף הזה כדי ליצור EGLSurfaces שייעבדו ב-sRGB על ידי הקשרים של OpenGL שתומכים ביכולת הזו. נדרשת תמיכה במנהל התקן להתנהגות sRGB.
ב-Android יש גם את התוספים האופציונליים הבאים:
-
EGL_EXT_colorspace_scrgb_linear
. התוסף הזה מספק אפשרות חדשה למרחב צבעים, scRGB, שאפליקציות יכולות לבחור כשיוצרים EGLSurface. מרחב הצבעים scRGB מגדיר מרחב ליניארי שמתייחס לתצוגה עם אותה נקודה לבנה וצבעי יסוד כמו sRGB (ולכן יש תאימות לאחור עם sRGB). הפעולה הזו לא אמורה לדרוש תמיכה במנהל התקן, ואפשר להטמיע אותה ב-wrapper של Android EGL. כדי שהתוסף הזה יהיה שימושי, הוא צריך תמיכה בנקודה צפה (FP16) של 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 ואחרות extended-sRGB, לכל אחת עם צינור צבעים משלה). אם מוצגים יותר ממרחב צבע אחד, צריך להמיר חלק ממרחבי הצבע למרחב הצבע של המסך. באופן אידיאלי, הטרנספורמציה הזו מסופקת על ידי מנוע התצוגה (אחרת מערכת Android צריכה לבצע קומפוזיציה של GPU).
בדיקה
כדי לבדוק את ניהול הצבעים, אפשר להשתמש במשאבים הבאים ב-opengl/tests
:
-
gl2_basic
היא הדגמה פשוטה של OpenGL שמבקשת מרחב צבעים Display-P3. -
EGL_test
בדיקות לתמיכה בהגדרות ובהרחבות הנדרשות (10:10:10:2 ו-FP16). -
test_wide_color
יוצרת משטח באופן דומה ל-SurfaceFlinger (לדוגמה, הגדרה, מרחב צבעים ופורמט פיקסלים).
הטמעה לדוגמה
לדוגמה להטמעה, אפשר לעיין בframeworks/native
. לגבי כותרות, אפשר לעיין במאמרים הבאים:
system/core/include/system/graphics.h
system/core/include/system/graphics-base.h
HAL_DATASPACE_*
HAL_COLOR_MODE_*