Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / xfa / src / fxbarcode / src / 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 \r
7 #include "barcode.h"\r
8 #include "include/BC_LuminanceSource.h"\r
9 #include "include/BC_BufferedImageLuminanceSource.h"\r
10 class CBC_Pause : public IFX_Pause\r
11 {\r
12 public:\r
13     virtual FX_BOOL     NeedToPauseNow()\r
14     {\r
15         return TRUE;\r
16     }\r
17 };\r
18 static CFX_DIBitmap* CreateDIBSource(IFX_FileRead* fileread)\r
19 {\r
20     CFX_DIBitmap* bitmap = NULL;\r
21     CCodec_ModuleMgr* pCodecMgr = NULL;\r
22     ICodec_ProgressiveDecoder* pImageCodec = NULL;\r
23     pCodecMgr = CCodec_ModuleMgr::Create();\r
24     pImageCodec = pCodecMgr->CreateProgressiveDecoder();\r
25     FXCODEC_STATUS status = FXCODEC_STATUS_DECODE_FINISH;\r
26     status = pImageCodec->LoadImageInfo(fileread, FXCODEC_IMAGE_UNKNOWN);\r
27     if (status != FXCODEC_STATUS_FRAME_READY) {\r
28         return NULL;\r
29     }\r
30     bitmap = FX_NEW CFX_DIBitmap;\r
31     bitmap->Create(pImageCodec->GetWidth(), pImageCodec->GetHeight(), FXDIB_Argb);\r
32     bitmap->Clear(FXARGB_MAKE(0xFF, 0xFF, 0xFF, 0xFF));\r
33     CBC_Pause pause;\r
34     FX_INT32 frames;\r
35     status = pImageCodec->GetFrames(frames, &pause);\r
36     while (status == FXCODEC_STATUS_FRAME_TOBECONTINUE) {\r
37         status = pImageCodec->GetFrames(frames, &pause);\r
38     }\r
39     if (status != FXCODEC_STATUS_DECODE_READY) {\r
40         goto except;\r
41     }\r
42     status = pImageCodec->StartDecode(bitmap,\r
43                                       0,\r
44                                       0,\r
45                                       bitmap->GetWidth(),\r
46                                       bitmap->GetHeight(),\r
47                                       0,\r
48                                       FALSE);\r
49     if (status == FXCODEC_STATUS_ERR_PARAMS) {\r
50         goto except;\r
51     }\r
52     if (status != FXCODEC_STATUS_DECODE_TOBECONTINUE) {\r
53         goto except;\r
54     }\r
55     while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {\r
56         status = pImageCodec->ContinueDecode(&pause);\r
57     }\r
58     if (status != FXCODEC_STATUS_DECODE_FINISH) {\r
59         goto except;\r
60     }\r
61     if (pImageCodec) {\r
62         delete pImageCodec;\r
63         pImageCodec = NULL;\r
64     }\r
65     if (pCodecMgr) {\r
66         pCodecMgr->Destroy();\r
67         pCodecMgr = NULL;\r
68     }\r
69     return bitmap;\r
70 except:\r
71     if (pImageCodec) {\r
72         delete pImageCodec;\r
73         pImageCodec = NULL;\r
74     }\r
75     if (pCodecMgr) {\r
76         pCodecMgr->Destroy();\r
77         pCodecMgr = NULL;\r
78     }\r
79     if (bitmap) {\r
80         delete bitmap;\r
81     }\r
82     return NULL;\r
83 }\r
84 CBC_BufferedImageLuminanceSource::CBC_BufferedImageLuminanceSource(const CFX_WideString &filename): CBC_LuminanceSource(0, 0), m_filename(filename)\r
85 {\r
86     m_height = 0;\r
87     m_width = 0;\r
88     m_bytesPerLine = 0;\r
89     m_top = 0;\r
90     m_left = 0;\r
91 }\r
92 void CBC_BufferedImageLuminanceSource::Init(FX_INT32 &e)\r
93 {\r
94     IFX_FileRead* fileread = FX_CreateFileRead(m_filename);\r
95     m_pBitmap = CreateDIBSource(fileread);\r
96     if (m_pBitmap == NULL) {\r
97         e = BCExceptionLoadFile;\r
98         return;\r
99     }\r
100     m_pBitmap->ConvertFormat(FXDIB_Argb);\r
101     m_height = m_pBitmap->GetHeight();\r
102     m_width = m_pBitmap->GetWidth();\r
103     m_rgbData.SetSize(m_height * m_width);\r
104     m_bytesPerLine = m_width * 4;\r
105     m_top = 0;\r
106     m_left = 0;\r
107 }\r
108 CBC_BufferedImageLuminanceSource::CBC_BufferedImageLuminanceSource(CFX_DIBitmap *pBitmap): CBC_LuminanceSource(0, 0)\r
109 {\r
110     m_pBitmap = pBitmap->Clone();\r
111     m_pBitmap->ConvertFormat(FXDIB_Argb);\r
112     m_height = m_pBitmap->GetHeight();\r
113     m_width = m_pBitmap->GetWidth();\r
114     m_rgbData.SetSize(m_height * m_width);\r
115     m_bytesPerLine = m_width * 4;\r
116     m_top = 0;\r
117     m_left = 0;\r
118 }\r
119 CBC_BufferedImageLuminanceSource::~CBC_BufferedImageLuminanceSource()\r
120 {\r
121     delete m_pBitmap;\r
122     m_pBitmap = NULL;\r
123 }\r
124 CFX_ByteArray *CBC_BufferedImageLuminanceSource::GetRow(FX_INT32 y, CFX_ByteArray &row, FX_INT32 &e)\r
125 {\r
126     if (y < 0 || y >= m_height) {\r
127         e = BCExceptionRequestedRowIsOutSizeTheImage;\r
128         return NULL;\r
129     }\r
130     FX_INT32 width = m_width;\r
131     if(row.GetSize() == 0 || row.GetSize() < width) {\r
132         row.SetSize(width);\r
133     }\r
134     if(m_rgbData.GetSize() == 0 || m_rgbData.GetSize() < width) {\r
135         m_rgbData.SetSize(width);\r
136     }\r
137     FX_INT32* rowLine = (FX_INT32*)m_pBitmap->GetScanline(y);\r
138     FX_INT32 x;\r
139     for (x = 0; x < width; x++) {\r
140         FX_INT32 pixel = rowLine[x];\r
141         FX_INT32 luminance = (306 * ((pixel >> 16) & 0xFF) +\r
142                               601 * ((pixel >> 8) & 0xFF) +\r
143                               117 * (pixel & 0xFF)) >> 10;\r
144         row[x] = (FX_BYTE) luminance;\r
145     }\r
146     return &row;\r
147 }\r
148 CFX_ByteArray *CBC_BufferedImageLuminanceSource::GetMatrix()\r
149 {\r
150     CFX_ByteArray *matirx = FX_NEW CFX_ByteArray();\r
151     matirx->SetSize(m_bytesPerLine * m_height);\r
152     FX_INT32 *rgb = (FX_INT32*)m_pBitmap->GetBuffer();\r
153     FX_INT32 y;\r
154     for(y = 0; y < m_height; y++) {\r
155         FX_INT32 offset = y * m_width;\r
156         FX_INT32 x;\r
157         for(x = 0; x < m_width; x++) {\r
158             FX_INT32 pixel = rgb[offset + x];\r
159             FX_INT32 luminance = (306 * ((pixel >> 16) & 0xFF) +\r
160                                   601 * ((pixel >> 8) & 0xFF) +\r
161                                   117 * (pixel & 0xFF)) >> 10;\r
162             (*matirx)[offset + x] = (FX_BYTE) luminance;\r
163         }\r
164     }\r
165     return matirx;\r
166 }\r
167 FX_BOOL CBC_BufferedImageLuminanceSource::IsCropSupported()\r
168 {\r
169     return TRUE;\r
170 }\r
171 FX_BOOL CBC_BufferedImageLuminanceSource::IsRotateSupported()\r
172 {\r
173     return TRUE;\r
174 }\r
175 CBC_LuminanceSource *CBC_BufferedImageLuminanceSource::Crop(FX_INT32 left, FX_INT32 top, FX_INT32 width, FX_INT32 height)\r
176 {\r
177     return NULL;\r
178 }\r
179 CBC_LuminanceSource *CBC_BufferedImageLuminanceSource::RotateCounterClockwise(FX_INT32 &e)\r
180 {\r
181     if (!IsRotateSupported()) {\r
182         e = BCExceptionRotateNotSupported;\r
183         return NULL;\r
184     }\r
185     FX_INT32 sourceWidth = m_width;\r
186     FX_INT32 sourceHeight = m_height;\r
187     return NULL;\r
188 }\r