// Copyright 2017 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/codec/ccodec_scanlinedecoder.h" #include "core/fxcrt/pauseindicator_iface.h" CCodec_ScanlineDecoder::CCodec_ScanlineDecoder() : CCodec_ScanlineDecoder(0, 0, 0, 0, 0, 0, 0) {} CCodec_ScanlineDecoder::CCodec_ScanlineDecoder(int nOrigWidth, int nOrigHeight, int nOutputWidth, int nOutputHeight, int nComps, int nBpc, uint32_t nPitch) : m_OrigWidth(nOrigWidth), m_OrigHeight(nOrigHeight), m_OutputWidth(nOutputWidth), m_OutputHeight(nOutputHeight), m_nComps(nComps), m_bpc(nBpc), m_Pitch(nPitch), m_NextLine(-1), m_pLastScanline(nullptr) {} CCodec_ScanlineDecoder::~CCodec_ScanlineDecoder() {} const uint8_t* CCodec_ScanlineDecoder::GetScanline(int line) { if (m_NextLine == line + 1) return m_pLastScanline; if (m_NextLine < 0 || m_NextLine > line) { if (!v_Rewind()) return nullptr; m_NextLine = 0; } while (m_NextLine < line) { ReadNextLine(); m_NextLine++; } m_pLastScanline = ReadNextLine(); m_NextLine++; return m_pLastScanline; } bool CCodec_ScanlineDecoder::SkipToScanline(int line, PauseIndicatorIface* pPause) { if (m_NextLine == line || m_NextLine == line + 1) return false; if (m_NextLine < 0 || m_NextLine > line) { v_Rewind(); m_NextLine = 0; } m_pLastScanline = nullptr; while (m_NextLine < line) { m_pLastScanline = ReadNextLine(); m_NextLine++; if (pPause && pPause->NeedToPauseNow()) { return true; } } return false; } uint8_t* CCodec_ScanlineDecoder::ReadNextLine() { return v_GetNextLine(); }