| // Copyright 2014 PDFium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| |
| #include "core/fxcodec/bmp/bmp_decoder.h" |
| |
| #include <utility> |
| |
| #include "core/fxcodec/bmp/cfx_bmpcontext.h" |
| #include "core/fxcodec/cfx_codec_memory.h" |
| #include "core/fxcodec/fx_codec.h" |
| #include "core/fxcodec/fx_codec_def.h" |
| #include "core/fxge/dib/fx_dib.h" |
| #include "third_party/base/check.h" |
| |
| namespace fxcodec { |
| |
| // static |
| std::unique_ptr<ProgressiveDecoderIface::Context> BmpDecoder::StartDecode( |
| Delegate* pDelegate) { |
| return std::make_unique<CFX_BmpContext>(pDelegate); |
| } |
| |
| // static |
| BmpDecoder::Status BmpDecoder::ReadHeader( |
| ProgressiveDecoderIface::Context* pContext, |
| int32_t* width, |
| int32_t* height, |
| bool* tb_flag, |
| int32_t* components, |
| int32_t* pal_num, |
| const std::vector<uint32_t>** palette, |
| CFX_DIBAttribute* pAttribute) { |
| DCHECK(pAttribute); |
| |
| auto* ctx = static_cast<CFX_BmpContext*>(pContext); |
| Status status = ctx->m_Bmp.ReadHeader(); |
| if (status != Status::kSuccess) |
| return status; |
| |
| *width = ctx->m_Bmp.width(); |
| *height = ctx->m_Bmp.height(); |
| *tb_flag = ctx->m_Bmp.img_tb_flag(); |
| *components = ctx->m_Bmp.components(); |
| *pal_num = ctx->m_Bmp.pal_num(); |
| *palette = ctx->m_Bmp.palette(); |
| pAttribute->m_wDPIUnit = FXCODEC_RESUNIT_METER; |
| pAttribute->m_nXDPI = ctx->m_Bmp.dpi_x(); |
| pAttribute->m_nYDPI = ctx->m_Bmp.dpi_y(); |
| return Status::kSuccess; |
| } |
| |
| // static |
| BmpDecoder::Status BmpDecoder::LoadImage( |
| ProgressiveDecoderIface::Context* pContext) { |
| return static_cast<CFX_BmpContext*>(pContext)->m_Bmp.DecodeImage(); |
| } |
| |
| // static |
| FX_FILESIZE BmpDecoder::GetAvailInput( |
| ProgressiveDecoderIface::Context* pContext) { |
| return static_cast<CFX_BmpContext*>(pContext)->m_Bmp.GetAvailInput(); |
| } |
| |
| // static |
| bool BmpDecoder::Input(ProgressiveDecoderIface::Context* pContext, |
| RetainPtr<CFX_CodecMemory> codec_memory, |
| CFX_DIBAttribute*) { |
| auto* ctx = static_cast<CFX_BmpContext*>(pContext); |
| ctx->m_Bmp.SetInputBuffer(std::move(codec_memory)); |
| return true; |
| } |
| |
| } // namespace fxcodec |