Android 8.1 i nowsze wersje obsługują zarządzanie kolorami, które zapewnia spójne wrażenia na różnych technologiach wyświetlania. Aplikacje działające na Androidzie mogą korzystać z pełnych możliwości wyświetlacza o szerokiej gamie kolorów, aby w pełni wykorzystać urządzenie wyświetlające.
Poprzednie wersje Androida nie obsługiwały zarządzania kolorami i zamiast tego opierały się na zgodności treści i wyświetlaczy (co często ułatwiała branża telewizyjna). Jednak najnowsze technologie wyświetlania umożliwiają stosowanie wyświetlaczy o znacznie szerszej gamie kolorów, które nie wyświetlają istniejących treści zgodnie z oczekiwaniami. W Androidzie 8.1 i nowszych wersjach urządzenia, które korzystają z wyświetlacza o szerokiej gamie kolorów (np. aktywnej matrycy organicznych diod elektroluminescencyjnych lub AMOLED, niektórych wyświetlaczy LCD), mogą wyświetlać treści o szerokiej gamie kolorów z aplikacji.
Sprawdzanie obsługi urządzenia
Urządzenia z wyświetlaczami o szerokiej gamie kolorów, na których działa Android 8.1 lub nowszy, powinny obsługiwać zarządzanie kolorami (szeroka gama kolorów). Zanim włączysz tę funkcję, upewnij się, że urządzenie spełnia te wymagania:
- Wyświetlacz urządzenia spełnia wymagania sprzętowe, w tym ma dobrze scharakteryzowany wyświetlacz, który obsługuje przestrzeń kolorów Display-P3. Jeśli wyświetlacz nie spełnia tego wymagania, nie włączaj zarządzania kolorami. Aby zmniejszyć obciążenie procesora i procesora graficznego, warto obsługiwać rozszerzoną przestrzeń kolorów sRGB i HDR10 w potoku wyświetlania.
- Urządzenie obsługuje proces kalibracji fabrycznej, który generuje dane kalibracyjne (przechowywane na urządzeniu) w celu skorygowania różnic w zachowaniu wyświetlacza wynikających z procesu produkcji. Dane kalibracyjne powinny co najmniej umożliwiać wyświetlanie treści sRGB oraz punktów bieli D65 i D73.
Jeśli te wymagania są spełnione, możesz włączyć funkcję zarządzania kolorami na urządzeniu.
Implementowanie zarządzania kolorami
Aby zaimplementować zarządzanie kolorami, najpierw zaktualizuj sterownik
Hardware Composer 2 (HWC2)
, aby obsługiwał tryby kolorów i stosował je do sprzętu.
W szczególności kompozytor HWC2 musi zgłaszać tryby kolorów Display-P3 i sRGB za pomocą funkcji HWCDisplay::GetColorModes.
Następnie włącz niezbędne rozszerzenia OpenGL i obsługę biblioteki, aby tłumaczyć przestrzenie kolorów OpenGL na przestrzenie danych HAL. Wymagane rozszerzenia OpenGL:
-
EGL_EXT_pixel_format_float. Umożliwia aplikacjom tworzenie prezentowanych powierzchni EGLSurface z 16-bitowymi komponentami kolorów zmiennoprzecinkowych. Priorytet: wysoki (oczekuje się, że jest to domyślny format pikseli w przypadku aplikacji obsługujących szeroką gamę kolorów). Wymaga obsługi sterownika. -
EGL_KHR_gl_colorspace. W przypadku aplikacji, które chcą używać domyślnych buforów ramki w formacie sRGB, aby łatwiej renderować sRGB na urządzeniach wyświetlających, to rozszerzenie umożliwia tworzenie powierzchni EGLSurface, które będą renderowane w sRGB przez konteksty OpenGL obsługujące tę funkcję. Wymaga obsługi sterownika w zakresie zachowania sRGB.
Android udostępnia też te opcjonalne rozszerzenia:
-
EGL_EXT_colorspace_scrgb_linear. To rozszerzenie udostępnia nową opcję przestrzeni kolorów, scRGB, którą aplikacje mogą wybrać podczas tworzenia powierzchni EGLSurface. Przestrzeń kolorów scRGB definiuje liniową przestrzeń wyświetlania z tym samym punktem bieli i podstawowymi kolorami co sRGB (dzięki czemu jest wstecznie zgodna z sRGB). Nie powinno to wymagać obsługi sterownika i można to zaimplementować w otoczce EGL Androida. Aby to rozszerzenie było przydatne, wymaga obsługi 16-bitowej liczby zmiennoprzecinkowej (FP16). -
EGL_EXT_gl_colorspace_display_p3iEGL_EXT_gl_colorspace_display_p3_linear. W przypadku aplikacji, które chcą używać domyślnych buforów ramki w formacie Display-P3, aby łatwiej renderować sRGB na urządzeniach wyświetlających, to rozszerzenie umożliwia tworzenie powierzchni EGLSurface, które będą renderowane w Display-P3 przez konteksty OpenGL obsługujące tę funkcję. Można to zaimplementować w otoczce sterownika EGL. -
VK_EXT_swapchain_colorspace(Vulkan). Umożliwia aplikacjom oznaczanie łańcuchów wymiany przestrzenią kolorów, której używają. Obejmuje wiele popularnych przestrzeni kolorów, takich jak DCI-P3, Display-P3, AdobeRGB i BT2020.
Dostosowywanie
Możesz dostosować funkcję zarządzania kolorami, dodając obsługę różnych standardów kolorów, takich jak DCI-P3, AdobeRGB, Rec709 i Rec2020. Inne dostosowania:
- Obsługa sprzętowa konwersji kolorów w potoku wyświetlania. Umożliwia obsługę wielu przekształceń kolorów w sprzęcie.
- Obsługa niezależnego przekształcenia kolorów na wielu warstwach (np. niektóre warstwy mogą być sRGB, a inne rozszerzone sRGB, każda z własnym potokiem kolorów). Gdy widoczna jest więcej niż 1 przestrzeń kolorów, niektóre przestrzenie kolorów muszą zostać przekonwertowane na przestrzeń kolorów wyświetlacza. Najlepiej, aby to przekształcenie było wykonywane przez silnik wyświetlania (w przeciwnym razie Android musi wykonać kompozycję GPU).
Testowanie
Aby przetestować zarządzanie kolorami, użyj tych zasobów w opengl/tests:
gl2_basicto proste demo OpenGL, które prosi o przestrzeń kolorów Display-P3.-
EGL_testsprawdza niezbędne rozszerzenie i obsługę konfiguracji (10:10:10:2 i FP16). test_wide_colortworzy powierzchnię w taki sam sposób jak SurfaceFlinger (np. konfiguracja, przestrzeń kolorów i format pikseli).
Implementacja referencyjna
Implementację referencyjną znajdziesz w frameworks/native. Nagłówki znajdziesz w tych plikach:
system/core/include/system/graphics.hsystem/core/include/system/graphics-base.hHAL_DATASPACE_*HAL_COLOR_MODE_*