Implement encoding alpha8 gainmaps
Fixes: 269746611 Test: atest android.graphics.cts.GainmapTest Change-Id: I292a077ec75e7af8f8e8756fd0f36869415307c1
This commit is contained in:
@@ -2001,7 +2001,7 @@ public final class Bitmap implements Parcelable {
|
||||
checkPixelAccess(x, y);
|
||||
|
||||
final ColorSpace cs = getColorSpace();
|
||||
if (cs.equals(ColorSpace.get(ColorSpace.Named.SRGB))) {
|
||||
if (cs == null || cs.equals(ColorSpace.get(ColorSpace.Named.SRGB))) {
|
||||
return Color.valueOf(nativeGetPixel(mNativePtr, x, y));
|
||||
}
|
||||
// The returned value is in kRGBA_F16_SkColorType, which is packed as
|
||||
|
||||
@@ -463,6 +463,13 @@ bool Bitmap::compress(JavaCompressFormat format, int32_t quality, SkWStream* str
|
||||
if (hasGainmap() && format == JavaCompressFormat::Jpeg) {
|
||||
SkBitmap baseBitmap = getSkBitmap();
|
||||
SkBitmap gainmapBitmap = gainmap()->bitmap->getSkBitmap();
|
||||
if (gainmapBitmap.colorType() == SkColorType::kAlpha_8_SkColorType) {
|
||||
SkBitmap greyGainmap;
|
||||
auto greyInfo = gainmapBitmap.info().makeColorType(SkColorType::kGray_8_SkColorType);
|
||||
greyGainmap.setInfo(greyInfo, gainmapBitmap.rowBytes());
|
||||
greyGainmap.setPixelRef(sk_ref_sp(gainmapBitmap.pixelRef()), 0, 0);
|
||||
gainmapBitmap = std::move(greyGainmap);
|
||||
}
|
||||
SkJpegEncoder::Options options{.fQuality = quality};
|
||||
return SkJpegGainmapEncoder::EncodeHDRGM(stream, baseBitmap.pixmap(), options,
|
||||
gainmapBitmap.pixmap(), options, gainmap()->info);
|
||||
|
||||
@@ -80,10 +80,10 @@ class GainmapImage(context: Context, attrs: AttributeSet?) : FrameLayout(context
|
||||
spinner.adapter = adapter
|
||||
spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
|
||||
override fun onItemSelected(
|
||||
parent: AdapterView<*>?,
|
||||
view: View?,
|
||||
position: Int,
|
||||
id: Long
|
||||
parent: AdapterView<*>?,
|
||||
view: View?,
|
||||
position: Int,
|
||||
id: Long
|
||||
) {
|
||||
setImage(position)
|
||||
}
|
||||
@@ -108,7 +108,7 @@ class GainmapImage(context: Context, attrs: AttributeSet?) : FrameLayout(context
|
||||
if (selectedImage == position) return
|
||||
selectedImage = position
|
||||
val source = ImageDecoder.createSource(resources.assets,
|
||||
"gainmaps/${gainmapImages[position]}")
|
||||
"gainmaps/${gainmapImages[position]}")
|
||||
doDecode(source)
|
||||
}
|
||||
|
||||
@@ -137,16 +137,16 @@ class GainmapImage(context: Context, attrs: AttributeSet?) : FrameLayout(context
|
||||
gainmapVisualizer = map
|
||||
} else {
|
||||
gainmapVisualizer = Bitmap.createBitmap(map.width, map.height,
|
||||
Bitmap.Config.ARGB_8888)
|
||||
Bitmap.Config.ARGB_8888)
|
||||
val canvas = Canvas(gainmapVisualizer!!)
|
||||
val paint = Paint()
|
||||
paint.colorFilter = ColorMatrixColorFilter(
|
||||
floatArrayOf(
|
||||
0f, 0f, 0f, 1f, 0f,
|
||||
0f, 0f, 0f, 1f, 0f,
|
||||
0f, 0f, 0f, 1f, 0f,
|
||||
0f, 0f, 0f, 0f, 255f
|
||||
)
|
||||
floatArrayOf(
|
||||
0f, 0f, 0f, 1f, 0f,
|
||||
0f, 0f, 0f, 1f, 0f,
|
||||
0f, 0f, 0f, 1f, 0f,
|
||||
0f, 0f, 0f, 0f, 255f
|
||||
)
|
||||
)
|
||||
canvas.drawBitmap(map, 0f, 0f, paint)
|
||||
canvas.setBitmap(null)
|
||||
@@ -174,8 +174,14 @@ class GainmapImage(context: Context, attrs: AttributeSet?) : FrameLayout(context
|
||||
if (bitmap == null) return
|
||||
|
||||
imageView.setImage(ImageSource.cachedBitmap(when (outputMode) {
|
||||
R.id.output_hdr -> { bitmap!!.gainmap = gainmap; bitmap!! }
|
||||
R.id.output_sdr -> { bitmap!!.gainmap = null; bitmap!! }
|
||||
R.id.output_hdr -> {
|
||||
bitmap!!.gainmap = gainmap; bitmap!!
|
||||
}
|
||||
|
||||
R.id.output_sdr -> {
|
||||
bitmap!!.gainmap = null; bitmap!!
|
||||
}
|
||||
|
||||
R.id.output_gainmap -> gainmapVisualizer!!
|
||||
else -> throw IllegalStateException()
|
||||
}))
|
||||
|
||||
Reference in New Issue
Block a user