Android 8.1 i nowsze wersje obsługują zarządzanie kolorami, dzięki czemu można zapewnić spójne wrażenia w przypadku różnych technologii wyświetlania. Aplikacje działające w systemie Android mogą uzyskać dostęp do pełnych możliwości wyświetlacza o szerokiej gamie barw, aby w pełni wykorzystać możliwości urządzenia wyświetlającego.
Poprzednie wersje Androida nie obejmowały obsługi zarządzania kolorami i zamiast tego opierały się na zgodności treści i wyświetlaczy (cel często wspierany przez branżę telewizyjną). Jednak najnowsze technologie wyświetlania pozwalają na znacznie większą gamę wyświetlaczy, które nie wyświetlają istniejącej treści zgodnie z oczekiwaniami. W przypadku Androida 8.1 lub nowszego urządzenia korzystające z wyświetlaczy o szerokiej gamie barw (na przykład organicznej diody elektroluminescencyjnej z aktywną matrycą lub AMOLED, niektóre wyświetlacze LCD) mogą wyświetlać treści o szerokiej gamie kolorów z aplikacji.
Określ obsługę urządzenia
Urządzenia z szerokokolorowymi wyświetlaczami z systemem Android 8.1 lub nowszym powinny obsługiwać zarządzanie kolorami (szeroki kolor). Przed włączeniem tej funkcji upewnij się, że urządzenie spełnia następujące wymagania:
- Wyświetlacz urządzenia spełnia wymagania sprzętowe, które obejmują dobrze scharakteryzowany 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ć wpływ procesora i karty graficznej, pożądana jest obsługa rozszerzonych standardów sRGB i HDR10 w potoku wyświetlania.
- Urządzenie obsługuje fabryczny proces kalibracji, który generuje dane kalibracyjne (przechowywane w urządzeniu) w celu dostosowania do odchyleń produkcyjnych w zachowaniu wyświetlacza. Dane kalibracyjne powinny co najmniej umożliwiać dokładne wyświetlanie zawartości sRGB oraz punktów bieli D65 i D73 na wyświetlaczu.
Jeśli te wymagania są spełnione, możesz włączyć funkcję zarządzania kolorami w urządzeniu.
Wdrażaj zarządzanie kolorami
Aby zaimplementować zarządzanie kolorami, najpierw zaktualizuj sterownik Hardware Composer 2 (HWC2) , aby poznać tryby kolorów i zastosować je do sprzętu. W szczególności kompozytor HWC2 musi zgłosić 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 obejmują:
-
EGL_EXT_pixel_format_float
. Umożliwia aplikacjom tworzenie reprezentacyjnych powierzchni EGLSurface z 16-bitowymi składnikami kolorów zmiennoprzecinkowych. Priorytet: wysoki (spodziewaj się, że jest to domyślny format pikseli dla aplikacji obsługujących szeroką gamę kolorów). Wymaga wsparcia ze strony kierowcy. -
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 EGLSurfaces, 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 także następujące opcjonalne rozszerzenia:
-
EGL_EXT_colorspace_scrgb_linear
. To rozszerzenie zapewnia nową opcję przestrzeni kolorów, scRGB, którą aplikacje mogą wybrać podczas tworzenia EGLSurface. Przestrzeń kolorów scRGB definiuje przestrzeń odniesienia wyświetlacza liniowego z tym samym punktem bieli i kolorami podstawowymi co sRGB (a zatem jest wstecznie kompatybilna z sRGB). Nie powinno to wymagać obsługi sterowników i można je zaimplementować w opakowaniu Androida EGL. Aby rozszerzenie to było przydatne, wymaga obsługi 16-bitowego formatu zmiennoprzecinkowego (FP16). -
EGL_EXT_gl_colorspace_display_p3
iEGL_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 uzyskać renderowanie sRGB na urządzeniach wyświetlających, to rozszerzenie umożliwia tworzenie EGLSurfaces, które będą renderowane w 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 wymiany używaną przestrzenią kolorów. Obejmuje wiele popularnych przestrzeni kolorów, takich jak DCI-P3, Display-P3, AdobeRGB i BT2020.
Dostosowywanie
Funkcję zarządzania kolorami można dostosować, włączając obsługę różnych standardów kolorów, takich jak DCI-P3, AdobeRGB, Rec709 i Rec2020. Inne dostosowania obejmują:
- Sprzętowa obsługa konwersji kolorów w potoku wyświetlania. Umożliwia obsługę wielu transformacji kolorów w sprzęcie.
- Obsługa niezależnej transformacji kolorów na wielu warstwach (na przykład niektóre warstwy mogą być w formacie sRGB, a inne w rozszerzonym sRGB, każda z własnym potokiem kolorów). Jeśli widoczna jest więcej niż jedna przestrzeń kolorów, niektóre przestrzenie kolorów należy przekonwertować na przestrzeń kolorów wyświetlacza. W idealnym przypadku tę transformację najlepiej zapewnia silnik wyświetlania (w przeciwnym razie Android musi wykonać kompozycję GPU).
Testowanie
Aby przetestować zarządzanie kolorami, użyj następujących zasobów w opengl/tests
:
-
gl2_basic
to proste demo OpenGL, które żąda przestrzeni kolorów Display-P3. -
EGL_test
testuje niezbędną obsługę rozszerzeń i konfiguracji (10:10:10:2 i FP16). -
test_wide_color
tworzy powierzchnię w taki sam sposób jak SurfaceFlinger (na przykład konfiguracja, przestrzeń kolorów i format pikseli).
Implementacja referencyjna
Aby zapoznać się z implementacją referencyjną, zobacz frameworks/native
. Aby zapoznać się z nagłówkami, zobacz:
-
system/core/include/system/graphics.h
-
system/core/include/system/graphics-base.h
-
HAL_DATASPACE_*
-
HAL_COLOR_MODE_*
-