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 } |