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 DRenderer implements DMarlinRenderer, 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 double to make tosubpix methods faster (no int to double conversion) 41 static final double SUBPIXEL_SCALE_X = SUBPIXEL_POSITIONS_X; 42 static final double SUBPIXEL_SCALE_Y = 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 double CUB_DEC_ERR_SUBPIX 62 = MarlinProperties.getCubicDecD2() * (NORM_SUBPIXELS / 8.0d); // 1 pixel 63 // cubic error in subpixels to increment step 64 private static final double CUB_INC_ERR_SUBPIX 65 = MarlinProperties.getCubicIncD1() * (NORM_SUBPIXELS / 8.0d); // 0.4 pixel 651 public void moveTo(double pix_x0, double pix_y0) { 652 closePath(); 653 final double sx = tosubpixx(pix_x0); 654 final double sy = tosubpixy(pix_y0); 655 this.sx0 = sx; 656 this.sy0 = sy; 657 this.x0 = sx; 658 this.y0 = sy; 659 } 660 661 @Override 662 public void lineTo(double pix_x1, double pix_y1) { 663 final double x1 = tosubpixx(pix_x1); 664 final double y1 = tosubpixy(pix_y1); 665 addLine(x0, y0, x1, y1); 666 x0 = x1; 667 y0 = y1; 668 } 669 670 @Override 671 public void curveTo(double x1, double y1, 672 double x2, double y2, 673 double x3, double y3) 674 { 675 final double xe = tosubpixx(x3); 676 final double ye = tosubpixy(y3); 677 curve.set(x0, y0, tosubpixx(x1), tosubpixy(y1), 678 tosubpixx(x2), tosubpixy(y2), xe, ye); 679 curveBreakIntoLinesAndAdd(x0, y0, curve, xe, ye); 680 x0 = xe; 681 y0 = ye; 682 } 683 684 @Override 685 public void quadTo(double x1, double y1, double x2, double y2) { 686 final double xe = tosubpixx(x2); 687 final double ye = tosubpixy(y2); 688 curve.set(x0, y0, tosubpixx(x1), tosubpixy(y1), xe, ye); 689 quadBreakIntoLinesAndAdd(x0, y0, curve, xe, ye); 690 x0 = xe; 691 y0 = ye; 692 } 693 694 @Override 695 public void closePath() { 696 addLine(x0, y0, sx0, sy0); 697 x0 = sx0; 698 y0 = sy0; 699 } 700 701 @Override 702 public void pathDone() { 703 closePath(); 704 705 // call endRendering() to determine the boundaries: 706 endRendering(); 707 } 708 709 private void _endRendering(final int ymin, final int ymax, 710 final MarlinAlphaConsumer ac) 711 { 712 if (DISABLE_RENDER) { 713 return; 714 } 715 716 // Get X bounds as true pixel boundaries to compute correct pixel coverage: 717 final int bboxx0 = bbox_spminX; 718 final int bboxx1 = bbox_spmaxX; 1531 int bboxX0, bboxX1, bboxY0, bboxY1; 1532 1533 @Override 1534 public int getOutpixMinX() { 1535 return bboxX0; 1536 } 1537 1538 @Override 1539 public int getOutpixMaxX() { 1540 return bboxX1; 1541 } 1542 1543 @Override 1544 public int getOutpixMinY() { 1545 return bboxY0; 1546 } 1547 1548 @Override 1549 public int getOutpixMaxY() { 1550 return bboxY1; 1551 } 1552 } | 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 DRenderer implements DMarlinRenderer, 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 double to make tosubpix methods faster (no int to double conversion) 41 static final double SUBPIXEL_SCALE_X = SUBPIXEL_POSITIONS_X; 42 static final double SUBPIXEL_SCALE_Y = 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 double RDR_OFFSET_X = 0.501d / SUBPIXEL_SCALE_X; 47 private static final double RDR_OFFSET_Y = 0.501d / 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 double CUB_DEC_ERR_SUBPIX 65 = MarlinProperties.getCubicDecD2() * (NORM_SUBPIXELS / 8.0d); // 1 pixel 66 // cubic error in subpixels to increment step 67 private static final double CUB_INC_ERR_SUBPIX 68 = MarlinProperties.getCubicIncD1() * (NORM_SUBPIXELS / 8.0d); // 0.4 pixel 654 public void moveTo(double pix_x0, double pix_y0) { 655 closePath(); 656 final double sx = tosubpixx(pix_x0); 657 final double 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(double pix_x1, double pix_y1) { 666 final double x1 = tosubpixx(pix_x1); 667 final double y1 = tosubpixy(pix_y1); 668 addLine(x0, y0, x1, y1); 669 x0 = x1; 670 y0 = y1; 671 } 672 673 @Override 674 public void curveTo(double pix_x1, double pix_y1, 675 double pix_x2, double pix_y2, 676 double pix_x3, double pix_y3) 677 { 678 final double xe = tosubpixx(pix_x3); 679 final double ye = tosubpixy(pix_y3); 680 curve.set(x0, y0, tosubpixx(pix_x1), tosubpixy(pix_y1), 681 tosubpixx(pix_x2), tosubpixy(pix_y2), xe, ye); 682 curveBreakIntoLinesAndAdd(x0, y0, curve, xe, ye); 683 x0 = xe; 684 y0 = ye; 685 } 686 687 @Override 688 public void quadTo(double pix_x1, double pix_y1, 689 double pix_x2, double pix_y2) 690 { 691 final double xe = tosubpixx(pix_x2); 692 final double ye = tosubpixy(pix_y2); 693 curve.set(x0, y0, tosubpixx(pix_x1), tosubpixy(pix_y1), xe, ye); 694 quadBreakIntoLinesAndAdd(x0, y0, curve, xe, ye); 695 x0 = xe; 696 y0 = ye; 697 } 698 699 @Override 700 public void closePath() { 701 if (x0 != sx0 || y0 != sy0) { 702 addLine(x0, y0, sx0, sy0); 703 x0 = sx0; 704 y0 = sy0; 705 } 706 } 707 708 @Override 709 public void pathDone() { 710 closePath(); 711 712 // call endRendering() to determine the boundaries: 713 endRendering(); 714 } 715 716 private void _endRendering(final int ymin, final int ymax, 717 final MarlinAlphaConsumer ac) 718 { 719 if (DISABLE_RENDER) { 720 return; 721 } 722 723 // Get X bounds as true pixel boundaries to compute correct pixel coverage: 724 final int bboxx0 = bbox_spminX; 725 final int bboxx1 = bbox_spmaxX; 1538 int bboxX0, bboxX1, bboxY0, bboxY1; 1539 1540 @Override 1541 public int getOutpixMinX() { 1542 return bboxX0; 1543 } 1544 1545 @Override 1546 public int getOutpixMaxX() { 1547 return bboxX1; 1548 } 1549 1550 @Override 1551 public int getOutpixMinY() { 1552 return bboxY0; 1553 } 1554 1555 @Override 1556 public int getOutpixMaxY() { 1557 return bboxY1; 1558 } 1559 1560 @Override 1561 public double getOffsetX() { 1562 return RDR_OFFSET_X; 1563 } 1564 1565 @Override 1566 public double getOffsetY() { 1567 return RDR_OFFSET_Y; 1568 } 1569 } |