1d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger/*
2d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger * Copyright (C) 2015 The Android Open Source Project
3d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger *
4d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger * Licensed under the Apache License, Version 2.0 (the "License");
5d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger * you may not use this file except in compliance with the License.
6d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger * You may obtain a copy of the License at
7d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger *
8d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger *      http://www.apache.org/licenses/LICENSE-2.0
9d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger *
10d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger * Unless required by applicable law or agreed to in writing, software
11d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger * distributed under the License is distributed on an "AS IS" BASIS,
12d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger * See the License for the specific language governing permissions and
14d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger * limitations under the License.
15d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger */
16d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger
17d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newbergerpackage com.android.camera.ui;
18d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger
19d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newbergerimport android.graphics.Canvas;
20d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newbergerimport android.graphics.ColorFilter;
21d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newbergerimport android.graphics.Paint;
22d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newbergerimport android.graphics.PixelFormat;
23d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newbergerimport android.graphics.Rect;
24d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newbergerimport android.graphics.RectF;
25d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newbergerimport android.graphics.drawable.Drawable;
26d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger
27d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger/**
28d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger * Drawable that takes a {@link RectF} as a screen, and draws around that
29d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger * screen to fill margins between the screen and the edge of the {@link Canvas}
30d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger * when drawing.
31d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger */
32d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newbergerpublic class MarginDrawable extends Drawable {
33d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger
34d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger    private RectF mScreen = new RectF(0, 0, 0, 0);
35d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger    private final Paint mPaint;
36d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger
37d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger    public MarginDrawable(int color) {
38d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger        super();
39d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger
40d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger        mPaint = new Paint();
41d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger        mPaint.setAntiAlias(true);
42d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger        mPaint.setColor(color);
43d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger    }
44d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger
45d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger    /**
46d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger     * Set the screen around which will be drawn margins. If the screen rect
47d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger     * has no area (zero width or height), no margins will be drawn.
48d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger     *
49d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger     * @param screen A {@link RectF} describing the screen dimensions
50d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger     */
51d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger    public void setScreen(RectF screen) {
52d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger        mScreen.set(screen);
53d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger        invalidateSelf();
54d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger    }
55d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger
56d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger    @Override
57d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger    public void draw(Canvas canvas) {
58d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger        RectF s = mScreen;
59d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger        if (s.top < s.bottom && s.left < s.right) {
60d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger            Rect cb = canvas.getClipBounds();
61d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger            if (s.top > 0) {
62d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger                canvas.drawRect(0, 0, cb.right, s.top + 1, mPaint);
63d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger            }
64d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger            if (s.left > 0) {
65d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger                canvas.drawRect(0, s.top, s.left + 1, s.bottom, mPaint);
66d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger            }
67d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger            if (s.right < cb.right) {
68d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger                canvas.drawRect(s.right - 1, s.top, cb.right, s.bottom, mPaint);
69d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger            }
70d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger            if (s.bottom < cb.bottom) {
71d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger                canvas.drawRect(0, s.bottom - 1, cb.right, cb.bottom, mPaint);
72d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger            }
73d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger        }
74d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger    }
75d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger
76d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger    @Override
77d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger    public void setAlpha(int alpha) {
78d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger    }
79d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger
80d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger    @Override
81d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger    public void setColorFilter(ColorFilter cf) {
82d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger    }
83d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger
84d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger    @Override
85d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger    public int getOpacity() {
86d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger        return PixelFormat.OPAQUE;
87d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger    }
88d7064a6c6f1eb0748de8f56b8a1e006d60ab0f7eAlan Newberger}
89