Skip to content
This repository has been archived by the owner on Jan 25, 2023. It is now read-only.

Commit

Permalink
Merge branch 'feature/label' into 'master'
Browse files Browse the repository at this point in the history
  • Loading branch information
ktgw0316 committed Sep 18, 2021
2 parents 819e584 + 5b4987d commit 16887dd
Show file tree
Hide file tree
Showing 29 changed files with 565 additions and 221 deletions.
55 changes: 17 additions & 38 deletions lightcrafts/src/com/lightcrafts/image/ImageInfo.java
Expand Up @@ -2,27 +2,27 @@

package com.lightcrafts.image;

import java.awt.image.RenderedImage;
import java.io.*;
import java.lang.ref.WeakReference;
import java.util.LinkedList;
import java.util.ResourceBundle;
import javax.media.jai.PlanarImage;

import org.w3c.dom.Document;

import com.lightcrafts.image.metadata.*;
import com.lightcrafts.image.types.*;
import com.lightcrafts.platform.Platform;
import com.lightcrafts.ui.editor.LightweightDocument;
import com.lightcrafts.utils.CloseableManager;
import com.lightcrafts.utils.UserCanceledException;
import com.lightcrafts.utils.bytebuffer.LCByteBuffer;
import com.lightcrafts.utils.bytebuffer.LCReopenableMappedByteBuffer;
import com.lightcrafts.utils.bytebuffer.SoftChunkyFileByteBuffer;
import com.lightcrafts.utils.CloseableManager;
import com.lightcrafts.utils.file.FileUtil;
import com.lightcrafts.utils.thread.ProgressThread;
import com.lightcrafts.utils.UserCanceledException;
import com.lightcrafts.utils.xml.XmlDocument;
import org.jetbrains.annotations.NotNull;
import org.w3c.dom.Document;

import javax.media.jai.PlanarImage;
import java.awt.image.RenderedImage;
import java.io.*;
import java.lang.ref.WeakReference;
import java.util.LinkedList;
import java.util.ResourceBundle;

