1. /*
  2. * @(#)AdobeMarkerSegment.java 1.4 03/01/23
  3. *
  4. * Copyright 2003 Sun Microsystems, Inc. All rights reserved.
  5. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
  6. */
  7. package com.sun.imageio.plugins.jpeg;
  8. import javax.imageio.IIOException;
  9. import javax.imageio.metadata.IIOInvalidTreeException;
  10. import javax.imageio.metadata.IIOMetadataNode;
  11. import javax.imageio.stream.ImageOutputStream;
  12. import java.io.IOException;
  13. import org.w3c.dom.Node;
  14. import org.w3c.dom.NamedNodeMap;
  15. /**
  16. * An Adobe APP14 (Application-Specific) marker segment.
  17. */
  18. class AdobeMarkerSegment extends MarkerSegment {
  19. int version;
  20. int flags0;
  21. int flags1;
  22. int transform;
  23. private static final int ID_SIZE = 5;
  24. AdobeMarkerSegment(int transform) {
  25. super(JPEG.APP14);
  26. version = 101;
  27. flags0 = 0;
  28. flags1 = 0;
  29. this.transform = transform;
  30. }
  31. AdobeMarkerSegment(JPEGBuffer buffer) throws IOException {
  32. super(buffer);
  33. buffer.bufPtr += ID_SIZE; // Skip the id
  34. version = (buffer.buf[buffer.bufPtr++] & 0xff) << 8;
  35. version |= buffer.buf[buffer.bufPtr++] & 0xff;
  36. flags0 = (buffer.buf[buffer.bufPtr++] & 0xff) << 8;
  37. flags0 |= buffer.buf[buffer.bufPtr++] & 0xff;
  38. flags1 = (buffer.buf[buffer.bufPtr++] & 0xff) << 8;
  39. flags1 |= buffer.buf[buffer.bufPtr++] & 0xff;
  40. transform = buffer.buf[buffer.bufPtr++] & 0xff;
  41. buffer.bufAvail -= length;
  42. }
  43. AdobeMarkerSegment(Node node) throws IIOInvalidTreeException {
  44. this(0); // default transform will be changed
  45. updateFromNativeNode(node, true);
  46. }
  47. IIOMetadataNode getNativeNode() {
  48. IIOMetadataNode node = new IIOMetadataNode("app14Adobe");
  49. node.setAttribute("version", Integer.toString(version));
  50. node.setAttribute("flags0", Integer.toString(flags0));
  51. node.setAttribute("flags1", Integer.toString(flags1));
  52. node.setAttribute("transform", Integer.toString(transform));
  53. return node;
  54. }
  55. void updateFromNativeNode(Node node, boolean fromScratch)
  56. throws IIOInvalidTreeException {
  57. // Only the transform is required
  58. NamedNodeMap attrs = node.getAttributes();
  59. transform = getAttributeValue(node, attrs, "transform", 0, 2, true);
  60. int count = attrs.getLength();
  61. if (count > 4) {
  62. throw new IIOInvalidTreeException
  63. ("Adobe APP14 node cannot have > 4 attributes", node);
  64. }
  65. if (count > 1) {
  66. int value = getAttributeValue(node, attrs, "version",
  67. 100, 255, false);
  68. version = (value != -1) ? value : version;
  69. value = getAttributeValue(node, attrs, "flags0", 0, 65535, false);
  70. flags0 = (value != -1) ? value : flags0;
  71. value = getAttributeValue(node, attrs, "flags1", 0, 65535, false);
  72. flags1 = (value != -1) ? value : flags1;
  73. }
  74. }
  75. /**
  76. * Writes the data for this segment to the stream in
  77. * valid JPEG format.
  78. */
  79. void write(ImageOutputStream ios) throws IOException {
  80. length = 14;
  81. writeTag(ios);
  82. byte [] id = {0x41, 0x64, 0x6F, 0x62, 0x65};
  83. ios.write(id);
  84. write2bytes(ios, version);
  85. write2bytes(ios, flags0);
  86. write2bytes(ios, flags1);
  87. ios.write(transform);
  88. }
  89. static void writeAdobeSegment(ImageOutputStream ios, int transform)
  90. throws IOException {
  91. (new AdobeMarkerSegment(transform)).write(ios);
  92. }
  93. void print () {
  94. printTag("Adobe APP14");
  95. System.out.print("Version: ");
  96. System.out.println(version);
  97. System.out.print("Flags0: 0x");
  98. System.out.println(Integer.toHexString(flags0));
  99. System.out.print("Flags1: 0x");
  100. System.out.println(Integer.toHexString(flags1));
  101. System.out.print("Transform: ");
  102. System.out.println(transform);
  103. }
  104. }