Replace some Release() calls with virtual destructors.
[pdfium.git] / xfa / src / fxbarcode / BC_BufferedImageLuminanceSource.cpp
1 // Copyright 2014 PDFium Authors. All rights reserved.\r
2 // Use of this source code is governed by a BSD-style license that can be\r
3 // found in the LICENSE file.\r
4 \r
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\r
6 // Original code is licensed as follows:
7 /*\r
8  * Copyright 2009 ZXing authors\r
9  *\r
10  * Licensed under the Apache License, Version 2.0 (the "License");\r
11  * you may not use this file except in compliance with the License.\r
12  * You may obtain a copy of the License at\r
13  *\r
14  *      http://www.apache.org/licenses/LICENSE-2.0\r
15  *\r
16  * Unless required by applicable law or agreed to in writing, software\r
17  * distributed under the License is distributed on an "AS IS" BASIS,\r
18  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
19  * See the License for the specific language governing permissions and\r
20  * limitations under the License.\r
21  */\r
22 \r
23 #include "barcode.h"\r
24 #include "BC_LuminanceSource.h"\r
25 #include "BC_BufferedImageLuminanceSource.h"\r
26 class CBC_Pause : public IFX_Pause\r
27 {\r
28 public:\r
29     virtual FX_BOOL     NeedToPauseNow()\r
30     {\r
31         return TRUE;\r
32     }\r
33 };\r
34 static CFX_DIBitmap* CreateDIBSource(IFX_FileRead* fileread)\r
35 {\r
36     CFX_DIBitmap* bitmap = NULL;\r
37     CCodec_ModuleMgr* pCodecMgr = NULL;\r
38     ICodec_ProgressiveDecoder* pImageCodec = NULL;\r
39     pCodecMgr = new CCodec_ModuleMgr();\r
40     pImageCodec = pCodecMgr->CreateProgressiveDecoder();\r
41     FXCODEC_STATUS status = FXCODEC_STATUS_DECODE_FINISH;\r
42     status = pImageCodec->LoadImageInfo(fileread, FXCODEC_IMAGE_UNKNOWN);\r
43     if (status != FXCODEC_STATUS_FRAME_READY) {\r
44         return NULL;\r
45     }\r
46     bitmap = FX_NEW CFX_DIBitmap;\r
47     bitmap->Create(pImageCodec->GetWidth(), pImageCodec->GetHeight(), FXDIB_Argb);\r
48     bitmap->Clear(FXARGB_MAKE(0xFF, 0xFF, 0xFF, 0xFF));\r
49     CBC_Pause pause;\r
50     int32_t frames;\r
51     status = pImageCodec->GetFrames(frames, &pause);\r
52     while (status == FXCODEC_STATUS_FRAME_TOBECONTINUE) {\r
53         status = pImageCodec->GetFrames(frames, &pause);\r
54     }\r
55     if (status != FXCODEC_STATUS_DECODE_READY) {\r
56         goto except;\r
57     }\r
58     status = pImageCodec->StartDecode(bitmap,\r
59                                       0,\r
60                                       0,\r
61                                       bitmap->GetWidth(),\r
62                                       bitmap->GetHeight(),\r
63                                       0,\r
64                                       FALSE);\r
65     if (status == FXCODEC_STATUS_ERR_PARAMS) {\r
66         goto except;\r
67     }\r
68     if (status != FXCODEC_STATUS_DECODE_TOBECONTINUE) {\r
69         goto except;\r
70     }\r
71     while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {\r
72         status = pImageCodec->ContinueDecode(&pause);\r
73     }\r
74     if (status != FXCODEC_STATUS_DECODE_FINISH) {\r
75         goto except;\r
76     }\r
77     if (pImageCodec) {\r
78         delete pImageCodec;\r
79         pImageCodec = NULL;\r
80     }\r
81     delete pCodecMgr;\r
82     pCodecMgr = NULL;\r
83     return bitmap;\r
84 except:\r
85     if (pImageCodec) {\r
86         delete pImageCodec;\r
87         pImageCodec = NULL;\r
88     }\r
89     delete pCodecMgr;\r
90     pCodecMgr = NULL;\r
91     if (bitmap) {\r
92         delete bitmap;\r
93     }\r
94     return NULL;\r
95 }\r
96 CBC_BufferedImageLuminanceSource::CBC_BufferedImageLuminanceSource(const CFX_WideString &filename): CBC_LuminanceSource(0, 0), m_filename(filename)\r
97 {\r
98     m_height = 0;\r
99     m_width = 0;\r
100     m_bytesPerLine = 0;\r
101     m_top = 0;\r
102     m_left = 0;\r
103 }\r
104 void CBC_BufferedImageLuminanceSource::Init(int32_t &e)\r
105 {\r
106     IFX_FileRead* fileread = FX_CreateFileRead(m_filename);\r
107     m_pBitmap = CreateDIBSource(fileread);\r
108     if (m_pBitmap == NULL) {\r
109         e = BCExceptionLoadFile;\r
110         return;\r
111     }\r
112     m_pBitmap->ConvertFormat(FXDIB_Argb);\r
113     m_height = m_pBitmap->GetHeight();\r
114     m_width = m_pBitmap->GetWidth();\r
115     m_rgbData.SetSize(m_height * m_width);\r
116     m_bytesPerLine = m_width * 4;\r
117     m_top = 0;\r
118     m_left = 0;\r
119 }\r
120 CBC_BufferedImageLuminanceSource::CBC_BufferedImageLuminanceSource(CFX_DIBitmap *pBitmap): CBC_LuminanceSource(0, 0)\r
121 {\r
122     m_pBitmap = pBitmap->Clone();\r
123     m_pBitmap->ConvertFormat(FXDIB_Argb);\r
124     m_height = m_pBitmap->GetHeight();\r
125     m_width = m_pBitmap->GetWidth();\r
126     m_rgbData.SetSize(m_height * m_width);\r
127     m_bytesPerLine = m_width * 4;\r
128     m_top = 0;\r
129     m_left = 0;\r
130 }\r
131 CBC_BufferedImageLuminanceSource::~CBC_BufferedImageLuminanceSource()\r
132 {\r
133     delete m_pBitmap;\r
134     m_pBitmap = NULL;\r
135 }\r
136 CFX_ByteArray *CBC_BufferedImageLuminanceSource::GetRow(int32_t y, CFX_ByteArray &row, int32_t &e)\r
137 {\r
138     if (y < 0 || y >= m_height) {\r
139         e = BCExceptionRequestedRowIsOutSizeTheImage;\r
140         return NULL;\r
141     }\r
142     int32_t width = m_width;\r
143     if(row.GetSize() == 0 || row.GetSize() < width) {\r
144         row.SetSize(width);\r
145     }\r
146     if(m_rgbData.GetSize() == 0 || m_rgbData.GetSize() < width) {\r
147         m_rgbData.SetSize(width);\r
148     }\r
149     int32_t* rowLine = (int32_t*)m_pBitmap->GetScanline(y);\r
150     int32_t x;\r
151     for (x = 0; x < width; x++) {\r
152         int32_t pixel = rowLine[x];\r
153         int32_t luminance = (306 * ((pixel >> 16) & 0xFF) +\r
154                               601 * ((pixel >> 8) & 0xFF) +\r
155                               117 * (pixel & 0xFF)) >> 10;\r
156         row[x] = (uint8_t) luminance;\r
157     }\r
158     return &row;\r
159 }\r
160 CFX_ByteArray *CBC_BufferedImageLuminanceSource::GetMatrix()\r
161 {\r
162     CFX_ByteArray *matirx = FX_NEW CFX_ByteArray();\r
163     matirx->SetSize(m_bytesPerLine * m_height);\r
164     int32_t *rgb = (int32_t*)m_pBitmap->GetBuffer();\r
165     int32_t y;\r
166     for(y = 0; y < m_height; y++) {\r
167         int32_t offset = y * m_width;\r
168         int32_t x;\r
169         for(x = 0; x < m_width; x++) {\r
170             int32_t pixel = rgb[offset + x];\r
171             int32_t luminance = (306 * ((pixel >> 16) & 0xFF) +\r
172                                   601 * ((pixel >> 8) & 0xFF) +\r
173                                   117 * (pixel & 0xFF)) >> 10;\r
174             (*matirx)[offset + x] = (uint8_t) luminance;\r
175         }\r
176     }\r
177     return matirx;\r
178 }\r
179 FX_BOOL CBC_BufferedImageLuminanceSource::IsCropSupported()\r
180 {\r
181     return TRUE;\r
182 }\r
183 FX_BOOL CBC_BufferedImageLuminanceSource::IsRotateSupported()\r
184 {\r
185     return TRUE;\r
186 }\r
187 CBC_LuminanceSource *CBC_BufferedImageLuminanceSource::Crop(int32_t left, int32_t top, int32_t width, int32_t height)\r
188 {\r
189     return NULL;\r
190 }\r
191 CBC_LuminanceSource *CBC_BufferedImageLuminanceSource::RotateCounterClockwise(int32_t &e)\r
192 {\r
193     if (!IsRotateSupported()) {\r
194         e = BCExceptionRotateNotSupported;\r
195         return NULL;\r
196     }\r
197     int32_t sourceWidth = m_width;\r
198     int32_t sourceHeight = m_height;\r
199     return NULL;\r
200 }\r