< prev index next >

modules/javafx.graphics/src/main/java/com/sun/marlin/Renderer.java

Print this page




  26 package com.sun.marlin;
  27 
  28 import static com.sun.marlin.OffHeapArray.SIZE_INT;
  29 import jdk.internal.misc.Unsafe;
  30 
  31 public final class Renderer implements MarlinRenderer, MarlinConst {
  32 
  33     static final boolean DISABLE_RENDER = false;
  34 
  35     private static final int ALL_BUT_LSB = 0xFFFFFFFE;
  36     private static final int ERR_STEP_MAX = 0x7FFFFFFF; // = 2^31 - 1
  37 
  38     private static final double POWER_2_TO_32 = 0x1.0p32d;
  39 
  40     // use float to make tosubpix methods faster (no int to float conversion)
  41     static final float SUBPIXEL_SCALE_X = (float) SUBPIXEL_POSITIONS_X;
  42     static final float SUBPIXEL_SCALE_Y = (float) SUBPIXEL_POSITIONS_Y;
  43     static final int SUBPIXEL_MASK_X = SUBPIXEL_POSITIONS_X - 1;
  44     static final int SUBPIXEL_MASK_Y = SUBPIXEL_POSITIONS_Y - 1;
  45 



  46     // common to all types of input path segments.
  47     // OFFSET as bytes
  48     // only integer values:
  49     public static final long OFF_CURX_OR  = 0;
  50     public static final long OFF_ERROR    = OFF_CURX_OR  + SIZE_INT;
  51     public static final long OFF_BUMP_X   = OFF_ERROR    + SIZE_INT;
  52     public static final long OFF_BUMP_ERR = OFF_BUMP_X   + SIZE_INT;
  53     public static final long OFF_NEXT     = OFF_BUMP_ERR + SIZE_INT;
  54     public static final long OFF_YMAX     = OFF_NEXT     + SIZE_INT;
  55 
  56     // size of one edge in bytes
  57     public static final int SIZEOF_EDGE_BYTES = (int)(OFF_YMAX + SIZE_INT);
  58 
  59     // curve break into lines
  60     // cubic error in subpixels to decrement step
  61     private static final float CUB_DEC_ERR_SUBPIX
  62         = MarlinProperties.getCubicDecD2() * (NORM_SUBPIXELS / 8.0f); // 1 pixel
  63     // cubic error in subpixels to increment step
  64     private static final float CUB_INC_ERR_SUBPIX
  65         = MarlinProperties.getCubicIncD1() * (NORM_SUBPIXELS / 8.0f); // 0.4 pixel


 654     public void moveTo(float pix_x0, float pix_y0) {
 655         closePath();
 656         final float sx = tosubpixx(pix_x0);
 657         final float sy = tosubpixy(pix_y0);
 658         this.sx0 = sx;
 659         this.sy0 = sy;
 660         this.x0 = sx;
 661         this.y0 = sy;
 662     }
 663 
 664     @Override
 665     public void lineTo(float pix_x1, float pix_y1) {
 666         final float x1 = tosubpixx(pix_x1);
 667         final float y1 = tosubpixy(pix_y1);
 668         addLine(x0, y0, x1, y1);
 669         x0 = x1;
 670         y0 = y1;
 671     }
 672 
 673     @Override
 674     public void curveTo(float x1, float y1,
 675             float x2, float y2,
 676             float x3, float y3)
 677     {
 678         final float xe = tosubpixx(x3);
 679         final float ye = tosubpixy(y3);
 680         curve.set(x0, y0, tosubpixx(x1), tosubpixy(y1),
 681                           tosubpixx(x2), tosubpixy(y2), xe, ye);
 682         curveBreakIntoLinesAndAdd(x0, y0, curve, xe, ye);
 683         x0 = xe;
 684         y0 = ye;
 685     }
 686 
 687     @Override
 688     public void quadTo(float x1, float y1, float x2, float y2) {
 689         final float xe = tosubpixx(x2);
 690         final float ye = tosubpixy(y2);
 691         curve.set(x0, y0, tosubpixx(x1), tosubpixy(y1), xe, ye);


 692         quadBreakIntoLinesAndAdd(x0, y0, curve, xe, ye);
 693         x0 = xe;
 694         y0 = ye;
 695     }
 696 
 697     @Override
 698     public void closePath() {
 699         addLine(x0, y0, sx0, sy0);
 700         x0 = sx0;
 701         y0 = sy0;


 702     }
 703 
 704     @Override
 705     public void pathDone() {
 706         closePath();
 707 
 708         // call endRendering() to determine the boundaries:
 709         endRendering();
 710     }
 711 
 712     private void _endRendering(final int ymin, final int ymax,
 713                                final MarlinAlphaConsumer ac)
 714     {
 715         if (DISABLE_RENDER) {
 716             return;
 717         }
 718 
 719         // Get X bounds as true pixel boundaries to compute correct pixel coverage:
 720         final int bboxx0 = bbox_spminX;
 721         final int bboxx1 = bbox_spmaxX;


1534     int bboxX0, bboxX1, bboxY0, bboxY1;
1535 
1536     @Override
1537     public int getOutpixMinX() {
1538         return bboxX0;
1539     }
1540 
1541     @Override
1542     public int getOutpixMaxX() {
1543         return bboxX1;
1544     }
1545 
1546     @Override
1547     public int getOutpixMinY() {
1548         return bboxY0;
1549     }
1550 
1551     @Override
1552     public int getOutpixMaxY() {
1553         return bboxY1;










1554     }
1555 }


  26 package com.sun.marlin;
  27 
  28 import static com.sun.marlin.OffHeapArray.SIZE_INT;
  29 import jdk.internal.misc.Unsafe;
  30 
  31 public final class Renderer implements MarlinRenderer, MarlinConst {
  32 
  33     static final boolean DISABLE_RENDER = false;
  34 
  35     private static final int ALL_BUT_LSB = 0xFFFFFFFE;
  36     private static final int ERR_STEP_MAX = 0x7FFFFFFF; // = 2^31 - 1
  37 
  38     private static final double POWER_2_TO_32 = 0x1.0p32d;
  39 
  40     // use float to make tosubpix methods faster (no int to float conversion)
  41     static final float SUBPIXEL_SCALE_X = (float) SUBPIXEL_POSITIONS_X;
  42     static final float SUBPIXEL_SCALE_Y = (float) SUBPIXEL_POSITIONS_Y;
  43     static final int SUBPIXEL_MASK_X = SUBPIXEL_POSITIONS_X - 1;
  44     static final int SUBPIXEL_MASK_Y = SUBPIXEL_POSITIONS_Y - 1;
  45 
  46     private static final float RDR_OFFSET_X = 0.501f / SUBPIXEL_SCALE_X;
  47     private static final float RDR_OFFSET_Y = 0.501f / SUBPIXEL_SCALE_Y;
  48 
  49     // common to all types of input path segments.
  50     // OFFSET as bytes
  51     // only integer values:
  52     public static final long OFF_CURX_OR  = 0;
  53     public static final long OFF_ERROR    = OFF_CURX_OR  + SIZE_INT;
  54     public static final long OFF_BUMP_X   = OFF_ERROR    + SIZE_INT;
  55     public static final long OFF_BUMP_ERR = OFF_BUMP_X   + SIZE_INT;
  56     public static final long OFF_NEXT     = OFF_BUMP_ERR + SIZE_INT;
  57     public static final long OFF_YMAX     = OFF_NEXT     + SIZE_INT;
  58 
  59     // size of one edge in bytes
  60     public static final int SIZEOF_EDGE_BYTES = (int)(OFF_YMAX + SIZE_INT);
  61 
  62     // curve break into lines
  63     // cubic error in subpixels to decrement step
  64     private static final float CUB_DEC_ERR_SUBPIX
  65         = MarlinProperties.getCubicDecD2() * (NORM_SUBPIXELS / 8.0f); // 1 pixel
  66     // cubic error in subpixels to increment step
  67     private static final float CUB_INC_ERR_SUBPIX
  68         = MarlinProperties.getCubicIncD1() * (NORM_SUBPIXELS / 8.0f); // 0.4 pixel


 657     public void moveTo(float pix_x0, float pix_y0) {
 658         closePath();
 659         final float sx = tosubpixx(pix_x0);
 660         final float sy = tosubpixy(pix_y0);
 661         this.sx0 = sx;
 662         this.sy0 = sy;
 663         this.x0 = sx;
 664         this.y0 = sy;
 665     }
 666 
 667     @Override
 668     public void lineTo(float pix_x1, float pix_y1) {
 669         final float x1 = tosubpixx(pix_x1);
 670         final float y1 = tosubpixy(pix_y1);
 671         addLine(x0, y0, x1, y1);
 672         x0 = x1;
 673         y0 = y1;
 674     }
 675 
 676     @Override
 677     public void curveTo(float pix_x1, float pix_y1,
 678                         float pix_x2, float pix_y2,
 679                         float pix_x3, float pix_y3)
 680     {
 681         final float xe = tosubpixx(pix_x3);
 682         final float ye = tosubpixy(pix_y3);
 683         curve.set(x0, y0, tosubpixx(pix_x1), tosubpixy(pix_y1),
 684                   tosubpixx(pix_x2), tosubpixy(pix_y2), xe, ye);
 685         curveBreakIntoLinesAndAdd(x0, y0, curve, xe, ye);
 686         x0 = xe;
 687         y0 = ye;
 688     }
 689 
 690     @Override
 691     public void quadTo(float pix_x1, float pix_y1,
 692                        float pix_x2, float pix_y2)
 693     {
 694         final float xe = tosubpixx(pix_x2);
 695         final float ye = tosubpixy(pix_y2);
 696         curve.set(x0, y0, tosubpixx(pix_x1), tosubpixy(pix_y1), xe, ye);
 697         quadBreakIntoLinesAndAdd(x0, y0, curve, xe, ye);
 698         x0 = xe;
 699         y0 = ye;
 700     }
 701 
 702     @Override
 703     public void closePath() {
 704         if (x0 != sx0 || y0 != sy0) {
 705             addLine(x0, y0, sx0, sy0);
 706             x0 = sx0;
 707             y0 = sy0;
 708         }
 709     }
 710 
 711     @Override
 712     public void pathDone() {
 713         closePath();
 714 
 715         // call endRendering() to determine the boundaries:
 716         endRendering();
 717     }
 718 
 719     private void _endRendering(final int ymin, final int ymax,
 720                                final MarlinAlphaConsumer ac)
 721     {
 722         if (DISABLE_RENDER) {
 723             return;
 724         }
 725 
 726         // Get X bounds as true pixel boundaries to compute correct pixel coverage:
 727         final int bboxx0 = bbox_spminX;
 728         final int bboxx1 = bbox_spmaxX;


1541     int bboxX0, bboxX1, bboxY0, bboxY1;
1542 
1543     @Override
1544     public int getOutpixMinX() {
1545         return bboxX0;
1546     }
1547 
1548     @Override
1549     public int getOutpixMaxX() {
1550         return bboxX1;
1551     }
1552 
1553     @Override
1554     public int getOutpixMinY() {
1555         return bboxY0;
1556     }
1557 
1558     @Override
1559     public int getOutpixMaxY() {
1560         return bboxY1;
1561     }
1562 
1563     @Override
1564     public float getOffsetX() {
1565         return RDR_OFFSET_X;
1566     }
1567 
1568     @Override
1569     public float getOffsetY() {
1570         return RDR_OFFSET_Y;
1571     }
1572 }
< prev index next >