267 PRINT(" gradientPaintReleaseFunction") 268 free(info); 269 } 270 271 static inline void contextQuartzLinearGradientPath(QuartzSDOps* qsdo) 272 { 273 274 PRINT(" contextQuartzLinearGradientPath"); 275 276 CGContextRef cgRef = qsdo->cgRef; 277 StateGradientInfo *gradientInfo = qsdo->gradientInfo; 278 279 CGColorSpaceRef colorspace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); 280 size_t num_locations = gradientInfo->fractionsLength; 281 CGFloat *locations = (CGFloat *) malloc(sizeof(CGFloat) * num_locations); 282 int i = 0; 283 size_t component_size = num_locations * 4; 284 CGFloat components[component_size]; 285 CGGradientRef gradient = NULL; 286 287 for (int i = 0; i < num_locations; i++) { 288 locations[i] = gradientInfo->fractionsdata[i]; 289 //fprintf(stderr, "locations[%d] %f\n", i, locations[i]); 290 } 291 for (i = 0; i < component_size; i++) { 292 components[i] = gradientInfo->colordata[i]; 293 //fprintf(stderr, "components[%d] %f, gradientInfo->colordata[%d] %f\n", 294 // i, components[i], i, gradientInfo->colordata[i]); 295 } 296 CGContextSaveGState(cgRef); 297 gradient = CGGradientCreateWithColorComponents(colorspace, components, locations, num_locations); 298 //fprintf(stderr, "gradientInfo->start.x %f, gradientInfo->start.y %f\n", 299 // gradientInfo->start.x, gradientInfo->start.y); 300 //fprintf(stderr, "gradientInfo->end.x %f, gradientInfo->end.y %f\n", 301 // gradientInfo->end.x, gradientInfo->end.y); 302 if (qsdo->isEvenOddFill) { 303 CGContextEOClip(cgRef); 304 } else { 305 CGContextClip(cgRef); 306 } 307 CGContextDrawLinearGradient(cgRef, gradient, gradientInfo->start, gradientInfo->end, kCGGradientDrawsAfterEndLocation); 308 309 CGContextRestoreGState(cgRef); 310 CGColorSpaceRelease(colorspace); 311 CGGradientRelease(gradient); 312 free(locations); 313 free(gradientInfo->colordata); 314 free(gradientInfo->fractionsdata); 315 } 316 317 static inline void contextQuartzRadialGradientPath(QuartzSDOps* qsdo) 318 { 319 320 PRINT(" contextQuartzRadialGradientPath"); 321 322 CGContextRef cgRef = qsdo->cgRef; 323 StateGradientInfo *gradientInfo = qsdo->gradientInfo; 324 325 CGColorSpaceRef colorspace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); 326 size_t num_locations = gradientInfo->fractionsLength; 327 CGFloat *locations = (CGFloat *) malloc(sizeof(CGFloat) * num_locations); 328 int i = 0; 329 size_t component_size = num_locations * 4; 330 CGFloat components[component_size]; 331 CGGradientRef gradient = NULL; 332 CGFloat startRadius = gradientInfo->radius; 333 CGFloat endRadius = gradientInfo->radius; 334 335 for (int i = 0; i < num_locations; i++) { 336 locations[i] = gradientInfo->fractionsdata[i]; 337 //fprintf(stderr, "locations[%d] %f\n", i, locations[i]); 338 } 339 for (i = 0; i < component_size; i++) { 340 components[i] = gradientInfo->colordata[i]; 341 //fprintf(stderr, "components[%d] %f, gradientInfo->colordata[%d] %f\n", 342 // i, components[i], i, gradientInfo->colordata[i]); 343 } 344 CGContextSaveGState(cgRef); 345 gradient = CGGradientCreateWithColorComponents(colorspace, components, locations, num_locations); 346 //fprintf(stderr, "gradientInfo->start.x %f, gradientInfo->start.y %f\n", 347 // gradientInfo->start.x, gradientInfo->start.y); 348 //fprintf(stderr, "gradientInfo->end.x %f, gradientInfo->end.y %f\n", 349 // gradientInfo->end.x, gradientInfo->end.y); 350 if (qsdo->isEvenOddFill) { 351 CGContextEOClip(cgRef); 352 } else { 353 CGContextClip(cgRef); 354 } 355 //fprintf(stderr, "gradientInfo->startRadius %f, gradientInfo->endRadius %f\n",startRadius,endRadius); 356 CGContextDrawRadialGradient(cgRef, gradient, gradientInfo->start, 0, gradientInfo->end, endRadius, kCGGradientDrawsAfterEndLocation); 357 358 CGContextRestoreGState(cgRef); 359 CGColorSpaceRelease(colorspace); 360 CGGradientRelease(gradient); 361 free(locations); 362 free(gradientInfo->colordata); 363 free(gradientInfo->fractionsdata); 364 } 365 366 static inline void contextGradientPath(QuartzSDOps* qsdo) 367 { 368 PRINT(" ContextGradientPath") 369 370 CGContextRef cgRef = qsdo->cgRef; 371 StateShadingInfo* shadingInfo = qsdo->shadingInfo; 372 373 CGRect bounds = CGContextGetClipBoundingBox(cgRef); 374 375 static const CGFloat domain[2] = {0.0f, 1.0f}; 927 { 928 static const CGFloat kColorConversionMultiplier = 1.0f/255.0f; 929 qsdo->gradientInfo = (StateGradientInfo*)malloc(sizeof(StateGradientInfo)); 930 if (qsdo->gradientInfo == NULL) 931 { 932 [JNFException raise:env as:kOutOfMemoryError reason:"Failed to malloc memory for gradient paint"]; 933 } 934 935 qsdo->graphicsStateInfo.simpleStroke = NO; 936 qsdo->graphicsStateInfo.simpleColor = NO; 937 938 qsdo->gradientInfo->start.x = javaFloatGraphicsStates[sun_java2d_OSXSurfaceData_kColorx1Index]; 939 qsdo->gradientInfo->start.y = javaFloatGraphicsStates[sun_java2d_OSXSurfaceData_kColory1Index]; 940 qsdo->gradientInfo->end.x = javaFloatGraphicsStates[sun_java2d_OSXSurfaceData_kColorx2Index]; 941 qsdo->gradientInfo->end.y = javaFloatGraphicsStates[sun_java2d_OSXSurfaceData_kColory2Index]; 942 943 jobject colorArray = ((*env)->GetObjectArrayElement(env, qsdo->javaGraphicsStatesObjects, sun_java2d_OSXSurfaceData_kColorArrayIndex)); 944 if (colorArray != NULL) 945 { 946 jint length = (*env)->GetArrayLength(env, colorArray); 947 //fprintf(stderr, "length %d\n", length); 948 949 jint* jcolorData = (jint*)(*env)->GetPrimitiveArrayCritical(env, colorArray, NULL); 950 CGFloat* colors= (CGFloat*)calloc(0, sizeof(CGFloat)*length); 951 if (jcolorData != NULL) 952 { 953 jint i; 954 for (i=0; i<length; i++) 955 { 956 colors[i] = (CGFloat)jcolorData[i]; 957 } 958 } 959 (*env)->ReleasePrimitiveArrayCritical(env, colorArray, jcolorData, 0); 960 qsdo->gradientInfo->colordata = (CGFloat*)calloc(0, sizeof(CGFloat)*4*length); 961 for (int i = 0; i < length; i++) 962 { 963 jint c1 = colors[i]; 964 //fprintf(stderr, "c1 %x\n", c1); 965 qsdo->gradientInfo->colordata[i*4] = ((c1>>16)&0xff)*kColorConversionMultiplier; 966 //fprintf(stderr, "qsdo->gradientInfo->colordata[%d] %f\n", i*4, qsdo->gradientInfo->colordata[i*4]); 967 968 qsdo->gradientInfo->colordata[i*4+1] = ((c1>>8)&0xff)*kColorConversionMultiplier; 969 //fprintf(stderr, "qsdo->gradientInfo->colordata[%d] %f\n", i*4+1, qsdo->gradientInfo->colordata[i*4+1]); 970 971 qsdo->gradientInfo->colordata[i*4+2] = ((c1>>0)&0xff)*kColorConversionMultiplier; 972 //fprintf(stderr, "qsdo->gradientInfo->colordata[%d] %f\n", i*4+2, qsdo->gradientInfo->colordata[i*4+2]); 973 974 qsdo->gradientInfo->colordata[i*4+3] = ((c1>>24)&0xff)*kColorConversionMultiplier; 975 //fprintf(stderr, "qsdo->gradientInfo->colordata[%d] %f\n", i*4+3, qsdo->gradientInfo->colordata[i*4+3]); 976 } 977 free(colors); 978 } 979 jobject fractionsArray = ((*env)->GetObjectArrayElement(env, qsdo->javaGraphicsStatesObjects, sun_java2d_OSXSurfaceData_kFractionsArrayIndex)); 980 if (fractionsArray != NULL) 981 { 982 jint length = (*env)->GetArrayLength(env, fractionsArray); 983 //fprintf(stderr, "fractions length %d\n", length); 984 qsdo->gradientInfo->fractionsLength = length; 985 986 jfloat* jfractionsData = (jfloat*)(*env)->GetPrimitiveArrayCritical(env, fractionsArray, NULL); 987 if (jfractionsData != NULL) 988 { 989 qsdo->gradientInfo->fractionsdata = (CGFloat *)malloc(sizeof(CGFloat) *length); 990 jint i; 991 for (i=0; i<length; i++) 992 { 993 qsdo->gradientInfo->fractionsdata[i] = jfractionsData[i]; 994 //fprintf(stderr, "jfrationsData[%d] %f, qsdo->gradientInfo->fractionsdata[%d] = %f\n", i, jfractionsData[i], i, qsdo->gradientInfo->fractionsdata[i]); 995 } 996 (*env)->ReleasePrimitiveArrayCritical(env, fractionsArray, jfractionsData, 0); 997 } 998 } 999 } 1000 1001 SDRenderType SetUpPaint(JNIEnv *env, QuartzSDOps *qsdo, SDRenderType renderType) 1002 { 1003 CGContextRef cgRef = qsdo->cgRef; 1004 1005 jint *javaGraphicsStates = qsdo->javaGraphicsStates; 1006 jfloat *javaFloatGraphicsStates = (jfloat*)(qsdo->javaGraphicsStates); 1007 1008 static const CGFloat kColorConversionMultiplier = 1.0f/255.0f; 1009 jint colorState = javaGraphicsStates[sun_java2d_OSXSurfaceData_kColorStateIndex]; 1010 1011 switch (colorState) 1012 { 1013 case sun_java2d_OSXSurfaceData_kColorSimple: 1014 { | 267 PRINT(" gradientPaintReleaseFunction") 268 free(info); 269 } 270 271 static inline void contextQuartzLinearGradientPath(QuartzSDOps* qsdo) 272 { 273 274 PRINT(" contextQuartzLinearGradientPath"); 275 276 CGContextRef cgRef = qsdo->cgRef; 277 StateGradientInfo *gradientInfo = qsdo->gradientInfo; 278 279 CGColorSpaceRef colorspace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); 280 size_t num_locations = gradientInfo->fractionsLength; 281 CGFloat *locations = (CGFloat *) malloc(sizeof(CGFloat) * num_locations); 282 int i = 0; 283 size_t component_size = num_locations * 4; 284 CGFloat components[component_size]; 285 CGGradientRef gradient = NULL; 286 287 for (i = 0; i < num_locations; i++) { 288 locations[i] = gradientInfo->fractionsdata[i]; 289 } 290 for (i = 0; i < component_size; i++) { 291 components[i] = gradientInfo->colordata[i]; 292 } 293 CGContextSaveGState(cgRef); 294 gradient = CGGradientCreateWithColorComponents(colorspace, components, locations, num_locations); 295 if (qsdo->isEvenOddFill) { 296 CGContextEOClip(cgRef); 297 } else { 298 CGContextClip(cgRef); 299 } 300 CGContextDrawLinearGradient(cgRef, gradient, gradientInfo->start, gradientInfo->end, kCGGradientDrawsAfterEndLocation); 301 302 CGContextRestoreGState(cgRef); 303 CGColorSpaceRelease(colorspace); 304 CGGradientRelease(gradient); 305 free(locations); 306 free(gradientInfo->colordata); 307 free(gradientInfo->fractionsdata); 308 } 309 310 static inline void contextQuartzRadialGradientPath(QuartzSDOps* qsdo) 311 { 312 313 PRINT(" contextQuartzRadialGradientPath"); 314 315 CGContextRef cgRef = qsdo->cgRef; 316 StateGradientInfo *gradientInfo = qsdo->gradientInfo; 317 318 CGColorSpaceRef colorspace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); 319 size_t num_locations = gradientInfo->fractionsLength; 320 CGFloat *locations = (CGFloat *) malloc(sizeof(CGFloat) * num_locations); 321 int i = 0; 322 size_t component_size = num_locations * 4; 323 CGFloat components[component_size]; 324 CGGradientRef gradient = NULL; 325 CGFloat startRadius = gradientInfo->radius; 326 CGFloat endRadius = gradientInfo->radius; 327 328 for (i = 0; i < num_locations; i++) { 329 locations[i] = gradientInfo->fractionsdata[i]; 330 } 331 for (i = 0; i < component_size; i++) { 332 components[i] = gradientInfo->colordata[i]; 333 } 334 CGContextSaveGState(cgRef); 335 gradient = CGGradientCreateWithColorComponents(colorspace, components, locations, num_locations); 336 if (qsdo->isEvenOddFill) { 337 CGContextEOClip(cgRef); 338 } else { 339 CGContextClip(cgRef); 340 } 341 CGContextDrawRadialGradient(cgRef, gradient, gradientInfo->start, 0, gradientInfo->end, endRadius, kCGGradientDrawsAfterEndLocation); 342 343 CGContextRestoreGState(cgRef); 344 CGColorSpaceRelease(colorspace); 345 CGGradientRelease(gradient); 346 free(locations); 347 free(gradientInfo->colordata); 348 free(gradientInfo->fractionsdata); 349 } 350 351 static inline void contextGradientPath(QuartzSDOps* qsdo) 352 { 353 PRINT(" ContextGradientPath") 354 355 CGContextRef cgRef = qsdo->cgRef; 356 StateShadingInfo* shadingInfo = qsdo->shadingInfo; 357 358 CGRect bounds = CGContextGetClipBoundingBox(cgRef); 359 360 static const CGFloat domain[2] = {0.0f, 1.0f}; 912 { 913 static const CGFloat kColorConversionMultiplier = 1.0f/255.0f; 914 qsdo->gradientInfo = (StateGradientInfo*)malloc(sizeof(StateGradientInfo)); 915 if (qsdo->gradientInfo == NULL) 916 { 917 [JNFException raise:env as:kOutOfMemoryError reason:"Failed to malloc memory for gradient paint"]; 918 } 919 920 qsdo->graphicsStateInfo.simpleStroke = NO; 921 qsdo->graphicsStateInfo.simpleColor = NO; 922 923 qsdo->gradientInfo->start.x = javaFloatGraphicsStates[sun_java2d_OSXSurfaceData_kColorx1Index]; 924 qsdo->gradientInfo->start.y = javaFloatGraphicsStates[sun_java2d_OSXSurfaceData_kColory1Index]; 925 qsdo->gradientInfo->end.x = javaFloatGraphicsStates[sun_java2d_OSXSurfaceData_kColorx2Index]; 926 qsdo->gradientInfo->end.y = javaFloatGraphicsStates[sun_java2d_OSXSurfaceData_kColory2Index]; 927 928 jobject colorArray = ((*env)->GetObjectArrayElement(env, qsdo->javaGraphicsStatesObjects, sun_java2d_OSXSurfaceData_kColorArrayIndex)); 929 if (colorArray != NULL) 930 { 931 jint length = (*env)->GetArrayLength(env, colorArray); 932 933 jint* jcolorData = (jint*)(*env)->GetPrimitiveArrayCritical(env, colorArray, NULL); 934 qsdo->gradientInfo->colordata = (CGFloat*)malloc(sizeof(CGFloat)*4*length); 935 memset(qsdo->gradientInfo->colordata, 0, sizeof(CGFloat)*4*length); 936 if (jcolorData != NULL) 937 { 938 int i; 939 for (i=0; i<length; i++) 940 { 941 qsdo->gradientInfo->colordata[i*4] = ((jcolorData[i]>>16)&0xff)*kColorConversionMultiplier; 942 943 qsdo->gradientInfo->colordata[i*4+1] = ((jcolorData[i]>>8)&0xff)*kColorConversionMultiplier; 944 945 qsdo->gradientInfo->colordata[i*4+2] = ((jcolorData[i]>>0)&0xff)*kColorConversionMultiplier; 946 947 qsdo->gradientInfo->colordata[i*4+3] = ((jcolorData[i]>>24)&0xff)*kColorConversionMultiplier; 948 } 949 } 950 (*env)->ReleasePrimitiveArrayCritical(env, colorArray, jcolorData, 0); 951 } 952 jobject fractionsArray = ((*env)->GetObjectArrayElement(env, qsdo->javaGraphicsStatesObjects, sun_java2d_OSXSurfaceData_kFractionsArrayIndex)); 953 if (fractionsArray != NULL) 954 { 955 jint length = (*env)->GetArrayLength(env, fractionsArray); 956 qsdo->gradientInfo->fractionsLength = length; 957 958 jfloat* jfractionsData = (jfloat*)(*env)->GetPrimitiveArrayCritical(env, fractionsArray, NULL); 959 if (jfractionsData != NULL) 960 { 961 int i; 962 qsdo->gradientInfo->fractionsdata = (CGFloat *)malloc(sizeof(CGFloat) *length); 963 memset(qsdo->gradientInfo->fractionsdata, 0, sizeof(CGFloat)*length); 964 for (i=0; i<length; i++) 965 { 966 qsdo->gradientInfo->fractionsdata[i] = jfractionsData[i]; 967 } 968 (*env)->ReleasePrimitiveArrayCritical(env, fractionsArray, jfractionsData, 0); 969 } 970 } 971 } 972 973 SDRenderType SetUpPaint(JNIEnv *env, QuartzSDOps *qsdo, SDRenderType renderType) 974 { 975 CGContextRef cgRef = qsdo->cgRef; 976 977 jint *javaGraphicsStates = qsdo->javaGraphicsStates; 978 jfloat *javaFloatGraphicsStates = (jfloat*)(qsdo->javaGraphicsStates); 979 980 static const CGFloat kColorConversionMultiplier = 1.0f/255.0f; 981 jint colorState = javaGraphicsStates[sun_java2d_OSXSurfaceData_kColorStateIndex]; 982 983 switch (colorState) 984 { 985 case sun_java2d_OSXSurfaceData_kColorSimple: 986 { |