Android نسخه ۸.۱ و بالاتر از مدیریت رنگ پشتیبانی میکند که میتوان از آن برای ارائه تجربهای یکسان در فناوریهای نمایشگر استفاده کرد. برنامههایی که در Android اجرا میشوند میتوانند به قابلیتهای کامل نمایشگر با گستره رنگ وسیع دسترسی داشته باشند تا از دستگاه نمایشگر بیشترین بهره را ببرند.
نسخههای قبلی Android شامل پشتیبانی از مدیریت رنگ نبودند و درعوض به سازگار بودن محتوا و نمایشگرها متکی بودند (هدفی که اغلب با کمک صنعت تلویزیون محقق میشد). بااینحال، فناوریهای نمایشگر جدید امکان نمایش طیف رنگی بسیار بزرگتری را فراهم میکنند که محتوای موجود را آنطور که انتظار میرود نمایش نمیدهند. با Android نسخه ۸.۱ و بالاتر، دستگاههایی که از نمایشگر با طیف رنگی گسترده استفاده میکنند (برای مثال، دیود نورافشان آلی ماتریس فعال یا 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 قابل ارائه با عناصر رنگ شناور ۱۶ بیتی ایجاد کنند. اولویت: بالا (انتظار میرود این قالب پیکسل پیشفرض برای برنامههای آگاه از رنگ گسترده باشد). به پشتیبانی درایور نیاز دارد. -
EGL_KHR_gl_colorspace. برای برنامههایی که میخواهند از میانگیرهای قاب پیشفرض قالب sRGB استفاده کنند تا راحتتر به پرداز زدن sRGB برای نمایش دستگاهها دست یابند، این افزونه امکان ایجاد EGLSurfaces را فراهم میکند که در sRGB توسط زمینههای OpenGL که از این قابلیت پشتیبانی میکنند پرداز زده خواهند شد. به پشتیبانی درایور برای عملکرد sRGB نیاز دارد.
Android همچنین افزونههای اختیاری زیر را ارائه میدهد:
-
EGL_EXT_colorspace_scrgb_linear. این افزونه گزینه فضای رنگ جدیدی، scRGB، ارائه میدهد که برنامهها میتوانند هنگام ایجاد EGLSurface انتخاب کنند. فضای رنگ scRGB فضای ارجاعی نمایش خطی را با همان درجه سفیدی و رنگهای اصلی sRGB تعریف میکند (و بنابراین با sRGB سازگار با نسخه قدیمی است). این کار نباید به پشتیبانی درایور نیاز داشته باشد و میتواند در پوشاننده Android EGL پیادهسازی شود. برای اینکه این افزونه مفید باشد، باید از ممیز شناور ۱۶ بیتی (FP16) پشتیبانی کند. -
EGL_EXT_gl_colorspace_display_p3وEGL_EXT_gl_colorspace_display_p3_linear. برای برنامههایی که میخواهند از قاببافرهای پیشفرض قالب Display-P3 استفاده کنند تا بهراحتی به پردازش sRGB برای نمایشگرها دست یابند، این افزونه امکان ایجاد EGLSurfaces را فراهم میکند که در Display-P3 توسط زمینههای OpenGL پشتیبانیکننده این قابلیت پردازش میشوند. این را میتوان در پوشاننده درایور EGL پیادهسازی کرد. -
VK_EXT_swapchain_colorspace(Vulkan). به برنامهها امکان میدهد زنجیرههای مبادله را با فضای رنگی که استفاده میکنند برچسبگذاری کنند. شامل تعدادی از فضاهای رنگی رایج مانند DCI-P3، Display-P3، AdobeRGB، و BT2020 میشود.
سفارشیسازی
میتوانید ویژگی مدیریت رنگ را با افزودن پشتیبانی از استانداردهای رنگ متنوعی مثل DCI-P3، AdobeRGB، Rec709، و Rec2020 سفارشیسازی کنید. دیگر سفارشیسازیها شامل:
- پشتیبانی سختافزاری برای تبدیل رنگ در خط لوله نمایشگر. پشتیبانی از تبدیلهای رنگی چندگانه در سختافزار را فعال میکند.
- پشتیبانی از تبدیل رنگ مستقل در چندین لایه (برای مثال، برخیاز لایهها میتوانند sRGB و برخی دیگر sRGB گسترشیافته باشند، که هرکدام خط لوله رنگ خود را دارند). وقتی بیشاز یک فضای رنگی قابلمشاهده باشد، برخیاز فضاهای رنگی باید به فضای رنگی نمایشگر تبدیل شوند. در حالت ایدهآل، بهترین راه برای ارائه این تبدیل استفاده از موتور نمایشگر است (درغیراینصورت Android باید ترکیب واحد پردازش گرافیکی را انجام دهد).
آزمایش
برای آزمایش مدیریت رنگ، از منابع زیر در
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.hsystem/core/include/system/graphics-base.hHAL_DATASPACE_*HAL_COLOR_MODE_*