35 return pixelFormat.alphaUsage() == QPixelFormat::UsesAlpha
36 ? pixelFormat.premultiplied() == QPixelFormat::Premultiplied
37 ? ::PIXELMAP_ALPHA_TYPE::PIXELMAP_ALPHA_TYPE_PREMULTIPLIED
38 : ::PIXELMAP_ALPHA_TYPE::PIXELMAP_ALPHA_TYPE_UNPREMULTIPLIED
39 : ::PIXELMAP_ALPHA_TYPE::PIXELMAP_ALPHA_TYPE_OPAQUE;
44 ::OH_Pixelmap_InitializationOptions *initOptionsPtr {};
46 callOhosCApiFuncOrFailOnErrorResult(
47 Q_OHOS_NAMED_FUNC(::OH_PixelmapInitializationOptions_Create),
50 return std::shared_ptr<::OH_Pixelmap_InitializationOptions>(
52 [](
auto *initOptionsPtr) {
53 if (initOptionsPtr !=
nullptr) {
54 callOhosCApiFuncOrFailOnErrorResult(
55 Q_OHOS_NAMED_FUNC(::OH_PixelmapInitializationOptions_Release),
62 std::uint32_t width,
std::uint32_t height, ::PIXEL_FORMAT pixelFormat,
63 ::PIXELMAP_ALPHA_TYPE alphaType)
65 auto initOptions = createOhPixelmapInitializationOptions();
67 callOhosCApiFuncOrFailOnErrorResult(
68 Q_OHOS_NAMED_FUNC(::OH_PixelmapInitializationOptions_SetWidth),
69 initOptions.get(), width);
71 callOhosCApiFuncOrFailOnErrorResult(
72 Q_OHOS_NAMED_FUNC(::OH_PixelmapInitializationOptions_SetHeight),
73 initOptions.get(), height);
75 callOhosCApiFuncOrFailOnErrorResult(
76 Q_OHOS_NAMED_FUNC(::OH_PixelmapInitializationOptions_SetSrcPixelFormat),
77 initOptions.get(),
static_cast<
int>(pixelFormat));
79 callOhosCApiFuncOrFailOnErrorResult(
80 Q_OHOS_NAMED_FUNC(::OH_PixelmapInitializationOptions_SetPixelFormat),
81 initOptions.get(),
static_cast<
int>(pixelFormat));
83 callOhosCApiFuncOrFailOnErrorResult(
84 Q_OHOS_NAMED_FUNC(::OH_PixelmapInitializationOptions_SetAlphaType),
85 initOptions.get(),
static_cast<
int>(alphaType));
93 Q_BYTE_ORDER == Q_LITTLE_ENDIAN,
94 "Pixel format mapping is currently supported for little-endian targets only");
97 case QImage::Format_RGBA8888:
98 return ::PIXEL_FORMAT::PIXEL_FORMAT_RGBA_8888;
99 case QImage::Format_RGB888:
100 return ::PIXEL_FORMAT::PIXEL_FORMAT_RGB_888;
101 case QImage::Format_Alpha8:
102 return ::PIXEL_FORMAT::PIXEL_FORMAT_ALPHA_8;
103 case QImage::Format_ARGB32:
104 return ::PIXEL_FORMAT::PIXEL_FORMAT_BGRA_8888;
105 case QImage::Format_RGBA16FPx4:
106 return ::PIXEL_FORMAT::PIXEL_FORMAT_RGBA_F16;
107 case QImage::Format_RGB16:
108 return ::PIXEL_FORMAT::PIXEL_FORMAT_RGB_565;
119 return makeEmptyOhosNativePixelMap();
121 ::OH_PixelmapNative *pixelMap {};
123 QImage effectiveImage =
124 tryMapQtPixelFormatToOhosPixelFormat(qImage.format()).has_value()
126 : qImage.convertToFormat(QImage::Format_RGBA8888);
127 auto optOhosPixelFormat = tryMapQtPixelFormatToOhosPixelFormat(effectiveImage.format());
128 Q_ASSERT(optOhosPixelFormat.has_value());
129 auto ohosPixelFormat = optOhosPixelFormat.value();
131 auto initOptions = makeNativePixelMapInitializationOptions(
132 static_cast<std::uint32_t>(effectiveImage.width()),
133 static_cast<std::uint32_t>(effectiveImage.height()), ohosPixelFormat,
134 mapQtPixelFormatToOhosPixelMapAlphaType(effectiveImage.pixelFormat()));
136 callOhosCApiFuncOrFailOnErrorResult(
137 Q_OHOS_NAMED_FUNC(::OH_PixelmapNative_CreatePixelmap),
138 effectiveImage.bits(), effectiveImage.sizeInBytes(), initOptions.get(), &pixelMap);
140 return std::shared_ptr<::OH_PixelmapNative>(
142 [](::OH_PixelmapNative *pixelMap) {
143 if (pixelMap !=
nullptr) {
144 int res = callOhosCApiFunc(Q_OHOS_NAMED_FUNC(::OH_PixelmapNative_Release), pixelMap);
145 if (res != ::Image_ErrorCode::IMAGE_SUCCESS) {
147 "%s: cannot release the pixel map (error code: %d).",
156 return std::shared_ptr<::OH_PixelmapNative>(
158 [](::OH_PixelmapNative *pixelMap) {
159 if (pixelMap !=
nullptr) {
160 int res = callOhosCApiFunc(Q_OHOS_NAMED_FUNC(::OH_PixelmapNative_Release), pixelMap);
161 if (res != ::Image_ErrorCode::IMAGE_SUCCESS) {
163 "%s: cannot release the pixel map (error code: %d).",
172 constexpr auto pixelFormat = ::PIXEL_FORMAT::PIXEL_FORMAT_RGBA_8888;
173 constexpr auto alphaType = ::PIXELMAP_ALPHA_TYPE::PIXELMAP_ALPHA_TYPE_OPAQUE;
175 auto initOptions = makeNativePixelMapInitializationOptions(1, 1, pixelFormat, alphaType);
177 ::OH_PixelmapNative *pixelMap = {};
178 callOhosCApiFuncOrFailOnErrorResult(
179 Q_OHOS_NAMED_FUNC(::OH_PixelmapNative_CreateEmptyPixelmap),
180 initOptions.get(), &pixelMap);
182 return wrapOhosNativePixelMapPtr(pixelMap);
187 QImage effectiveImage =
188 tryMapQtPixelFormatToOhosPixelFormat(image.format()).has_value()
190 : image.convertToFormat(QImage::Format_RGBA8888);
191 auto optOhosPixelFormat = tryMapQtPixelFormatToOhosPixelFormat(effectiveImage.format());
192 Q_ASSERT(optOhosPixelFormat.has_value());
193 auto ohosPixelFormat = optOhosPixelFormat.value();
195 auto *env = jsState.env();
197 auto destBytesPerLine = effectiveImage.bytesPerLine();
198 auto arrayBuffer = QNapi::ArrayBuffer::New(env, effectiveImage.height() * destBytesPerLine);
200 for (
int y = 0; y < effectiveImage.height(); ++y) {
202 static_cast<uchar *>(arrayBuffer.Data()) + y * destBytesPerLine, effectiveImage.scanLine(y), destBytesPerLine);
205 const auto options = QNapi::makeObject(
213 {
"width", effectiveImage.size().width()},
214 {
"height", effectiveImage.size().height()},
217 {
"pixelFormat",
static_cast<
int>(ohosPixelFormat)},
218 {
"srcPixelFormat",
static_cast<
int>(ohosPixelFormat)},
221 return jsState.eval<QNapi::Object>(
"@ohos.multimedia.image.createPixelMapSync(*)", {arrayBuffer, options});