src/java.desktop/macosx/native/libawt_lwawt/awt/ImageSurfaceData.h
changeset 47216 71c04702a3d5
parent 26751 70bac69b37c9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/java.desktop/macosx/native/libawt_lwawt/awt/ImageSurfaceData.h	Tue Sep 12 19:03:39 2017 +0200
@@ -0,0 +1,114 @@
+/*
+ * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#import "QuartzSurfaceData.h"
+#import <pthread.h>
+
+typedef UInt8 Pixel8bit;
+typedef UInt16 Pixel16bit;
+typedef UInt32 Pixel32bit;
+
+typedef struct _ImageSDOps ImageSDOps;
+
+ImageSDOps*    LockImage(JNIEnv* env, jobject imageSurfaceData);
+void        UnlockImage(JNIEnv* env, ImageSDOps* isdo);
+ImageSDOps*    LockImagePixels(JNIEnv* env, jobject imageSurfaceData);
+void        UnlockImagePixels(JNIEnv* env, ImageSDOps* isdo);
+
+// if there is no image created for isdo.imgRef, it creates and image using the isdo.dataProvider
+// If there is an image present, this is a no-op
+void makeSureImageIsCreated(ImageSDOps* isdo);
+
+typedef struct _ContextInfo
+{
+    BOOL                useWindowContextReference;
+    BOOL                canUseJavaPixelsAsContext;
+    size_t                bitsPerComponent;
+    size_t                bytesPerPixel;
+    size_t                bytesPerRow;
+    CGImageAlphaInfo    alphaInfo;
+    CGColorSpaceRef        colorSpace;
+} ContextInfo;
+
+typedef struct _ImageInfo
+{
+    size_t                bitsPerComponent;
+    size_t                bitsPerPixel;
+    size_t                bytesPerPixel;
+    size_t                bytesPerRow;
+    CGImageAlphaInfo    alphaInfo;
+    CGColorSpaceRef        colorSpace;
+} ImageInfo;
+
+struct _ImageSDOps
+{
+    QuartzSDOps                qsdo; // must be the first entry!
+
+    ContextInfo                contextInfo;
+    ImageInfo                imageInfo;
+    BOOL                    isSubImage;
+
+    jint*                    javaImageInfo;
+
+    // parameters specifying this BufferedImage given to us from Java
+    jobject                    array;
+    jint                    offset;
+    jint                    width;
+    jint                    height;
+    jint                    javaPixelBytes;
+    jint                    javaPixelsBytesPerRow;
+    jobject                    icm;
+    jint                    type;
+
+    Pixel8bit*                pixels;
+    Pixel8bit*                pixelsLocked;
+
+    // needed by TYPE_BYTE_INDEXED
+    UInt16*                    indexedColorTable;
+    UInt32*                    lutData;
+    UInt32                    lutDataSize;
+
+    // Used as a cached image ref created from the isdo.dataprovider. This is only a chached image, and it might become invalid
+    // if somebody draws on the bitmap context, or the pixels are changed in java. In that case, we need to NULL out
+    // this image and recreate it from the data provider.
+    CGImageRef                imgRef;
+
+    // Cached instance of CGDataProvider. dataProvider is alloced the first time a bitmap context is created, providing the
+    // native pixels as a source of the data. The dataProviders life cycle is the same as ISDO. The reference gets
+    // released when we are done with the ISDO.
+    CGDataProviderRef        dataProvider;
+
+    // Pointer in memory that is used for create the CGBitmapContext and the CGDataProvider (used for imgRef). This is a native
+    // copy of the pixels for the Image. There is a spearate copy of the pixels that lives in Java heap. There are two main
+    // reasons why we keep those pixels spearate: 1) CG doesn't support all the Java pixel formats 2) The Garbage collector can
+    // move the java pixels at any time. There are possible workarounds for both problems. Number 2) seems to be a more serious issue, since
+    // we can solve 1) by only supporting certain image types.
+    void *                    nativePixels;
+    NSGraphicsContext*        nsRef;
+
+    pthread_mutex_t            lock;
+    jint                    nrOfPixelsOwners;
+};
+