1/*
2 * Copyright (C) 2011 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///////////////////////////////////////////////////
18// MosaicTypes.h
19// S.O. # :
20// Author(s): zkira
21// $Id: MosaicTypes.h,v 1.15 2011/06/17 13:35:48 mbansal Exp $
22
23
24#ifndef MOSAIC_TYPES_H
25#define MOSAIC_TYPES_H
26
27#include "ImageUtils.h"
28
29/**
30 *  Definition of rectangle in a mosaic.
31 */
32class MosaicRect
33{
34    public:
35        MosaicRect()
36        {
37            left = right = top = bottom = 0.0;
38        }
39
40        inline int Width()
41        {
42            return right - left;
43        }
44
45        inline int Height()
46        {
47            return bottom - top;
48        }
49
50        /**
51         *  Bounds of the rectangle
52         */
53        int left, right, top, bottom;
54};
55
56class BlendRect
57{
58    public:
59    double lft, rgt, top, bot;
60};
61
62/**
63 *  A frame making up the mosaic.
64 *  Note: Currently assumes a YVU image
65 *  containing separate Y,V, and U planes
66 *  in contiguous memory (in that order).
67 */
68class MosaicFrame {
69public:
70  ImageType image;
71  double trs[3][3];
72  int width, height;
73  BlendRect brect;  // This frame warped to the Mosaic coordinate system
74  BlendRect vcrect; // brect clipped using the voronoi neighbors
75  bool internal_allocation;
76
77  MosaicFrame() { };
78  MosaicFrame(int _width, int _height, bool allocate=true)
79  {
80    width = _width;
81    height = _height;
82    internal_allocation = allocate;
83    if(internal_allocation)
84        image = ImageUtils::allocateImage(width, height, ImageUtils::IMAGE_TYPE_NUM_CHANNELS);
85  }
86
87
88  ~MosaicFrame()
89  {
90    if(internal_allocation)
91        if (image)
92        free(image);
93  }
94
95  /**
96  *  Get the V plane of the image.
97  */
98  inline ImageType getV()
99  {
100    return (image + (width*height));
101  }
102
103  /**
104  *  Get the U plane of the image.
105  */
106  inline ImageType getU()
107  {
108    return (image + (width*height*2));
109  }
110
111  /**
112  *  Get a pixel from the V plane of the image.
113  */
114  inline int getV(int y, int x)
115  {
116    ImageType U = image + (width*height);
117    return U[y*width+x];
118  }
119
120  /**
121  *  Get a pixel from the U plane of the image.
122  */
123  inline int getU(int y, int x)
124  {
125    ImageType U = image + (width*height*2);
126    return U[y*width+x];
127  }
128
129};
130
131/**
132 *  Structure for describing a warp.
133 */
134typedef struct {
135  int horizontal;
136  double theta;
137  double x;
138  double y;
139  double width;
140  double radius;
141  double direction;
142  double correction;
143  int blendRange;
144  int blendRangeUV;
145  int nlevs;
146  int nlevsC;
147  int blendingType;
148  int stripType;
149  // Add an overlap to prevent a gap between pictures due to roundoffs
150  double roundoffOverlap;// 1.5
151
152} BlendParams;
153
154#endif
155