54 std::uint32_t width,
std::uint32_t height, ::PIXEL_FORMAT pixelFormat,
55 ::PIXELMAP_ALPHA_TYPE alphaType)
57 auto initOptions = createOhPixelmapInitializationOptions();
59 QArkUi::callArkUiOrFailOnErrorResult(
60 Q_OHOS_NAMED_FUNC(::OH_PixelmapInitializationOptions_SetWidth),
61 initOptions.get(), width);
63 QArkUi::callArkUiOrFailOnErrorResult(
64 Q_OHOS_NAMED_FUNC(::OH_PixelmapInitializationOptions_SetHeight),
65 initOptions.get(), height);
67 QArkUi::callArkUiOrFailOnErrorResult(
68 Q_OHOS_NAMED_FUNC(::OH_PixelmapInitializationOptions_SetSrcPixelFormat),
69 initOptions.get(),
static_cast<
int>(pixelFormat));
71 QArkUi::callArkUiOrFailOnErrorResult(
72 Q_OHOS_NAMED_FUNC(::OH_PixelmapInitializationOptions_SetPixelFormat),
73 initOptions.get(),
static_cast<
int>(pixelFormat));
75 QArkUi::callArkUiOrFailOnErrorResult(
76 Q_OHOS_NAMED_FUNC(::OH_PixelmapInitializationOptions_SetAlphaType),
77 initOptions.get(),
static_cast<
int>(alphaType));
84 ::OH_Pixelmap_ImageInfo *imageInfoPtr;
85 QArkUi::callArkUiOrFailOnErrorResult(
86 Q_OHOS_NAMED_FUNC(::OH_PixelmapImageInfo_Create),
89 auto imageInfo = std::shared_ptr<::OH_Pixelmap_ImageInfo>(
91 [](::OH_Pixelmap_ImageInfo *imageInfoPtr) {
92 QArkUi::callArkUiOrFailOnErrorResult(
93 Q_OHOS_NAMED_FUNC(::OH_PixelmapImageInfo_Release),
97 QArkUi::callArkUiOrFailOnErrorResult(
98 Q_OHOS_NAMED_FUNC(::OH_PixelmapNative_GetImageInfo),
99 pixelMap, imageInfo.get());
102 QArkUi::callArkUiOrFailOnErrorResult(
103 Q_OHOS_NAMED_FUNC(::OH_PixelmapImageInfo_GetWidth),
104 imageInfo.get(), &width);
106 std::uint32_t height;
107 QArkUi::callArkUiOrFailOnErrorResult(
108 Q_OHOS_NAMED_FUNC(::OH_PixelmapImageInfo_GetHeight),
109 imageInfo.get(), &height);
112 QArkUi::callArkUiOrFailOnErrorResult(
113 Q_OHOS_NAMED_FUNC(::OH_PixelmapImageInfo_GetPixelFormat),
114 imageInfo.get(), &pixelFormat);
119 .pixelFormat =
static_cast<::PIXEL_FORMAT>(pixelFormat),
143 ::OH_PixelmapNative *pixelMap {};
145 QImage effectiveImage =
146 tryMapQtPixelFormatToOhosPixelFormat(qImage.format()).hasValue()
148 : qImage.convertToFormat(QImage::Format_RGBA8888);
149 auto optOhosPixelFormat = tryMapQtPixelFormatToOhosPixelFormat(effectiveImage.format());
150 Q_ASSERT(optOhosPixelFormat.hasValue());
151 auto ohosPixelFormat = optOhosPixelFormat.value();
153 auto initOptions = makeNativePixelMapInitializationOptions(
154 static_cast<std::uint32_t>(effectiveImage.width()),
155 static_cast<std::uint32_t>(effectiveImage.height()), ohosPixelFormat,
156 mapQtPixelFormatToOhosPixelMapAlphaType(effectiveImage.pixelFormat()));
158 QArkUi::callArkUiOrFailOnErrorResult(
159 Q_OHOS_NAMED_FUNC(::OH_PixelmapNative_CreatePixelmap),
160 effectiveImage.bits(), effectiveImage.sizeInBytes(), initOptions.get(), &pixelMap);
162 return std::shared_ptr<::OH_PixelmapNative>(
164 [](::OH_PixelmapNative *pixelMap) {
165 if (pixelMap !=
nullptr) {
166 int res = QArkUi::callArkUi(Q_OHOS_NAMED_FUNC(::OH_PixelmapNative_Release), pixelMap);
167 if (res != ::Image_ErrorCode::IMAGE_SUCCESS) {
169 "%s: cannot release the pixel map (error code: %d).",
178 readPixelMapDataAsArgb(pixelMap, output);
180 for (qsizetype pixelOffset = 0; pixelOffset < output.size(); pixelOffset += 4) {
181 std::uint8_t *pixelPtr = &output[pixelOffset];
182 std::uint8_t a = pixelPtr[0];
183 std::uint8_t r = pixelPtr[1];
184 std::uint8_t g = pixelPtr[2];
185 std::uint8_t b = pixelPtr[3];
192 for (
unsigned i = 0; i < output.size(); ++i)
193 qOhosPrintfDebug(
"%s: pixelMap[%d]: %02x", Q_FUNC_INFO, i, output[i]);
198 auto pixelMapInfo = getPixelMapInfo(pixelMap);
200 QImage::Format qImagePixelFormat;
201 void (*readPixelMapDataFunc)(::OH_PixelmapNative *, QSpan<std::uint8_t>);
202 std::uint32_t pixelMapBytesPerPixel;
203 switch (pixelMapInfo.pixelFormat) {
204 case ::PIXEL_FORMAT::PIXEL_FORMAT_RGBA_8888:
205 qImagePixelFormat = QImage::Format_RGBA8888;
206 readPixelMapDataFunc = &readPixelMapData;
207 pixelMapBytesPerPixel = 4;
209 case ::PIXEL_FORMAT::PIXEL_FORMAT_RGB_888:
210 qImagePixelFormat = QImage::Format_RGB888;
211 readPixelMapDataFunc = &readPixelMapData;
212 pixelMapBytesPerPixel = 3;
214 case ::PIXEL_FORMAT::PIXEL_FORMAT_ALPHA_8:
215 qImagePixelFormat = QImage::Format_Alpha8;
216 readPixelMapDataFunc = &readPixelMapData;
217 pixelMapBytesPerPixel = 1;
219 case ::PIXEL_FORMAT::PIXEL_FORMAT_BGRA_8888:
220 if (QSysInfo::ByteOrder == QSysInfo::LittleEndian) {
221 qImagePixelFormat = QImage::Format_ARGB32;
222 readPixelMapDataFunc = &readPixelMapData;
224 qImagePixelFormat = QImage::Format_RGBA8888;
225 readPixelMapDataFunc = &readPixelMapDataAsRgba;
227 pixelMapBytesPerPixel = 4;
230 qImagePixelFormat = QImage::Format_RGBA8888;
231 readPixelMapDataFunc = &readPixelMapDataAsRgba;
232 pixelMapBytesPerPixel = 4;
237 QSize {
static_cast<
int>(pixelMapInfo.width),
static_cast<
int>(pixelMapInfo.height)},
240 auto pixelMapDataBytesPerLine = pixelMapInfo.width * pixelMapBytesPerPixel;
241 auto pixelMapDataSize = pixelMapInfo.height * pixelMapDataBytesPerLine;
243 if (resultImage.sizeInBytes() >= pixelMapDataSize) {
244 auto *pixelMapDataBufferStart = resultImage.bits() + (resultImage.sizeInBytes() - pixelMapDataSize);
245 readPixelMapDataFunc(pixelMap, QSpan(pixelMapDataBufferStart, pixelMapDataSize));
246 if (pixelMapDataBufferStart > resultImage.bits()) {
247 for (
std::uint32_t row = 0; row < pixelMapInfo.height; ++row) {
249 resultImage.scanLine(row),
250 pixelMapDataBufferStart + row * pixelMapDataBytesPerLine,
251 pixelMapDataBytesPerLine);
255 std::vector<std::uint8_t> pixelMapData(pixelMapDataSize);
256 readPixelMapDataFunc(pixelMap, QSpan(pixelMapData.data(), pixelMapData.size()));
257 for (
std::uint32_t row = 0; row < pixelMapInfo.height; ++row) {
259 resultImage.scanLine(row),
260 pixelMapData.data() + row * pixelMapDataBytesPerLine,
261 resultImage.bytesPerLine());
286 constexpr auto pixelFormat = ::PIXEL_FORMAT::PIXEL_FORMAT_RGBA_8888;
287 constexpr auto alphaType = ::PIXELMAP_ALPHA_TYPE::PIXELMAP_ALPHA_TYPE_OPAQUE;
289 auto initOptions = makeNativePixelMapInitializationOptions(1, 1, pixelFormat, alphaType);
291 ::OH_PixelmapNative *pixelMap = {};
292 QArkUi::callArkUiOrFailOnErrorResult(
293 Q_OHOS_NAMED_FUNC(::OH_PixelmapNative_CreateEmptyPixelmap),
294 initOptions.get(), &pixelMap);
296 return wrapNativePixelMapPtr(pixelMap);
301 QImage effectiveImage =
302 tryMapQtPixelFormatToOhosPixelFormat(image.format()).hasValue()
304 : image.convertToFormat(QImage::Format_RGBA8888);
305 auto optOhosPixelFormat = tryMapQtPixelFormatToOhosPixelFormat(effectiveImage.format());
306 Q_ASSERT(optOhosPixelFormat.hasValue());
307 auto ohosPixelFormat = optOhosPixelFormat.value();
309 auto *env = jsState.env();
311 auto destBytesPerLine = effectiveImage.bytesPerLine();
312 auto arrayBuffer = QNapi::ArrayBuffer::New(env, effectiveImage.height() * destBytesPerLine);
314 for (
int y = 0; y < effectiveImage.height(); ++y) {
316 static_cast<uchar *>(arrayBuffer.Data()) + y * destBytesPerLine, effectiveImage.scanLine(y), destBytesPerLine);
319 const auto options = QNapi::makeObject(
327 {
"width", effectiveImage.size().width()},
328 {
"height", effectiveImage.size().height()},
331 {
"pixelFormat",
static_cast<
int>(ohosPixelFormat)},
332 {
"srcPixelFormat",
static_cast<
int>(ohosPixelFormat)},
335 return jsState.eval<QNapi::Object>(
"@ohos.multimedia.image.createPixelMapSync(*)", {arrayBuffer, options});