/*
* Copyright (C) 2013 Peng fei Pan <sky@xiaopan.me>
*
* 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 me.xiaopan.sketch.process;
import android.graphics.Bitmap;
import android.text.TextUtils;
import me.xiaopan.sketch.Sketch;
import me.xiaopan.sketch.cache.BitmapPool;
import me.xiaopan.sketch.cache.BitmapPoolUtils;
import me.xiaopan.sketch.request.Resize;
/**
* 用于组合两个ImageProcessor一起使用
*/
public abstract class WrappedImageProcessor extends ResizeImageProcessor {
private WrappedImageProcessor wrappedProcessor;
public WrappedImageProcessor(WrappedImageProcessor wrappedProcessor) {
this.wrappedProcessor = wrappedProcessor;
}
@Override
public final String getKey() {
String selfKey = onGetKey();
String wrappedKey = wrappedProcessor != null ? wrappedProcessor.getKey() : null;
if (!TextUtils.isEmpty(selfKey)) {
if (!TextUtils.isEmpty(wrappedKey)) {
return String.format("%s&%s", selfKey, wrappedKey);
} else {
return selfKey;
}
} else {
if (!TextUtils.isEmpty(wrappedKey)) {
return wrappedKey;
} else {
return null;
}
}
}
@SuppressWarnings("unused")
public WrappedImageProcessor getWrappedProcessor() {
return wrappedProcessor;
}
public abstract String onGetKey();
protected boolean isInterceptResize() {
return false;
}
@Override
public final Bitmap process(Sketch sketch, Bitmap bitmap, Resize resize, boolean forceUseResize,
boolean lowQualityImage) {
if (bitmap == null || bitmap.isRecycled()) {
return bitmap;
}
// resize
Bitmap newBitmap = bitmap;
if (!isInterceptResize()) {
newBitmap = super.process(sketch, bitmap, resize, forceUseResize, lowQualityImage);
}
// wrapped
if (wrappedProcessor != null) {
Bitmap wrappedBitmap = wrappedProcessor.process(sketch, newBitmap, resize, forceUseResize, lowQualityImage);
if (wrappedBitmap != null && wrappedBitmap != newBitmap) {
if (newBitmap != bitmap) {
BitmapPool bitmapPool = sketch.getConfiguration().getBitmapPool();
BitmapPoolUtils.freeBitmapToPool(newBitmap, bitmapPool);
}
newBitmap = wrappedBitmap;
}
}
return onProcess(sketch, newBitmap, resize, forceUseResize, lowQualityImage);
}
public abstract Bitmap onProcess(Sketch sketch, Bitmap bitmap, Resize resize, boolean forceUseResize,
boolean lowQualityImage);
}