| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You 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.apache.commons.imaging.formats.png.scanlinefilters; |
| |
| import java.io.IOException; |
| |
| import org.apache.commons.imaging.ImageReadException; |
| |
| public class ScanlineFilterPaeth extends ScanlineFilter |
| { |
| private final int BytesPerPixel; |
| |
| public ScanlineFilterPaeth(int BytesPerPixel) |
| { |
| this.BytesPerPixel = BytesPerPixel; |
| } |
| |
| private int PaethPredictor(int a, int b, int c) |
| { |
| // ; a = left, b = above, c = upper left |
| int p = a + b - c; // ; initial estimate |
| int pa = Math.abs(p - a); // ; distances to a, b, c |
| int pb = Math.abs(p - b); |
| int pc = Math.abs(p - c); |
| // ; return nearest of a,b,c, |
| // ; breaking ties in order a,b,c. |
| if ((pa <= pb) && (pa <= pc)) |
| return a; |
| else if (pb <= pc) |
| return b; |
| else |
| return c; |
| } |
| |
| @Override |
| public void unfilter(byte src[], byte dst[], byte up[]) |
| throws ImageReadException, IOException |
| { |
| for (int i = 0; i < src.length; i++) |
| { |
| int left = 0; |
| int prev_index = i - BytesPerPixel; |
| if (prev_index >= 0) |
| left = dst[prev_index]; |
| |
| int above = 0; |
| if (up != null) |
| above = up[i]; |
| // above = 255; |
| |
| int upperleft = 0; |
| if ((prev_index >= 0) && (up != null)) |
| upperleft = up[prev_index]; |
| // upperleft = 255; |
| |
| int PaethPredictor = PaethPredictor(0xff & left, 0xff & above, |
| 0xff & upperleft); |
| |
| dst[i] = (byte) ((src[i] + PaethPredictor) % 256); |
| // dst[i] = (byte) ((src[i] + PaethPredictor) ); |
| // dst[i] = src[i]; |
| |
| // dst[i] = (byte) 0; |
| } |
| } |
| } |