OSDN Git Service

am 655e208d: Merge "Correct label position after rotation" into gb-ub-photos-bryce
[android-x86/packages-apps-Gallery2.git] / src / com / android / gallery3d / filtershow / filters / ImageFilterVignette.java
1 /*
2  * Copyright (C) 2012 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package com.android.gallery3d.filtershow.filters;
18
19 import android.content.res.Resources;
20 import android.graphics.Bitmap;
21 import android.graphics.Canvas;
22 import android.graphics.Matrix;
23 import android.graphics.Rect;
24 import com.android.gallery3d.R;
25 import com.android.gallery3d.filtershow.presets.FilterEnvironment;
26
27 public class ImageFilterVignette extends SimpleImageFilter {
28     private static final String LOGTAG = "ImageFilterVignette";
29     private Bitmap mOverlayBitmap;
30
31     public ImageFilterVignette() {
32         mName = "Vignette";
33     }
34
35     @Override
36     public FilterRepresentation getDefaultRepresentation() {
37         FilterVignetteRepresentation representation = new FilterVignetteRepresentation();
38         return representation;
39     }
40
41     native protected void nativeApplyFilter(
42             Bitmap bitmap, int w, int h, int cx, int cy, float radx, float rady, float strength);
43
44     private float calcRadius(float cx, float cy, int w, int h) {
45         float d = cx;
46         if (d < (w - cx)) {
47             d = w - cx;
48         }
49         if (d < cy) {
50             d = cy;
51         }
52         if (d < (h - cy)) {
53             d = h - cy;
54         }
55         return d * d * 2.0f;
56     }
57
58     @Override
59     public Bitmap apply(Bitmap bitmap, float scaleFactor, int quality) {
60         if (SIMPLE_ICONS && FilterEnvironment.QUALITY_ICON == quality) {
61             if (mOverlayBitmap == null) {
62                 Resources res = getEnvironment().getPipeline().getResources();
63                 mOverlayBitmap = IconUtilities.getFXBitmap(res,
64                         R.drawable.filtershow_icon_vignette);
65             }
66             Canvas c = new Canvas(bitmap);
67             int dim = Math.max(bitmap.getWidth(), bitmap.getHeight());
68             Rect r = new Rect(0, 0, dim, dim);
69             c.drawBitmap(mOverlayBitmap, null, r, null);
70             return bitmap;
71         }
72         FilterVignetteRepresentation rep = (FilterVignetteRepresentation) getParameters();
73         if (rep == null) {
74             return bitmap;
75         }
76         int w = bitmap.getWidth();
77         int h = bitmap.getHeight();
78         float value = rep.getValue() / 100.0f;
79         float cx = w / 2;
80         float cy = h / 2;
81         float r = calcRadius(cx, cy, w, h);
82         float rx = r;
83         float ry = r;
84         if (rep.isCenterSet()) {
85             Matrix m = getOriginalToScreenMatrix(w, h);
86             cx = rep.getCenterX();
87             cy = rep.getCenterY();
88             float[] center = new float[] { cx, cy };
89             m.mapPoints(center);
90             cx = center[0];
91             cy = center[1];
92             rx = m.mapRadius(rep.getRadiusX());
93             ry = m.mapRadius(rep.getRadiusY());
94          }
95         nativeApplyFilter(bitmap, w, h, (int) cx, (int) cy, rx, ry, value);
96         return bitmap;
97     }
98 }