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 "java_awt_image_BufferedImage.h"
27 #import "java_awt_geom_PathIterator.h"
28 #import "sun_java2d_OSXSurfaceData.h"
29
30 #import <stdio.h>
31 #import <JavaNativeFoundation/JavaNativeFoundation.h>
32
33 #import "ImageSurfaceData.h"
34
35
36 //#define DEBUG 1
37 #if defined DEBUG
38 #define QUARTZ_RENDERER_INLINE
39 #define PRINT(msg) {fprintf(stderr, "%s\n", msg);fflush(stderr);}
40 #else
41 #define QUARTZ_RENDERER_INLINE static inline
42 #define PRINT(msg) {}
43 #endif
44
45 // Copied the following from Math.java
46 #define PI 3.14159265358979323846f
47
48 #define BATCHED_POINTS_SIZE 1024
49
50 // same value as defined in Sun's own code
51 #define XOR_ALPHA_CUTOFF 128
619 gRoundRectCtrlpts[2][3] = -acv;
620 gRoundRectCtrlpts[2][5] = acv;
621 gRoundRectCtrlpts[4][1] = -acv;
622 gRoundRectCtrlpts[4][7] = -acv;
623 gRoundRectCtrlpts[6][3] = acv;
624 gRoundRectCtrlpts[6][5] = -acv;
625 gRoundRectCtrlpts[8][1] = acv;
626 gRoundRectCtrlpts[8][7] = acv;
627 }
628
629 /*
630 * Class: sun_java2d_CRenderer
631 * Method: doLine
632 * Signature: (Lsun/java2d/SurfaceData;Ljava/nio/IntBuffer;Ljava/nio/FloatBuffer;[Ljava/lang/Object;FFFF)V
633 */
634 JNIEXPORT void JNICALL Java_sun_java2d_CRenderer_doLine
635 (JNIEnv *env, jobject jthis, jobject jsurfacedata, jfloat x1, jfloat y1, jfloat x2, jfloat y2)
636 {
637 PRINT("Java_sun_java2d_CRenderer_doLine")
638 QuartzSDOps *qsdo = (QuartzSDOps*)SurfaceData_GetOps(env, jsurfacedata);
639 JNF_COCOA_ENTER(env);
640 SDRenderType renderType = SD_Stroke;
641 qsdo->BeginSurface(env, qsdo, renderType);
642 if (qsdo->cgRef != NULL)
643 {
644 doLine(qsdo, x1, y1, x2, y2);
645 }
646 qsdo->FinishSurface(env, qsdo);
647 JNF_COCOA_RENDERER_EXIT(env);
648 }
649
650 /*
651 * Class: sun_java2d_CRenderer
652 * Method: doRect
653 * Signature: (Lsun/java2d/SurfaceData;Ljava/nio/IntBuffer;Ljava/nio/FloatBuffer;[Ljava/lang/Object;FFFF)V
654 */
655 JNIEXPORT void JNICALL Java_sun_java2d_CRenderer_doRect
656 (JNIEnv *env, jobject jthis, jobject jsurfacedata, jfloat x, jfloat y, jfloat w, jfloat h, jboolean isfill)
657 {
658 PRINT("Java_sun_java2d_CRenderer_doRect")
659 QuartzSDOps *qsdo = (QuartzSDOps*)SurfaceData_GetOps(env, jsurfacedata);
660 JNF_COCOA_ENTER(env);
661 SDRenderType renderType = (isfill? SD_Fill : SD_Stroke);
662 qsdo->BeginSurface(env, qsdo, renderType);
663 if (qsdo->cgRef != NULL)
664 {
665 doRect(qsdo, x, y, w, h, isfill);
666 }
667 qsdo->FinishSurface(env, qsdo);
668 JNF_COCOA_RENDERER_EXIT(env);
669 }
670
671 /*
672 * Class: sun_java2d_CRenderer
673 * Method: doRoundRect
674 * Signature: (Lsun/java2d/SurfaceData;Ljava/nio/IntBuffer;Ljava/nio/FloatBuffer;[Ljava/lang/Object;IIIIII)V
675 */
676 JNIEXPORT void JNICALL Java_sun_java2d_CRenderer_doRoundRect
677 (JNIEnv *env, jobject jthis, jobject jsurfacedata, jfloat x, jfloat y, jfloat w, jfloat h, jfloat arcWidth, jfloat arcHeight, jboolean isfill)
678 {
679 PRINT("Java_sun_java2d_CRenderer_doRoundRect")
680 QuartzSDOps *qsdo = (QuartzSDOps*)SurfaceData_GetOps(env, jsurfacedata);
681 JNF_COCOA_ENTER(env);
682 SDRenderType renderType = (isfill? SD_Fill : SD_Stroke);
683 qsdo->BeginSurface(env, qsdo, renderType);
684 if (qsdo->cgRef != NULL)
685 {
686 doRoundRect(qsdo, x, y, w, h, arcWidth, arcHeight, isfill);
687 }
688 qsdo->FinishSurface(env, qsdo);
689 JNF_COCOA_RENDERER_EXIT(env);
690 }
691
692 /*
693 * Class: sun_java2d_CRenderer
694 * Method: doOval
695 * Signature: (Lsun/java2d/SurfaceData;Ljava/nio/IntBuffer;Ljava/nio/FloatBuffer;[Ljava/lang/Object;IIII)V
696 */
697 JNIEXPORT void JNICALL Java_sun_java2d_CRenderer_doOval
698 (JNIEnv *env, jobject jthis, jobject jsurfacedata, jfloat x, jfloat y, jfloat w, jfloat h, jboolean isfill)
699 {
700 PRINT("Java_sun_java2d_CRenderer_doOval")
701 QuartzSDOps *qsdo = (QuartzSDOps*)SurfaceData_GetOps(env, jsurfacedata);
702 JNF_COCOA_ENTER(env);
703 SDRenderType renderType = (isfill? SD_Fill : SD_Stroke);
704 qsdo->BeginSurface(env, qsdo, renderType);
705 if (qsdo->cgRef != NULL)
706 {
707 doOval(qsdo, x, y, w, h, isfill);
708 }
709 qsdo->FinishSurface(env, qsdo);
710 JNF_COCOA_RENDERER_EXIT(env);
711 }
712
713 /*
714 * Class: sun_java2d_CRenderer
715 * Method: doArc
716 * Signature: (Lsun/java2d/SurfaceData;Ljava/nio/IntBuffer;Ljava/nio/FloatBuffer;[Ljava/lang/Object;IIIIII)V
717 */
718 JNIEXPORT void JNICALL Java_sun_java2d_CRenderer_doArc
719 (JNIEnv *env, jobject jthis, jobject jsurfacedata, jfloat x, jfloat y, jfloat w, jfloat h, jfloat angleStart, jfloat angleExtent, jint arcType, jboolean isfill)
720 {
721 PRINT("Java_sun_java2d_CRenderer_doArc")
722 QuartzSDOps *qsdo = (QuartzSDOps*)SurfaceData_GetOps(env, jsurfacedata);
723 JNF_COCOA_ENTER(env);
724 SDRenderType renderType = (isfill? SD_Fill : SD_Stroke);
725 qsdo->BeginSurface(env, qsdo, renderType);
726 if (qsdo->cgRef != NULL)
727 {
728 doArc(qsdo, x, y, w, h, angleStart, angleExtent, arcType, isfill);
729 }
730 qsdo->FinishSurface(env, qsdo);
731 JNF_COCOA_RENDERER_EXIT(env);
732 }
733
734 /*
735 * Class: sun_java2d_CRenderer
736 * Method: doPoly
737 * Signature:
738 */
739 JNIEXPORT void JNICALL Java_sun_java2d_CRenderer_doPoly
740 (JNIEnv *env, jobject jthis, jobject jsurfacedata, jintArray xpointsarray, jintArray ypointsarray, jint npoints, jboolean ispolygon, jboolean isfill)
741 {
742 PRINT("Java_sun_java2d_CRenderer_doPoly")
743 QuartzSDOps *qsdo = (QuartzSDOps*)SurfaceData_GetOps(env, jsurfacedata);
744 JNF_COCOA_ENTER(env);
745 BOOL eoFill = YES; // polys are WIND_EVEN_ODD by definition
746 SDRenderType renderType = (isfill? (eoFill ? SD_EOFill : SD_Fill) : SD_Stroke);
747 qsdo->BeginSurface(env, qsdo, renderType);
748 if (qsdo->cgRef != NULL)
749 {
750 doPoly(env, qsdo, xpointsarray, ypointsarray, npoints, ispolygon, isfill);
751 }
752 qsdo->FinishSurface(env, qsdo);
753 JNF_COCOA_RENDERER_EXIT(env);
754 }
755
756 /*
757 * Class: sun_java2d_CRenderer
758 * Method: doShape
759 * Signature: (Lsun/java2d/SurfaceData;Ljava/nio/IntBuffer;Ljava/nio/FloatBuffer;[Ljava/lang/Object;ILjava/nio/FloatBuffer;Ljava/nio/IntBuffer;IZ)V
760 */
761 JNIEXPORT void JNICALL Java_sun_java2d_CRenderer_doShape
762 (JNIEnv *env, jobject jthis, jobject jsurfacedata, jint length, jobject jFloatCoordinates, jobject jIntTypes, jint windingRule, jboolean isfill, jboolean shouldApplyOffset)
763 {
764 PRINT("Java_sun_java2d_CRenderer_doShape")
765 QuartzSDOps *qsdo = (QuartzSDOps*)SurfaceData_GetOps(env, jsurfacedata);
766 JNF_COCOA_ENTER(env);
767 BOOL eoFill = (windingRule == java_awt_geom_PathIterator_WIND_EVEN_ODD);
768 SDRenderType renderType = (isfill? (eoFill ? SD_EOFill : SD_Fill) : SD_Stroke);
769 qsdo->BeginSurface(env, qsdo, renderType);
770 if (qsdo->cgRef != NULL)
771 {
772 jfloat *coordinates = (jfloat*)((*env)->GetDirectBufferAddress(env, jFloatCoordinates));
773 jint *types = (jint*)((*env)->GetDirectBufferAddress(env, jIntTypes));
774 doShape(qsdo, types, coordinates, length, isfill, shouldApplyOffset);
775 }
776 qsdo->FinishSurface(env, qsdo);
777 JNF_COCOA_RENDERER_EXIT(env);
778 }
779
780 #define invalidContext(c) \
781 ((c) == NULL /* || (c)->identifer != CGContextIdentifier */)
782
783 /*
784 * Class: sun_java2d_CRenderer
785 * Method: doImage
786 * Signature: (Lsun/java2d/SurfaceData;Ljava/nio/IntBuffer;Ljava/nio/FloatBuffer;[Ljava/lang/Object;Lsun/java2d/SurfaceData;ZZIIIIIIII)V
787 */
788 JNIEXPORT void JNICALL Java_sun_java2d_CRenderer_doImage
789 (JNIEnv *env, jobject jthis, jobject jsurfacedata, jobject imageSurfaceData, jboolean fliph, jboolean flipv, jint w, jint h, jint sx, jint sy, jint sw, jint sh, jint dx, jint dy, jint dw, jint dh)
790 {
791 PRINT("Java_sun_java2d_CRenderer_doImage")
792 QuartzSDOps *qsdo = (QuartzSDOps*)SurfaceData_GetOps(env, jsurfacedata);
793 JNF_COCOA_ENTER(env);
794 qsdo->BeginSurface(env, qsdo, SD_Image);
795 if (qsdo->cgRef != NULL)
796 {
797 doImage(env, qsdo, imageSurfaceData, fliph, flipv, w, h, sx, sy, sw, sh, dx, dy, dw, dh);
798 }
799 qsdo->FinishSurface(env, qsdo);
800 JNF_COCOA_RENDERER_EXIT(env);
801 }
|
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 "java_awt_image_BufferedImage.h"
27 #import "java_awt_geom_PathIterator.h"
28 #import "sun_java2d_OSXSurfaceData.h"
29
30 #import <stdio.h>
31
32 #import "ImageSurfaceData.h"
33
34
35 //#define DEBUG 1
36 #if defined DEBUG
37 #define QUARTZ_RENDERER_INLINE
38 #define PRINT(msg) {fprintf(stderr, "%s\n", msg);fflush(stderr);}
39 #else
40 #define QUARTZ_RENDERER_INLINE static inline
41 #define PRINT(msg) {}
42 #endif
43
44 // Copied the following from Math.java
45 #define PI 3.14159265358979323846f
46
47 #define BATCHED_POINTS_SIZE 1024
48
49 // same value as defined in Sun's own code
50 #define XOR_ALPHA_CUTOFF 128
618 gRoundRectCtrlpts[2][3] = -acv;
619 gRoundRectCtrlpts[2][5] = acv;
620 gRoundRectCtrlpts[4][1] = -acv;
621 gRoundRectCtrlpts[4][7] = -acv;
622 gRoundRectCtrlpts[6][3] = acv;
623 gRoundRectCtrlpts[6][5] = -acv;
624 gRoundRectCtrlpts[8][1] = acv;
625 gRoundRectCtrlpts[8][7] = acv;
626 }
627
628 /*
629 * Class: sun_java2d_CRenderer
630 * Method: doLine
631 * Signature: (Lsun/java2d/SurfaceData;Ljava/nio/IntBuffer;Ljava/nio/FloatBuffer;[Ljava/lang/Object;FFFF)V
632 */
633 JNIEXPORT void JNICALL Java_sun_java2d_CRenderer_doLine
634 (JNIEnv *env, jobject jthis, jobject jsurfacedata, jfloat x1, jfloat y1, jfloat x2, jfloat y2)
635 {
636 PRINT("Java_sun_java2d_CRenderer_doLine")
637 QuartzSDOps *qsdo = (QuartzSDOps*)SurfaceData_GetOps(env, jsurfacedata);
638 JNI_COCOA_ENTER(env);
639 SDRenderType renderType = SD_Stroke;
640 qsdo->BeginSurface(env, qsdo, renderType);
641 if (qsdo->cgRef != NULL)
642 {
643 doLine(qsdo, x1, y1, x2, y2);
644 }
645 qsdo->FinishSurface(env, qsdo);
646 JNI_COCOA_RENDERER_EXIT(env);
647 }
648
649 /*
650 * Class: sun_java2d_CRenderer
651 * Method: doRect
652 * Signature: (Lsun/java2d/SurfaceData;Ljava/nio/IntBuffer;Ljava/nio/FloatBuffer;[Ljava/lang/Object;FFFF)V
653 */
654 JNIEXPORT void JNICALL Java_sun_java2d_CRenderer_doRect
655 (JNIEnv *env, jobject jthis, jobject jsurfacedata, jfloat x, jfloat y, jfloat w, jfloat h, jboolean isfill)
656 {
657 PRINT("Java_sun_java2d_CRenderer_doRect")
658 QuartzSDOps *qsdo = (QuartzSDOps*)SurfaceData_GetOps(env, jsurfacedata);
659 JNI_COCOA_ENTER(env);
660 SDRenderType renderType = (isfill? SD_Fill : SD_Stroke);
661 qsdo->BeginSurface(env, qsdo, renderType);
662 if (qsdo->cgRef != NULL)
663 {
664 doRect(qsdo, x, y, w, h, isfill);
665 }
666 qsdo->FinishSurface(env, qsdo);
667 JNI_COCOA_RENDERER_EXIT(env);
668 }
669
670 /*
671 * Class: sun_java2d_CRenderer
672 * Method: doRoundRect
673 * Signature: (Lsun/java2d/SurfaceData;Ljava/nio/IntBuffer;Ljava/nio/FloatBuffer;[Ljava/lang/Object;IIIIII)V
674 */
675 JNIEXPORT void JNICALL Java_sun_java2d_CRenderer_doRoundRect
676 (JNIEnv *env, jobject jthis, jobject jsurfacedata, jfloat x, jfloat y, jfloat w, jfloat h, jfloat arcWidth, jfloat arcHeight, jboolean isfill)
677 {
678 PRINT("Java_sun_java2d_CRenderer_doRoundRect")
679 QuartzSDOps *qsdo = (QuartzSDOps*)SurfaceData_GetOps(env, jsurfacedata);
680 JNI_COCOA_ENTER(env);
681 SDRenderType renderType = (isfill? SD_Fill : SD_Stroke);
682 qsdo->BeginSurface(env, qsdo, renderType);
683 if (qsdo->cgRef != NULL)
684 {
685 doRoundRect(qsdo, x, y, w, h, arcWidth, arcHeight, isfill);
686 }
687 qsdo->FinishSurface(env, qsdo);
688 JNI_COCOA_RENDERER_EXIT(env);
689 }
690
691 /*
692 * Class: sun_java2d_CRenderer
693 * Method: doOval
694 * Signature: (Lsun/java2d/SurfaceData;Ljava/nio/IntBuffer;Ljava/nio/FloatBuffer;[Ljava/lang/Object;IIII)V
695 */
696 JNIEXPORT void JNICALL Java_sun_java2d_CRenderer_doOval
697 (JNIEnv *env, jobject jthis, jobject jsurfacedata, jfloat x, jfloat y, jfloat w, jfloat h, jboolean isfill)
698 {
699 PRINT("Java_sun_java2d_CRenderer_doOval")
700 QuartzSDOps *qsdo = (QuartzSDOps*)SurfaceData_GetOps(env, jsurfacedata);
701 JNI_COCOA_ENTER(env);
702 SDRenderType renderType = (isfill? SD_Fill : SD_Stroke);
703 qsdo->BeginSurface(env, qsdo, renderType);
704 if (qsdo->cgRef != NULL)
705 {
706 doOval(qsdo, x, y, w, h, isfill);
707 }
708 qsdo->FinishSurface(env, qsdo);
709 JNI_COCOA_RENDERER_EXIT(env);
710 }
711
712 /*
713 * Class: sun_java2d_CRenderer
714 * Method: doArc
715 * Signature: (Lsun/java2d/SurfaceData;Ljava/nio/IntBuffer;Ljava/nio/FloatBuffer;[Ljava/lang/Object;IIIIII)V
716 */
717 JNIEXPORT void JNICALL Java_sun_java2d_CRenderer_doArc
718 (JNIEnv *env, jobject jthis, jobject jsurfacedata, jfloat x, jfloat y, jfloat w, jfloat h, jfloat angleStart, jfloat angleExtent, jint arcType, jboolean isfill)
719 {
720 PRINT("Java_sun_java2d_CRenderer_doArc")
721 QuartzSDOps *qsdo = (QuartzSDOps*)SurfaceData_GetOps(env, jsurfacedata);
722 JNI_COCOA_ENTER(env);
723 SDRenderType renderType = (isfill? SD_Fill : SD_Stroke);
724 qsdo->BeginSurface(env, qsdo, renderType);
725 if (qsdo->cgRef != NULL)
726 {
727 doArc(qsdo, x, y, w, h, angleStart, angleExtent, arcType, isfill);
728 }
729 qsdo->FinishSurface(env, qsdo);
730 JNI_COCOA_RENDERER_EXIT(env);
731 }
732
733 /*
734 * Class: sun_java2d_CRenderer
735 * Method: doPoly
736 * Signature:
737 */
738 JNIEXPORT void JNICALL Java_sun_java2d_CRenderer_doPoly
739 (JNIEnv *env, jobject jthis, jobject jsurfacedata, jintArray xpointsarray, jintArray ypointsarray, jint npoints, jboolean ispolygon, jboolean isfill)
740 {
741 PRINT("Java_sun_java2d_CRenderer_doPoly")
742 QuartzSDOps *qsdo = (QuartzSDOps*)SurfaceData_GetOps(env, jsurfacedata);
743 JNI_COCOA_ENTER(env);
744 BOOL eoFill = YES; // polys are WIND_EVEN_ODD by definition
745 SDRenderType renderType = (isfill? (eoFill ? SD_EOFill : SD_Fill) : SD_Stroke);
746 qsdo->BeginSurface(env, qsdo, renderType);
747 if (qsdo->cgRef != NULL)
748 {
749 doPoly(env, qsdo, xpointsarray, ypointsarray, npoints, ispolygon, isfill);
750 }
751 qsdo->FinishSurface(env, qsdo);
752 JNI_COCOA_RENDERER_EXIT(env);
753 }
754
755 /*
756 * Class: sun_java2d_CRenderer
757 * Method: doShape
758 * Signature: (Lsun/java2d/SurfaceData;Ljava/nio/IntBuffer;Ljava/nio/FloatBuffer;[Ljava/lang/Object;ILjava/nio/FloatBuffer;Ljava/nio/IntBuffer;IZ)V
759 */
760 JNIEXPORT void JNICALL Java_sun_java2d_CRenderer_doShape
761 (JNIEnv *env, jobject jthis, jobject jsurfacedata, jint length, jobject jFloatCoordinates, jobject jIntTypes, jint windingRule, jboolean isfill, jboolean shouldApplyOffset)
762 {
763 PRINT("Java_sun_java2d_CRenderer_doShape")
764 QuartzSDOps *qsdo = (QuartzSDOps*)SurfaceData_GetOps(env, jsurfacedata);
765 JNI_COCOA_ENTER(env);
766 BOOL eoFill = (windingRule == java_awt_geom_PathIterator_WIND_EVEN_ODD);
767 SDRenderType renderType = (isfill? (eoFill ? SD_EOFill : SD_Fill) : SD_Stroke);
768 qsdo->BeginSurface(env, qsdo, renderType);
769 if (qsdo->cgRef != NULL)
770 {
771 jfloat *coordinates = (jfloat*)((*env)->GetDirectBufferAddress(env, jFloatCoordinates));
772 jint *types = (jint*)((*env)->GetDirectBufferAddress(env, jIntTypes));
773 doShape(qsdo, types, coordinates, length, isfill, shouldApplyOffset);
774 }
775 qsdo->FinishSurface(env, qsdo);
776 JNI_COCOA_RENDERER_EXIT(env);
777 }
778
779 #define invalidContext(c) \
780 ((c) == NULL /* || (c)->identifer != CGContextIdentifier */)
781
782 /*
783 * Class: sun_java2d_CRenderer
784 * Method: doImage
785 * Signature: (Lsun/java2d/SurfaceData;Ljava/nio/IntBuffer;Ljava/nio/FloatBuffer;[Ljava/lang/Object;Lsun/java2d/SurfaceData;ZZIIIIIIII)V
786 */
787 JNIEXPORT void JNICALL Java_sun_java2d_CRenderer_doImage
788 (JNIEnv *env, jobject jthis, jobject jsurfacedata, jobject imageSurfaceData, jboolean fliph, jboolean flipv, jint w, jint h, jint sx, jint sy, jint sw, jint sh, jint dx, jint dy, jint dw, jint dh)
789 {
790 PRINT("Java_sun_java2d_CRenderer_doImage")
791 QuartzSDOps *qsdo = (QuartzSDOps*)SurfaceData_GetOps(env, jsurfacedata);
792 JNI_COCOA_ENTER(env);
793 qsdo->BeginSurface(env, qsdo, SD_Image);
794 if (qsdo->cgRef != NULL)
795 {
796 doImage(env, qsdo, imageSurfaceData, fliph, flipv, w, h, sx, sy, sw, sh, dx, dy, dw, dh);
797 }
798 qsdo->FinishSurface(env, qsdo);
799 JNI_COCOA_RENDERER_EXIT(env);
800 }
|