Android 8.1 以降では、複数のディスプレイ技術にわたって一貫したエクスペリエンスを提供できるカラー マネージメントがサポートされています。Android 上で稼働するアプリは、広色域ディスプレイのすべての機能を利用できるため、ディスプレイ デバイスを最大限に活用できます。
従来の Android のリリースでは、カラー マネージメントのサポートはなく、替わりにコンテンツやディスプレイが対応していることに依存していました(これはテレビ業界が支援することが多い目標でした)。しかし、最近のディスプレイ技術では、より色域が広いディスプレイが可能となり、そのため既存のコンテンツが想定どおりに表示できません。Android 8.1 以降では、広色域のディスプレイを使用するデバイス(アクティブ マトリックス有機発光ダイオードや AMOLED、一部の LCD など)で、アプリから広色域のコンテンツを視聴できます。
デバイスのサポートを決定する
Android 8.1 以降を搭載したワイドカラー ディスプレイのデバイスは、カラー マネージメント(ワイドカラー)をサポートする必要があります。この機能を有効にする前に、デバイスが次の要件を満たしていることを確認してください。
- デバイスのディスプレイが、Display-P3 色空間をサポートすることが十分に特性評価されていることを初めとするハードウェア要件を満たしている。ディスプレイがこの要件を満たしていない場合は、カラー マネージメントを有効にしないでください。CPU と GPU の影響を軽減するには、ディスプレイ パイプラインで拡張された sRGB と HDR10 をサポートすることが推奨されます。
- デバイスが、調整データ(デバイスに格納されています)を生成する出荷時の調整プロセスをサポートして、ディスプレイの動作に関する製造時のばらつきを調整している。少なくとも、調整データは、sRGB コンテンツと D65 および D73 のホワイト ポイントを正確に表示できるようにする必要があります。
上記の要件が満たされている場合、デバイスのカラー マネージメント機能を有効にできます。
カラー マネージメントを実装する
カラー マネージメントを実装するには、まず Hardware Composer 2(HWC2)ドライバを更新してカラーモードについて把握し、これらのモードをハードウェアに適用します。具体的には、HWC2 コンポーザーは、HWCDisplay::GetColorModes
を使用して Display-P3 と sRGB のカラーモードを報告する必要があります。
次に、必要な OpenGL 拡張機能とライブラリ サポートを有効にして、OpenGL 色空間を HAL データスペースに変換します。必要な OpenGL 拡張機能は次のとおりです。
-
EGL_EXT_pixel_format_float
: 16 ビット浮動小数点の色の構成を使用することで、アプリが表示可能な EGLSurface を作成できるようにします。優先度: 高(ワイドカラー対応アプリのデフォルトのピクセル形式を想定)。ドライバのサポートが必要です。 -
EGL_KHR_gl_colorspace
: ディスプレイ デバイスに対する sRGB レンダリングを簡単に行えるように sRGB 形式のデフォルトのフレームバッファを使用するアプリでは、この拡張機能により、その機能をサポートする OpenGL コンテキストで sRGB にレンダリングされる EGLSurface を作成できます。sRGB の動作に対するドライバのサポートが必要です。
Android では、次のオプションの拡張機能も提供しています。
-
EGL_EXT_colorspace_scrgb_linear
: この拡張機能では、EGLSurface の作成時にアプリが選択できる新しい色空間オプション scRGB が提供されます。scRGB 色空間は、sRGB と同じホワイト ポイントと原色の線形表示参照空間を定義します(したがって sRGB と下位互換性があります)。ドライバのサポートは不要で、Android EGL ラッパーで実装できます。有効活用するためには、この拡張機能では 16 ビット浮動小数点(FP16)のサポートが必要です。 -
EGL_EXT_gl_colorspace_display_p3
とEGL_EXT_gl_colorspace_display_p3_linear
: ディスプレイ デバイスに対する sRGB レンダリングを簡単に行えるように Display-P3 形式のデフォルトのフレームバッファを使用するアプリでは、この拡張機能により、その機能をサポートする OpenGL コンテキストで Display-P3 にレンダリングされる EGLSurface を作成できます。これは、EGL ドライバのラッパーで実装できます。 -
VK_EXT_swapchain_colorspace
(Vulkan): アプリが、使用している色空間にスワップ チェーンをタグ付けできるようにします。DCI-P3、Display-P3、AdobeRGB、BT2020 などの一般的な色空間が含まれます。
カスタマイズ
DCI-P3、AdobeRGB、Rec709、Rec2020 などのさまざまな色標準をサポートすることで、カラー マネージメント機能をカスタマイズできます。他にも次のようなカスタマイズを行えます。
- ディスプレイ パイプラインの色変換のハードウェア サポート。ハードウェアでの複数の色変換のサポートを有効にします。
- 複数レイヤでの独立した色変換のサポート(たとえば、一部のレイヤを sRGB、その他を extended-sRGB にし、それぞれ独自のカラー パイプラインを持たせることができます)。複数の色空間が表示される場合、一部の色空間はディスプレイの色空間に変換する必要があります。この変換はディスプレイ エンジンから提供されるのが理想的です。そうでない場合は、Android が GPU 合成を実行する必要があります。
テスト
カラー マネージメントをテストするには、opengl/tests
の次のリソースを使用します。
gl2_basic
: Display-P3 色空間を要求するシンプルな OpenGL デモです。-
EGL_test
: 必要な拡張機能と構成のサポートをテストします(10:10:10:2 および FP16)。 test_wide_color
: SurfaceFlinger と同じ方法でサーフェスを作成します(例: 構成、色空間、ピクセル形式)。
リファレンス実装
リファレンス実装については、frameworks/native
を参照してください。ヘッダーについては、以下を参照してください。
system/core/include/system/graphics.h
system/core/include/system/graphics-base.h
HAL_DATASPACE_*
HAL_COLOR_MODE_*