Merge to XFA: Use stdint.h types throughout PDFium.
[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 = CCodec_ModuleMgr::Create();\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     if (pCodecMgr) {\r
82         pCodecMgr->Destroy();\r
83         pCodecMgr = NULL;\r
84     }\r
85     return bitmap;\r
86 except:\r
87     if (pImageCodec) {\r
88         delete pImageCodec;\r
89         pImageCodec = NULL;\r
90     }\r
91     if (pCodecMgr) {\r
92         pCodecMgr->Destroy();\r
93         pCodecMgr = NULL;\r
94     }\r
95     if (bitmap) {\r
96         delete bitmap;\r
97     }\r
98     return NULL;\r
99 }\r
100 CBC_BufferedImageLuminanceSource::CBC_BufferedImageLuminanceSource(const CFX_WideString &filename): CBC_LuminanceSource(0, 0), m_filename(filename)\r
101 {\r
102     m_height = 0;\r
103     m_width = 0;\r
104     m_bytesPerLine = 0;\r
105     m_top = 0;\r
106     m_left = 0;\r
107 }\r
108 void CBC_BufferedImageLuminanceSource::Init(int32_t &e)\r
109 {\r
110     IFX_FileRead* fileread = FX_CreateFileRead(m_filename);\r
111     m_pBitmap = CreateDIBSource(fileread);\r
112     if (m_pBitmap == NULL) {\r
113         e = BCExceptionLoadFile;\r
114         return;\r
115     }\r
116     m_pBitmap->ConvertFormat(FXDIB_Argb);\r
117     m_height = m_pBitmap->GetHeight();\r
118     m_width = m_pBitmap->GetWidth();\r
119     m_rgbData.SetSize(m_height * m_width);\r
120     m_bytesPerLine = m_width * 4;\r
121     m_top = 0;\r
122     m_left = 0;\r
123 }\r
124 CBC_BufferedImageLuminanceSource::CBC_BufferedImageLuminanceSource(CFX_DIBitmap *pBitmap): CBC_LuminanceSource(0, 0)\r
125 {\r
126     m_pBitmap = pBitmap->Clone();\r
127     m_pBitmap->ConvertFormat(FXDIB_Argb);\r
128     m_height = m_pBitmap->GetHeight();\r
129     m_width = m_pBitmap->GetWidth();\r
130     m_rgbData.SetSize(m_height * m_width);\r
131     m_bytesPerLine = m_width * 4;\r
132     m_top = 0;\r
133     m_left = 0;\r
134 }\r
135 CBC_BufferedImageLuminanceSource::~CBC_BufferedImageLuminanceSource()\r
136 {\r
137     delete m_pBitmap;\r
138     m_pBitmap = NULL;\r
139 }\r
140 CFX_ByteArray *CBC_BufferedImageLuminanceSource::GetRow(int32_t y, CFX_ByteArray &row, int32_t &e)\r
141 {\r
142     if (y < 0 || y >= m_height) {\r
143         e = BCExceptionRequestedRowIsOutSizeTheImage;\r
144         return NULL;\r
145     }\r
146     int32_t width = m_width;\r
147     if(row.GetSize() == 0 || row.GetSize() < width) {\r
148         row.SetSize(width);\r
149     }\r
150     if(m_rgbData.GetSize() == 0 || m_rgbData.GetSize() < width) {\r
151         m_rgbData.SetSize(width);\r
152     }\r
153     int32_t* rowLine = (int32_t*)m_pBitmap->GetScanline(y);\r
154     int32_t x;\r
155     for (x = 0; x < width; x++) {\r
156         int32_t pixel = rowLine[x];\r
157         int32_t luminance = (306 * ((pixel >> 16) & 0xFF) +\r
158                               601 * ((pixel >> 8) & 0xFF) +\r
159                               117 * (pixel & 0xFF)) >> 10;\r
160         row[x] = (uint8_t) luminance;\r
161     }\r
162     return &row;\r
163 }\r
164 CFX_ByteArray *CBC_BufferedImageLuminanceSource::GetMatrix()\r
165 {\r
166     CFX_ByteArray *matirx = FX_NEW CFX_ByteArray();\r
167     matirx->SetSize(m_bytesPerLine * m_height);\r
168     int32_t *rgb = (int32_t*)m_pBitmap->GetBuffer();\r
169     int32_t y;\r
170     for(y = 0; y < m_height; y++) {\r
171         int32_t offset = y * m_width;\r
172         int32_t x;\r
173         for(x = 0; x < m_width; x++) {\r
174             int32_t pixel = rgb[offset + x];\r
175             int32_t luminance = (306 * ((pixel >> 16) & 0xFF) +\r
176                                   601 * ((pixel >> 8) & 0xFF) +\r
177                                   117 * (pixel & 0xFF)) >> 10;\r
178             (*matirx)[offset + x] = (uint8_t) luminance;\r
179         }\r
180     }\r
181     return matirx;\r
182 }\r
183 FX_BOOL CBC_BufferedImageLuminanceSource::IsCropSupported()\r
184 {\r
185     return TRUE;\r
186 }\r
187 FX_BOOL CBC_BufferedImageLuminanceSource::IsRotateSupported()\r
188 {\r
189     return TRUE;\r
190 }\r
191 CBC_LuminanceSource *CBC_BufferedImageLuminanceSource::Crop(int32_t left, int32_t top, int32_t width, int32_t height)\r
192 {\r
193     return NULL;\r
194 }\r
195 CBC_LuminanceSource *CBC_BufferedImageLuminanceSource::RotateCounterClockwise(int32_t &e)\r
196 {\r
197     if (!IsRotateSupported()) {\r
198         e = BCExceptionRotateNotSupported;\r
199         return NULL;\r
200     }\r
201     int32_t sourceWidth = m_width;\r
202     int32_t sourceHeight = m_height;\r
203     return NULL;\r
204 }\r