ב-Android מגרסה 8.1 ואילך יש תמיכה בניהול צבעים, שאפשר להשתמש בה כדי לספק חוויה עקבית בטכנולוגיות מסך שונות. אפליקציות שפועלות ב-Android יכולות לגשת ליכולות המלאות של מסך עם מגוון רחב של צבעים כדי להפיק את המקסימום מהמסך.
גרסאות קודמות של Android לא כללו תמיכה בניהול צבעים, ובמקום זאת הסתמכו על תאימות בין התוכן למסכים (מטרה שענף הטלוויזיה עוזר להשיג לעיתים קרובות). עם זאת, טכנולוגיות התצוגה החדשות מאפשרות להציג צבעים רחבים יותר, אבל התוכן הקיים לא מוצג בהם כצפוי. במכשירים עם Android מגרסה 8.1 ואילך, שמשתמשים במסך עם מגוון רחב של צבעים (לדוגמה, נורית LED אורגנית במטריצה פעילה או 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 ביט. תעדוף: גבוה (זהו פורמט הפיקסלים שמוגדר כברירת מחדל באפליקציות שתומכות בצבעים רחבים). נדרשת תמיכה בדרייבר. -
EGL_KHR_gl_colorspace
. באפליקציות שרוצות להשתמש בפורמט ברירת המחדל של framebuffers ב-sRGB כדי להשיג בקלות רבה יותר עיבוד ב-sRGB למכשירי תצוגה, התוסף הזה מאפשר ליצור EGLSurfaces שיעובדו ב-sRGB על ידי הקשרי OpenGL שתומכים ביכולת הזו. נדרש מנהל התקן עם תמיכה בהתנהגות sRGB.
ב-Android יש גם את התוספים האופציונליים הבאים:
-
EGL_EXT_colorspace_scrgb_linear
. התוסף הזה מספק אפשרות חדשה למרחב צבעים, scRGB, שאפליקציות יכולות לבחור כשיוצרים EGLSurface. מרחב הצבעים scRGB מגדיר מרחב לינארי שמתייחס לתצוגה, עם אותו נקודת לבן וצבעי יסוד כמו ב-sRGB (ולכן הוא תואם לאחור ל-sRGB). הפעולה הזו לא אמורה לדרוש תמיכה במנהל התקן, וניתן להטמיע אותה ב-EGL wrapper של Android. כדי להשתמש בתוסף הזה, צריך תמיכה בנקודת צפה של 16 ביט (FP16). -
EGL_EXT_gl_colorspace_display_p3
ו-EGL_EXT_gl_colorspace_display_p3_linear
. באפליקציות שרוצות להשתמש בפורמט ברירת המחדל של framebuffers ב-Display-P3 כדי לבצע עיבוד גרפי של sRGB למכשירי תצוגה בקלות רבה יותר, התוסף הזה מאפשר ליצור EGLSurfaces שיועברו לעיבוד גרפי ב-Display-P3 על ידי הקשרי OpenGL שתומכים ביכולת הזו. אפשר להטמיע את זה ב-EGL driver wrapper. -
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
. למידע נוסף על כותרות, אפשר לעיין במאמרים הבאים:
system/core/include/system/graphics.h
system/core/include/system/graphics-base.h
HAL_DATASPACE_*
HAL_COLOR_MODE_*