1db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra/*
2db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra * Copyright (C) 2010 The Android Open Source Project
3db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra *
4db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra * Licensed under the Apache License, Version 2.0 (the "License");
5db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra * you may not use this file except in compliance with the License.
6db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra * You may obtain a copy of the License at
7db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra *
8db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra *      http://www.apache.org/licenses/LICENSE-2.0
9db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra *
10db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra * Unless required by applicable law or agreed to in writing, software
11db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra * distributed under the License is distributed on an "AS IS" BASIS,
12db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra * See the License for the specific language governing permissions and
14db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra * limitations under the License.
15db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra */
16db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra
17db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra// YUVCanvas holds a reference to a YUVImage on which it can do various
18db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra// drawing operations. It provides various utility functions for filling,
19db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra// cropping, etc.
20db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra
21db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra
22db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra#ifndef YUV_CANVAS_H_
23db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra
24db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra#define YUV_CANVAS_H_
25db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra
26db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra#include <stdint.h>
27db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra
28db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatranamespace android {
29db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra
30db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatraclass YUVImage;
31db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatraclass Rect;
32db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra
33db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatraclass YUVCanvas {
34db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatrapublic:
35db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra
36db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra    // Constructor takes in reference to a yuvImage on which it can do
37db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra    // various drawing opreations.
38db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra    YUVCanvas(YUVImage &yuvImage);
39db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra    ~YUVCanvas();
40db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra
41db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra    // Fills the entire image with the given YUV values.
42db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra    void FillYUV(uint8_t yValue, uint8_t uValue, uint8_t vValue);
43db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra
44db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra    // Fills the rectangular region [startX,endX]x[startY,endY] with the given YUV values.
45db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra    void FillYUVRectangle(const Rect& rect,
46db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra            uint8_t yValue, uint8_t uValue, uint8_t vValue);
47db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra
48db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra    // Copies the region [startX,endX]x[startY,endY] from srcImage into the
49db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra    // canvas' target image (mYUVImage) starting at
50db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra    // (destinationStartX,destinationStartY).
51db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra    // Note that undefined behavior may occur if srcImage is same as the canvas'
52db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra    // target image.
53db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra    void CopyImageRect(
54db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra            const Rect& srcRect,
55db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra            int32_t destStartX, int32_t destStartY,
56db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra            const YUVImage &srcImage);
57db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra
58c0d936ddacc4f7d883f3bd1dd8099586836c820fNipun Kwatra    // Downsamples the srcImage into the canvas' target image (mYUVImage)
59c0d936ddacc4f7d883f3bd1dd8099586836c820fNipun Kwatra    // The downsampling copies pixels from the source image starting at
60c0d936ddacc4f7d883f3bd1dd8099586836c820fNipun Kwatra    // (srcOffsetX, srcOffsetY) to the target image, starting at (0, 0).
61c0d936ddacc4f7d883f3bd1dd8099586836c820fNipun Kwatra    // For each X increment in the target image, skipX pixels are skipped
62c0d936ddacc4f7d883f3bd1dd8099586836c820fNipun Kwatra    // in the source image.
63c0d936ddacc4f7d883f3bd1dd8099586836c820fNipun Kwatra    // Similarly for each Y increment in the target image, skipY pixels
64c0d936ddacc4f7d883f3bd1dd8099586836c820fNipun Kwatra    // are skipped in the source image.
65c0d936ddacc4f7d883f3bd1dd8099586836c820fNipun Kwatra    void downsample(
66c0d936ddacc4f7d883f3bd1dd8099586836c820fNipun Kwatra            int32_t srcOffsetX, int32_t srcOffsetY,
67c0d936ddacc4f7d883f3bd1dd8099586836c820fNipun Kwatra            int32_t skipX, int32_t skipY,
68c0d936ddacc4f7d883f3bd1dd8099586836c820fNipun Kwatra            const YUVImage &srcImage);
69c0d936ddacc4f7d883f3bd1dd8099586836c820fNipun Kwatra
70db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatraprivate:
71db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra    YUVImage& mYUVImage;
72db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra
73db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra    YUVCanvas(const YUVCanvas &);
74db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra    YUVCanvas &operator=(const YUVCanvas &);
75db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra};
76db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra
77db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra}  // namespace android
78db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra
79db205a1d75c1e9a7d0dbd8fa011335249ad6f4acNipun Kwatra#endif  // YUV_CANVAS_H_
80