| // Copyright 2022 The PDFium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "core/fxge/calculate_pitch.h" |
| |
| #include "core/fxcrt/fx_safe_types.h" |
| #include "core/fxge/dib/fx_dib.h" |
| |
| namespace fxge { |
| namespace { |
| |
| FX_SAFE_UINT32 CalculatePitch8Safely(uint32_t bpc, |
| uint32_t components, |
| int width) { |
| FX_SAFE_UINT32 pitch = bpc; |
| pitch *= components; |
| pitch *= width; |
| pitch += 7; |
| pitch /= 8; |
| return pitch; |
| } |
| |
| FX_SAFE_UINT32 CalculatePitch32Safely(int bpp, int width) { |
| FX_SAFE_UINT32 pitch = bpp; |
| pitch *= width; |
| pitch += 31; |
| pitch /= 32; // quantized to number of 32-bit words. |
| pitch *= 4; // and then back to bytes, (not just /8 in one step). |
| return pitch; |
| } |
| |
| } // namespace |
| |
| uint32_t CalculatePitch8OrDie(uint32_t bpc, uint32_t components, int width) { |
| return CalculatePitch8Safely(bpc, components, width).ValueOrDie(); |
| } |
| |
| uint32_t CalculatePitch32OrDie(int bpp, int width) { |
| return CalculatePitch32Safely(bpp, width).ValueOrDie(); |
| } |
| |
| absl::optional<uint32_t> CalculatePitch8(uint32_t bpc, |
| uint32_t components, |
| int width) { |
| FX_SAFE_UINT32 pitch = CalculatePitch8Safely(bpc, components, width); |
| if (!pitch.IsValid()) |
| return absl::nullopt; |
| return pitch.ValueOrDie(); |
| } |
| |
| absl::optional<uint32_t> CalculatePitch32(int bpp, int width) { |
| FX_SAFE_UINT32 pitch = CalculatePitch32Safely(bpp, width); |
| if (!pitch.IsValid()) |
| return absl::nullopt; |
| return pitch.ValueOrDie(); |
| } |
| |
| } // namespace fxge |