// Copyright © 2018 The CefSharp Authors. All rights reserved. // // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. #pragma once #include "Stdafx.h" #include "include\cef_image.h" #include "CefWrapper.h" using namespace System::IO; using namespace CefSharp::Enums; namespace CefSharp { namespace Internals { private ref class CefImageWrapper : public IImage, public CefWrapper { internal: MCefRefPtr _image; CefImageWrapper::CefImageWrapper(CefRefPtr &image) : _image(image) { } !CefImageWrapper() { _image = NULL; } ~CefImageWrapper() { this->!CefImageWrapper(); _disposed = true; } public: /// /// Returns the bitmap representation that most closely matches scaleFactor. /// /// scale factor /// color type /// alpha type /// pixel width /// pixel height /// A stream represending the bitmap or null. virtual cli::array^ GetAsBitmap(float scaleFactor, ColorType colorType, AlphaType alphaType, int% pixelWidth, int% pixelHeight) { int width; int height; auto binary = _image->GetAsBitmap(scaleFactor, (cef_color_type_t)colorType, (cef_alpha_type_t)alphaType, width, height); if (binary.get()) { pixelWidth = width; pixelHeight = height; auto binarySize = binary->GetSize(); auto buffer = gcnew cli::array(binarySize); pin_ptr src = &buffer[0]; // pin pointer to first element in arr binary->GetData(static_cast(src), binarySize, 0); return buffer; } return nullptr; } /// /// Returns the JPEG representation that most closely matches scaleFactor. /// /// scale factor /// image quality /// pixel width /// pixel height /// A stream representing the JPEG or null. virtual cli::array^ GetAsJPEG(float scaleFactor, int quality, int% pixelWidth, int% pixelHeight) { int width; int height; auto binary = _image->GetAsJPEG(scaleFactor, quality, width, height); if (binary.get()) { pixelWidth = width; pixelHeight = height; auto binarySize = binary->GetSize(); auto buffer = gcnew cli::array(binarySize); pin_ptr src = &buffer[0]; // pin pointer to first element in arr binary->GetData(static_cast(src), binarySize, 0); return buffer; } return nullptr; } /// /// Returns the PNG representation that most closely matches scaleFactor. /// /// scale factor /// is the PNG transparent /// pixel width /// pixel height /// A stream represending the PNG or null. virtual cli::array^ GetAsPNG(float scaleFactor, bool withTransparency, int% pixelWidth, int% pixelHeight) { int width; int height; auto binary = _image->GetAsPNG(scaleFactor, withTransparency, width, height); if (binary.get()) { pixelWidth = width; pixelHeight = height; auto binarySize = binary->GetSize(); auto buffer = gcnew cli::array(binarySize); pin_ptr src = &buffer[0]; // pin pointer to first element in arr binary->GetData(static_cast(src), binarySize, 0); return buffer; } return nullptr; } /// /// Returns information for the representation that most closely matches scaleFactor. /// /// scale factor /// actual scale factor /// pixel width /// pixel height /// return if information found for scale factor virtual bool GetRepresentationInfo(float scaleFactor, float% actualScaleFactor, int% pixelWidth, int% pixelHeight) { float actualScale; int width; int height; auto success = _image->GetRepresentationInfo(scaleFactor, actualScale, width, height); actualScaleFactor = actualScale; pixelWidth = width; pixelHeight = height; return success; } /// /// Returns the image height in density independent pixel(DIP) units. /// virtual property int Height { int get() { return _image->GetHeight(); } } /// /// Returns true if this image contains a representation for scaleFactor. /// /// /// virtual bool HasRepresentation(float scaleFactor) { return _image->HasRepresentation(scaleFactor); } /// /// Returns true if this Image is empty. /// /// virtual property bool IsEmpty { bool get() { return _image->IsEmpty(); } } /// /// Returns true if this Image and that Image share the same underlying storage. /// /// image to compare /// returns true if share same underlying storage virtual bool IsSame(IImage^ that) { return _image->IsSame(((CefImageWrapper^)that)->_image.get()); } /// /// Removes the representation for scaleFactor. /// /// /// true for success virtual bool RemoveRepresentation(float scaleFactor) { return _image->RemoveRepresentation(scaleFactor); } /// /// Returns the image width in density independent pixel(DIP) units. /// virtual property int Width { int get() { return _image->GetWidth(); } } }; } }