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