/**
* An <code>ImageInfo</code> holds various information about an image in a
Expand Down Expand Up @@ -405,21 +405,9 @@ public synchronized RenderedImage getThumbnailImage()
*
* @return Returns said filename.
*/
public String getXMPFilename()
throws BadImageFileException, IOException, UnknownImageTypeException
{
final ImageType t = getImageType();
final String fileName = m_imageFile.getAbsolutePath();

final int dot = fileName.lastIndexOf( '.' );
if ( dot <= 0 || dot == fileName.length() - 1 )
throw new UnknownImageTypeException( "no filename extension" );

if ( t instanceof RawImageType )
return fileName.substring( 0, dot + 1 ) + "xmp";

return fileName.substring( 0, dot ) +
'_' + fileName.substring( dot + 1 ) + ".xmp";
@NotNull
public String getXMPFilename() {
return m_imageFile.getAbsolutePath() + ".xmp";
}

/**
Expand Down Expand Up @@ -595,19 +583,10 @@ private void determinePreliminaryImageType()
* @return Returns said {@link ImageMetadata} or <code>null</code> if there
* is no sidecar XMP file.
*/
private ImageMetadata readXMPMetadata()
throws BadImageFileException, IOException, UnknownImageTypeException
{
private ImageMetadata readXMPMetadata() throws IOException {
final String xmpFilename = getXMPFilename();
if ( xmpFilename != null ) {
try {
return XMPMetadataReader.readFrom( new File( xmpFilename ) );
}
catch ( FileNotFoundException e ) {
// ignore
}
}
return null;
final var xmpFile = new File(xmpFilename);
return xmpFile.isFile() ? XMPMetadataReader.readFrom(xmpFile) : null;
}

private AuxiliaryImageInfo m_auxInfo;
Expand Down
Expand Up @@ -13,6 +13,7 @@
import com.lightcrafts.utils.TextUtil;
import com.lightcrafts.utils.Version;
import com.lightcrafts.utils.xml.XMLUtil;
import org.jetbrains.annotations.NotNull;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

Expand All @@ -39,7 +40,7 @@ public final class CoreDirectory extends ImageMetadataDirectory implements
ColorTemperatureProvider, CopyrightProvider, FileDateTimeProvider,
FlashProvider, FocalLengthProvider, ISOProvider, LensProvider,
MakeModelProvider, OrientationProvider, OriginalWidthHeightProvider,
RatingProvider, ShutterSpeedProvider, WidthHeightProvider {
RatingProvider, ShutterSpeedProvider, UrgencyProvider, WidthHeightProvider {

////////// public /////////////////////////////////////////////////////////

Expand Down Expand Up @@ -70,6 +71,7 @@ public static void addMetadata( ImageInfo imageInfo ) {
dir.addShutterSpeed( metadata );

dir.addRating( metadata );
dir.addUrgency( metadata );
syncEditableMetadata( metadata );
}

Expand Down Expand Up @@ -361,6 +363,15 @@ public ImageMetaTagInfo getTagInfoFor( String name ) {
return m_tagsByName.get( name );
}

/**
* {@inheritDoc}
*/
@Override
public int getUrgency() {
final ImageMetaValue value = getValue( CORE_URGENCY );
return value != null ? value.getIntValue() : 0;
}

/**
* {@inheritDoc}
*/
Expand Down Expand Up @@ -390,6 +401,8 @@ public String valueToString( ImageMetaValue value ) {
break;
case CORE_SHUTTER_SPEED:
return MetadataUtil.shutterSpeedString( value.getFloatValue() );
case CORE_URGENCY:
return Integer.toString(value.getIntValue());
}
return super.valueToString( value );
}
Expand Down Expand Up @@ -518,12 +531,53 @@ protected Collection<Element> toXMP( Document xmpDoc, String nsURI,
xapRDFDescElement.appendChild( ratingElement );
}

////////// Color Label (Urgency)

final ImageMetaValue urgency = getValue( CORE_URGENCY );
if (urgency != null) {
final String urgencyString = urgency.getStringValue();

final Element photoshopRDFDescElement = XMPUtil.createRDFDescription(
xmpDoc, XMP_PHOTOSHOP_NS, XMP_PHOTOSHOP_PREFIX
);
final Element photoshopUrgencyElement = xmpDoc.createElementNS(
XMP_PHOTOSHOP_NS, XMP_PHOTOSHOP_PREFIX + ":Urgency"
);
XMLUtil.setTextContentOf(photoshopUrgencyElement, urgencyString);
photoshopRDFDescElement.appendChild(photoshopUrgencyElement);
elements.add(photoshopRDFDescElement);

final Element labelElement = xmpDoc.createElementNS(
XMP_XAP_NS, XMP_XAP_PREFIX + ":Label"
);
XMLUtil.setTextContentOf( labelElement, convertToColorName(urgencyString) );
xapRDFDescElement.appendChild( labelElement );
}

elements.add( xapRDFDescElement );
return elements;
}

////////// private ////////////////////////////////////////////////////////

@NotNull
private String convertToColorName(@NotNull String c) {
switch (c) {
case "1":
return "Red";
case "3":
return "Yellow";
case "4":
return "Green";
case "5":
return "Blue";
case "6":
return "Purple";
default:
return "";
}
}

/**
* Adds the tag mappings.
*
Expand Down Expand Up @@ -822,6 +876,17 @@ private void addRating( ImageMetadata metadata ) {
putValue( CORE_RATING, new UnsignedShortMetaValue( rating ) );
}

/**
* Adds urgency information to the <code>CoreDirectory</code>'s metadata.
*
* @param metadata The {@link ImageMetadata} to add into.
*/
private void addUrgency( ImageMetadata metadata ) {
final int urgency = metadata.getUrgency();
if ( urgency > 0 )
putValue( CORE_URGENCY, new UnsignedShortMetaValue( urgency ) );
}

/**
* Adds resolution information to the <code>CoreDirectory</code>'s metadata.
*
Expand Down Expand Up @@ -939,6 +1004,7 @@ private static ImageOrientation getOrientationFrom( ImageMetadata metadata ) {
add( CORE_ORIGINAL_ORIENTATION, "OriginalOrientation", META_USHORT, false );
add( CORE_RATING, "Rating", META_USHORT, true );
add( CORE_SHUTTER_SPEED, "ShutterSpeed", META_FLOAT, false );
add( CORE_URGENCY, "Urgency", META_USHORT, true );
}
}
/* vim:set et sw=4 ts=4: */
7 changes: 7 additions & 0 deletions lightcrafts/src/com/lightcrafts/image/metadata/CoreTags.java
Expand Up @@ -202,5 +202,12 @@ public interface CoreTags extends ImageMetaTags {
* Type: ASCII.
*/
int CORE_TITLE = 0x0303;

/**
* User color label.
* <p>
* Type: Unsigned short.
*/
int CORE_URGENCY = 0x0304;
}
/* vim:set et sw=4 ts=4: */
49 changes: 47 additions & 2 deletions lightcrafts/src/com/lightcrafts/image/metadata/ImageMetadata.java
Expand Up @@ -39,7 +39,7 @@ public class ImageMetadata implements
CaptureDateTimeProvider, Cloneable, ColorTemperatureProvider,
CopyrightProvider, Externalizable, FileDateTimeProvider, FlashProvider,
FocalLengthProvider, GPSProvider, ISOProvider, LensProvider, MakeModelProvider,
OrientationProvider, OriginalWidthHeightProvider, RatingProvider,
OrientationProvider, OriginalWidthHeightProvider, RatingProvider, UrgencyProvider,
ResolutionProvider, ShutterSpeedProvider, TitleProvider,
WidthHeightProvider {

Expand Down Expand Up @@ -87,6 +87,16 @@ public void clearRating() {
setRating( 0 );
}

/**
* Clears the urgency of the image.
*
* @see #getUrgency()
* @see #setUrgency(int)
*/
public void clearUrgency() {
setUrgency( 0 );
}

/**
* Perform a deep clone of this object.
*
Expand Down Expand Up @@ -610,7 +620,7 @@ public synchronized String getPath() {
*/
public int getRating() {
final Collection<ImageMetadataDirectory> dirs =
findProvidersOf( RatingProvider.class );
findProvidersOf( RatingProvider.class );
for ( ImageMetadataDirectory dir : dirs ) {
final int rating = ((RatingProvider)dir).getRating();
if ( rating != 0 )
Expand All @@ -619,6 +629,26 @@ public int getRating() {
return 0;
}

/**
* Gets the urgency of this image.
*
* @return Returns said urgency in the range 1-8 if it's set, otherwise
* returns 0.
* @see #clearUrgency()
* @see #setUrgency(int)
*/
@Override
public int getUrgency() {
final Collection<ImageMetadataDirectory> dirs =
findProvidersOf( UrgencyProvider.class );
for ( ImageMetadataDirectory dir : dirs ) {
final int colorLabel = ((UrgencyProvider)dir).getUrgency();
if ( colorLabel != 0 )
return colorLabel;
}
return 0;
}

/**
* {@inheritDoc}
*/
Expand Down Expand Up @@ -1269,6 +1299,21 @@ public void setRating( int rating ) {
.forEach(dir -> ((RatingProvider) dir).setRating(rating));
}

/**
* Sets the urgency of the image.
*
* @param urgency The urgency; must be in the range 0-8.
* @see #clearUrgency()
* @see #getUrgency()
*/
public void setUrgency(int urgency) {
if (urgency < 0 || urgency > 8)
throw new IllegalArgumentException("urgency must be between 0-8");
final ImageMetadataDirectory dir =
getDirectoryFor(CoreDirectory.class, true);
dir.setValue(CORE_URGENCY, urgency);
}

/**
* Convert all the metadata into a single {@link String} for debugging
* purposes.
Expand Down
10 changes: 8 additions & 2 deletions lightcrafts/src/com/lightcrafts/image/metadata/XMPConstants.java
Expand Up @@ -2,10 +2,10 @@

package com.lightcrafts.image.metadata;

import java.text.SimpleDateFormat;

import com.lightcrafts.app.Application;

import java.text.SimpleDateFormat;

/**
* <code>XMPConstants</code> defines constants for XMP.
*
Expand Down Expand Up @@ -66,6 +66,12 @@ public interface XMPConstants {
// String XMP_XAP_PREFIX = "xap";
String XMP_XAP_PREFIX = "xmp";

/** The PhotoShop namespace URI. */
String XMP_PHOTOSHOP_NS = "http://ns.adobe.com/photoshop/1.0/";

/** The PhotoShop namespace prefix. */
String XMP_PHOTOSHOP_PREFIX = "photoshop";

/** The XMP XPacket begin processing instruction. */
String XMP_XPACKET_BEGIN =
"<?xpacket begin='' id='" + XMP_PACKET_ID + "'?>";
Expand Down
Expand Up @@ -2,15 +2,14 @@

package com.lightcrafts.image.metadata;

import com.lightcrafts.image.metadata.values.ImageMetaValue;
import com.lightcrafts.utils.xml.*;
import org.w3c.dom.*;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.IOException;

import org.w3c.dom.*;

import com.lightcrafts.image.metadata.values.ImageMetaValue;
import com.lightcrafts.utils.xml.*;
import java.io.InputStream;

import static com.lightcrafts.image.metadata.XMPConstants.*;

Expand Down Expand Up @@ -59,7 +58,11 @@ public static ImageMetadata readFrom( Document xmpDoc ) {
metadata
);
readMetadata( // reads xap:Rating
rdfElement, XMP_XAP_NS, XMP_XAP_PREFIX, CoreDirectory.class,
rdfElement, XMP_XAP_NS, XMP_XAP_PREFIX, CoreDirectory.class,
metadata
);
readMetadata( // reads photoshop:Urgency
rdfElement, XMP_PHOTOSHOP_NS, XMP_PHOTOSHOP_PREFIX, CoreDirectory.class,
metadata
);
return metadata;
Expand Down Expand Up @@ -109,11 +112,7 @@ static void parseElements( Node[] elements,
ImageMetadataDirectory dir ) {
for ( Node node : elements ) {
final Element dirElement = (Element)node;
//
// Use getTagName() since getLocalName() always returns null.
//
// final String tagName = dirElement.getLocalName();
final String tagName = dirElement.getTagName().replaceAll( ".*:", "" );
final String tagName = dirElement.getLocalName();
final ImageMetaTagInfo tagInfo = dir.getTagInfoFor( tagName );
if ( tagInfo == null )
continue;
Expand Down

0 comments on commit 16887dd

Please sign in to comment.