1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/headless/test/pdf_utils.h"
#include <optional>
#include "base/logging.h"
#include "components/headless/test/bitmap_utils.h"
#include "pdf/pdf.h"
#include "printing/units.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "third_party/skia/include/core/SkColor.h"
#include "third_party/skia/include/core/SkImageInfo.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/size_conversions.h"
namespace headless {
PDFPageBitmap::PDFPageBitmap() = default;
PDFPageBitmap::~PDFPageBitmap() = default;
bool PDFPageBitmap::Render(base::span<const uint8_t> pdf_data, int page_index) {
std::optional<gfx::SizeF> page_size_in_points =
chrome_pdf::GetPDFPageSizeByIndex(pdf_data, page_index);
if (!page_size_in_points) {
return false;
}
page_size_in_points_ = page_size_in_points.value();
gfx::SizeF page_size_in_pixels =
gfx::ScaleSize(page_size_in_points_,
static_cast<float>(kDpi) / printing::kPointsPerInch);
gfx::Rect page_rect(gfx::ToCeiledSize(page_size_in_pixels));
constexpr chrome_pdf::RenderOptions options = {
.stretch_to_bounds = false,
.keep_aspect_ratio = true,
.autorotate = true,
.use_color = true,
.render_device_type = chrome_pdf::RenderDeviceType::kPrinter,
};
bitmap_size_ = page_rect.size();
bitmap_data_.resize(kColorChannels * bitmap_size_.GetArea());
return chrome_pdf::RenderPDFPageToBitmap(pdf_data, page_index,
bitmap_data_.data(), bitmap_size_,
gfx::Size(kDpi, kDpi), options);
}
uint32_t PDFPageBitmap::GetPixelRGB(const gfx::Point& pt) const {
return GetPixelRGB(pt.x(), pt.y());
}
uint32_t PDFPageBitmap::GetPixelRGB(int x, int y) const {
CHECK_LT(x, bitmap_size_.width());
CHECK_LT(y, bitmap_size_.height());
int pixel_index =
bitmap_size_.width() * y * kColorChannels + x * kColorChannels;
return bitmap_data_[pixel_index + 0] // B
| (bitmap_data_[pixel_index + 1] << 8) // G
| (bitmap_data_[pixel_index + 2] << 16); // R
}
bool PDFPageBitmap::CheckColoredRect(SkColor rect_color,
SkColor bkgr_color,
int margins) {
SkBitmap bitmap;
SkImageInfo info = SkImageInfo::MakeN32(
bitmap_size_.width(), bitmap_size_.height(), kOpaque_SkAlphaType);
size_t rowBytes = bitmap_size_.width() * kColorChannels;
CHECK(bitmap.installPixels(info, bitmap_data_.data(), rowBytes));
return headless::CheckColoredRect(bitmap, rect_color, bkgr_color, margins);
}
} // namespace headless
|