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;
118 ::OH_PixelmapNative *pixelMap {};
120 QImage effectiveImage =
121 tryMapQtPixelFormatToOhosPixelFormat(qImage.format()).has_value()
123 : qImage.convertToFormat(QImage::Format_RGBA8888);
124 auto optOhosPixelFormat = tryMapQtPixelFormatToOhosPixelFormat(effectiveImage.format());
125 Q_ASSERT(optOhosPixelFormat.has_value());
126 auto ohosPixelFormat = optOhosPixelFormat.value();
128 auto initOptions = makeNativePixelMapInitializationOptions(
129 static_cast<std::uint32_t>(effectiveImage.width()),
130 static_cast<std::uint32_t>(effectiveImage.height()), ohosPixelFormat,
131 mapQtPixelFormatToOhosPixelMapAlphaType(effectiveImage.pixelFormat()));
133 callOhosCApiFuncOrFailOnErrorResult(
134 Q_OHOS_NAMED_FUNC(::OH_PixelmapNative_CreatePixelmap),
135 effectiveImage.bits(), effectiveImage.sizeInBytes(), initOptions.get(), &pixelMap);
137 return std::shared_ptr<::OH_PixelmapNative>(
139 [](::OH_PixelmapNative *pixelMap) {
140 if (pixelMap !=
nullptr) {
141 int res = callOhosCApiFunc(Q_OHOS_NAMED_FUNC(::OH_PixelmapNative_Release), pixelMap);
142 if (res != ::Image_ErrorCode::IMAGE_SUCCESS) {
144 "%s: cannot release the pixel map (error code: %d).",
153 return std::shared_ptr<::OH_PixelmapNative>(
155 [](::OH_PixelmapNative *pixelMap) {
156 if (pixelMap !=
nullptr) {
157 int res = callOhosCApiFunc(Q_OHOS_NAMED_FUNC(::OH_PixelmapNative_Release), pixelMap);
158 if (res != ::Image_ErrorCode::IMAGE_SUCCESS) {
160 "%s: cannot release the pixel map (error code: %d).",
169 constexpr auto pixelFormat = ::PIXEL_FORMAT::PIXEL_FORMAT_RGBA_8888;
170 constexpr auto alphaType = ::PIXELMAP_ALPHA_TYPE::PIXELMAP_ALPHA_TYPE_OPAQUE;
172 auto initOptions = makeNativePixelMapInitializationOptions(1, 1, pixelFormat, alphaType);
174 ::OH_PixelmapNative *pixelMap = {};
175 callOhosCApiFuncOrFailOnErrorResult(
176 Q_OHOS_NAMED_FUNC(::OH_PixelmapNative_CreateEmptyPixelmap),
177 initOptions.get(), &pixelMap);
179 return wrapOhosNativePixelMapPtr(pixelMap);
184 QImage effectiveImage =
185 tryMapQtPixelFormatToOhosPixelFormat(image.format()).has_value()
187 : image.convertToFormat(QImage::Format_RGBA8888);
188 auto optOhosPixelFormat = tryMapQtPixelFormatToOhosPixelFormat(effectiveImage.format());
189 Q_ASSERT(optOhosPixelFormat.has_value());
190 auto ohosPixelFormat = optOhosPixelFormat.value();
192 auto *env = jsState.env();
194 auto destBytesPerLine = effectiveImage.bytesPerLine();
195 auto arrayBuffer = QNapi::ArrayBuffer::New(env, effectiveImage.height() * destBytesPerLine);
197 for (
int y = 0; y < effectiveImage.height(); ++y) {
199 static_cast<uchar *>(arrayBuffer.Data()) + y * destBytesPerLine, effectiveImage.scanLine(y), destBytesPerLine);
202 const auto options = QNapi::makeObject(
210 {
"width", effectiveImage.size().width()},
211 {
"height", effectiveImage.size().height()},
214 {
"pixelFormat",
static_cast<
int>(ohosPixelFormat)},
215 {
"srcPixelFormat",
static_cast<
int>(ohosPixelFormat)},
218 return jsState.eval<QNapi::Object>(
"@ohos.multimedia.image.createPixelMapSync(*)", {arrayBuffer, options});