package leadtools.demos; import java.util.ArrayList; import java.util.Arrays; import org.magnum.soda.example.maint.R; import leadtools.RasterImageFormat; import leadtools.codecs.CodecsJpeg2000CompressionControl; import leadtools.codecs.RasterCodecs; import android.app.Dialog; import android.content.Context; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.SeekBar; import android.widget.Spinner; import android.widget.TextView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.SeekBar.OnSeekBarChangeListener; public class SaveFormatDialog extends Dialog { public interface OnSaveFormat { public void onSaveFormat(RasterCodecs codecs, RasterImageFormat format, int bitsPerPixel); } private OnSaveFormat mCallback; private int mBitsPerPixel; private RasterImageFormat mFormat; private int mQFactor; private RasterCodecs mCodecs; private Spinner mFormatSpinner; private Spinner mBPPSpinner; private Spinner mSubFormatSpinner; private SeekBar mQFSeekBar; private TextView mQFValueTxtView; public SaveFormatDialog(Context context, RasterCodecs codecs, OnSaveFormat callBack) { super(context); getWindow().setBackgroundDrawableResource(R.drawable.dialog_background); getWindow().setWindowAnimations(R.style.DialogAnimation); setTitle("Save Format"); mCallback = callBack; mCodecs = codecs; mQFactor = 2; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(R.layout.save_format_dialog); // Format Spinner ArrayAdapter<SaveFormat> formatsArrayAdapter = new ArrayAdapter<SaveFormat>(this.getContext(), android.R.layout.simple_spinner_item, SaveFormats); formatsArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); mFormatSpinner = (Spinner) findViewById(R.id.spnr_saveformat); mFormatSpinner.setAdapter(formatsArrayAdapter); mFormatSpinner.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { updateSaveFormat(true, false); } @Override public void onNothingSelected(AdapterView<?> parent) { } }); // BPP Spinner mBPPSpinner = (Spinner) findViewById(R.id.spnr_bits_per_pixel); mBPPSpinner.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { mBitsPerPixel = (Integer) mBPPSpinner.getItemAtPosition(position); updateSaveFormat(false, true); } @Override public void onNothingSelected(AdapterView<?> parent) { } }); // Sub-Format Spinner mSubFormatSpinner = (Spinner) findViewById(R.id.spnr_subformat); mSubFormatSpinner.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { updateSaveFormat(false, false); } @Override public void onNothingSelected(AdapterView<?> parent) { } }); // QF Text Value mQFValueTxtView = (TextView) findViewById(R.id.txtview_quality_factor_value); mQFValueTxtView.setText(Integer.toString(mQFactor)); // QF SeekBar mQFSeekBar = (SeekBar) findViewById(R.id.seekbar_quality_factor); mQFSeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { updateSaveFormat(false, false); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if(mFormat == RasterImageFormat.PNG) // 0 to 9 mQFactor = progress; else // 2 to 255 mQFactor = progress + 2; } }); // OK Button Button okButton = (Button) findViewById(R.id.btn_ok); okButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(mCallback != null) mCallback.onSaveFormat(mCodecs, mFormat, mBitsPerPixel); dismiss(); } }); // Cancel Button Button cancelButton = (Button) findViewById(R.id.btn_cancel); cancelButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dismiss(); } }); } private void updateSaveFormat(boolean formatChanged, boolean bitsChanged) { SaveFormat fmt = (SaveFormat) mFormatSpinner.getSelectedItem(); if (formatChanged) { updateBitsPerPixel(fmt.getAllBitsPerPixel()); } if (bitsChanged && mBPPSpinner.getAdapter().getCount() > 0) { SubFormat oldSubformat = null; if(mSubFormatSpinner.getSelectedItem() != null) oldSubformat = (SubFormat) mSubFormatSpinner.getSelectedItem(); if (fmt.getSubFormats() == null) { mSubFormatSpinner.setEnabled(false); // Set an empty adapter ArrayAdapter<SubFormat> subFormatArrayAdapter = new ArrayAdapter<SubFormat>(this.getContext(), android.R.layout.simple_spinner_item, new SubFormat[0]); mSubFormatSpinner.setAdapter(subFormatArrayAdapter); } else { mSubFormatSpinner.setEnabled(true); ArrayList<SubFormat> subFormatsList = new ArrayList<SubFormat>(); int oldSelectedIndex = -1; for (SubFormat sub: fmt.getSubFormats()) { if (sub.getBitsPerPixel() != null && Arrays.asList(sub.getBitsPerPixel()).contains(mBPPSpinner.getSelectedItem())) { subFormatsList.add(sub); if (oldSubformat != null && sub == oldSubformat) { oldSelectedIndex = subFormatsList.indexOf(sub); } } } ArrayAdapter<SubFormat> subFormatArrayAdapter = new ArrayAdapter<SubFormat>(this.getContext(), android.R.layout.simple_spinner_item, subFormatsList); subFormatArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); mSubFormatSpinner.setAdapter(subFormatArrayAdapter); if(oldSelectedIndex == -1) mSubFormatSpinner.setSelection(0); else mSubFormatSpinner.setSelection(oldSelectedIndex); } } if (mBitsPerPixel == 16 && (mFormat == RasterImageFormat.JPEG || mFormat == RasterImageFormat.TIF_JPEG)) { mQFSeekBar.setEnabled(false); mQFactor = 0; } else { if (mSubFormatSpinner.getSelectedItem() != null) { SubFormat sub = (SubFormat) mSubFormatSpinner.getSelectedItem(); mQFSeekBar.setEnabled(sub.getUseQFactor()); } else { mQFSeekBar.setEnabled(fmt.getUseQFactor()); } } if (!mQFSeekBar.isEnabled()) { mQFactor = 0; mQFSeekBar.setProgress(mQFactor); } else { if (mFormat == RasterImageFormat.PNG) { if(mQFactor > 9) mQFactor = 9; // 0 to 9 mQFSeekBar.setMax(9); mQFSeekBar.setProgress(mQFactor); } else { if(mQFactor < 2) mQFactor = 2; // 2 to 255 mQFSeekBar.setMax(253); mQFSeekBar.setProgress(mQFactor - 2); } } if (fmt.getFormat() != RasterImageFormat.UNKNOWN) { mFormat = fmt.getFormat(); if (fmt.getFormat() == RasterImageFormat.PNG) { if (mQFactor > 9) mQFactor = 9; mCodecs.getOptions().getPng().getSave().setQualityFactor(mQFactor); } else fmt.setOptions(mCodecs, mQFactor); } else { SubFormat sub = (SubFormat) mSubFormatSpinner.getSelectedItem(); if(sub != null) { mFormat = sub.getFormat(); if (mQFactor == 0 && (sub.getFormat() == RasterImageFormat.RAS_PDF_JPEG_411 || sub.getFormat() == RasterImageFormat.RAS_PDF_JPEG || sub.getFormat() == RasterImageFormat.RAS_PDF_JPEG_422)) sub.setOptions(mCodecs, 2); else sub.setOptions(mCodecs, mQFactor); } } // Update quality factor text value mQFValueTxtView.setText(Integer.toString(mQFactor)); } private void updateBitsPerPixel(Integer[] bits) { mBPPSpinner.setAdapter(null); if (bits != null) { ArrayAdapter<Integer> bppArrayAdapter = new ArrayAdapter<Integer>(this.getContext(), android.R.layout.simple_spinner_item, bits); bppArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); mBPPSpinner.setAdapter(bppArrayAdapter); mBPPSpinner.setSelection(bits.length - 1); } mBPPSpinner.setEnabled(mBPPSpinner.getAdapter().getCount() > 1); } private SaveFormat[] SaveFormats = new SaveFormat[] { new SaveFormat("LEAD CMP", RasterImageFormat.UNKNOWN, new Integer[] { 8, 24 }, true, false, new SubFormat[] { new CmpFormat(false), new CmpFormat(true), }), new SaveFormat("JPEG", RasterImageFormat.UNKNOWN, new Integer[] { 8, 12, 16, 24 }, true, false, new SubFormat[] { new JpegFormat(RasterImageFormat.JPEG, null, false, false), new JpegFormat(RasterImageFormat.JPEG, null, true, false), new JpegFormat(RasterImageFormat.JPEG, null, false, true), new JpegFormat(RasterImageFormat.JPEG_RGB, null, false, false), new JpegFormat(RasterImageFormat.JPEG_RGB, null, true, false), new JpegFormat(RasterImageFormat.JPEG_411, null, false, false), new JpegFormat(RasterImageFormat.JPEG_411, null, true, false), new JpegFormat(RasterImageFormat.JPEG_LAB_411, null, false, false), new JpegFormat(RasterImageFormat.JPEG_422, null, false, false), new JpegFormat(RasterImageFormat.JPEG_422, null, true, false), new JpegFormat(RasterImageFormat.JPEG_LAB_422, null, false, false), new JpegFormat(RasterImageFormat.JPEG_LAB, null, false, false), }), new SaveFormat("PDF", RasterImageFormat.UNKNOWN, new Integer[] { 1, 2, 4, 8, 24 }, false, true, new SubFormat[]{ new PdfFormat(RasterImageFormat.RAS_PDF, false), new PdfFormat(RasterImageFormat.RAS_PDF_G3_1DIM, false), new PdfFormat(RasterImageFormat.RAS_PDF_G3_2DIM, false), new PdfFormat(RasterImageFormat.RAS_PDF_G4, false), new PdfFormat(RasterImageFormat.RAS_PDF_JPEG, false), new PdfFormat(RasterImageFormat.RAS_PDF_JPEG, true), new PdfFormat(RasterImageFormat.RAS_PDF_JPEG_422, false), new PdfFormat(RasterImageFormat.RAS_PDF_JPEG_411, false)}), new SaveFormat("TIFF", RasterImageFormat.UNKNOWN, new Integer[] { 1, 2, 3, 4, 5, 6, 7, 8, 12, 16, 24, 32, 48, 64 }, false, true, new SubFormat[] { new TiffFormat(RasterImageFormat.TIF), new TiffFormat(RasterImageFormat.TIF_CMYK), new TiffFormat(RasterImageFormat.TIF_YCC), new TiffFormat(RasterImageFormat.TIF_PACKBITS), new TiffFormat(RasterImageFormat.TIF_PACKBITS_CMYK), new TiffFormat(RasterImageFormat.TIF_PACKBITS_YCC), new TiffFormat(RasterImageFormat.TIFLZW), new TiffFormat(RasterImageFormat.TIFLZW_CMYK), new TiffFormat(RasterImageFormat.TIFLZW_YCC), new TiffFormat(RasterImageFormat.TIF_JPEG), new TiffFormat(RasterImageFormat.TIF_JPEG_411), new TiffFormat(RasterImageFormat.TIF_JPEG_422), new TiffFormat(RasterImageFormat.TIF_CMP), new TiffFormat(RasterImageFormat.TIF_JBIG), new TiffFormat(RasterImageFormat.TIF_JBIG2), new TiffFormat(RasterImageFormat.TIF_J2K), new TiffFormat(RasterImageFormat.CCITT), new TiffFormat(RasterImageFormat.CCITT_GROUP3_1DIM), new TiffFormat(RasterImageFormat.CCITT_GROUP3_2DIM), new TiffFormat(RasterImageFormat.CCITT_GROUP4), }), new SaveFormat("GeoTIFF", RasterImageFormat.GEO_TIFF, new Integer[] { 1, 2, 3, 4, 5, 6, 7, 8, 12, 16, 24, 32, 48, 64 }, false, true, null), new SaveFormat("EXIF", RasterImageFormat.UNKNOWN, new Integer[] { 24 }, false, false, new SubFormat[] { new ExifFormat(RasterImageFormat.EXIF), new ExifFormat(RasterImageFormat.EXIF_YCC), new ExifFormat(RasterImageFormat.EXIF_JPEG_411), new ExifFormat(RasterImageFormat.EXIF_JPEG_422), }), new SaveFormat("JPEG 2000", RasterImageFormat.UNKNOWN, new Integer[] { 8, 12, 16, 24, 32, 48, 64 }, true, false, new SubFormat[] { new Jpeg2000Format(RasterImageFormat.J2K, false), new Jpeg2000Format(RasterImageFormat.J2K, true), new Jpeg2000Format(RasterImageFormat.JP2, false), new Jpeg2000Format(RasterImageFormat.JP2, true) }), new SaveFormat("JBIG", RasterImageFormat.JBIG, new Integer[] { 1, 2, 3, 4, 5, 6, 7, 8, 12, 16, 24, 32 }, false, false, null), new SaveFormat("JBIG2", RasterImageFormat.JBIG2, new Integer[] { 1 }, false, false, null), new SaveFormat("Win Bitmap", RasterImageFormat.UNKNOWN, new Integer[] { 1, 4, 8, 16, 24, 32 }, false, false, new SubFormat[] { new WinBitmapFormat(RasterImageFormat.BMP), new WinBitmapFormat(RasterImageFormat.BMP_RLE) }), new SaveFormat("OS2", RasterImageFormat.UNKNOWN, new Integer[] { 1, 4, 8, 16, 24 }, true, false, new SubFormat[] { new OS2Format(RasterImageFormat.OS2), new OS2Format(RasterImageFormat.OS2_2) }), new SaveFormat("GIF", RasterImageFormat.GIF, new Integer[] { 1, 2, 3, 4, 5, 6, 7, 8 }, false, true, null), new SaveFormat("JPEG Extended Range", RasterImageFormat.UNKNOWN, new Integer[] { 1, 8, 16, 24, 32, 48, 64 }, false, false, new SubFormat[] { new SubFormat("JXR Black and White", RasterImageFormat.JXR, new Integer[] { 1 }, null, true, false), new SubFormat("JXR RGB", RasterImageFormat.JXR, new Integer[] {16, 32, 48, 64 }, null, true, false), new SubFormat("JXR Gray", RasterImageFormat.JXR_GRAY, new Integer[] { 8, 16 }, null, true, false), new SubFormat("JXR YUV 4:4:4", RasterImageFormat.JXR, new Integer[] { 24 }, null, true, false), new SubFormat("JXR YUV 4:2:2", RasterImageFormat.JXR_422, new Integer[] { 24 }, null, true, false), new SubFormat("JXR YUV 4:2:0", RasterImageFormat.JXR_420, new Integer[] { 24 }, null, true, false) }), new SaveFormat("JPEG LS", RasterImageFormat.UNKNOWN, new Integer[] { 8, 12, 16, 24 }, false, false, new SubFormat[] { new SubFormat("Lossless", RasterImageFormat.JLS, new Integer[] { 8, 12, 16 }, null, false, false), new SubFormat("Near Lossless", RasterImageFormat.JLS, new Integer[] { 8, 12, 16 }, null, true, false), new SubFormat("Interleave Mode None - Lossless", RasterImageFormat.JLS, new Integer[] { 24 }, null, false, false), new SubFormat("Interleave Mode None - Near Lossless", RasterImageFormat.JLS, new Integer[] { 24 }, null, true, false), new SubFormat("Interleave Mode Line - Lossless", RasterImageFormat.JLS_LINE, new Integer[] { 24 }, null, false, false), new SubFormat("Interleave Mode Line - Near Lossless", RasterImageFormat.JLS_LINE, new Integer[] { 24 }, null, true, false), new SubFormat("Interleave Mode Sample - Lossless", RasterImageFormat.JLS_SAMPLE, new Integer[] { 24 }, null, false, false), new SubFormat("Interleave Mode Sample - Near Lossless", RasterImageFormat.JLS_SAMPLE, new Integer[] { 24 }, null, true, false) }), new SaveFormat("PSD", RasterImageFormat.PSD, new Integer[] { 1, 8, 24 }, false, false, null), new SaveFormat("PNG", RasterImageFormat.PNG, new Integer[] { 1, 4, 8, 24, 32, 48, 64 }, true, false, null), }; /* SaveFormat Class */ private class SaveFormat { private RasterImageFormat mFormat; public RasterImageFormat getFormat() { return mFormat; } private Integer[] mAllbitsPerPixel; public Integer[] getAllBitsPerPixel() { return mAllbitsPerPixel; } private boolean mUseQFactor; public boolean getUseQFactor() { return mUseQFactor; } public void setUseQFactor(boolean useQFactor) { mUseQFactor = useQFactor; } private String mDisplay; public String getDisplay() { return mDisplay; } public void setDisplay(String display) { mDisplay = display; } private SubFormat[] mSubFormats; public SubFormat[] getSubFormats() { return mSubFormats; } public SaveFormat(String display, RasterImageFormat fmt, Integer[] bits, boolean useQFactor, boolean multiPage, SubFormat[] subFormats) { mDisplay = display; mFormat = fmt; mAllbitsPerPixel = bits; mUseQFactor = useQFactor; mSubFormats = subFormats; } @Override public String toString() { return mDisplay; } public void setOptions(RasterCodecs codecs, int qFactor) { codecs.getOptions().getJpeg().getSave().setQualityFactor(qFactor); } } /* SubFormat Class */ private class SubFormat extends SaveFormat { private Integer[] mBitsPerPixel; public Integer[] getBitsPerPixel() { return mBitsPerPixel; } public void setBitsPerPixel(Integer[] bitsPerPixel) { mBitsPerPixel = bitsPerPixel; } public SubFormat(String display, RasterImageFormat fmt, Integer[] bits, Integer[] allbits, boolean qFactor, boolean multiPage) { super(display, fmt, allbits, qFactor, multiPage, null); setBitsPerPixel(bits); } } /* CmpFormat Class */ private class CmpFormat extends SubFormat { private int mPasses = 1; public CmpFormat(boolean progressive) { super((progressive ? "Progressive" : "Non-Progressive"), RasterImageFormat.CMP, new Integer[] { 8, 24 }, null, true, false); if (progressive) { mPasses = 10; } } @Override public void setOptions(RasterCodecs codecs, int qFactor) { codecs.getOptions().getJpeg().getSave().setPasses(mPasses); codecs.getOptions().getJpeg().getSave().setQualityFactor(qFactor); super.setOptions(codecs, qFactor); } } /* JpegFormat Class */ private class JpegFormat extends SubFormat { private int mPasses = 1; public JpegFormat(RasterImageFormat format, Integer[] allbits, boolean progressive, boolean lossLess) { super("Jpeg", format, null, allbits, true, false); switch (format) { case JPEG: if (lossLess) { setBitsPerPixel(new Integer[] { 8, 12, 24 }); setDisplay(String.format("%1$s %2$s", "Lossless", getDisplay())); } else { setBitsPerPixel(new Integer[] { 8, 12, 16, 24 }); setDisplay(String.format("%1$s %2$s", getDisplay(), "YUV 4:4:4")); } break; case JPEG_411: setBitsPerPixel(new Integer[] { 8, 24 }); setDisplay(String.format("%1$s %2$s", getDisplay(), "YUV 4:1:1")); break; case JPEG_422: setBitsPerPixel(new Integer[] { 8, 24 }); setDisplay(String.format("%1$s %2$s", getDisplay(), "YUV 4:2:2")); break; case JPEG_LAB: setBitsPerPixel(new Integer[] { 24 }); setDisplay(String.format("%1$s %2$s", getDisplay(), "LAB 4:4:4")); break; case JPEG_LAB_411: setBitsPerPixel(new Integer[] { 24 }); setDisplay(String.format("%1$s %2$s", getDisplay(), "LAB 4:1:1")); break; case JPEG_LAB_422: setBitsPerPixel(new Integer[] { 24 }); setDisplay(String.format("%1$s %2$s", getDisplay(), "LAB 4:2:2")); break; case JPEG_RGB: setBitsPerPixel(new Integer[] { 24 }); setDisplay(String.format("%1$s %2$s", getDisplay(), "RGB 4:4:4")); break; default: throw new IllegalArgumentException("Invalid file format"); } if (lossLess) { setUseQFactor(false); } if (progressive) { mPasses = 10; setDisplay(String.format("%1$s %2$s", getDisplay(), "Progressive")); } } @Override public void setOptions(RasterCodecs codecs, int qFactor) { codecs.getOptions().getJpeg().getSave().setPasses(mPasses); codecs.getOptions().getJpeg().getSave().setQualityFactor(qFactor); super.setOptions(codecs, qFactor); } } private class Jpeg2000Format extends SubFormat { public Jpeg2000Format(RasterImageFormat format, boolean lossLess) { super(null, format, new Integer[] { 8, 12, 16, 24, 32, 48, 64 }, null, true, false); switch (format) { case J2K: setDisplay("JPEG 2000"); break; case JP2: setDisplay("JP2"); break; default: throw new RuntimeException("Invalid file format"); } if (lossLess) { setDisplay(String.format("%1$s %2$s", "Lossless", getDisplay())); } else { setDisplay(String.format("%1$s %2$s", "Lossy", getDisplay())); } if (lossLess) { setUseQFactor(false); } else { setUseQFactor(true); } } @Override public void setOptions(RasterCodecs codecs, int qFactor) { codecs.getOptions().getJpeg().getSave().setQualityFactor(qFactor); codecs.getOptions().getJpeg2000().getSave().setCompressionControl(CodecsJpeg2000CompressionControl.QUALITY_FACTOR); super.setOptions(codecs, qFactor); } } private class ExifFormat extends SubFormat { public ExifFormat(RasterImageFormat format) { super("", format, new Integer[] { 24 }, null, false, false); switch (format) { case EXIF: setDisplay("Uncompressed RGB"); break; case EXIF_YCC: setDisplay("Uncompressed YCC"); break; case EXIF_JPEG_411: setDisplay("JPEG 4:1:1"); break; case EXIF_JPEG_422: setDisplay("JPEG 4:2:2"); break; default: throw new UnsupportedOperationException("Invalid file format"); } } @Override public void setOptions(RasterCodecs codecs, int qFactor) { codecs.getOptions().getJpeg().getSave().setQualityFactor(qFactor); super.setOptions(codecs, qFactor); } } private class WinBitmapFormat extends SubFormat { public WinBitmapFormat(RasterImageFormat format) { super("", format, null, null, false, false); switch (format) { case BMP: setDisplay("Uncompressed"); setBitsPerPixel(new Integer[] { 1, 4, 8, 16, 24, 32 }); break; case BMP_RLE: setDisplay("RLE Compressed"); setBitsPerPixel(new Integer[] { 4, 8}); break; default: throw new UnsupportedOperationException("Invalid file format"); } } } private class OS2Format extends SubFormat { public OS2Format(RasterImageFormat format) { super("", format, new Integer[] { 1, 4, 8, 16, 24 }, null, false, false); switch (format) { case OS2: setDisplay("Version 1.0"); break; case OS2_2: setDisplay("Version 2.0"); break; default: throw new UnsupportedOperationException("Invalid file format"); } } } private class TiffFormat extends SubFormat { public TiffFormat(RasterImageFormat format) { super("", format, null, null, false, true); switch (format) { case TIF: setDisplay("Uncompressed RGB"); setBitsPerPixel(new Integer[] { 1, 2, 3, 4, 5, 6, 7, 8, 12, 16, 24, 32, 48, 64 }); setUseQFactor(false); break; case TIF_CMYK: setDisplay("Uncompressed CMYK"); setBitsPerPixel(new Integer[] { 24, 32 }); setUseQFactor(false); break; case TIF_YCC: setDisplay("Uncompressed YCC"); setBitsPerPixel(new Integer[] { 24 }); setUseQFactor(false); break; case TIF_PACKBITS: setDisplay("Packbits Compressed RGB"); setBitsPerPixel(new Integer[] { 1, 2, 3, 4, 5, 6, 7, 8, 16, 24, 32 }); setUseQFactor(false); break; case TIF_PACKBITS_CMYK: setDisplay("Packbits Compressed CMYK"); setBitsPerPixel(new Integer[] { 24, 32 }); setUseQFactor(false); break; case TIF_PACKBITS_YCC: setDisplay("Packbits Compressed YCC"); setBitsPerPixel(new Integer[] { 24 }); setUseQFactor(false); break; case TIFLZW: setDisplay("LZW Compressed RGB"); setBitsPerPixel(new Integer[] { 1, 2, 3, 4, 5, 6, 7, 8, 16, 24, 32, 48, 64 }); setUseQFactor(false); break; case TIFLZW_CMYK: setDisplay("LZW Compressed CMYK"); setBitsPerPixel(new Integer[] { 24, 32 }); setUseQFactor(false); break; case TIFLZW_YCC: setDisplay("LZW Compressed YCC"); setBitsPerPixel(new Integer[] { 24 }); setUseQFactor(false); break; case TIF_JPEG: setDisplay("JPEG 4:4:4"); setBitsPerPixel(new Integer[] { 8, 12, 16, 24 }); setUseQFactor(false); break; case TIF_JPEG_411: setDisplay("JPEG 4:1:1"); setBitsPerPixel(new Integer[] { 8, 24 }); setUseQFactor(true); break; case TIF_JPEG_422: setDisplay("JPEG 4:2:2"); setBitsPerPixel(new Integer[] { 8, 24 }); setUseQFactor(true); break; case TIF_CMP: setDisplay("LEAD CMP"); setBitsPerPixel(new Integer[] { 8, 24 }); setUseQFactor(true); break; case TIF_JBIG: setDisplay("JBIG"); setBitsPerPixel(new Integer[] { 1, 2, 3, 4, 5, 6, 7, 8, 12, 16, 24, 32 }); setUseQFactor(false); break; case TIF_JBIG2: setDisplay("JBIG2"); setBitsPerPixel(new Integer[] { 1 }); setUseQFactor(false); break; case TIF_J2K: setDisplay("JPEG 2000"); setBitsPerPixel(new Integer[] { 8, 12, 16, 24 }); setUseQFactor(true); break; case CCITT_GROUP3_1DIM: setDisplay("CCITT Group3 1D FAX"); setBitsPerPixel(new Integer[] { 1 }); setUseQFactor(false); break; case CCITT: setDisplay("CCITT Group3 1D FAX (Modified, no EOL)"); setBitsPerPixel(new Integer[] { 1 }); setUseQFactor(false); break; case CCITT_GROUP3_2DIM: setDisplay("CCITT Group3 2D FAX"); setBitsPerPixel(new Integer[] { 1 }); setUseQFactor(false); break; case CCITT_GROUP4: setDisplay("CCITT Group4 FAX"); setBitsPerPixel(new Integer[] { 1 }); setUseQFactor(false); break; default: throw new UnsupportedOperationException("Invalid file format"); } } @Override public void setOptions(RasterCodecs codecs, int qFactor) { codecs.getOptions().getJpeg().getSave().setQualityFactor(qFactor); super.setOptions(codecs, qFactor); } } private class PdfFormat extends SubFormat { public PdfFormat(RasterImageFormat format, boolean isLoosless) { super("", format, null, null, false, true); switch (format) { case RAS_PDF: setDisplay("Uncompressed"); setBitsPerPixel(new Integer[] { 1, 2, 4, 8, 24 }); setUseQFactor(false); break; case RAS_PDF_G3_1DIM: setDisplay("CCITT Group3 1D"); setBitsPerPixel(new Integer[] { 1 }); setUseQFactor(false); break; case RAS_PDF_G3_2DIM: setDisplay("CCITT Group3 2D"); setBitsPerPixel(new Integer[] { 1 }); setUseQFactor(false); break; case RAS_PDF_G4: setDisplay("CCITT Group4"); setBitsPerPixel(new Integer[] { 1 }); setUseQFactor(false); break; case RAS_PDF_JPEG: if (isLoosless) { setDisplay("Lossless JPEG"); setBitsPerPixel(new Integer[] { 8 }); setUseQFactor(false); } else { setDisplay("JPEG YUV 4:4:4"); setBitsPerPixel(new Integer[] { 24 }); setUseQFactor(true); } break; case RAS_PDF_JPEG_422: setDisplay("JPEG YUV 4:2:2"); setBitsPerPixel(new Integer[] { 24 }); setUseQFactor(true); break; case RAS_PDF_JPEG_411: setDisplay("JPEG YUV 4:1:1"); setBitsPerPixel(new Integer[] { 24 }); setUseQFactor(true); break; default: throw new UnsupportedOperationException("Invalid file format"); } } @Override public void setOptions(RasterCodecs codecs, int qFactor) { codecs.getOptions().getJpeg().getSave().setQualityFactor(qFactor); super.setOptions(codecs, qFactor); } } }