251 } 252 else if (c1 > c2) 253 { 254 *out++ = c1 - ((c1-c2)*range); 255 } 256 else// if (c1 < c2) 257 { 258 *out++ = c1 + ((c2-c1)*range); 259 } 260 } 261 } 262 } 263 264 // this function MUST NOT be inlined! 265 void gradientPaintReleaseFunction(void *info) 266 { 267 PRINT(" gradientPaintReleaseFunction") 268 free(info); 269 } 270 271 static inline void contextGradientPath(QuartzSDOps* qsdo) 272 { 273 PRINT(" ContextGradientPath") 274 CGContextRef cgRef = qsdo->cgRef; 275 StateShadingInfo* shadingInfo = qsdo->shadingInfo; 276 277 CGRect bounds = CGContextGetClipBoundingBox(cgRef); 278 279 static const CGFloat domain[2] = {0.0f, 1.0f}; 280 static const CGFloat range[8] = {0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f}; 281 CGColorSpaceRef colorspace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); 282 CGFunctionRef shadingFunc = NULL; 283 CGShadingRef shading = NULL; 284 if (shadingInfo->cyclic == NO) 285 { 286 static const CGFunctionCallbacks callbacks = {0, &gradientLinearPaintEvaluateFunction, &gradientPaintReleaseFunction}; 287 shadingFunc = CGFunctionCreate((void *)shadingInfo, 1, domain, 4, range, &callbacks); 288 shading = CGShadingCreateAxial(colorspace, shadingInfo->start, shadingInfo->end, shadingFunc, 1, 1); 289 } 290 else 291 { 292 //fprintf(stderr, "BOUNDING BOX x1=%f, y1=%f x2=%f, y2=%f\n", bounds.origin.x, bounds.origin.y, bounds.origin.x+bounds.size.width, bounds.origin.y+bounds.size.height); 293 // need to extend the line start-end 810 } 811 812 BOOL cocoaPaint = (javaGraphicsStates[sun_java2d_OSXSurfaceData_kColorStateIndex] == sun_java2d_OSXSurfaceData_kColorSystem); 813 BOOL complexPaint = (javaGraphicsStates[sun_java2d_OSXSurfaceData_kColorStateIndex] == sun_java2d_OSXSurfaceData_kColorGradient) || 814 (javaGraphicsStates[sun_java2d_OSXSurfaceData_kColorStateIndex] == sun_java2d_OSXSurfaceData_kColorTexture); 815 if ((everyThingChanged == YES) || (paintChanged == YES) || (cocoaPaint == YES) || (complexPaint == YES)) 816 { 817 // rdar://problem/5214320 818 // Gradient fills of Java GeneralPath don't respect the even odd winding rule (quartz pipeline). 819 // Notice the side effect of the stmt after this if-block. 820 if (renderType == SD_EOFill) { 821 qsdo->isEvenOddFill = YES; 822 } 823 824 renderType = SetUpPaint(env, qsdo, renderType); 825 } 826 827 qsdo->renderType = renderType; 828 } 829 830 SDRenderType SetUpPaint(JNIEnv *env, QuartzSDOps *qsdo, SDRenderType renderType) 831 { 832 CGContextRef cgRef = qsdo->cgRef; 833 834 jint *javaGraphicsStates = qsdo->javaGraphicsStates; 835 jfloat *javaFloatGraphicsStates = (jfloat*)(qsdo->javaGraphicsStates); 836 837 static const CGFloat kColorConversionMultiplier = 1.0f/255.0f; 838 jint colorState = javaGraphicsStates[sun_java2d_OSXSurfaceData_kColorStateIndex]; 839 840 switch (colorState) 841 { 842 case sun_java2d_OSXSurfaceData_kColorSimple: 843 { 844 if (qsdo->graphicsStateInfo.simpleColor == NO) 845 { 846 setDefaultColorSpace(cgRef); 847 } 848 qsdo->graphicsStateInfo.simpleColor = YES; 849 881 renderType = SD_Shade; 882 883 qsdo->shadingInfo->start.x = javaFloatGraphicsStates[sun_java2d_OSXSurfaceData_kColorx1Index]; 884 qsdo->shadingInfo->start.y = javaFloatGraphicsStates[sun_java2d_OSXSurfaceData_kColory1Index]; 885 qsdo->shadingInfo->end.x = javaFloatGraphicsStates[sun_java2d_OSXSurfaceData_kColorx2Index]; 886 qsdo->shadingInfo->end.y = javaFloatGraphicsStates[sun_java2d_OSXSurfaceData_kColory2Index]; 887 jint c1 = javaGraphicsStates[sun_java2d_OSXSurfaceData_kColorRGBValue1Index]; 888 qsdo->shadingInfo->colors[0] = ((c1>>16)&0xff)*kColorConversionMultiplier; 889 qsdo->shadingInfo->colors[1] = ((c1>>8)&0xff)*kColorConversionMultiplier; 890 qsdo->shadingInfo->colors[2] = ((c1>>0)&0xff)*kColorConversionMultiplier; 891 qsdo->shadingInfo->colors[3] = ((c1>>24)&0xff)*kColorConversionMultiplier; 892 jint c2 = javaGraphicsStates[sun_java2d_OSXSurfaceData_kColorRGBValue2Index]; 893 qsdo->shadingInfo->colors[4] = ((c2>>16)&0xff)*kColorConversionMultiplier; 894 qsdo->shadingInfo->colors[5] = ((c2>>8)&0xff)*kColorConversionMultiplier; 895 qsdo->shadingInfo->colors[6] = ((c2>>0)&0xff)*kColorConversionMultiplier; 896 qsdo->shadingInfo->colors[7] = ((c2>>24)&0xff)*kColorConversionMultiplier; 897 qsdo->shadingInfo->cyclic = (javaGraphicsStates[sun_java2d_OSXSurfaceData_kColorIsCyclicIndex] == sun_java2d_OSXSurfaceData_kColorCyclic); 898 899 break; 900 } 901 case sun_java2d_OSXSurfaceData_kColorTexture: 902 { 903 qsdo->patternInfo = (StatePatternInfo*)malloc(sizeof(StatePatternInfo)); 904 if (qsdo->patternInfo == NULL) 905 { 906 [JNFException raise:env as:kOutOfMemoryError reason:"Failed to malloc memory for texture paint"]; 907 } 908 909 qsdo->graphicsStateInfo.simpleStroke = NO; 910 qsdo->graphicsStateInfo.simpleColor = NO; 911 912 renderType = SD_Pattern; 913 914 qsdo->patternInfo->tx = javaFloatGraphicsStates[sun_java2d_OSXSurfaceData_kColortxIndex]; 915 qsdo->patternInfo->ty = javaFloatGraphicsStates[sun_java2d_OSXSurfaceData_kColortyIndex]; 916 qsdo->patternInfo->sx = javaFloatGraphicsStates[sun_java2d_OSXSurfaceData_kColorsxIndex]; 917 if (qsdo->patternInfo->sx == 0.0f) 918 { 919 return SD_Fill; // 0 is an invalid value, fill argb rect 920 } 1059 if (CGContextIsPathEmpty(qsdo->cgRef) == 0) 1060 { 1061 CGContextStrokePath(qsdo->cgRef); 1062 } 1063 break; 1064 1065 case SD_Fill: 1066 if (CGContextIsPathEmpty(qsdo->cgRef) == 0) 1067 { 1068 CGContextFillPath(qsdo->cgRef); 1069 } 1070 break; 1071 1072 case SD_Shade: 1073 if (CGContextIsPathEmpty(qsdo->cgRef) == 0) 1074 { 1075 contextGradientPath(qsdo); 1076 } 1077 break; 1078 1079 case SD_Pattern: 1080 if (CGContextIsPathEmpty(qsdo->cgRef) == 0) 1081 { 1082 //TODO:BG 1083 //contextTexturePath(env, qsdo); 1084 } 1085 break; 1086 1087 case SD_EOFill: 1088 if (CGContextIsPathEmpty(qsdo->cgRef) == 0) 1089 { 1090 CGContextEOFillPath(qsdo->cgRef); 1091 } 1092 break; 1093 1094 case SD_Image: 1095 break; 1096 1097 case SD_Text: 1098 break; 1099 1100 case SD_CopyArea: 1101 break; 1102 1103 case SD_Queue: 1104 break; 1105 1106 case SD_External: 1107 break; 1108 } 1109 1110 if (qsdo->shadingInfo != NULL) { 1111 gradientPaintReleaseFunction(qsdo->shadingInfo); 1112 qsdo->shadingInfo = NULL; 1113 } 1114 } | 251 } 252 else if (c1 > c2) 253 { 254 *out++ = c1 - ((c1-c2)*range); 255 } 256 else// if (c1 < c2) 257 { 258 *out++ = c1 + ((c2-c1)*range); 259 } 260 } 261 } 262 } 263 264 // this function MUST NOT be inlined! 265 void gradientPaintReleaseFunction(void *info) 266 { 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}; 376 static const CGFloat range[8] = {0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f}; 377 CGColorSpaceRef colorspace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); 378 CGFunctionRef shadingFunc = NULL; 379 CGShadingRef shading = NULL; 380 if (shadingInfo->cyclic == NO) 381 { 382 static const CGFunctionCallbacks callbacks = {0, &gradientLinearPaintEvaluateFunction, &gradientPaintReleaseFunction}; 383 shadingFunc = CGFunctionCreate((void *)shadingInfo, 1, domain, 4, range, &callbacks); 384 shading = CGShadingCreateAxial(colorspace, shadingInfo->start, shadingInfo->end, shadingFunc, 1, 1); 385 } 386 else 387 { 388 //fprintf(stderr, "BOUNDING BOX x1=%f, y1=%f x2=%f, y2=%f\n", bounds.origin.x, bounds.origin.y, bounds.origin.x+bounds.size.width, bounds.origin.y+bounds.size.height); 389 // need to extend the line start-end 906 } 907 908 BOOL cocoaPaint = (javaGraphicsStates[sun_java2d_OSXSurfaceData_kColorStateIndex] == sun_java2d_OSXSurfaceData_kColorSystem); 909 BOOL complexPaint = (javaGraphicsStates[sun_java2d_OSXSurfaceData_kColorStateIndex] == sun_java2d_OSXSurfaceData_kColorGradient) || 910 (javaGraphicsStates[sun_java2d_OSXSurfaceData_kColorStateIndex] == sun_java2d_OSXSurfaceData_kColorTexture); 911 if ((everyThingChanged == YES) || (paintChanged == YES) || (cocoaPaint == YES) || (complexPaint == YES)) 912 { 913 // rdar://problem/5214320 914 // Gradient fills of Java GeneralPath don't respect the even odd winding rule (quartz pipeline). 915 // Notice the side effect of the stmt after this if-block. 916 if (renderType == SD_EOFill) { 917 qsdo->isEvenOddFill = YES; 918 } 919 920 renderType = SetUpPaint(env, qsdo, renderType); 921 } 922 923 qsdo->renderType = renderType; 924 } 925 926 void setupGradient(JNIEnv *env, QuartzSDOps* qsdo, jfloat* javaFloatGraphicsStates) 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 { 1015 if (qsdo->graphicsStateInfo.simpleColor == NO) 1016 { 1017 setDefaultColorSpace(cgRef); 1018 } 1019 qsdo->graphicsStateInfo.simpleColor = YES; 1020 1052 renderType = SD_Shade; 1053 1054 qsdo->shadingInfo->start.x = javaFloatGraphicsStates[sun_java2d_OSXSurfaceData_kColorx1Index]; 1055 qsdo->shadingInfo->start.y = javaFloatGraphicsStates[sun_java2d_OSXSurfaceData_kColory1Index]; 1056 qsdo->shadingInfo->end.x = javaFloatGraphicsStates[sun_java2d_OSXSurfaceData_kColorx2Index]; 1057 qsdo->shadingInfo->end.y = javaFloatGraphicsStates[sun_java2d_OSXSurfaceData_kColory2Index]; 1058 jint c1 = javaGraphicsStates[sun_java2d_OSXSurfaceData_kColorRGBValue1Index]; 1059 qsdo->shadingInfo->colors[0] = ((c1>>16)&0xff)*kColorConversionMultiplier; 1060 qsdo->shadingInfo->colors[1] = ((c1>>8)&0xff)*kColorConversionMultiplier; 1061 qsdo->shadingInfo->colors[2] = ((c1>>0)&0xff)*kColorConversionMultiplier; 1062 qsdo->shadingInfo->colors[3] = ((c1>>24)&0xff)*kColorConversionMultiplier; 1063 jint c2 = javaGraphicsStates[sun_java2d_OSXSurfaceData_kColorRGBValue2Index]; 1064 qsdo->shadingInfo->colors[4] = ((c2>>16)&0xff)*kColorConversionMultiplier; 1065 qsdo->shadingInfo->colors[5] = ((c2>>8)&0xff)*kColorConversionMultiplier; 1066 qsdo->shadingInfo->colors[6] = ((c2>>0)&0xff)*kColorConversionMultiplier; 1067 qsdo->shadingInfo->colors[7] = ((c2>>24)&0xff)*kColorConversionMultiplier; 1068 qsdo->shadingInfo->cyclic = (javaGraphicsStates[sun_java2d_OSXSurfaceData_kColorIsCyclicIndex] == sun_java2d_OSXSurfaceData_kColorCyclic); 1069 1070 break; 1071 } 1072 case sun_java2d_OSXSurfaceData_kColorLinearGradient: 1073 { 1074 renderType = SD_LinearGradient; 1075 setupGradient(env, qsdo, javaFloatGraphicsStates); 1076 break; 1077 } 1078 1079 case sun_java2d_OSXSurfaceData_kColorRadialGradient: 1080 { 1081 renderType = SD_RadialGradient; 1082 setupGradient(env, qsdo, javaFloatGraphicsStates); 1083 qsdo->gradientInfo->radius = javaFloatGraphicsStates[sun_java2d_OSXSurfaceData_kRadiusIndex]; 1084 break; 1085 } 1086 1087 case sun_java2d_OSXSurfaceData_kColorTexture: 1088 { 1089 qsdo->patternInfo = (StatePatternInfo*)malloc(sizeof(StatePatternInfo)); 1090 if (qsdo->patternInfo == NULL) 1091 { 1092 [JNFException raise:env as:kOutOfMemoryError reason:"Failed to malloc memory for texture paint"]; 1093 } 1094 1095 qsdo->graphicsStateInfo.simpleStroke = NO; 1096 qsdo->graphicsStateInfo.simpleColor = NO; 1097 1098 renderType = SD_Pattern; 1099 1100 qsdo->patternInfo->tx = javaFloatGraphicsStates[sun_java2d_OSXSurfaceData_kColortxIndex]; 1101 qsdo->patternInfo->ty = javaFloatGraphicsStates[sun_java2d_OSXSurfaceData_kColortyIndex]; 1102 qsdo->patternInfo->sx = javaFloatGraphicsStates[sun_java2d_OSXSurfaceData_kColorsxIndex]; 1103 if (qsdo->patternInfo->sx == 0.0f) 1104 { 1105 return SD_Fill; // 0 is an invalid value, fill argb rect 1106 } 1245 if (CGContextIsPathEmpty(qsdo->cgRef) == 0) 1246 { 1247 CGContextStrokePath(qsdo->cgRef); 1248 } 1249 break; 1250 1251 case SD_Fill: 1252 if (CGContextIsPathEmpty(qsdo->cgRef) == 0) 1253 { 1254 CGContextFillPath(qsdo->cgRef); 1255 } 1256 break; 1257 1258 case SD_Shade: 1259 if (CGContextIsPathEmpty(qsdo->cgRef) == 0) 1260 { 1261 contextGradientPath(qsdo); 1262 } 1263 break; 1264 1265 case SD_LinearGradient: 1266 if (CGContextIsPathEmpty(qsdo->cgRef) == 0) 1267 { 1268 contextQuartzLinearGradientPath(qsdo); 1269 } 1270 break; 1271 1272 case SD_RadialGradient: 1273 if (CGContextIsPathEmpty(qsdo->cgRef) == 0) 1274 { 1275 contextQuartzRadialGradientPath(qsdo); 1276 } 1277 break; 1278 1279 case SD_Pattern: 1280 if (CGContextIsPathEmpty(qsdo->cgRef) == 0) 1281 { 1282 contextTexturePath(env, qsdo); 1283 } 1284 break; 1285 1286 case SD_EOFill: 1287 if (CGContextIsPathEmpty(qsdo->cgRef) == 0) 1288 { 1289 CGContextEOFillPath(qsdo->cgRef); 1290 } 1291 break; 1292 1293 case SD_Image: 1294 break; 1295 1296 case SD_Text: 1297 break; 1298 1299 case SD_CopyArea: 1300 break; 1301 1302 case SD_Queue: 1303 break; 1304 1305 case SD_External: 1306 break; 1307 } 1308 1309 if (qsdo->shadingInfo != NULL) { 1310 gradientPaintReleaseFunction(qsdo->shadingInfo); 1311 qsdo->shadingInfo = NULL; 1312 } 1313 if (qsdo->gradientInfo != NULL) { 1314 gradientPaintReleaseFunction(qsdo->gradientInfo); 1315 qsdo->gradientInfo = NULL; 1316 } 1317 } |