Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 753a56fa authored by Leon Scroggins III's avatar Leon Scroggins III
Browse files

Separate ImageDecoder JNI from actual work

Bug: 135133301
Test: CtsGraphicsTestCases ImageDecoderTest

Make the native ImageDecoder a class, with methods that do the bulk of
the work that was previously done in JNI. This will allow the
forthcoming NDK API (AImageDecoder) to share the same code for decoding.

Move enums into implementation file, as no other code needs them.

Make computeAllocationSize a public static method on hwui/Bitmap, for
use by ImageDecoder.

Change-Id: I4e4dae338a951761614aed42ca2cc157e3d526dd
parent f3c1392b
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@
#include <SkPicture.h>
#include <SkPictureRecorder.h>
#include <hwui/AnimatedImageDrawable.h>
#include <hwui/ImageDecoder.h>
#include <hwui/Canvas.h>
#include <utils/Looper.h>

+95 −130

File changed.

Preview size limit exceeded, changes collapsed.

+2 −38
Original line number Diff line number Diff line
@@ -14,48 +14,12 @@
 * limitations under the License.
 */

#include "NinePatchPeeker.h"

#include <hwui/Canvas.h>

#include <jni.h>

class SkAndroidCodec;

using namespace android;

struct ImageDecoder {
    // These need to stay in sync with ImageDecoder.java's Allocator constants.
    enum Allocator {
        kDefault_Allocator      = 0,
        kSoftware_Allocator     = 1,
        kSharedMemory_Allocator = 2,
        kHardware_Allocator     = 3,
    };

    // These need to stay in sync with ImageDecoder.java's Error constants.
    enum Error {
        kSourceException     = 1,
        kSourceIncomplete    = 2,
        kSourceMalformedData = 3,
    };

    // These need to stay in sync with PixelFormat.java's Format constants.
    enum PixelFormat {
        kUnknown     =  0,
        kTranslucent = -3,
        kOpaque      = -1,
    };

    std::unique_ptr<SkAndroidCodec> mCodec;
    sk_sp<NinePatchPeeker> mPeeker;

    ImageDecoder()
        :mPeeker(new NinePatchPeeker)
    {}
};

// Creates a Java Canvas object from canvas, calls jimageDecoder's PostProcess on it, and then
// releases the Canvas.
// Caller needs to check for exceptions.
jint postProcessAndRelease(JNIEnv* env, jobject jimageDecoder, std::unique_ptr<Canvas> canvas);
jint postProcessAndRelease(JNIEnv* env, jobject jimageDecoder,
                           std::unique_ptr<android::Canvas> canvas);
+1 −0
Original line number Diff line number Diff line
@@ -176,6 +176,7 @@ cc_defaults {
        "hwui/AnimatedImageThread.cpp",
        "hwui/Bitmap.cpp",
        "hwui/Canvas.cpp",
        "hwui/ImageDecoder.cpp",
        "hwui/MinikinSkia.cpp",
        "hwui/MinikinUtils.cpp",
        "hwui/PaintImpl.cpp",
+2 −4
Original line number Diff line number Diff line
@@ -44,9 +44,7 @@

namespace android {

// returns true if rowBytes * height can be represented by a positive int32_t value
// and places that value in size.
static bool computeAllocationSize(size_t rowBytes, int height, size_t* size) {
bool Bitmap::computeAllocationSize(size_t rowBytes, int height, size_t* size) {
    return 0 <= height && height <= std::numeric_limits<size_t>::max() &&
           !__builtin_mul_overflow(rowBytes, (size_t)height, size) &&
           *size <= std::numeric_limits<int32_t>::max();
@@ -66,7 +64,7 @@ static sk_sp<Bitmap> allocateBitmap(SkBitmap* bitmap, AllocPixelRef alloc) {
    // we must respect the rowBytes value already set on the bitmap instead of
    // attempting to compute our own.
    const size_t rowBytes = bitmap->rowBytes();
    if (!computeAllocationSize(rowBytes, bitmap->height(), &size)) {
    if (!Bitmap::computeAllocationSize(rowBytes, bitmap->height(), &size)) {
        return nullptr;
    }

Loading