Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: add nativeImage.createThumbnailFromPath API (#24802)
* initial commit, mac implementation * add documentation * convert createThumbnailFromPath to async function * windows impl protoype * add tests * added test * fix * fix test * clean up * update docs * cleaning up code * fix test * retrigger CI * retrigger CI * refactor from app to native_image * windows build * lint * lint * add smart pointers, fix test * change tests and update docs * fix test, remove nolint * add renderer-main process routing to fix tests * lint * thanks sam * thanks sam
- Loading branch information
1 parent
b403e64
commit beaf60d
Showing
17 changed files
with
221 additions
and
8 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
import { ipcRendererInternal } from '@electron/internal/renderer/ipc-renderer-internal'; | ||
import { deserialize } from '@electron/internal/common/type-utils'; | ||
|
||
const { nativeImage } = process._linkedBinding('electron_common_native_image'); | ||
|
||
nativeImage.createThumbnailFromPath = async (path: string, size: Electron.Size) => { | ||
return deserialize(await ipcRendererInternal.invoke('ELECTRON_NATIVE_IMAGE_CREATE_THUMBNAIL_FROM_PATH', path, size)); | ||
}; | ||
|
||
export default nativeImage; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,106 @@ | ||
// Copyright (c) 2020 GitHub, Inc. | ||
// Use of this source code is governed by the MIT license that can be | ||
// found in the LICENSE file. | ||
|
||
#include "shell/common/api/electron_api_native_image.h" | ||
|
||
#include <windows.h> | ||
|
||
#include <thumbcache.h> | ||
#include <wrl/client.h> | ||
|
||
#include <string> | ||
#include <vector> | ||
|
||
#include "shell/common/gin_converters/image_converter.h" | ||
#include "shell/common/gin_helper/promise.h" | ||
#include "shell/common/skia_util.h" | ||
#include "ui/gfx/icon_util.h" | ||
|
||
namespace electron { | ||
|
||
namespace api { | ||
|
||
// static | ||
v8::Local<v8::Promise> NativeImage::CreateThumbnailFromPath( | ||
v8::Isolate* isolate, | ||
const base::FilePath& path, | ||
const gfx::Size& size) { | ||
gin_helper::Promise<gfx::Image> promise(isolate); | ||
v8::Local<v8::Promise> handle = promise.GetHandle(); | ||
HRESULT hr; | ||
|
||
if (size.IsEmpty()) { | ||
promise.RejectWithErrorMessage("size must not be empty"); | ||
return handle; | ||
} | ||
|
||
// create an IShellItem | ||
Microsoft::WRL::ComPtr<IShellItem> pItem; | ||
std::wstring image_path = path.AsUTF16Unsafe(); | ||
hr = SHCreateItemFromParsingName(image_path.c_str(), nullptr, | ||
IID_PPV_ARGS(&pItem)); | ||
|
||
if (FAILED(hr)) { | ||
promise.RejectWithErrorMessage( | ||
"failed to create IShellItem from the given path"); | ||
return handle; | ||
} | ||
|
||
// Init thumbnail cache | ||
Microsoft::WRL::ComPtr<IThumbnailCache> pThumbnailCache; | ||
hr = CoCreateInstance(CLSID_LocalThumbnailCache, nullptr, CLSCTX_INPROC, | ||
IID_PPV_ARGS(&pThumbnailCache)); | ||
if (FAILED(hr)) { | ||
promise.RejectWithErrorMessage( | ||
"failed to acquire local thumbnail cache reference"); | ||
return handle; | ||
} | ||
|
||
// Populate the IShellBitmap | ||
Microsoft::WRL::ComPtr<ISharedBitmap> pThumbnail; | ||
WTS_CACHEFLAGS flags; | ||
WTS_THUMBNAILID thumbId; | ||
hr = pThumbnailCache->GetThumbnail(pItem.Get(), size.width(), | ||
WTS_FLAGS::WTS_NONE, &pThumbnail, &flags, | ||
&thumbId); | ||
|
||
if (FAILED(hr)) { | ||
promise.RejectWithErrorMessage( | ||
"failed to get thumbnail from local thumbnail cache reference"); | ||
return handle; | ||
} | ||
|
||
// Init HBITMAP | ||
HBITMAP hBitmap = NULL; | ||
hr = pThumbnail->GetSharedBitmap(&hBitmap); | ||
if (FAILED(hr)) { | ||
promise.RejectWithErrorMessage("failed to extract bitmap from thumbnail"); | ||
return handle; | ||
} | ||
|
||
// convert HBITMAP to gfx::Image | ||
BITMAP bitmap; | ||
if (!GetObject(hBitmap, sizeof(bitmap), &bitmap)) { | ||
promise.RejectWithErrorMessage("could not convert HBITMAP to BITMAP"); | ||
return handle; | ||
} | ||
|
||
ICONINFO icon_info; | ||
icon_info.fIcon = TRUE; | ||
icon_info.hbmMask = hBitmap; | ||
icon_info.hbmColor = hBitmap; | ||
|
||
base::win::ScopedHICON icon(CreateIconIndirect(&icon_info)); | ||
SkBitmap skbitmap = IconUtil::CreateSkBitmapFromHICON(icon.get()); | ||
gfx::ImageSkia image_skia; | ||
image_skia.AddRepresentation( | ||
gfx::ImageSkiaRep(skbitmap, 1.0 /*scale factor*/)); | ||
gfx::Image gfx_image = gfx::Image(image_skia); | ||
promise.Resolve(gfx_image); | ||
return handle; | ||
} | ||
|
||
} // namespace api | ||
|
||
} // namespace electron |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters