737 switch (cs.getType()) { 738 case ColorSpace.TYPE_GRAY: 739 if (!alpha) { 740 outCsType = JPEG.JCS_GRAYSCALE; 741 } else { 742 if (jfif != null) { 743 ignoreJFIF = true; 744 warningOccurred 745 (WARNING_IMAGE_METADATA_JFIF_MISMATCH); 746 } 747 // out colorspace remains unknown 748 } 749 if ((adobe != null) 750 && (adobe.transform != JPEG.ADOBE_UNKNOWN)) { 751 newAdobeTransform = JPEG.ADOBE_UNKNOWN; 752 warningOccurred 753 (WARNING_IMAGE_METADATA_ADOBE_MISMATCH); 754 } 755 break; 756 case ColorSpace.TYPE_RGB: 757 if (!alpha) { 758 if (jfif != null) { 759 outCsType = JPEG.JCS_YCbCr; 760 if (JPEG.isNonStandardICC(cs) 761 || ((cs instanceof ICC_ColorSpace) 762 && (jfif.iccSegment != null))) { 763 iccProfile = 764 ((ICC_ColorSpace) cs).getProfile(); 765 } 766 } else if (adobe != null) { 767 switch (adobe.transform) { 768 case JPEG.ADOBE_UNKNOWN: 769 outCsType = JPEG.JCS_RGB; 770 break; 771 case JPEG.ADOBE_YCC: 772 outCsType = JPEG.JCS_YCbCr; 773 break; 774 default: 775 warningOccurred 776 (WARNING_IMAGE_METADATA_ADOBE_MISMATCH); 777 newAdobeTransform = JPEG.ADOBE_UNKNOWN; 778 outCsType = JPEG.JCS_RGB; 779 break; 780 } 781 } else { 782 // consult the ids 783 int outCS = sof.getIDencodedCSType(); 784 // if they don't resolve it, 785 // consult the sampling factors 786 if (outCS != JPEG.JCS_UNKNOWN) { 787 outCsType = outCS; 788 } else { 789 boolean subsampled = 790 isSubsampled(sof.componentSpecs); 791 if (subsampled) { 792 outCsType = JPEG.JCS_YCbCr; 793 } else { 794 outCsType = JPEG.JCS_RGB; 795 } 796 } 797 } 798 } else { // RGBA 799 if (jfif != null) { 800 ignoreJFIF = true; 801 warningOccurred 802 (WARNING_IMAGE_METADATA_JFIF_MISMATCH); 803 } 804 if (adobe != null) { 805 if (adobe.transform 806 != JPEG.ADOBE_UNKNOWN) { 807 newAdobeTransform = JPEG.ADOBE_UNKNOWN; 808 warningOccurred 809 (WARNING_IMAGE_METADATA_ADOBE_MISMATCH); 810 } 811 outCsType = JPEG.JCS_RGBA; 812 } else { 813 // consult the ids 814 int outCS = sof.getIDencodedCSType(); 815 // if they don't resolve it, 816 // consult the sampling factors 817 if (outCS != JPEG.JCS_UNKNOWN) { 818 outCsType = outCS; 819 } else { 820 boolean subsampled = 821 isSubsampled(sof.componentSpecs); 822 outCsType = subsampled ? 823 JPEG.JCS_YCbCrA : JPEG.JCS_RGBA; 824 } 825 } 826 } 827 break; 828 case ColorSpace.TYPE_3CLR: 829 if (cs == JPEG.JCS.getYCC()) { 830 if (!alpha) { 831 if (jfif != null) { 832 convertTosRGB = true; 833 convertOp = 834 new ColorConvertOp(cs, 835 JPEG.JCS.sRGB, 836 null); 837 outCsType = JPEG.JCS_YCbCr; 838 } else if (adobe != null) { 839 if (adobe.transform 840 != JPEG.ADOBE_YCC) { 841 newAdobeTransform = JPEG.ADOBE_YCC; 842 warningOccurred 843 (WARNING_IMAGE_METADATA_ADOBE_MISMATCH); 844 } 845 outCsType = JPEG.JCS_YCC; 846 } else { 847 outCsType = JPEG.JCS_YCC; 848 } 849 } else { // PhotoYCCA 850 if (jfif != null) { 851 ignoreJFIF = true; 852 warningOccurred 853 (WARNING_IMAGE_METADATA_JFIF_MISMATCH); 854 } else if (adobe != null) { 855 if (adobe.transform 856 != JPEG.ADOBE_UNKNOWN) { 857 newAdobeTransform 858 = JPEG.ADOBE_UNKNOWN; 859 warningOccurred 860 (WARNING_IMAGE_METADATA_ADOBE_MISMATCH); 861 } 862 } 863 outCsType = JPEG.JCS_YCCA; 864 } 865 } 866 } 867 } 868 } // else no dest, metadata, not an image. Defaults ok 869 } 870 } 871 872 boolean metadataProgressive = false; 873 int [] scans = null; 874 875 if (metadata != null) { 876 if (sof == null) { 877 sof = (SOFMarkerSegment) metadata.findMarkerSegment 878 (SOFMarkerSegment.class, true); 879 } 880 if ((sof != null) && (sof.tag == JPEG.SOF2)) { 881 metadataProgressive = true; 882 if (progressiveMode == ImageWriteParam.MODE_COPY_FROM_METADATA) { 883 scans = collectScans(metadata, sof); // Might still be null 884 } else { 885 numScans = 0; 1547 ////////////// ColorSpace conversion 1548 1549 private int getSrcCSType(ImageTypeSpecifier type) { 1550 return getSrcCSType(type.getColorModel()); 1551 } 1552 1553 private int getSrcCSType(RenderedImage rimage) { 1554 return getSrcCSType(rimage.getColorModel()); 1555 } 1556 1557 private int getSrcCSType(ColorModel cm) { 1558 int retval = JPEG.JCS_UNKNOWN; 1559 if (cm != null) { 1560 boolean alpha = cm.hasAlpha(); 1561 ColorSpace cs = cm.getColorSpace(); 1562 switch (cs.getType()) { 1563 case ColorSpace.TYPE_GRAY: 1564 retval = JPEG.JCS_GRAYSCALE; 1565 break; 1566 case ColorSpace.TYPE_RGB: 1567 if (alpha) { 1568 retval = JPEG.JCS_RGBA; 1569 } else { 1570 retval = JPEG.JCS_RGB; 1571 } 1572 break; 1573 case ColorSpace.TYPE_YCbCr: 1574 if (alpha) { 1575 retval = JPEG.JCS_YCbCrA; 1576 } else { 1577 retval = JPEG.JCS_YCbCr; 1578 } 1579 break; 1580 case ColorSpace.TYPE_3CLR: 1581 if (cs == JPEG.JCS.getYCC()) { 1582 if (alpha) { 1583 retval = JPEG.JCS_YCCA; 1584 } else { 1585 retval = JPEG.JCS_YCC; 1586 } 1587 } 1588 break; 1589 case ColorSpace.TYPE_CMYK: 1590 retval = JPEG.JCS_CMYK; 1591 break; 1592 } 1593 } 1594 return retval; 1595 } 1596 1597 private int getDestCSType(ImageTypeSpecifier destType) { 1598 ColorModel cm = destType.getColorModel(); 1599 boolean alpha = cm.hasAlpha(); 1600 ColorSpace cs = cm.getColorSpace(); 1601 int retval = JPEG.JCS_UNKNOWN; 1602 switch (cs.getType()) { 1603 case ColorSpace.TYPE_GRAY: 1604 retval = JPEG.JCS_GRAYSCALE; 1605 break; 1606 case ColorSpace.TYPE_RGB: 1607 if (alpha) { 1608 retval = JPEG.JCS_RGBA; 1609 } else { 1610 retval = JPEG.JCS_RGB; 1611 } 1612 break; 1613 case ColorSpace.TYPE_YCbCr: 1614 if (alpha) { 1615 retval = JPEG.JCS_YCbCrA; 1616 } else { 1617 retval = JPEG.JCS_YCbCr; 1618 } 1619 break; 1620 case ColorSpace.TYPE_3CLR: 1621 if (cs == JPEG.JCS.getYCC()) { 1622 if (alpha) { 1623 retval = JPEG.JCS_YCCA; 1624 } else { 1625 retval = JPEG.JCS_YCC; 1626 } 1627 } 1628 break; 1629 case ColorSpace.TYPE_CMYK: 1630 retval = JPEG.JCS_CMYK; 1631 break; 1632 } 1633 return retval; 1634 } 1635 1636 private int getDefaultDestCSType(ImageTypeSpecifier type) { 1637 return getDefaultDestCSType(type.getColorModel()); 1638 } 1639 1640 private int getDefaultDestCSType(RenderedImage rimage) { 1641 return getDefaultDestCSType(rimage.getColorModel()); 1642 } 1643 1644 private int getDefaultDestCSType(ColorModel cm) { 1645 int retval = JPEG.JCS_UNKNOWN; 1646 if (cm != null) { 1647 boolean alpha = cm.hasAlpha(); 1648 ColorSpace cs = cm.getColorSpace(); 1649 switch (cs.getType()) { 1650 case ColorSpace.TYPE_GRAY: 1651 retval = JPEG.JCS_GRAYSCALE; 1652 break; 1653 case ColorSpace.TYPE_RGB: 1654 if (alpha) { 1655 retval = JPEG.JCS_YCbCrA; 1656 } else { 1657 retval = JPEG.JCS_YCbCr; 1658 } 1659 break; 1660 case ColorSpace.TYPE_YCbCr: 1661 if (alpha) { 1662 retval = JPEG.JCS_YCbCrA; 1663 } else { 1664 retval = JPEG.JCS_YCbCr; 1665 } 1666 break; 1667 case ColorSpace.TYPE_3CLR: 1668 if (cs == JPEG.JCS.getYCC()) { 1669 if (alpha) { 1670 retval = JPEG.JCS_YCCA; 1671 } else { 1672 retval = JPEG.JCS_YCC; 1673 } 1674 } 1675 break; 1676 case ColorSpace.TYPE_CMYK: 1677 retval = JPEG.JCS_YCCK; 1678 break; 1679 } 1680 } 1681 return retval; 1682 } 1683 1684 private boolean isSubsampled(SOFMarkerSegment.ComponentSpec [] specs) { 1685 int hsamp0 = specs[0].HsamplingFactor; 1686 int vsamp0 = specs[0].VsamplingFactor; 1687 for (int i = 1; i < specs.length; i++) { 1688 if ((specs[i].HsamplingFactor != hsamp0) || 1689 (specs[i].VsamplingFactor != vsamp0)) 1690 return true; 1691 } 1692 return false; 1693 } 1694 | 737 switch (cs.getType()) { 738 case ColorSpace.TYPE_GRAY: 739 if (!alpha) { 740 outCsType = JPEG.JCS_GRAYSCALE; 741 } else { 742 if (jfif != null) { 743 ignoreJFIF = true; 744 warningOccurred 745 (WARNING_IMAGE_METADATA_JFIF_MISMATCH); 746 } 747 // out colorspace remains unknown 748 } 749 if ((adobe != null) 750 && (adobe.transform != JPEG.ADOBE_UNKNOWN)) { 751 newAdobeTransform = JPEG.ADOBE_UNKNOWN; 752 warningOccurred 753 (WARNING_IMAGE_METADATA_ADOBE_MISMATCH); 754 } 755 break; 756 case ColorSpace.TYPE_RGB: 757 if (jfif != null) { 758 outCsType = JPEG.JCS_YCbCr; 759 if (JPEG.isNonStandardICC(cs) 760 || ((cs instanceof ICC_ColorSpace) 761 && (jfif.iccSegment != null))) { 762 iccProfile = 763 ((ICC_ColorSpace) cs).getProfile(); 764 } 765 } else if (adobe != null) { 766 switch (adobe.transform) { 767 case JPEG.ADOBE_UNKNOWN: 768 outCsType = JPEG.JCS_RGB; 769 break; 770 case JPEG.ADOBE_YCC: 771 outCsType = JPEG.JCS_YCbCr; 772 break; 773 default: 774 warningOccurred 775 (WARNING_IMAGE_METADATA_ADOBE_MISMATCH); 776 newAdobeTransform = JPEG.ADOBE_UNKNOWN; 777 outCsType = JPEG.JCS_RGB; 778 break; 779 } 780 } else { 781 // consult the ids 782 int outCS = sof.getIDencodedCSType(); 783 // if they don't resolve it, 784 // consult the sampling factors 785 if (outCS != JPEG.JCS_UNKNOWN) { 786 outCsType = outCS; 787 } else { 788 boolean subsampled = 789 isSubsampled(sof.componentSpecs); 790 if (subsampled) { 791 outCsType = JPEG.JCS_YCbCr; 792 } else { 793 outCsType = JPEG.JCS_RGB; 794 } 795 } 796 } 797 break; 798 } 799 } 800 } // else no dest, metadata, not an image. Defaults ok 801 } 802 } 803 804 boolean metadataProgressive = false; 805 int [] scans = null; 806 807 if (metadata != null) { 808 if (sof == null) { 809 sof = (SOFMarkerSegment) metadata.findMarkerSegment 810 (SOFMarkerSegment.class, true); 811 } 812 if ((sof != null) && (sof.tag == JPEG.SOF2)) { 813 metadataProgressive = true; 814 if (progressiveMode == ImageWriteParam.MODE_COPY_FROM_METADATA) { 815 scans = collectScans(metadata, sof); // Might still be null 816 } else { 817 numScans = 0; 1479 ////////////// ColorSpace conversion 1480 1481 private int getSrcCSType(ImageTypeSpecifier type) { 1482 return getSrcCSType(type.getColorModel()); 1483 } 1484 1485 private int getSrcCSType(RenderedImage rimage) { 1486 return getSrcCSType(rimage.getColorModel()); 1487 } 1488 1489 private int getSrcCSType(ColorModel cm) { 1490 int retval = JPEG.JCS_UNKNOWN; 1491 if (cm != null) { 1492 boolean alpha = cm.hasAlpha(); 1493 ColorSpace cs = cm.getColorSpace(); 1494 switch (cs.getType()) { 1495 case ColorSpace.TYPE_GRAY: 1496 retval = JPEG.JCS_GRAYSCALE; 1497 break; 1498 case ColorSpace.TYPE_RGB: 1499 retval = JPEG.JCS_RGB; 1500 break; 1501 case ColorSpace.TYPE_YCbCr: 1502 retval = JPEG.JCS_YCbCr; 1503 break; 1504 case ColorSpace.TYPE_CMYK: 1505 retval = JPEG.JCS_CMYK; 1506 break; 1507 } 1508 } 1509 return retval; 1510 } 1511 1512 private int getDestCSType(ImageTypeSpecifier destType) { 1513 ColorModel cm = destType.getColorModel(); 1514 boolean alpha = cm.hasAlpha(); 1515 ColorSpace cs = cm.getColorSpace(); 1516 int retval = JPEG.JCS_UNKNOWN; 1517 switch (cs.getType()) { 1518 case ColorSpace.TYPE_GRAY: 1519 retval = JPEG.JCS_GRAYSCALE; 1520 break; 1521 case ColorSpace.TYPE_RGB: 1522 retval = JPEG.JCS_RGB; 1523 break; 1524 case ColorSpace.TYPE_YCbCr: 1525 retval = JPEG.JCS_YCbCr; 1526 break; 1527 case ColorSpace.TYPE_CMYK: 1528 retval = JPEG.JCS_CMYK; 1529 break; 1530 } 1531 return retval; 1532 } 1533 1534 private int getDefaultDestCSType(ImageTypeSpecifier type) { 1535 return getDefaultDestCSType(type.getColorModel()); 1536 } 1537 1538 private int getDefaultDestCSType(RenderedImage rimage) { 1539 return getDefaultDestCSType(rimage.getColorModel()); 1540 } 1541 1542 private int getDefaultDestCSType(ColorModel cm) { 1543 int retval = JPEG.JCS_UNKNOWN; 1544 if (cm != null) { 1545 boolean alpha = cm.hasAlpha(); 1546 ColorSpace cs = cm.getColorSpace(); 1547 switch (cs.getType()) { 1548 case ColorSpace.TYPE_GRAY: 1549 retval = JPEG.JCS_GRAYSCALE; 1550 break; 1551 case ColorSpace.TYPE_RGB: 1552 retval = JPEG.JCS_YCbCr; 1553 break; 1554 case ColorSpace.TYPE_YCbCr: 1555 retval = JPEG.JCS_YCbCr; 1556 break; 1557 case ColorSpace.TYPE_CMYK: 1558 retval = JPEG.JCS_YCCK; 1559 break; 1560 } 1561 } 1562 return retval; 1563 } 1564 1565 private boolean isSubsampled(SOFMarkerSegment.ComponentSpec [] specs) { 1566 int hsamp0 = specs[0].HsamplingFactor; 1567 int vsamp0 = specs[0].VsamplingFactor; 1568 for (int i = 1; i < specs.length; i++) { 1569 if ((specs[i].HsamplingFactor != hsamp0) || 1570 (specs[i].VsamplingFactor != vsamp0)) 1571 return true; 1572 } 1573 return false; 1574 } 1575 |