aboutsummaryrefslogtreecommitdiffstats
path: root/src/jogl/classes/jogamp/opengl/util/pngj/chunks/PngMetadata.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/jogl/classes/jogamp/opengl/util/pngj/chunks/PngMetadata.java')
-rw-r--r--src/jogl/classes/jogamp/opengl/util/pngj/chunks/PngMetadata.java135
1 files changed, 135 insertions, 0 deletions
diff --git a/src/jogl/classes/jogamp/opengl/util/pngj/chunks/PngMetadata.java b/src/jogl/classes/jogamp/opengl/util/pngj/chunks/PngMetadata.java
new file mode 100644
index 000000000..a82754588
--- /dev/null
+++ b/src/jogl/classes/jogamp/opengl/util/pngj/chunks/PngMetadata.java
@@ -0,0 +1,135 @@
+package jogamp.opengl.util.pngj.chunks;
+
+import jogamp.opengl.util.pngj.PngHelper;
+import jogamp.opengl.util.pngj.PngjException;
+
+/**
+ * We consider "image metadata" every info inside the image except for the most basic image info (IHDR chunk - ImageInfo
+ * class) and the pixels values.
+ *
+ * This includes the palette (if present) and all the ancillary chunks
+ *
+ * This class provides a wrapper over the collection of chunks of a image (read or to write) and provides some high
+ * level methods to access them
+ *
+ */
+public class PngMetadata {
+ private final ChunkList chunkList;
+ private final boolean readonly;
+
+ public PngMetadata(ChunkList chunks, boolean readonly) {
+ this.chunkList = chunks;
+ this.readonly = readonly;
+ }
+
+ /**
+ * Queues the chunk at the writer
+ */
+ public boolean setChunk(PngChunk c, boolean overwriteIfPresent) {
+ if (readonly)
+ throw new PngjException("cannot set chunk : readonly metadata");
+ return chunkList.setChunk(c, overwriteIfPresent);
+ }
+
+
+ /**
+ * Returns only one chunk or null if nothing found - does not include queued chunks
+ *
+ * If more than one chunk (after filtering by inner id) is found, then an exception is thrown (failifMultiple=true)
+ * or the last one is returned (failifMultiple=false)
+ *
+ * @param id Chunk id
+ * @param innerid if not null, the chunk is assumed to be PngChunkTextVar or PngChunkSPLT, and filtered by that 'internal id'
+ * @param failIfMultiple throw exception if more that one
+ * @return chunk (not cloned)
+ */
+ public PngChunk getChunk1(String id, String innerid, boolean failIfMultiple) {
+ return chunkList.getChunk1(id, innerid, failIfMultiple);
+ }
+
+ /**
+ * Same as getChunk1(id, innerid=null, failIfMultiple=true);
+ */
+ public PngChunk getChunk1(String id) {
+ return chunkList.getChunk1(id);
+ }
+
+ // ///// high level utility methods follow ////////////
+
+ // //////////// DPI
+
+ /**
+ * returns -1 if not found or dimension unknown
+ **/
+ public double[] getDpi() {
+ PngChunk c = getChunk1(ChunkHelper.pHYs, null, true);
+ if (c == null)
+ return new double[] { -1, -1 };
+ else
+ return ((PngChunkPHYS) c).getAsDpi2();
+ }
+
+ public void setDpi(double x) {
+ setDpi(x, x);
+ }
+
+ public void setDpi(double x, double y) {
+ PngChunkPHYS c = new PngChunkPHYS(chunkList.imageInfo);
+ c.setAsDpi2(x, y);
+ setChunk(c, true);
+ }
+
+ // //////////// TIME
+
+ public void setTimeNow(int secsAgo) {
+ PngChunkTIME c = new PngChunkTIME(chunkList.imageInfo);
+ c.setNow(secsAgo);
+ setChunk(c, true);
+ }
+
+ public void setTimeYMDHMS(int yearx, int monx, int dayx, int hourx, int minx, int secx) {
+ PngChunkTIME c = new PngChunkTIME(chunkList.imageInfo);
+ c.setYMDHMS(yearx, monx, dayx, hourx, minx, secx);
+ setChunk(c, true);
+ }
+
+ public String getTimeAsString() {
+ PngChunk c = getChunk1(ChunkHelper.tIME, null, true);
+ return c != null ? ((PngChunkTIME) c).getAsString() : "";
+ }
+
+ // //////////// TEXT
+
+ public void setText(String k, String val, boolean useLatin1, boolean compress) {
+ if (compress && !useLatin1)
+ throw new PngjException("cannot compress non latin text");
+ PngChunkTextVar c;
+ if (useLatin1) {
+ if (compress) {
+ c = new PngChunkZTXT(chunkList.imageInfo);
+ } else {
+ c = new PngChunkTEXT(chunkList.imageInfo);
+ }
+ } else {
+ c = new PngChunkITXT(chunkList.imageInfo);
+ ((PngChunkITXT) c).setLangtag(k); // we use the same orig tag (this is not quite right)
+ }
+ c.setKeyVal(k, val);
+ setChunk(c, true);
+ }
+
+ public void setText(String k, String val) {
+ setText(k, val, false, val.length() > 400);
+ }
+
+ /** tries all text chunks - returns null if not found */
+ public String getTxtForKey(String k) {
+ PngChunk c = getChunk1(ChunkHelper.tEXt, k, true);
+ if (c == null)
+ c = getChunk1(ChunkHelper.zTXt, k, true);
+ if (c == null)
+ c = getChunk1(ChunkHelper.iTXt, k, true);
+ return c != null ? ((PngChunkTextVar) c).getVal() : null;
+ }
+
+}