blob: 8d4a8a246b085e1755d760f0dff2b1e81e054faa [file] [log] [blame]
/*
* 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 "SurfaceData.h"
#import "BufImgSurfaceData.h"
#import "AWTFont.h"
#import <Cocoa/Cocoa.h>
// these flags are not defined on Tiger on PPC, so we need to make them a no-op
#if !defined(kCGBitmapByteOrder32Host)
#define kCGBitmapByteOrder32Host 0
#endif
#if !defined(kCGBitmapByteOrder16Host)
#define kCGBitmapByteOrder16Host 0
#endif
// NOTE : Modify the printSurfaceDataDiagnostics API if you change this enum
enum SDRenderType
{
SD_Nothing,
SD_Stroke,
SD_Fill,
SD_EOFill,
SD_Shade,
SD_LinearGradient,
SD_RadialGradient,
SD_Pattern,
SD_Image,
SD_Text,
SD_CopyArea,
SD_Queue,
SD_External
};
typedef enum SDRenderType SDRenderType;
struct _stateShadingInfo
{
CGPoint start;
CGPoint end;
CGFloat colors[8];
BOOL cyclic;
CGFloat length; // of the total segment (used by the cyclic gradient)
CGFloat period; // of the cycle (used by the cyclic gradient)
CGFloat offset; // of the cycle from the start (used by the cyclic gradient)
};
typedef struct _stateShadingInfo StateShadingInfo;
struct _stateGradientInfo
{
CGPoint start;
CGPoint end;
CGFloat radius;
CGFloat* colordata;
CGFloat* fractionsdata;
jint fractionsLength;
};
typedef struct _stateGradientInfo StateGradientInfo;
struct _statePatternInfo
{
CGFloat tx;
CGFloat ty;
CGFloat sx;
CGFloat sy;
jint width;
jint height;
jobject sdata;
};
typedef struct _statePatternInfo StatePatternInfo;
struct _stateGraphicsInfo
{
BOOL adjustedLineWidth;
BOOL adjustedAntialias;
BOOL antialiased;
jint interpolation;
BOOL simpleColor;
BOOL simpleStroke;
CGAffineTransform ctm;
CGFloat offsetX;
CGFloat offsetY;
struct CGPoint* batchedLines;
UInt32 batchedLinesCount;
};
typedef struct _stateGraphicsInfo StateGraphicsInfo;
typedef struct _QuartzSDOps QuartzSDOps;
typedef void BeginContextFunc(JNIEnv *env, QuartzSDOps *qsdo, SDRenderType renderType);
typedef void FinishContextFunc(JNIEnv *env, QuartzSDOps *qsdo);
struct _QuartzSDOps
{
BufImgSDOps sdo; // must be the first entry!
BeginContextFunc* BeginSurface; // used to set graphics states (clip, color, stroke, etc...)
FinishContextFunc* FinishSurface; // used to finish drawing primitives
BOOL newContext;
CGContextRef cgRef;
jint* javaGraphicsStates;
jobject javaGraphicsStatesObjects;
SDRenderType renderType;
// rdar://problem/5214320
// Gradient/Texture fills of Java GeneralPath don't respect the even odd winding rule (quartz pipeline).
BOOL isEvenOddFill; // Tracks whether the original render type passed into
// SetUpCGContext(...) is SD_EOFILL.
// The reason for this field is because SetUpCGContext(...) can
// change the render type after calling SetUpPaint(...), and right
// after that, the possibly new render type is then assigned into
// qsdo->renderType. Sigh!!!
// This field is potentially used within CompleteCGContext(...) or
// its callees.
StateShadingInfo* shadingInfo; // tracks shading and its parameters
StateGradientInfo* gradientInfo; // tracks gradient and its parameters
StatePatternInfo* patternInfo; // tracks pattern and its parameters
StateGraphicsInfo graphicsStateInfo; // tracks other graphics state
BOOL syncContentsToLayer; // should changed pixels be synced to a CALayer
CGRect updateRect; // used by the layer synchronization code to track update rects.
};
void SetUpCGContext(JNIEnv *env, QuartzSDOps *qsdo, SDRenderType renderType);
SDRenderType DoShapeUsingCG(CGContextRef cgRef, jint *types, jfloat *coords, jint numtypes, BOOL fill, CGFloat offsetX, CGFloat offsetY);
SDRenderType SetUpPaint(JNIEnv *env, QuartzSDOps *qsdo, SDRenderType renderType);
void CompleteCGContext(JNIEnv *env, QuartzSDOps *qsdo);
NSColor* ByteParametersToNSColor(JNIEnv* env, jint *javaGraphicsStates, NSColor* defColor);
#define JNF_COCOA_RENDERER_EXIT(env) \
} @catch(NSException *localException) { \
qsdo->FinishSurface(env, qsdo); \
[JNFException throwToJava:env exception:localException]; \
} \
if (_token) JNFNativeMethodExit(_token); \
}