// 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 #include #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(context); DCHECK_EQ(addr, image_data->data()); delete image_data; } } // namespace SkBitmap SkBitmapFromPPImageData(std::unique_ptr 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