1/* 2 * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26#import "SurfaceData.h" 27#import "BufImgSurfaceData.h" 28#import "AWTFont.h" 29#import <Cocoa/Cocoa.h> 30 31// these flags are not defined on Tiger on PPC, so we need to make them a no-op 32#if !defined(kCGBitmapByteOrder32Host) 33#define kCGBitmapByteOrder32Host 0 34#endif 35#if !defined(kCGBitmapByteOrder16Host) 36#define kCGBitmapByteOrder16Host 0 37#endif 38 39// NOTE : Modify the printSurfaceDataDiagnostics API if you change this enum 40enum SDRenderType 41{ 42 SD_Nothing, 43 SD_Stroke, 44 SD_Fill, 45 SD_EOFill, 46 SD_Shade, 47 SD_LinearGradient, 48 SD_RadialGradient, 49 SD_Pattern, 50 SD_Image, 51 SD_Text, 52 SD_CopyArea, 53 SD_Queue, 54 SD_External 55}; 56typedef enum SDRenderType SDRenderType; 57 58struct _stateShadingInfo 59{ 60 CGPoint start; 61 CGPoint end; 62 CGFloat colors[8]; 63 BOOL cyclic; 64 CGFloat length; // of the total segment (used by the cyclic gradient) 65 CGFloat period; // of the cycle (used by the cyclic gradient) 66 CGFloat offset; // of the cycle from the start (used by the cyclic gradient) 67}; 68typedef struct _stateShadingInfo StateShadingInfo; 69 70struct _stateGradientInfo 71{ 72 CGPoint start; 73 CGPoint end; 74 CGFloat radius; 75 CGFloat* colordata; 76 CGFloat* fractionsdata; 77 jint fractionsLength; 78}; 79typedef struct _stateGradientInfo StateGradientInfo; 80 81struct _statePatternInfo 82{ 83 CGFloat tx; 84 CGFloat ty; 85 CGFloat sx; 86 CGFloat sy; 87 jint width; 88 jint height; 89 jobject sdata; 90}; 91typedef struct _statePatternInfo StatePatternInfo; 92 93struct _stateGraphicsInfo 94{ 95 BOOL adjustedLineWidth; 96 BOOL adjustedAntialias; 97 BOOL antialiased; 98 jint interpolation; 99 BOOL simpleColor; 100 BOOL simpleStroke; 101 CGAffineTransform ctm; 102 CGFloat offsetX; 103 CGFloat offsetY; 104 struct CGPoint* batchedLines; 105 UInt32 batchedLinesCount; 106}; 107typedef struct _stateGraphicsInfo StateGraphicsInfo; 108 109typedef struct _QuartzSDOps QuartzSDOps; 110typedef void BeginContextFunc(JNIEnv *env, QuartzSDOps *qsdo, SDRenderType renderType); 111typedef void FinishContextFunc(JNIEnv *env, QuartzSDOps *qsdo); 112struct _QuartzSDOps 113{ 114 BufImgSDOps sdo; // must be the first entry! 115 116 BeginContextFunc* BeginSurface; // used to set graphics states (clip, color, stroke, etc...) 117 FinishContextFunc* FinishSurface; // used to finish drawing primitives 118 BOOL newContext; 119 CGContextRef cgRef; 120 121 jint* javaGraphicsStates; 122 jobject javaGraphicsStatesObjects; 123 124 SDRenderType renderType; 125 126 // rdar://problem/5214320 127 // Gradient/Texture fills of Java GeneralPath don't respect the even odd winding rule (quartz pipeline). 128 BOOL isEvenOddFill; // Tracks whether the original render type passed into 129 // SetUpCGContext(...) is SD_EOFILL. 130 // The reason for this field is because SetUpCGContext(...) can 131 // change the render type after calling SetUpPaint(...), and right 132 // after that, the possibly new render type is then assigned into 133 // qsdo->renderType. Sigh!!! 134 // This field is potentially used within CompleteCGContext(...) or 135 // its callees. 136 137 StateShadingInfo* shadingInfo; // tracks shading and its parameters 138 StateGradientInfo* gradientInfo; // tracks gradient and its parameters 139 StatePatternInfo* patternInfo; // tracks pattern and its parameters 140 StateGraphicsInfo graphicsStateInfo; // tracks other graphics state 141 142 BOOL syncContentsToLayer; // should changed pixels be synced to a CALayer 143 CGRect updateRect; // used by the layer synchronization code to track update rects. 144}; 145 146void SetUpCGContext(JNIEnv *env, QuartzSDOps *qsdo, SDRenderType renderType); 147SDRenderType DoShapeUsingCG(CGContextRef cgRef, jint *types, jfloat *coords, jint numtypes, BOOL fill, CGFloat offsetX, CGFloat offsetY); 148SDRenderType SetUpPaint(JNIEnv *env, QuartzSDOps *qsdo, SDRenderType renderType); 149void CompleteCGContext(JNIEnv *env, QuartzSDOps *qsdo); 150 151NSColor* ByteParametersToNSColor(JNIEnv* env, jint *javaGraphicsStates, NSColor* defColor); 152 153#define JNF_COCOA_RENDERER_EXIT(env) \ 154} @catch(NSException *localException) { \ 155 qsdo->FinishSurface(env, qsdo); \ 156 [JNFException throwToJava:env exception:localException]; \ 157} \ 158 if (_token) JNFNativeMethodExit(_token); \ 159} 160