< prev index next >

src/java.desktop/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageWriter.java

Print this page




 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 


< prev index next >