| // 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 bits_per_component, |
| uint32_t components_per_pixel, |
| int width_in_pixels) { |
| return CalculatePitch8Safely(bits_per_component, components_per_pixel, |
| width_in_pixels) |
| .ValueOrDie(); |
| } |
| |
| uint32_t CalculatePitch32OrDie(int bits_per_pixel, int width_in_pixels) { |
| return CalculatePitch32Safely(bits_per_pixel, width_in_pixels).ValueOrDie(); |
| } |
| |
| std::optional<uint32_t> CalculatePitch8(uint32_t bits_per_component, |
| uint32_t components, |
| int width_in_pixels) { |
| FX_SAFE_UINT32 pitch = |
| CalculatePitch8Safely(bits_per_component, components, width_in_pixels); |
| if (!pitch.IsValid()) |
| return std::nullopt; |
| return pitch.ValueOrDie(); |
| } |
| |
| std::optional<uint32_t> CalculatePitch32(int bits_per_pixel, |
| int width_in_pixels) { |
| FX_SAFE_UINT32 pitch = |
| CalculatePitch32Safely(bits_per_pixel, width_in_pixels); |
| if (!pitch.IsValid()) |
| return std::nullopt; |
| return pitch.ValueOrDie(); |
| } |
| |
| } // namespace fxge |