29 ::OH_Pixelmap_ImageInfo *imageInfoPtr;
30 QArkUi::callArkUiOrFailOnErrorResult(
31 Q_OHOS_NAMED_FUNC(::OH_PixelmapImageInfo_Create),
34 auto imageInfo = std::shared_ptr<::OH_Pixelmap_ImageInfo>(
36 [](::OH_Pixelmap_ImageInfo *imageInfoPtr) {
37 QArkUi::callArkUiOrFailOnErrorResult(
38 Q_OHOS_NAMED_FUNC(::OH_PixelmapImageInfo_Release),
42 QArkUi::callArkUiOrFailOnErrorResult(
43 Q_OHOS_NAMED_FUNC(::OH_PixelmapNative_GetImageInfo),
44 pixelMap, imageInfo.get());
47 QArkUi::callArkUiOrFailOnErrorResult(
48 Q_OHOS_NAMED_FUNC(::OH_PixelmapImageInfo_GetWidth),
49 imageInfo.get(), &width);
52 QArkUi::callArkUiOrFailOnErrorResult(
53 Q_OHOS_NAMED_FUNC(::OH_PixelmapImageInfo_GetHeight),
54 imageInfo.get(), &height);
57 QArkUi::callArkUiOrFailOnErrorResult(
58 Q_OHOS_NAMED_FUNC(::OH_PixelmapImageInfo_GetPixelFormat),
59 imageInfo.get(), &pixelFormat);
64 .pixelFormat =
static_cast<::PIXEL_FORMAT>(pixelFormat),
88 readPixelMapDataAsArgb(pixelMap, output);
90 for (qsizetype pixelOffset = 0; pixelOffset < output.size(); pixelOffset += 4) {
91 std::uint8_t *pixelPtr = &output[pixelOffset];
92 std::uint8_t a = pixelPtr[0];
93 std::uint8_t r = pixelPtr[1];
94 std::uint8_t g = pixelPtr[2];
95 std::uint8_t b = pixelPtr[3];
102 for (
unsigned i = 0; i < output.size(); ++i)
103 qOhosPrintfDebug(
"%s: pixelMap[%d]: %02x", Q_FUNC_INFO, i, output[i]);
108 auto pixelMapInfo = getPixelMapInfo(pixelMap);
110 QImage::Format qImagePixelFormat;
111 void (*readPixelMapDataFunc)(::OH_PixelmapNative *, QSpan<std::uint8_t>);
112 std::uint32_t pixelMapBytesPerPixel;
113 switch (pixelMapInfo.pixelFormat) {
114 case ::PIXEL_FORMAT::PIXEL_FORMAT_RGBA_8888:
115 qImagePixelFormat = QImage::Format_RGBA8888;
116 readPixelMapDataFunc = &readPixelMapData;
117 pixelMapBytesPerPixel = 4;
119 case ::PIXEL_FORMAT::PIXEL_FORMAT_RGB_888:
120 qImagePixelFormat = QImage::Format_RGB888;
121 readPixelMapDataFunc = &readPixelMapData;
122 pixelMapBytesPerPixel = 3;
124 case ::PIXEL_FORMAT::PIXEL_FORMAT_ALPHA_8:
125 qImagePixelFormat = QImage::Format_Alpha8;
126 readPixelMapDataFunc = &readPixelMapData;
127 pixelMapBytesPerPixel = 1;
129 case ::PIXEL_FORMAT::PIXEL_FORMAT_BGRA_8888:
130 if (QSysInfo::ByteOrder == QSysInfo::LittleEndian) {
131 qImagePixelFormat = QImage::Format_ARGB32;
132 readPixelMapDataFunc = &readPixelMapData;
134 qImagePixelFormat = QImage::Format_RGBA8888;
135 readPixelMapDataFunc = &readPixelMapDataAsRgba;
137 pixelMapBytesPerPixel = 4;
140 qImagePixelFormat = QImage::Format_RGBA8888;
141 readPixelMapDataFunc = &readPixelMapDataAsRgba;
142 pixelMapBytesPerPixel = 4;
147 QSize {
static_cast<
int>(pixelMapInfo.width),
static_cast<
int>(pixelMapInfo.height)},
150 auto pixelMapDataBytesPerLine = pixelMapInfo.width * pixelMapBytesPerPixel;
151 auto pixelMapDataSize = pixelMapInfo.height * pixelMapDataBytesPerLine;
153 if (resultImage.sizeInBytes() >= pixelMapDataSize) {
154 auto *pixelMapDataBufferStart = resultImage.bits() + (resultImage.sizeInBytes() - pixelMapDataSize);
155 readPixelMapDataFunc(pixelMap, QSpan(pixelMapDataBufferStart, pixelMapDataSize));
156 if (pixelMapDataBufferStart > resultImage.bits()) {
157 for (
std::uint32_t row = 0; row < pixelMapInfo.height; ++row) {
159 resultImage.scanLine(row),
160 pixelMapDataBufferStart + row * pixelMapDataBytesPerLine,
161 pixelMapDataBytesPerLine);
165 std::vector<std::uint8_t> pixelMapData(pixelMapDataSize);
166 readPixelMapDataFunc(pixelMap, QSpan(pixelMapData.data(), pixelMapData.size()));
167 for (
std::uint32_t row = 0; row < pixelMapInfo.height; ++row) {
169 resultImage.scanLine(row),
170 pixelMapData.data() + row * pixelMapDataBytesPerLine,
171 resultImage.bytesPerLine());
180 constexpr auto fallbackDisplayDensity = 1.0;
182 auto primaryDisplay = jsState.eval<QNapi::Object>(
"@ohos.display.getPrimaryDisplaySync()");
183 auto displayInfo = QOhosDisplayInfo::makeFromOhosDisplayObject(jsState, primaryDisplay);
186 if (displayInfo.densityPixels > 0.0) {
187 density =
std::lround(displayInfo.densityPixels);
189 qOhosPrintfDebug(
"%s: invalid display densityPixels: %.3f", Q_FUNC_INFO, displayInfo.densityPixels);
193 return density > 0.0 ? density : fallbackDisplayDensity;
199 "%s: image dimensions: %dx%d, format: %d, bytes: %lld",
200 Q_FUNC_INFO, image.width(), image.height(),
static_cast<
int>(image.format()), image.sizeInBytes());
202 const int sourceWidth = image.width();
203 const int sourceHeight = image.height();
207 const double widthVp =
std::lround(sourceWidth / density);
208 const double heightVp =
std::lround(sourceHeight / density);
210 QImage newImage = image.scaled(widthVp, heightVp, Qt::KeepAspectRatio, Qt::SmoothTransformation);
212 const int width = newImage.width();
213 const int height = newImage.height();
214 const double finalWidthVp = width / density;
215 const double finalHeightVp = height / density;
218 "%s: density=%.3f, vp %.2f x %.2f -> %.2f x %.2f, px %dx%d -> %dx%d",
219 Q_FUNC_INFO, density, widthVp, heightVp, finalWidthVp, finalHeightVp, sourceWidth, sourceHeight, width, height);
221 return makeOhosNapiPixelMapFromQImage(jsState, newImage);
226 QImage monochromeImage = sourceImage.copy();
227 const int colorValue = useWhite ? 255 : 0;
229 for (
int y = 0; y < monochromeImage.height(); ++y) {
230 for (
int x = 0; x < monochromeImage.width(); ++x) {
231 const QRgb pixel = monochromeImage.pixel(x, y);
232 const int alpha = qAlpha(pixel);
235 monochromeImage.setPixel(x, y, qRgba(colorValue, colorValue, colorValue, alpha));
239 return monochromeImage;