blob: 799e10e886a16313856c55a40a53d7680c250f9c [file] [log] [blame] [edit]
// 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