36 return pixelFormat.alphaUsage() == QPixelFormat::UsesAlpha
37 ? pixelFormat.premultiplied() == QPixelFormat::Premultiplied
38 ? ::PIXELMAP_ALPHA_TYPE::PIXELMAP_ALPHA_TYPE_PREMULTIPLIED
39 : ::PIXELMAP_ALPHA_TYPE::PIXELMAP_ALPHA_TYPE_UNPREMULTIPLIED
40 : ::PIXELMAP_ALPHA_TYPE::PIXELMAP_ALPHA_TYPE_OPAQUE;
45 ::OH_Pixelmap_InitializationOptions *initOptionsPtr {};
47 callOhosCApiFuncOrFailOnErrorResult(
48 Q_OHOS_NAMED_FUNC(::OH_PixelmapInitializationOptions_Create),
51 return std::shared_ptr<::OH_Pixelmap_InitializationOptions>(
53 [](
auto *initOptionsPtr) {
54 if (initOptionsPtr !=
nullptr) {
55 callOhosCApiFuncOrFailOnErrorResult(
56 Q_OHOS_NAMED_FUNC(::OH_PixelmapInitializationOptions_Release),
63 std::uint32_t width,
std::uint32_t height, ::PIXEL_FORMAT pixelFormat,
64 ::PIXELMAP_ALPHA_TYPE alphaType)
66 auto initOptions = createOhPixelmapInitializationOptions();
68 callOhosCApiFuncOrFailOnErrorResult(
69 Q_OHOS_NAMED_FUNC(::OH_PixelmapInitializationOptions_SetWidth),
70 initOptions.get(), width);
72 callOhosCApiFuncOrFailOnErrorResult(
73 Q_OHOS_NAMED_FUNC(::OH_PixelmapInitializationOptions_SetHeight),
74 initOptions.get(), height);
76 callOhosCApiFuncOrFailOnErrorResult(
77 Q_OHOS_NAMED_FUNC(::OH_PixelmapInitializationOptions_SetSrcPixelFormat),
78 initOptions.get(),
static_cast<
int>(pixelFormat));
80 callOhosCApiFuncOrFailOnErrorResult(
81 Q_OHOS_NAMED_FUNC(::OH_PixelmapInitializationOptions_SetPixelFormat),
82 initOptions.get(),
static_cast<
int>(pixelFormat));
84 callOhosCApiFuncOrFailOnErrorResult(
85 Q_OHOS_NAMED_FUNC(::OH_PixelmapInitializationOptions_SetAlphaType),
86 initOptions.get(),
static_cast<
int>(alphaType));
94 Q_BYTE_ORDER == Q_LITTLE_ENDIAN,
95 "Pixel format mapping is currently supported for little-endian targets only");
98 case QImage::Format_RGBA8888:
99 return ::PIXEL_FORMAT::PIXEL_FORMAT_RGBA_8888;
100 case QImage::Format_RGB888:
101 return ::PIXEL_FORMAT::PIXEL_FORMAT_RGB_888;
102 case QImage::Format_Alpha8:
103 return ::PIXEL_FORMAT::PIXEL_FORMAT_ALPHA_8;
104 case QImage::Format_ARGB32:
105 return ::PIXEL_FORMAT::PIXEL_FORMAT_BGRA_8888;
106 case QImage::Format_RGBA16FPx4:
107 return ::PIXEL_FORMAT::PIXEL_FORMAT_RGBA_F16;
108 case QImage::Format_RGB16:
109 return ::PIXEL_FORMAT::PIXEL_FORMAT_RGB_565;
119 ::OH_PixelmapNative *pixelMap {};
121 QImage effectiveImage =
122 tryMapQtPixelFormatToOhosPixelFormat(qImage.format()).has_value()
124 : qImage.convertToFormat(QImage::Format_RGBA8888);
125 auto optOhosPixelFormat = tryMapQtPixelFormatToOhosPixelFormat(effectiveImage.format());
126 Q_ASSERT(optOhosPixelFormat.has_value());
127 auto ohosPixelFormat = optOhosPixelFormat.value();
129 auto initOptions = makeNativePixelMapInitializationOptions(
130 static_cast<std::uint32_t>(effectiveImage.width()),
131 static_cast<std::uint32_t>(effectiveImage.height()), ohosPixelFormat,
132 mapQtPixelFormatToOhosPixelMapAlphaType(effectiveImage.pixelFormat()));
134 callOhosCApiFuncOrFailOnErrorResult(
135 Q_OHOS_NAMED_FUNC(::OH_PixelmapNative_CreatePixelmap),
136 effectiveImage.bits(), effectiveImage.sizeInBytes(), initOptions.get(), &pixelMap);
138 return std::shared_ptr<::OH_PixelmapNative>(
140 [](::OH_PixelmapNative *pixelMap) {
141 if (pixelMap !=
nullptr) {
142 int res = callOhosCApiFunc(Q_OHOS_NAMED_FUNC(::OH_PixelmapNative_Release), pixelMap);
143 if (res != ::Image_ErrorCode::IMAGE_SUCCESS) {
145 "%s: cannot release the pixel map (error code: %d).",
154 return std::shared_ptr<::OH_PixelmapNative>(
156 [](::OH_PixelmapNative *pixelMap) {
157 if (pixelMap !=
nullptr) {
158 int res = callOhosCApiFunc(Q_OHOS_NAMED_FUNC(::OH_PixelmapNative_Release), pixelMap);
159 if (res != ::Image_ErrorCode::IMAGE_SUCCESS) {
161 "%s: cannot release the pixel map (error code: %d).",
170 constexpr auto pixelFormat = ::PIXEL_FORMAT::PIXEL_FORMAT_RGBA_8888;
171 constexpr auto alphaType = ::PIXELMAP_ALPHA_TYPE::PIXELMAP_ALPHA_TYPE_OPAQUE;
173 auto initOptions = makeNativePixelMapInitializationOptions(1, 1, pixelFormat, alphaType);
175 ::OH_PixelmapNative *pixelMap = {};
176 callOhosCApiFuncOrFailOnErrorResult(
177 Q_OHOS_NAMED_FUNC(::OH_PixelmapNative_CreateEmptyPixelmap),
178 initOptions.get(), &pixelMap);
180 return wrapOhosNativePixelMapPtr(pixelMap);
185 QImage effectiveImage =
186 tryMapQtPixelFormatToOhosPixelFormat(image.format()).has_value()
188 : image.convertToFormat(QImage::Format_RGBA8888);
189 auto optOhosPixelFormat = tryMapQtPixelFormatToOhosPixelFormat(effectiveImage.format());
190 Q_ASSERT(optOhosPixelFormat.has_value());
191 auto ohosPixelFormat = optOhosPixelFormat.value();
193 auto *env = jsState.env();
195 auto destBytesPerLine = effectiveImage.bytesPerLine();
196 auto arrayBuffer = QNapi::ArrayBuffer::New(env, effectiveImage.height() * destBytesPerLine);
198 for (
int y = 0; y < effectiveImage.height(); ++y) {
200 static_cast<uchar *>(arrayBuffer.Data()) + y * destBytesPerLine, effectiveImage.scanLine(y), destBytesPerLine);
203 const auto options = QNapi::makeObject(
211 {
"width", effectiveImage.size().width()},
212 {
"height", effectiveImage.size().height()},
215 {
"pixelFormat",
static_cast<
int>(ohosPixelFormat)},
216 {
"srcPixelFormat",
static_cast<
int>(ohosPixelFormat)},
219 return jsState.eval<QNapi::Object>(
"@ohos.multimedia.image.createPixelMapSync(*)", {arrayBuffer, options});