0

Add conversion from pp::ImageData to SkBitmap

Adds a new function, SkBitmapFromPPImageData(), that converts from
pp::ImageData to SkBitmap. SkBitmap can then be used to replace any
instances of pp::ImageData. Note that the underlying pixel memory is
shared, so these conversions are relatively cheap.

As an example, converts chrome_pdf::draw_utils::DrawShadow() to accept
an SkBitmap& instead of a pp::ImageData*.

Bug: 1099020
Change-Id: Ib5ed84fe45f2a4ac882ba6b367a02398ba256c5f
Cq-Do-Not-Cancel-Tryjobs: true
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2270813
Reviewed-by: Dirk Pranke <dpranke@google.com>
Reviewed-by: Mike Klein <mtklein@google.com>
Reviewed-by: Daniel Hosseinian <dhoss@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: K. Moon <kmoon@chromium.org>
Cr-Commit-Position: refs/heads/master@{#787942}
This commit is contained in:
K. Moon
2020-07-13 22:55:07 +00:00
committed by Commit Bot
parent 8b8afb1821
commit 71dd82e8bb
7 changed files with 99 additions and 7 deletions

@ -57,6 +57,8 @@ if (enable_pdf) {
"pdf_ppapi.cc",
"pdf_transform.cc",
"pdf_transform.h",
"ppapi_migration/bitmap.cc",
"ppapi_migration/bitmap.h",
"ppapi_migration/callback.cc",
"ppapi_migration/callback.h",
"ppapi_migration/geometry_conversions.cc",
@ -91,6 +93,7 @@ if (enable_pdf) {
"//net",
"//ppapi/cpp:objects",
"//ppapi/cpp/private:internal_module",
"//skia",
"//ui/base",
"//ui/gfx/range",
]

@ -2,6 +2,7 @@ include_rules = [
"+net",
"+ppapi",
"+printing/units.h",
"+third_party/skia/include/core",
"+ui/base/window_open_disposition.h",
"+ui/events/keycodes/keyboard_codes.h",
"+ui/gfx/geometry",

@ -10,8 +10,8 @@
#include <algorithm>
#include "base/check_op.h"
#include "ppapi/cpp/image_data.h"
#include "ppapi/cpp/rect.h"
#include "third_party/skia/include/core/SkBitmap.h"
namespace chrome_pdf {
namespace draw_utils {
@ -110,7 +110,7 @@ ShadowMatrix::~ShadowMatrix() = default;
namespace {
void PaintShadow(pp::ImageData* image,
void PaintShadow(SkBitmap& image,
const pp::Rect& clip_rc,
const pp::Rect& shadow_rc,
const ShadowMatrix& matrix) {
@ -125,7 +125,7 @@ void PaintShadow(pp::ImageData* image,
depth - shadow_rc.right() + x);
int32_t matrix_y = std::max(depth + shadow_rc.y() - y - 1,
depth - shadow_rc.bottom() + y);
uint32_t* pixel = image->GetAddr32(pp::Point(x, y));
uint32_t* pixel = image.getAddr32(x, y);
if (matrix_x < 0)
matrix_x = 0;
@ -144,7 +144,7 @@ void PaintShadow(pp::ImageData* image,
} // namespace
void DrawShadow(pp::ImageData* image,
void DrawShadow(SkBitmap& image,
const pp::Rect& shadow_rc,
const pp::Rect& object_rc,
const pp::Rect& clip_rc,

@ -9,8 +9,9 @@
#include <vector>
class SkBitmap;
namespace pp {
class ImageData;
class Rect;
} // namespace pp
@ -46,7 +47,7 @@ class ShadowMatrix {
// shadow_rc - rectangle occupied by shadow
// object_rc - rectangle that drops the shadow
// clip_rc - clipping region
void DrawShadow(pp::ImageData* image,
void DrawShadow(SkBitmap& image,
const pp::Rect& shadow_rc,
const pp::Rect& object_rc,
const pp::Rect& clip_rc,

@ -41,6 +41,7 @@
#include "pdf/pdfium/pdfium_mem_buffer_file_write.h"
#include "pdf/pdfium/pdfium_permissions.h"
#include "pdf/pdfium/pdfium_unsupported_features.h"
#include "pdf/ppapi_migration/bitmap.h"
#include "pdf/ppapi_migration/input_event_conversions.h"
#include "pdf/url_loader_wrapper_impl.h"
#include "ppapi/c/ppb_input_event.h"
@ -56,6 +57,7 @@
#include "third_party/pdfium/public/fpdf_fwlevent.h"
#include "third_party/pdfium/public/fpdf_ppo.h"
#include "third_party/pdfium/public/fpdf_searchex.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/events/keycodes/keyboard_codes.h"
#include "ui/gfx/geometry/rect.h"
#include "v8/include/v8.h"
@ -3501,8 +3503,12 @@ void PDFiumEngine::DrawPageShadow(const pp::Rect& page_rc,
depth, factor, client_->GetBackgroundColor());
}
// TODO(crbug.com/1099020): Converting to SkBitmap here may seem silly, but
// this is part of a migration from pp::ImageData to SkBitmap in general.
DCHECK(!image_data->is_null());
DrawShadow(image_data, shadow_rect, page_rect, clip_rect, *page_shadow_);
SkBitmap bitmap =
SkBitmapFromPPImageData(std::make_unique<pp::ImageData>(*image_data));
DrawShadow(bitmap, shadow_rect, page_rect, clip_rect, *page_shadow_);
}
void PDFiumEngine::GetRegion(const pp::Point& location,

@ -0,0 +1,51 @@
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "pdf/ppapi_migration/bitmap.h"
#include <stdint.h>
#include <memory>
#include "base/check_op.h"
#include "ppapi/cpp/image_data.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "third_party/skia/include/core/SkImageInfo.h"
namespace chrome_pdf {
namespace {
// Releases pp::ImageData associated with the SkPixelRef. The pp::ImageData acts
// like a shared pointer to memory provided by Pepper, and must be retained for
// the life of the SkPixelRef.
void ReleaseImageData(void* addr, void* context) {
pp::ImageData* image_data = static_cast<pp::ImageData*>(context);
DCHECK_EQ(addr, image_data->data());
delete image_data;
}
} // namespace
SkBitmap SkBitmapFromPPImageData(std::unique_ptr<pp::ImageData> image_data) {
if (image_data->is_null()) {
return SkBitmap();
}
// Note that we unconditionally use BGRA_PREMUL with PDFium.
DCHECK_EQ(image_data->format(), PP_IMAGEDATAFORMAT_BGRA_PREMUL);
SkImageInfo info =
SkImageInfo::Make(image_data->size().width(), image_data->size().height(),
kBGRA_8888_SkColorType, kPremul_SkAlphaType);
void* data = image_data->data();
int32_t stride = image_data->stride();
SkBitmap bitmap;
bool success = bitmap.installPixels(info, data, stride, ReleaseImageData,
image_data.release());
DCHECK(success);
return bitmap;
}
} // namespace chrome_pdf

@ -0,0 +1,30 @@
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef PDF_PPAPI_MIGRATION_BITMAP_H_
#define PDF_PPAPI_MIGRATION_BITMAP_H_
#include <memory>
class SkBitmap;
namespace pp {
class ImageData;
} // namespace pp
namespace chrome_pdf {
// Creates an SkBitmap from a pp::ImageData. The SkBitmap takes ownership of the
// pp::ImageData, and shares ownership of the underlying pixel memory. (Note
// that it's easy to make a shallow copy of a pp::ImageData.)
//
// In case of an error, returns an empty SkBitmap.
//
// TODO(kmoon): Skia is trying to get rid of SkBitmap in favor of immutable
// types like SkImage, so we should migrate once PDFium is ready for Skia.
SkBitmap SkBitmapFromPPImageData(std::unique_ptr<pp::ImageData> image_data);
} // namespace chrome_pdf
#endif // PDF_PPAPI_MIGRATION_BITMAP_H_