public static ColorModel makeColorModel()

in src/main/java/org/apache/xmlgraphics/image/rendered/FormatRed.java [144:216]


    public static ColorModel makeColorModel(CachableRed cr, SampleModel sm) {
        ColorModel srcCM = cr.getColorModel();
        ColorSpace cs    = srcCM.getColorSpace();

        int bands = sm.getNumBands();

        int bits;
        int dt = sm.getDataType();
        switch (dt) {
        case DataBuffer.TYPE_BYTE:   bits = 8;  break;
        case DataBuffer.TYPE_SHORT:  bits = 16; break;
        case DataBuffer.TYPE_USHORT: bits = 16; break;
        case DataBuffer.TYPE_INT:    bits = 32; break;
        default:
            throw new IllegalArgumentException(
                "Unsupported DataBuffer type: " + dt);
        }

        boolean hasAlpha = srcCM.hasAlpha();
        if (hasAlpha) {
            // if Src has Alpha then our out bands must
            // either be one less than the source (no out alpha)
            // or equal (still has alpha)
            if (bands == srcCM.getNumComponents() - 1) {
                hasAlpha = false;
            } else if (bands != srcCM.getNumComponents()) {
                throw new IllegalArgumentException(
                    "Incompatible number of bands in and out");
            }
        } else {
            if (bands == srcCM.getNumComponents() + 1) {
                hasAlpha = true;
            } else if (bands != srcCM.getNumComponents()) {
                throw new IllegalArgumentException(
                    "Incompatible number of bands in and out");
            }
        }

        boolean preMult  = srcCM.isAlphaPremultiplied();
        if (!hasAlpha) {
            preMult = false;
        }

        if (sm instanceof ComponentSampleModel) {
            int [] bitsPer = new int[bands];
            for (int i = 0; i < bands; i++) {
                bitsPer[i] = bits;
            }

            return new ComponentColorModel(
                cs, bitsPer, hasAlpha, preMult,
                 hasAlpha ? Transparency.TRANSLUCENT : Transparency.OPAQUE,
                 dt);
        } else if (sm instanceof SinglePixelPackedSampleModel) {
            SinglePixelPackedSampleModel sppsm;
            sppsm = (SinglePixelPackedSampleModel)sm;
            int[] masks  = sppsm.getBitMasks();
            if (bands == 4) {
                return new DirectColorModel(
                    cs, bits, masks[0], masks[1], masks[2], masks[3],
                     preMult, dt);
            } else if (bands == 3) {
                return new DirectColorModel(
                    cs, bits, masks[0], masks[1], masks[2], 0x0,
                     preMult, dt);
            } else {
                throw new IllegalArgumentException(
                    "Incompatible number of bands out for ColorModel");
            }
        }
        throw new IllegalArgumentException(
            "Unsupported SampleModel Type");
    }