< prev index next >

src/java.desktop/macosx/native/libawt_lwawt/awt/QuartzSurfaceData.m

Print this page




 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         {


< prev index next >