Android 8.1 i nowsze wersje obsługują zarządzanie kolorami, co pozwala zapewnić spójne wrażenia w przypadku różnych technologii wyświetlania. Aplikacje działające na Androidzie mogą korzystać z pełnych możliwości wyświetlacza o szerokim zakresie, aby w pełni wykorzystać możliwości urządzenia wyświetlającego.
Wcześniejsze wersje Androida nie obsługiwały zarządzania kolorami, lecz polegały na kompatybilności treści i wyświetlaczy (co często było możliwe dzięki branży telewizyjnej). Jednak najnowsze technologie wyświetlania umożliwiają tworzenie wyświetlaczy o znacznie szerszym zakresie, które nie wyświetlają istniejących treści zgodnie z oczekiwaniami. W Androidzie 8.1 i nowszych wersjach urządzenia korzystające z wyświetlaczy o szerokim zakresie (np. z diodami elektroluminescencyjnymi z aktywną matrycą lub AMOLED, niektóre wyświetlacze LCD) mogą wyświetlać treści z aplikacji w szerokim zakresie.
Określanie obsługi urządzeń
Urządzenia z szerokością kolorów obsługujące Androida w wersji 8.1 lub nowszej powinny obsługiwać zarządzanie kolorami (szerokie kolory). Zanim włączysz tę funkcję, sprawdź, czy urządzenie spełnia te wymagania:
- Ekran urządzenia spełnia wymagania sprzętowe, w tym dobrze zdefiniowany wyświetlacz obsługujący przestrzeń barw Display-P3. Jeśli wyświetlacz nie spełnia tego wymagania, nie włączaj zarządzania kolorami. Aby zmniejszyć wpływ na procesor i procesor graficzny, zaleca się obsługę rozszerzonego sRGB i HDR10 w przesyłce danych do wyświetlacza.
- Urządzenie obsługuje proces kalibracji fabrycznej, który generuje dane kalibracji (zapisywane na urządzeniu) w celu dostosowania wyświetlacza do różnic w zachowaniu wynikających z różnic produkcyjnych. Dane kalibracji powinny co najmniej umożliwiać wyświetlanie treści sRGB oraz punktów bieli D65 i D73.
Jeśli te wymagania zostaną spełnione, możesz włączyć funkcję zarządzania kolorami na urządzeniu.
Wdrażanie zarządzania kolorami
Aby wdrożyć zarządzanie kolorami, najpierw zaktualizuj sterownik Hardware Composer 2 (HWC2), aby poznać tryby kolorów i zastosować je na sprzęcie.
W szczególności kompozytor HWC2 musi zgłaszać tryby kolorów Display-P3 i sRGB za pomocą HWCDisplay::GetColorModes
.
Następnie włącz niezbędne rozszerzenia OpenGL i obsługę bibliotek, aby przetłumaczyć przestrzenie kolorów OpenGL na przestrzenie danych HAL. Wymagane rozszerzenia OpenGL:
-
EGL_EXT_pixel_format_float
. Umożliwia aplikacjom tworzenie prezentowalnych powierzchni EGL z 16-bitowymi komponentami kolorów zmiennoprzecinkowych. Priorytet: wysoki (prawdopodobnie jest to domyślny format pikselów w przypadku aplikacji obsługujących szeroką paletę kolorów). Wymaga obsługi sterownika. -
EGL_KHR_gl_colorspace
. W przypadku aplikacji, które chcą używać domyślnych framebufferów w formacie sRGB, aby łatwiej uzyskać renderowanie sRGB na urządzeniach wyświetlających, to rozszerzenie umożliwia tworzenie powierzchni EGL, które będą renderowane w formacie sRGB przez konteksty OpenGL obsługujące tę funkcję. Wymaga obsługi sterownika dla 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 EGLSurface. Przestrzeń kolorów scRGB definiuje liniową przestrzeń referencyjną z tymi samymi punktami białym i kolorami podstawowymi co sRGB (a zatem jest wstecznie zgodna z sRGB). Nie powinno to wymagać obsługi sterownika i można to zaimplementować w opakowaniu EGL dla Androida. Aby to rozszerzenie było przydatne, wymaga obsługi 16-bitowej liczby zmiennoprzecinkowej (FP16). -
EGL_EXT_gl_colorspace_display_p3
iEGL_EXT_gl_colorspace_display_p3_linear
. W przypadku aplikacji, które chcą używać domyślnych framebufferów w formacie Display P3, aby łatwiej uzyskać renderowanie sRGB na urządzeniach wyświetlających, to rozszerzenie umożliwia tworzenie EGLSurfaces, które będą renderowane w formacie Display P3 przez konteksty OpenGL obsługujące tę funkcję. Można to zaimplementować w opakowaniu sterownika EGL. -
VK_EXT_swapchain_colorspace
(Vulkan). Umożliwia aplikacjom oznaczanie łańcuchów za pomocą tagów z przestrzenią barw, której używają. Obejmuje wiele popularnych przestrzeni kolorów, takich jak DCI-P3, Display-P3, AdobeRGB i BT2020.
Dostosowywanie
Funkcję zarządzania kolorami możesz dostosować, włączając obsługę różnych standardów kolorów, takich jak DCI-P3, AdobeRGB, Rec709 i Rec2020. Inne opcje dostosowywania:
- Wsparcie sprzętowe dla konwersji kolorów w przepływie danych wyświetlacza. Włącza obsługę wielu przekształceń kolorów na sprzęcie.
- Obsługa niezależnej transformacji kolorów na wielu warstwach (na przykład niektóre warstwy mogą być w sRGB, a inne w rozszerzonym sRGB, każda z własną ścieżką kolorów). Jeśli widocznych jest więcej niż 1 przestrzeń kolorów, niektóre z nich trzeba przekonwertować na przestrzeń kolorów wyświetlacza. W idealnej sytuacji tę transformację najlepiej zapewnia silnik wyświetlania (w przeciwnym razie Android musi wykonać kompozycję na procesorze graficznym).
Testowanie
Aby przetestować zarządzanie kolorami, skorzystaj z tych zasobów w opengl/tests
:
gl2_basic
to proste demo OpenGL, które wymaga przestrzeni barw Display-P3.-
EGL_test
testuje wymagane rozszerzenia i obsługę konfiguracji (10:10:10:2 i FP16). test_wide_color
tworzy powierzchnię w taki sam sposób jak SurfaceFlinger (np. konfiguracja, przestrzeń barw i format pikseli).
Implementacja referencyjna
Przykładową implementację znajdziesz w frameworks/native
. Więcej informacji o nagłówkach:
system/core/include/system/graphics.h
system/core/include/system/graphics-base.h
HAL_DATASPACE_*
HAL_COLOR_MODE_*