Zarządzanie kolorami

Android 8.1 i nowsze wersje obsługują zarządzanie kolorami, które może zapewnić 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ć potencjał urządzenia wyświetlającego.

W poprzednich wersjach Androida nie było obsługi zarządzania kolorami, a zamiast tego polegano na zgodności treści i wyświetlaczy (cel ten był często wspierany przez branżę telewizyjną). Jednak najnowsze technologie wyświetlania pozwalają na stosowanie wyświetlaczy o znacznie większej gamie kolorów, które nie wyświetlają istniejących treści zgodnie z oczekiwaniami. W przypadku Androida w wersji 8.1 i nowszych urządzenia z wyświetlaczem o szerokiej gamie kolorów (np. aktywna matryca organiczna dioda elektroluminescencyjna lub AMOLED, niektóre wyświetlacze LCD) mogą wyświetlać treści z aplikacji w szerokiej gamie kolorów.

Sprawdzanie, czy urządzenie jest obsługiwane

Urządzenia z wyświetlaczami o szerokiej gamie kolorów z Androidem 8.1 lub nowszym powinny obsługiwać zarządzanie kolorami (szeroka gama kolorów). Zanim włączysz tę funkcję, upewnij się, że urządzenie spełnia te wymagania:

  • Ekran urządzenia spełnia wymagania sprzętowe, w tym dobrze skalibrowany wyświetlacz obsługujący 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ń 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 dostosowania do różnic w zachowaniu wyświetlacza wynikających z procesu produkcji. Dane kalibracyjne powinny co najmniej umożliwiać dokładne 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.

Wdrażanie zarządzania kolorami

Aby wdrożyć 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ą HWCDisplay::GetColorModes.

Następnie włącz niezbędne rozszerzenia OpenGL i obsługę biblioteki, aby przetłumaczyć przestrzenie kolorów OpenGL na przestrzenie danych HAL. Wymagane rozszerzenia OpenGL to:

  • EGL_EXT_pixel_format_float. Umożliwia aplikacjom tworzenie prezentowanych obiektów EGLSurface z 16-bitowymi komponentami koloru zmiennoprzecinkowego. Priorytet: wysoki (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 uzyskać renderowanie sRGB na urządzeniach wyświetlających, to rozszerzenie umożliwia tworzenie obiektów EGLSurface, które będą renderowane w sRGB przez konteksty OpenGL obsługujące tę funkcję. Wymaga obsługi sterownika dla 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 obiektu EGLSurface. Przestrzeń kolorów scRGB definiuje liniową przestrzeń wyświetlania z tym samym punktem bieli i kolorami podstawowymi co sRGB (dzięki czemu jest wstecznie zgodna z sRGB). Nie powinno to wymagać obsługi sterownika i może zostać zaimplementowane w otoczce EGL Androida. Aby to rozszerzenie było przydatne, musi obsługiwać 16-bitowe liczby zmiennoprzecinkowe (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 buforów ramki w formacie Display-P3, aby łatwiej renderować sRGB na urządzeniach wyświetlających, to rozszerzenie umożliwia tworzenie obiektów EGLSurface, które będą renderowane w formacie 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 buforów kolorem, którego 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. Włącza obsługę wielu przekształceń kolorów w sprzęcie.
  • Obsługa niezależnej transformacji kolorów na wielu warstwach (np. niektóre warstwy mogą być w przestrzeni sRGB, a inne w rozszerzonej przestrzeni sRGB, przy czym każda z nich ma własny potok kolorów). Jeśli widocznych jest więcej niż jedna przestrzeń kolorów, niektóre z nich muszą zostać przekonwertowane na przestrzeń kolorów wyświetlacza. Najlepiej, aby tę transformację zapewniał silnik wyświetlania (w przeciwnym razie Android musi przeprowadzić kompozycję GPU).

Testowanie

Aby przetestować zarządzanie kolorami, skorzystaj z tych zasobów w opengl/tests:

  • gl2_basic to prosta wersja demonstracyjna OpenGL, która żąda przestrzeni kolorów Display-P3.
  • EGL_test testy niezbędnego rozszerzenia i obsługi konfiguracji (10:10:10:2 i FP16).
  • test_wide_color tworzy powierzchnię w taki sam sposób jak SurfaceFlinger (np. konfiguracja, przestrzeń kolorów i format pikseli).

Implementacja referencyjna

Przykładową implementację znajdziesz w sekcji frameworks/native. W przypadku nagłówków zapoznaj się z tymi artykułami: