blob: f2db1b48fc338e9cd6291dafca2854a67214cd67 [file] [log] [blame]
/*
* Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.intellij.images.index;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.util.indexing.*;
import com.intellij.util.io.DataExternalizer;
import com.intellij.util.io.DataInputOutputUtil;
import org.intellij.images.fileTypes.ImageFileTypeManager;
import org.intellij.images.util.ImageInfoReader;
import org.jetbrains.annotations.NotNull;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
/**
* @author spleaner
*/
public class ImageInfoIndex extends SingleEntryFileBasedIndexExtension<ImageInfoIndex.ImageInfo> {
private static final int ourMaxImageSize;
static {
int maxImageSize = 200;
try {
maxImageSize = Integer.parseInt(System.getProperty("idea.max.image.filesize", Integer.toString(maxImageSize)), 10);
} catch (NumberFormatException ex) {}
ourMaxImageSize = maxImageSize;
}
public static final ID<Integer, ImageInfo> INDEX_ID = ID.create("ImageFileInfoIndex");
private final DataExternalizer<ImageInfo> myValueExternalizer = new DataExternalizer<ImageInfo>() {
@Override
public void save(@NotNull final DataOutput out, final ImageInfo info) throws IOException {
DataInputOutputUtil.writeINT(out, info.width);
DataInputOutputUtil.writeINT(out, info.height);
DataInputOutputUtil.writeINT(out, info.bpp);
}
@Override
public ImageInfo read(@NotNull final DataInput in) throws IOException {
return new ImageInfo(DataInputOutputUtil.readINT(in), DataInputOutputUtil.readINT(in), DataInputOutputUtil.readINT(in));
}
};
private final SingleEntryIndexer<ImageInfo> myDataIndexer = new SingleEntryIndexer<ImageInfo>(false) {
@Override
protected ImageInfo computeValue(@NotNull FileContent inputData) {
final ImageInfoReader.Info info = ImageInfoReader.getInfo(inputData.getContent());
return info != null? new ImageInfo(info.width, info.height, info.bpp) : null;
}
};
@Override
@NotNull
public ID<Integer, ImageInfo> getName() {
return INDEX_ID;
}
@Override
@NotNull
public SingleEntryIndexer<ImageInfo> getIndexer() {
return myDataIndexer;
}
public static void processValues(VirtualFile virtualFile, FileBasedIndex.ValueProcessor<ImageInfo> processor, Project project) {
FileBasedIndex.getInstance().processValues(INDEX_ID, Math.abs(FileBasedIndex.getFileId(virtualFile)), virtualFile, processor, GlobalSearchScope
.fileScope(project, virtualFile));
}
@NotNull
@Override
public DataExternalizer<ImageInfo> getValueExternalizer() {
return myValueExternalizer;
}
@NotNull
@Override
public FileBasedIndex.InputFilter getInputFilter() {
return new DefaultFileTypeSpecificInputFilter(ImageFileTypeManager.getInstance().getImageFileType()) {
@Override
public boolean acceptInput(@NotNull final VirtualFile file) {
return file.isInLocalFileSystem() &&
file.getLength() / 1024 < ourMaxImageSize
;
}
};
}
@Override
public int getVersion() {
return 5;
}
public static class ImageInfo {
public int width;
public int height;
public int bpp;
public ImageInfo(int width, int height, int bpp) {
this.width = width;
this.height = height;
this.bpp = bpp;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ImageInfo imageInfo = (ImageInfo)o;
if (bpp != imageInfo.bpp) return false;
if (height != imageInfo.height) return false;
if (width != imageInfo.width) return false;
return true;
}
@Override
public int hashCode() {
int result = width;
result = 31 * result + height;
result = 31 * result + bpp;
return result;
}
}
}