libjxl

FORK: libjxl patches used on blog
git clone https://git.neptards.moe/blog/libjxl.git
Log | Files | Refs | Submodules | README | LICENSE

DecoderJni.java (2267B)


      1 // Copyright (c) the JPEG XL Project Authors. All rights reserved.
      2 //
      3 // Use of this source code is governed by a BSD-style
      4 // license that can be found in the LICENSE file.
      5 
      6 package org.jpeg.jpegxl.wrapper;
      7 
      8 import java.nio.Buffer;
      9 
     10 /**
     11  * Low level JNI wrapper.
     12  *
     13  * This class is package-private, should be only be used by high level wrapper.
     14  */
     15 class DecoderJni {
     16   private static native void nativeGetBasicInfo(int[] context, Buffer data);
     17   private static native void nativeGetPixels(int[] context, Buffer data, Buffer pixels, Buffer icc);
     18 
     19   static Status makeStatus(int statusCode) {
     20     switch (statusCode) {
     21       case 0:
     22         return Status.OK;
     23       case -1:
     24         return Status.INVALID_STREAM;
     25       case 1:
     26         return Status.NOT_ENOUGH_INPUT;
     27       default:
     28         throw new IllegalStateException("Unknown status code");
     29     }
     30   }
     31 
     32   static StreamInfo makeStreamInfo(int[] context) {
     33     StreamInfo result = new StreamInfo();
     34     result.status = makeStatus(context[0]);
     35     result.width = context[1];
     36     result.height = context[2];
     37     result.pixelsSize = context[3];
     38     result.iccSize = context[4];
     39     result.alphaBits = context[5];
     40     return result;
     41   }
     42 
     43   /** Decode stream information. */
     44   static StreamInfo getBasicInfo(Buffer data, PixelFormat pixelFormat) {
     45     if (!data.isDirect()) {
     46       throw new IllegalArgumentException("data must be direct buffer");
     47     }
     48     int[] context = new int[6];
     49     context[0] = (pixelFormat == null) ? -1 : pixelFormat.ordinal();
     50     nativeGetBasicInfo(context, data);
     51     return makeStreamInfo(context);
     52   }
     53 
     54   /** One-shot decoding. */
     55   static Status getPixels(Buffer data, Buffer pixels, Buffer icc, PixelFormat pixelFormat) {
     56     if (!data.isDirect()) {
     57       throw new IllegalArgumentException("data must be direct buffer");
     58     }
     59     if (!pixels.isDirect()) {
     60       throw new IllegalArgumentException("pixels must be direct buffer");
     61     }
     62     if (!icc.isDirect()) {
     63       throw new IllegalArgumentException("icc must be direct buffer");
     64     }
     65     int[] context = new int[1];
     66     context[0] = pixelFormat.ordinal();
     67     nativeGetPixels(context, data, pixels, icc);
     68     return makeStatus(context[0]);
     69   }
     70 
     71   /** Utility library, disable object construction. */
     72   private DecoderJni() {}
     73 }