Zarządzanie kolorami

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 i EGL_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_testtestuje 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: