1*d57664e9SAndroid Build Coastguard Worker /*
2*d57664e9SAndroid Build Coastguard Worker * Copyright (C) 2023 The Android Open Source Project
3*d57664e9SAndroid Build Coastguard Worker *
4*d57664e9SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*d57664e9SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*d57664e9SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*d57664e9SAndroid Build Coastguard Worker *
8*d57664e9SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*d57664e9SAndroid Build Coastguard Worker *
10*d57664e9SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*d57664e9SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*d57664e9SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*d57664e9SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*d57664e9SAndroid Build Coastguard Worker * limitations under the License.
15*d57664e9SAndroid Build Coastguard Worker */
16*d57664e9SAndroid Build Coastguard Worker
17*d57664e9SAndroid Build Coastguard Worker #include <Gainmap.h>
18*d57664e9SAndroid Build Coastguard Worker
19*d57664e9SAndroid Build Coastguard Worker #include "SkColorType.h"
20*d57664e9SAndroid Build Coastguard Worker #include "SkGainmapInfo.h"
21*d57664e9SAndroid Build Coastguard Worker
22*d57664e9SAndroid Build Coastguard Worker #ifdef __ANDROID__
23*d57664e9SAndroid Build Coastguard Worker #include <binder/Parcel.h>
24*d57664e9SAndroid Build Coastguard Worker #endif
25*d57664e9SAndroid Build Coastguard Worker
26*d57664e9SAndroid Build Coastguard Worker #include "Bitmap.h"
27*d57664e9SAndroid Build Coastguard Worker #include "GraphicsJNI.h"
28*d57664e9SAndroid Build Coastguard Worker #include "ScopedParcel.h"
29*d57664e9SAndroid Build Coastguard Worker #include "graphics_jni_helpers.h"
30*d57664e9SAndroid Build Coastguard Worker
31*d57664e9SAndroid Build Coastguard Worker namespace android {
32*d57664e9SAndroid Build Coastguard Worker
33*d57664e9SAndroid Build Coastguard Worker static jclass gGainmap_class;
34*d57664e9SAndroid Build Coastguard Worker static jmethodID gGainmap_constructorMethodID;
35*d57664e9SAndroid Build Coastguard Worker
36*d57664e9SAndroid Build Coastguard Worker using namespace uirenderer;
37*d57664e9SAndroid Build Coastguard Worker
fromJava(jlong gainmap)38*d57664e9SAndroid Build Coastguard Worker static Gainmap* fromJava(jlong gainmap) {
39*d57664e9SAndroid Build Coastguard Worker return reinterpret_cast<Gainmap*>(gainmap);
40*d57664e9SAndroid Build Coastguard Worker }
41*d57664e9SAndroid Build Coastguard Worker
baseImageTypeFromJava(jint direction)42*d57664e9SAndroid Build Coastguard Worker static SkGainmapInfo::BaseImageType baseImageTypeFromJava(jint direction) {
43*d57664e9SAndroid Build Coastguard Worker switch (direction) {
44*d57664e9SAndroid Build Coastguard Worker case 0:
45*d57664e9SAndroid Build Coastguard Worker return SkGainmapInfo::BaseImageType::kSDR;
46*d57664e9SAndroid Build Coastguard Worker case 1:
47*d57664e9SAndroid Build Coastguard Worker return SkGainmapInfo::BaseImageType::kHDR;
48*d57664e9SAndroid Build Coastguard Worker default:
49*d57664e9SAndroid Build Coastguard Worker LOG_ALWAYS_FATAL("Unrecognized Gainmap direction: %d", direction);
50*d57664e9SAndroid Build Coastguard Worker }
51*d57664e9SAndroid Build Coastguard Worker }
52*d57664e9SAndroid Build Coastguard Worker
baseImageTypeToJava(SkGainmapInfo::BaseImageType type)53*d57664e9SAndroid Build Coastguard Worker static jint baseImageTypeToJava(SkGainmapInfo::BaseImageType type) {
54*d57664e9SAndroid Build Coastguard Worker switch (type) {
55*d57664e9SAndroid Build Coastguard Worker case SkGainmapInfo::BaseImageType::kSDR:
56*d57664e9SAndroid Build Coastguard Worker return 0;
57*d57664e9SAndroid Build Coastguard Worker case SkGainmapInfo::BaseImageType::kHDR:
58*d57664e9SAndroid Build Coastguard Worker return 1;
59*d57664e9SAndroid Build Coastguard Worker default:
60*d57664e9SAndroid Build Coastguard Worker LOG_ALWAYS_FATAL("Unrecognized base image: %d", type);
61*d57664e9SAndroid Build Coastguard Worker }
62*d57664e9SAndroid Build Coastguard Worker }
63*d57664e9SAndroid Build Coastguard Worker
getCreateFlags(const sk_sp<Bitmap> & bitmap)64*d57664e9SAndroid Build Coastguard Worker static int getCreateFlags(const sk_sp<Bitmap>& bitmap) {
65*d57664e9SAndroid Build Coastguard Worker int flags = 0;
66*d57664e9SAndroid Build Coastguard Worker if (bitmap->info().alphaType() == kPremul_SkAlphaType) {
67*d57664e9SAndroid Build Coastguard Worker flags |= android::bitmap::kBitmapCreateFlag_Premultiplied;
68*d57664e9SAndroid Build Coastguard Worker }
69*d57664e9SAndroid Build Coastguard Worker if (!bitmap->isImmutable()) {
70*d57664e9SAndroid Build Coastguard Worker flags |= android::bitmap::kBitmapCreateFlag_Mutable;
71*d57664e9SAndroid Build Coastguard Worker }
72*d57664e9SAndroid Build Coastguard Worker return flags;
73*d57664e9SAndroid Build Coastguard Worker }
74*d57664e9SAndroid Build Coastguard Worker
Gainmap_extractFromBitmap(JNIEnv * env,const Bitmap & bitmap)75*d57664e9SAndroid Build Coastguard Worker jobject Gainmap_extractFromBitmap(JNIEnv* env, const Bitmap& bitmap) {
76*d57664e9SAndroid Build Coastguard Worker auto gainmap = bitmap.gainmap();
77*d57664e9SAndroid Build Coastguard Worker jobject jGainmapImage;
78*d57664e9SAndroid Build Coastguard Worker
79*d57664e9SAndroid Build Coastguard Worker {
80*d57664e9SAndroid Build Coastguard Worker // Scope to guard the release of nativeBitmap
81*d57664e9SAndroid Build Coastguard Worker auto nativeBitmap = gainmap->bitmap;
82*d57664e9SAndroid Build Coastguard Worker const int createFlags = getCreateFlags(nativeBitmap);
83*d57664e9SAndroid Build Coastguard Worker jGainmapImage = bitmap::createBitmap(env, nativeBitmap.release(), createFlags);
84*d57664e9SAndroid Build Coastguard Worker }
85*d57664e9SAndroid Build Coastguard Worker
86*d57664e9SAndroid Build Coastguard Worker // Grab a ref for the jobject
87*d57664e9SAndroid Build Coastguard Worker gainmap->incStrong(0);
88*d57664e9SAndroid Build Coastguard Worker jobject obj = env->NewObject(gGainmap_class, gGainmap_constructorMethodID, jGainmapImage,
89*d57664e9SAndroid Build Coastguard Worker gainmap.get());
90*d57664e9SAndroid Build Coastguard Worker
91*d57664e9SAndroid Build Coastguard Worker if (env->ExceptionCheck() != 0) {
92*d57664e9SAndroid Build Coastguard Worker // sadtrombone
93*d57664e9SAndroid Build Coastguard Worker gainmap->decStrong(0);
94*d57664e9SAndroid Build Coastguard Worker ALOGE("*** Uncaught exception returned from Java call!\n");
95*d57664e9SAndroid Build Coastguard Worker env->ExceptionDescribe();
96*d57664e9SAndroid Build Coastguard Worker }
97*d57664e9SAndroid Build Coastguard Worker return obj;
98*d57664e9SAndroid Build Coastguard Worker }
99*d57664e9SAndroid Build Coastguard Worker
Gainmap_destructor(Gainmap * gainmap)100*d57664e9SAndroid Build Coastguard Worker static void Gainmap_destructor(Gainmap* gainmap) {
101*d57664e9SAndroid Build Coastguard Worker gainmap->decStrong(0);
102*d57664e9SAndroid Build Coastguard Worker }
103*d57664e9SAndroid Build Coastguard Worker
Gainmap_getNativeFinalizer(JNIEnv *,jobject)104*d57664e9SAndroid Build Coastguard Worker static jlong Gainmap_getNativeFinalizer(JNIEnv*, jobject) {
105*d57664e9SAndroid Build Coastguard Worker return static_cast<jlong>(reinterpret_cast<uintptr_t>(&Gainmap_destructor));
106*d57664e9SAndroid Build Coastguard Worker }
107*d57664e9SAndroid Build Coastguard Worker
Gainmap_createEmpty(JNIEnv *,jobject)108*d57664e9SAndroid Build Coastguard Worker jlong Gainmap_createEmpty(JNIEnv*, jobject) {
109*d57664e9SAndroid Build Coastguard Worker Gainmap* gainmap = new Gainmap();
110*d57664e9SAndroid Build Coastguard Worker gainmap->incStrong(0);
111*d57664e9SAndroid Build Coastguard Worker return static_cast<jlong>(reinterpret_cast<uintptr_t>(gainmap));
112*d57664e9SAndroid Build Coastguard Worker }
113*d57664e9SAndroid Build Coastguard Worker
Gainmap_createCopy(JNIEnv *,jobject,jlong sourcePtr)114*d57664e9SAndroid Build Coastguard Worker jlong Gainmap_createCopy(JNIEnv*, jobject, jlong sourcePtr) {
115*d57664e9SAndroid Build Coastguard Worker Gainmap* gainmap = new Gainmap();
116*d57664e9SAndroid Build Coastguard Worker gainmap->incStrong(0);
117*d57664e9SAndroid Build Coastguard Worker if (sourcePtr) {
118*d57664e9SAndroid Build Coastguard Worker Gainmap* src = fromJava(sourcePtr);
119*d57664e9SAndroid Build Coastguard Worker gainmap->info = src->info;
120*d57664e9SAndroid Build Coastguard Worker }
121*d57664e9SAndroid Build Coastguard Worker return static_cast<jlong>(reinterpret_cast<uintptr_t>(gainmap));
122*d57664e9SAndroid Build Coastguard Worker }
123*d57664e9SAndroid Build Coastguard Worker
Gainmap_setBitmap(JNIEnv * env,jobject,jlong gainmapPtr,jobject jBitmap)124*d57664e9SAndroid Build Coastguard Worker static void Gainmap_setBitmap(JNIEnv* env, jobject, jlong gainmapPtr, jobject jBitmap) {
125*d57664e9SAndroid Build Coastguard Worker android::Bitmap* bitmap = GraphicsJNI::getNativeBitmap(env, jBitmap);
126*d57664e9SAndroid Build Coastguard Worker fromJava(gainmapPtr)->bitmap = sk_ref_sp(bitmap);
127*d57664e9SAndroid Build Coastguard Worker }
128*d57664e9SAndroid Build Coastguard Worker
Gainmap_setRatioMin(JNIEnv *,jobject,jlong gainmapPtr,jfloat r,jfloat g,jfloat b)129*d57664e9SAndroid Build Coastguard Worker static void Gainmap_setRatioMin(JNIEnv*, jobject, jlong gainmapPtr, jfloat r, jfloat g, jfloat b) {
130*d57664e9SAndroid Build Coastguard Worker fromJava(gainmapPtr)->info.fGainmapRatioMin = {r, g, b, 1.f};
131*d57664e9SAndroid Build Coastguard Worker }
132*d57664e9SAndroid Build Coastguard Worker
Gainmap_getRatioMin(JNIEnv * env,jobject,jlong gainmapPtr,jfloatArray components)133*d57664e9SAndroid Build Coastguard Worker static void Gainmap_getRatioMin(JNIEnv* env, jobject, jlong gainmapPtr, jfloatArray components) {
134*d57664e9SAndroid Build Coastguard Worker const auto value = fromJava(gainmapPtr)->info.fGainmapRatioMin;
135*d57664e9SAndroid Build Coastguard Worker jfloat buf[3]{value.fR, value.fG, value.fB};
136*d57664e9SAndroid Build Coastguard Worker env->SetFloatArrayRegion(components, 0, 3, buf);
137*d57664e9SAndroid Build Coastguard Worker }
138*d57664e9SAndroid Build Coastguard Worker
Gainmap_setRatioMax(JNIEnv *,jobject,jlong gainmapPtr,jfloat r,jfloat g,jfloat b)139*d57664e9SAndroid Build Coastguard Worker static void Gainmap_setRatioMax(JNIEnv*, jobject, jlong gainmapPtr, jfloat r, jfloat g, jfloat b) {
140*d57664e9SAndroid Build Coastguard Worker fromJava(gainmapPtr)->info.fGainmapRatioMax = {r, g, b, 1.f};
141*d57664e9SAndroid Build Coastguard Worker }
142*d57664e9SAndroid Build Coastguard Worker
Gainmap_getRatioMax(JNIEnv * env,jobject,jlong gainmapPtr,jfloatArray components)143*d57664e9SAndroid Build Coastguard Worker static void Gainmap_getRatioMax(JNIEnv* env, jobject, jlong gainmapPtr, jfloatArray components) {
144*d57664e9SAndroid Build Coastguard Worker const auto value = fromJava(gainmapPtr)->info.fGainmapRatioMax;
145*d57664e9SAndroid Build Coastguard Worker jfloat buf[3]{value.fR, value.fG, value.fB};
146*d57664e9SAndroid Build Coastguard Worker env->SetFloatArrayRegion(components, 0, 3, buf);
147*d57664e9SAndroid Build Coastguard Worker }
148*d57664e9SAndroid Build Coastguard Worker
Gainmap_setGamma(JNIEnv *,jobject,jlong gainmapPtr,jfloat r,jfloat g,jfloat b)149*d57664e9SAndroid Build Coastguard Worker static void Gainmap_setGamma(JNIEnv*, jobject, jlong gainmapPtr, jfloat r, jfloat g, jfloat b) {
150*d57664e9SAndroid Build Coastguard Worker fromJava(gainmapPtr)->info.fGainmapGamma = {r, g, b, 1.f};
151*d57664e9SAndroid Build Coastguard Worker }
152*d57664e9SAndroid Build Coastguard Worker
Gainmap_getGamma(JNIEnv * env,jobject,jlong gainmapPtr,jfloatArray components)153*d57664e9SAndroid Build Coastguard Worker static void Gainmap_getGamma(JNIEnv* env, jobject, jlong gainmapPtr, jfloatArray components) {
154*d57664e9SAndroid Build Coastguard Worker const auto value = fromJava(gainmapPtr)->info.fGainmapGamma;
155*d57664e9SAndroid Build Coastguard Worker jfloat buf[3]{value.fR, value.fG, value.fB};
156*d57664e9SAndroid Build Coastguard Worker env->SetFloatArrayRegion(components, 0, 3, buf);
157*d57664e9SAndroid Build Coastguard Worker }
158*d57664e9SAndroid Build Coastguard Worker
Gainmap_setEpsilonSdr(JNIEnv *,jobject,jlong gainmapPtr,jfloat r,jfloat g,jfloat b)159*d57664e9SAndroid Build Coastguard Worker static void Gainmap_setEpsilonSdr(JNIEnv*, jobject, jlong gainmapPtr, jfloat r, jfloat g,
160*d57664e9SAndroid Build Coastguard Worker jfloat b) {
161*d57664e9SAndroid Build Coastguard Worker fromJava(gainmapPtr)->info.fEpsilonSdr = {r, g, b, 1.f};
162*d57664e9SAndroid Build Coastguard Worker }
163*d57664e9SAndroid Build Coastguard Worker
Gainmap_getEpsilonSdr(JNIEnv * env,jobject,jlong gainmapPtr,jfloatArray components)164*d57664e9SAndroid Build Coastguard Worker static void Gainmap_getEpsilonSdr(JNIEnv* env, jobject, jlong gainmapPtr, jfloatArray components) {
165*d57664e9SAndroid Build Coastguard Worker const auto value = fromJava(gainmapPtr)->info.fEpsilonSdr;
166*d57664e9SAndroid Build Coastguard Worker jfloat buf[3]{value.fR, value.fG, value.fB};
167*d57664e9SAndroid Build Coastguard Worker env->SetFloatArrayRegion(components, 0, 3, buf);
168*d57664e9SAndroid Build Coastguard Worker }
169*d57664e9SAndroid Build Coastguard Worker
Gainmap_setEpsilonHdr(JNIEnv *,jobject,jlong gainmapPtr,jfloat r,jfloat g,jfloat b)170*d57664e9SAndroid Build Coastguard Worker static void Gainmap_setEpsilonHdr(JNIEnv*, jobject, jlong gainmapPtr, jfloat r, jfloat g,
171*d57664e9SAndroid Build Coastguard Worker jfloat b) {
172*d57664e9SAndroid Build Coastguard Worker fromJava(gainmapPtr)->info.fEpsilonHdr = {r, g, b, 1.f};
173*d57664e9SAndroid Build Coastguard Worker }
174*d57664e9SAndroid Build Coastguard Worker
Gainmap_getEpsilonHdr(JNIEnv * env,jobject,jlong gainmapPtr,jfloatArray components)175*d57664e9SAndroid Build Coastguard Worker static void Gainmap_getEpsilonHdr(JNIEnv* env, jobject, jlong gainmapPtr, jfloatArray components) {
176*d57664e9SAndroid Build Coastguard Worker const auto value = fromJava(gainmapPtr)->info.fEpsilonHdr;
177*d57664e9SAndroid Build Coastguard Worker jfloat buf[3]{value.fR, value.fG, value.fB};
178*d57664e9SAndroid Build Coastguard Worker env->SetFloatArrayRegion(components, 0, 3, buf);
179*d57664e9SAndroid Build Coastguard Worker }
180*d57664e9SAndroid Build Coastguard Worker
Gainmap_setDisplayRatioHdr(JNIEnv *,jobject,jlong gainmapPtr,jfloat max)181*d57664e9SAndroid Build Coastguard Worker static void Gainmap_setDisplayRatioHdr(JNIEnv*, jobject, jlong gainmapPtr, jfloat max) {
182*d57664e9SAndroid Build Coastguard Worker fromJava(gainmapPtr)->info.fDisplayRatioHdr = max;
183*d57664e9SAndroid Build Coastguard Worker }
184*d57664e9SAndroid Build Coastguard Worker
Gainmap_getDisplayRatioHdr(JNIEnv *,jobject,jlong gainmapPtr)185*d57664e9SAndroid Build Coastguard Worker static jfloat Gainmap_getDisplayRatioHdr(JNIEnv*, jobject, jlong gainmapPtr) {
186*d57664e9SAndroid Build Coastguard Worker return fromJava(gainmapPtr)->info.fDisplayRatioHdr;
187*d57664e9SAndroid Build Coastguard Worker }
188*d57664e9SAndroid Build Coastguard Worker
Gainmap_setDisplayRatioSdr(JNIEnv *,jobject,jlong gainmapPtr,jfloat min)189*d57664e9SAndroid Build Coastguard Worker static void Gainmap_setDisplayRatioSdr(JNIEnv*, jobject, jlong gainmapPtr, jfloat min) {
190*d57664e9SAndroid Build Coastguard Worker fromJava(gainmapPtr)->info.fDisplayRatioSdr = min;
191*d57664e9SAndroid Build Coastguard Worker }
192*d57664e9SAndroid Build Coastguard Worker
Gainmap_getDisplayRatioSdr(JNIEnv *,jobject,jlong gainmapPtr)193*d57664e9SAndroid Build Coastguard Worker static jfloat Gainmap_getDisplayRatioSdr(JNIEnv*, jobject, jlong gainmapPtr) {
194*d57664e9SAndroid Build Coastguard Worker return fromJava(gainmapPtr)->info.fDisplayRatioSdr;
195*d57664e9SAndroid Build Coastguard Worker }
196*d57664e9SAndroid Build Coastguard Worker
Gainmap_setAlternativeColorSpace(JNIEnv *,jobject,jlong gainmapPtr,jlong colorSpacePtr)197*d57664e9SAndroid Build Coastguard Worker static void Gainmap_setAlternativeColorSpace(JNIEnv*, jobject, jlong gainmapPtr,
198*d57664e9SAndroid Build Coastguard Worker jlong colorSpacePtr) {
199*d57664e9SAndroid Build Coastguard Worker auto colorSpace = GraphicsJNI::getNativeColorSpace(colorSpacePtr);
200*d57664e9SAndroid Build Coastguard Worker fromJava(gainmapPtr)->info.fGainmapMathColorSpace = colorSpace;
201*d57664e9SAndroid Build Coastguard Worker }
202*d57664e9SAndroid Build Coastguard Worker
Gainmap_getAlternativeColorSpace(JNIEnv * env,jobject,jlong gainmapPtr)203*d57664e9SAndroid Build Coastguard Worker static jobject Gainmap_getAlternativeColorSpace(JNIEnv* env, jobject, jlong gainmapPtr) {
204*d57664e9SAndroid Build Coastguard Worker const auto javaGainmap = fromJava(gainmapPtr);
205*d57664e9SAndroid Build Coastguard Worker auto colorSpace = javaGainmap->info.fGainmapMathColorSpace.get();
206*d57664e9SAndroid Build Coastguard Worker if (colorSpace == nullptr) {
207*d57664e9SAndroid Build Coastguard Worker return nullptr;
208*d57664e9SAndroid Build Coastguard Worker }
209*d57664e9SAndroid Build Coastguard Worker
210*d57664e9SAndroid Build Coastguard Worker auto colorType = javaGainmap->bitmap->colorType();
211*d57664e9SAndroid Build Coastguard Worker // A8 bitmaps don't support colorspaces, but an alternative colorspace is
212*d57664e9SAndroid Build Coastguard Worker // still valid for configuring the gainmap math, so use RGBA8888 instead.
213*d57664e9SAndroid Build Coastguard Worker if (colorType == kAlpha_8_SkColorType) {
214*d57664e9SAndroid Build Coastguard Worker colorType = kRGBA_8888_SkColorType;
215*d57664e9SAndroid Build Coastguard Worker }
216*d57664e9SAndroid Build Coastguard Worker return GraphicsJNI::getColorSpace(env, colorSpace, colorType);
217*d57664e9SAndroid Build Coastguard Worker }
218*d57664e9SAndroid Build Coastguard Worker
Gainmap_setDirection(JNIEnv *,jobject,jlong gainmapPtr,jint direction)219*d57664e9SAndroid Build Coastguard Worker static void Gainmap_setDirection(JNIEnv*, jobject, jlong gainmapPtr, jint direction) {
220*d57664e9SAndroid Build Coastguard Worker fromJava(gainmapPtr)->info.fBaseImageType = baseImageTypeFromJava(direction);
221*d57664e9SAndroid Build Coastguard Worker }
222*d57664e9SAndroid Build Coastguard Worker
Gainmap_getDirection(JNIEnv * env,jobject,jlong gainmapPtr)223*d57664e9SAndroid Build Coastguard Worker static jint Gainmap_getDirection(JNIEnv* env, jobject, jlong gainmapPtr) {
224*d57664e9SAndroid Build Coastguard Worker return baseImageTypeToJava(fromJava(gainmapPtr)->info.fBaseImageType);
225*d57664e9SAndroid Build Coastguard Worker }
226*d57664e9SAndroid Build Coastguard Worker
227*d57664e9SAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
228*d57664e9SAndroid Build Coastguard Worker // Serialization
229*d57664e9SAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
230*d57664e9SAndroid Build Coastguard Worker
Gainmap_writeToParcel(JNIEnv * env,jobject,jlong nativeObject,jobject parcel)231*d57664e9SAndroid Build Coastguard Worker static void Gainmap_writeToParcel(JNIEnv* env, jobject, jlong nativeObject, jobject parcel) {
232*d57664e9SAndroid Build Coastguard Worker #ifdef __ANDROID__ // Layoutlib does not support parcel
233*d57664e9SAndroid Build Coastguard Worker if (parcel == NULL) {
234*d57664e9SAndroid Build Coastguard Worker ALOGD("write null parcel\n");
235*d57664e9SAndroid Build Coastguard Worker return;
236*d57664e9SAndroid Build Coastguard Worker }
237*d57664e9SAndroid Build Coastguard Worker ScopedParcel p(env, parcel);
238*d57664e9SAndroid Build Coastguard Worker SkGainmapInfo info = fromJava(nativeObject)->info;
239*d57664e9SAndroid Build Coastguard Worker // write gainmap to parcel
240*d57664e9SAndroid Build Coastguard Worker // ratio min
241*d57664e9SAndroid Build Coastguard Worker p.writeFloat(info.fGainmapRatioMin.fR);
242*d57664e9SAndroid Build Coastguard Worker p.writeFloat(info.fGainmapRatioMin.fG);
243*d57664e9SAndroid Build Coastguard Worker p.writeFloat(info.fGainmapRatioMin.fB);
244*d57664e9SAndroid Build Coastguard Worker // ratio max
245*d57664e9SAndroid Build Coastguard Worker p.writeFloat(info.fGainmapRatioMax.fR);
246*d57664e9SAndroid Build Coastguard Worker p.writeFloat(info.fGainmapRatioMax.fG);
247*d57664e9SAndroid Build Coastguard Worker p.writeFloat(info.fGainmapRatioMax.fB);
248*d57664e9SAndroid Build Coastguard Worker // gamma
249*d57664e9SAndroid Build Coastguard Worker p.writeFloat(info.fGainmapGamma.fR);
250*d57664e9SAndroid Build Coastguard Worker p.writeFloat(info.fGainmapGamma.fG);
251*d57664e9SAndroid Build Coastguard Worker p.writeFloat(info.fGainmapGamma.fB);
252*d57664e9SAndroid Build Coastguard Worker // epsilonsdr
253*d57664e9SAndroid Build Coastguard Worker p.writeFloat(info.fEpsilonSdr.fR);
254*d57664e9SAndroid Build Coastguard Worker p.writeFloat(info.fEpsilonSdr.fG);
255*d57664e9SAndroid Build Coastguard Worker p.writeFloat(info.fEpsilonSdr.fB);
256*d57664e9SAndroid Build Coastguard Worker // epsilonhdr
257*d57664e9SAndroid Build Coastguard Worker p.writeFloat(info.fEpsilonHdr.fR);
258*d57664e9SAndroid Build Coastguard Worker p.writeFloat(info.fEpsilonHdr.fG);
259*d57664e9SAndroid Build Coastguard Worker p.writeFloat(info.fEpsilonHdr.fB);
260*d57664e9SAndroid Build Coastguard Worker // display ratio sdr
261*d57664e9SAndroid Build Coastguard Worker p.writeFloat(info.fDisplayRatioSdr);
262*d57664e9SAndroid Build Coastguard Worker // display ratio hdr
263*d57664e9SAndroid Build Coastguard Worker p.writeFloat(info.fDisplayRatioHdr);
264*d57664e9SAndroid Build Coastguard Worker // base image type
265*d57664e9SAndroid Build Coastguard Worker p.writeInt32(static_cast<int32_t>(info.fBaseImageType));
266*d57664e9SAndroid Build Coastguard Worker #else
267*d57664e9SAndroid Build Coastguard Worker doThrowRE(env, "Cannot use parcels outside of Android!");
268*d57664e9SAndroid Build Coastguard Worker #endif
269*d57664e9SAndroid Build Coastguard Worker }
270*d57664e9SAndroid Build Coastguard Worker
Gainmap_readFromParcel(JNIEnv * env,jobject,jlong nativeObject,jobject parcel)271*d57664e9SAndroid Build Coastguard Worker static void Gainmap_readFromParcel(JNIEnv* env, jobject, jlong nativeObject, jobject parcel) {
272*d57664e9SAndroid Build Coastguard Worker #ifdef __ANDROID__ // Layoutlib does not support parcel
273*d57664e9SAndroid Build Coastguard Worker if (parcel == NULL) {
274*d57664e9SAndroid Build Coastguard Worker jniThrowNullPointerException(env, "parcel cannot be null");
275*d57664e9SAndroid Build Coastguard Worker return;
276*d57664e9SAndroid Build Coastguard Worker }
277*d57664e9SAndroid Build Coastguard Worker ScopedParcel p(env, parcel);
278*d57664e9SAndroid Build Coastguard Worker
279*d57664e9SAndroid Build Coastguard Worker SkGainmapInfo info;
280*d57664e9SAndroid Build Coastguard Worker info.fGainmapRatioMin = {p.readFloat(), p.readFloat(), p.readFloat(), 1.f};
281*d57664e9SAndroid Build Coastguard Worker info.fGainmapRatioMax = {p.readFloat(), p.readFloat(), p.readFloat(), 1.f};
282*d57664e9SAndroid Build Coastguard Worker info.fGainmapGamma = {p.readFloat(), p.readFloat(), p.readFloat(), 1.f};
283*d57664e9SAndroid Build Coastguard Worker info.fEpsilonSdr = {p.readFloat(), p.readFloat(), p.readFloat(), 1.f};
284*d57664e9SAndroid Build Coastguard Worker info.fEpsilonHdr = {p.readFloat(), p.readFloat(), p.readFloat(), 1.f};
285*d57664e9SAndroid Build Coastguard Worker info.fDisplayRatioSdr = p.readFloat();
286*d57664e9SAndroid Build Coastguard Worker info.fDisplayRatioHdr = p.readFloat();
287*d57664e9SAndroid Build Coastguard Worker info.fBaseImageType = static_cast<SkGainmapInfo::BaseImageType>(p.readInt32());
288*d57664e9SAndroid Build Coastguard Worker
289*d57664e9SAndroid Build Coastguard Worker fromJava(nativeObject)->info = info;
290*d57664e9SAndroid Build Coastguard Worker #else
291*d57664e9SAndroid Build Coastguard Worker jniThrowRuntimeException(env, "Cannot use parcels outside of Android");
292*d57664e9SAndroid Build Coastguard Worker #endif
293*d57664e9SAndroid Build Coastguard Worker }
294*d57664e9SAndroid Build Coastguard Worker
295*d57664e9SAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
296*d57664e9SAndroid Build Coastguard Worker // JNI Glue
297*d57664e9SAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
298*d57664e9SAndroid Build Coastguard Worker
299*d57664e9SAndroid Build Coastguard Worker static const JNINativeMethod gGainmapMethods[] = {
300*d57664e9SAndroid Build Coastguard Worker {"nGetFinalizer", "()J", (void*)Gainmap_getNativeFinalizer},
301*d57664e9SAndroid Build Coastguard Worker {"nCreateEmpty", "()J", (void*)Gainmap_createEmpty},
302*d57664e9SAndroid Build Coastguard Worker {"nCreateCopy", "(J)J", (void*)Gainmap_createCopy},
303*d57664e9SAndroid Build Coastguard Worker {"nSetBitmap", "(JLandroid/graphics/Bitmap;)V", (void*)Gainmap_setBitmap},
304*d57664e9SAndroid Build Coastguard Worker {"nSetRatioMin", "(JFFF)V", (void*)Gainmap_setRatioMin},
305*d57664e9SAndroid Build Coastguard Worker {"nGetRatioMin", "(J[F)V", (void*)Gainmap_getRatioMin},
306*d57664e9SAndroid Build Coastguard Worker {"nSetRatioMax", "(JFFF)V", (void*)Gainmap_setRatioMax},
307*d57664e9SAndroid Build Coastguard Worker {"nGetRatioMax", "(J[F)V", (void*)Gainmap_getRatioMax},
308*d57664e9SAndroid Build Coastguard Worker {"nSetGamma", "(JFFF)V", (void*)Gainmap_setGamma},
309*d57664e9SAndroid Build Coastguard Worker {"nGetGamma", "(J[F)V", (void*)Gainmap_getGamma},
310*d57664e9SAndroid Build Coastguard Worker {"nSetEpsilonSdr", "(JFFF)V", (void*)Gainmap_setEpsilonSdr},
311*d57664e9SAndroid Build Coastguard Worker {"nGetEpsilonSdr", "(J[F)V", (void*)Gainmap_getEpsilonSdr},
312*d57664e9SAndroid Build Coastguard Worker {"nSetEpsilonHdr", "(JFFF)V", (void*)Gainmap_setEpsilonHdr},
313*d57664e9SAndroid Build Coastguard Worker {"nGetEpsilonHdr", "(J[F)V", (void*)Gainmap_getEpsilonHdr},
314*d57664e9SAndroid Build Coastguard Worker {"nSetDisplayRatioHdr", "(JF)V", (void*)Gainmap_setDisplayRatioHdr},
315*d57664e9SAndroid Build Coastguard Worker {"nGetDisplayRatioHdr", "(J)F", (void*)Gainmap_getDisplayRatioHdr},
316*d57664e9SAndroid Build Coastguard Worker {"nSetDisplayRatioSdr", "(JF)V", (void*)Gainmap_setDisplayRatioSdr},
317*d57664e9SAndroid Build Coastguard Worker {"nGetDisplayRatioSdr", "(J)F", (void*)Gainmap_getDisplayRatioSdr},
318*d57664e9SAndroid Build Coastguard Worker {"nSetAlternativeColorSpace", "(JJ)V", (void*)Gainmap_setAlternativeColorSpace},
319*d57664e9SAndroid Build Coastguard Worker {"nGetAlternativeColorSpace", "(J)Landroid/graphics/ColorSpace;",
320*d57664e9SAndroid Build Coastguard Worker (void*)Gainmap_getAlternativeColorSpace},
321*d57664e9SAndroid Build Coastguard Worker {"nSetDirection", "(JI)V", (void*)Gainmap_setDirection},
322*d57664e9SAndroid Build Coastguard Worker {"nGetDirection", "(J)I", (void*)Gainmap_getDirection},
323*d57664e9SAndroid Build Coastguard Worker {"nWriteGainmapToParcel", "(JLandroid/os/Parcel;)V", (void*)Gainmap_writeToParcel},
324*d57664e9SAndroid Build Coastguard Worker {"nReadGainmapFromParcel", "(JLandroid/os/Parcel;)V", (void*)Gainmap_readFromParcel},
325*d57664e9SAndroid Build Coastguard Worker };
326*d57664e9SAndroid Build Coastguard Worker
register_android_graphics_Gainmap(JNIEnv * env)327*d57664e9SAndroid Build Coastguard Worker int register_android_graphics_Gainmap(JNIEnv* env) {
328*d57664e9SAndroid Build Coastguard Worker gGainmap_class = MakeGlobalRefOrDie(env, FindClassOrDie(env, "android/graphics/Gainmap"));
329*d57664e9SAndroid Build Coastguard Worker gGainmap_constructorMethodID =
330*d57664e9SAndroid Build Coastguard Worker GetMethodIDOrDie(env, gGainmap_class, "<init>", "(Landroid/graphics/Bitmap;J)V");
331*d57664e9SAndroid Build Coastguard Worker return android::RegisterMethodsOrDie(env, "android/graphics/Gainmap", gGainmapMethods,
332*d57664e9SAndroid Build Coastguard Worker NELEM(gGainmapMethods));
333*d57664e9SAndroid Build Coastguard Worker }
334*d57664e9SAndroid Build Coastguard Worker
335*d57664e9SAndroid Build Coastguard Worker } // namespace android
336