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