!34612 预览器drawImage不绘制

Merge pull request !34612 from 陈俞池/cc060102
This commit is contained in:
openharmony_ci 2024-06-04 09:38:47 +00:00 committed by Gitee
commit 7990608757
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
9 changed files with 40 additions and 33 deletions

View File

@ -473,8 +473,8 @@ void JSCanvasRenderer::JsDrawImage(const JSCallbackInfo& info)
#else
CHECK_NULL_VOID(jsImage);
isImage = true;
std::string imageValue = jsImage->GetSrc();
image.src = imageValue;
image.src = jsImage->GetSrc();
image.imageData = jsImage->GetImageData();
imageInfo.imgWidth = jsImage->GetWidth();
imageInfo.imgHeight = jsImage->GetHeight();
imageInfo.isImage = true;

View File

@ -349,7 +349,7 @@ napi_value JSOffscreenCanvas::onTransferToImageBitmap(napi_env env)
if (imageData == nullptr) {
return nullptr;
}
jsImage->SetImageData(imageData);
jsImage->SetImageData(std::make_shared<Ace::ImageData>(*imageData));
#endif
jsImage->SetUnit(GetUnit());
jsImage->SetWidth(GetWidth());

View File

@ -229,7 +229,7 @@ void JSOffscreenRenderingContext::JsTransferToImageBitmap(const JSCallbackInfo&
#else
auto imageData = offscreenCanvasPattern->GetImageData(0, 0, width_, height_);
CHECK_NULL_VOID(imageData);
jsImage->SetImageData(imageData);
jsImage->SetImageData(std::make_shared<Ace::ImageData>(*imageData));
#endif
jsImage->SetUnit(GetUnit());
jsImage->SetWidth(GetWidth());

View File

@ -70,14 +70,14 @@ public:
pixelMap_ = pixelMap;
}
std::unique_ptr<Ace::ImageData> GetImageData() const
std::shared_ptr<Ace::ImageData> GetImageData() const
{
return std::make_unique<Ace::ImageData>(*imageData_);
return imageData_;
}
void SetImageData(const std::unique_ptr<Ace::ImageData>& imageData)
void SetImageData(const std::shared_ptr<Ace::ImageData>& imageData)
{
imageData_ = std::make_unique<Ace::ImageData>(*imageData);
imageData_ = imageData;
}
RefPtr<NG::SvgDomBase> GetSvgDom()
@ -150,7 +150,7 @@ private:
RefPtr<NG::ImageObject> imageObj_;
RefPtr<NG::ImageLoadingContext> loadingCtx_;
RefPtr<PixelMap> pixelMap_;
std::unique_ptr<Ace::ImageData> imageData_;
std::shared_ptr<Ace::ImageData> imageData_;
RefPtr<NG::SvgDomBase> svgDom_;
ImageSourceInfo sourceInfo_;
ImageFit imageFit_ = ImageFit::NONE;

View File

@ -82,6 +82,17 @@ struct LineDashParam {
double dashOffset = 0.0;
};
struct ImageData {
RefPtr<Ace::PixelMap> pixelMap;
int32_t x = 0;
int32_t y = 0;
int32_t dirtyX = 0;
int32_t dirtyY = 0;
int32_t dirtyWidth = 0;
int32_t dirtyHeight = 0;
std::vector<Color> data;
};
struct CanvasImage {
int32_t flag = 0;
double sx = 0.0;
@ -94,17 +105,7 @@ struct CanvasImage {
double dHeight = 0.0;
std::string src;
int32_t instanceId = 0;
};
struct ImageData {
RefPtr<Ace::PixelMap> pixelMap;
int32_t x = 0;
int32_t y = 0;
int32_t dirtyX = 0;
int32_t dirtyY = 0;
int32_t dirtyWidth = 0;
int32_t dirtyHeight = 0;
std::vector<Color> data;
std::shared_ptr<ImageData> imageData;
};
struct TextMetrics {

View File

@ -590,7 +590,7 @@ void CanvasRenderingContext2DModelNG::TransferFromImageBitmap(
}
#else
void CanvasRenderingContext2DModelNG::TransferFromImageBitmap(
RefPtr<AceType>& canvasPattern, const std::unique_ptr<Ace::ImageData>& imageData)
RefPtr<AceType>& canvasPattern, const std::shared_ptr<Ace::ImageData>& imageData)
{
auto customPaintPattern = AceType::DynamicCast<CanvasPattern>(canvasPattern);
CHECK_NULL_VOID(customPaintPattern);

View File

@ -115,7 +115,7 @@ public:
void TransferFromImageBitmap(RefPtr<AceType>& canvasPattern, const RefPtr<AceType>& pixelMap) override;
#else
void TransferFromImageBitmap(
RefPtr<AceType>& canvasPattern, const std::unique_ptr<Ace::ImageData>& imageData) override;
RefPtr<AceType>& canvasPattern, const std::shared_ptr<Ace::ImageData>& imageData) override;
#endif
private:

View File

@ -134,7 +134,7 @@ public:
virtual void TransferFromImageBitmap(RefPtr<AceType>& canvasPattern, const RefPtr<AceType>& pixelMap) {};
#else
virtual void TransferFromImageBitmap(
RefPtr<AceType>& canvasPattern, const std::unique_ptr<Ace::ImageData>& imageData) {};
RefPtr<AceType>& canvasPattern, const std::shared_ptr<Ace::ImageData>& imageData) {};
#endif
virtual void StartImageAnalyzer(RefPtr<AceType>& canvasPattern, void* config, onAnalyzedCallback& onAnalyzed) {};
virtual void StopImageAnalyzer(RefPtr<AceType>& canvasPattern) {};

View File

@ -623,8 +623,21 @@ void CustomPaintPaintMethod::DrawImage(const Ace::CanvasImage& canvasImage, doub
ContainerScope scope(canvasImage.instanceId);
auto context = PipelineBase::GetCurrentContext();
auto image = Ace::ImageProvider::GetDrawingImage(
canvasImage.src, context, Size(std::max(width, 0.0), std::max(height, 0.0)));
auto image = std::make_shared<RSImage>();
if (canvasImage.imageData != nullptr) {
auto imageData = *(canvasImage.imageData);
if (imageData.data.empty()) {
return;
}
RSBitmap bitmap;
RSBitmapFormat format { RSColorType::COLORTYPE_BGRA_8888, RSAlphaType::ALPHATYPE_OPAQUE };
bitmap.Build(imageData.dirtyWidth, imageData.dirtyHeight, format);
bitmap.SetPixels(const_cast<void*>(reinterpret_cast<const void*>(imageData.data.data())));
image->BuildFromBitmap(bitmap);
} else {
image = Ace::ImageProvider::GetDrawingImage(
canvasImage.src, context, Size(std::max(width, 0.0), std::max(height, 0.0)));
}
CHECK_NULL_VOID(image);
DrawImageInternal(canvasImage, image);
#endif
@ -635,22 +648,15 @@ void CustomPaintPaintMethod::PutImageData(const Ace::ImageData& imageData)
if (imageData.data.empty()) {
return;
}
uint32_t* data = new (std::nothrow) uint32_t[imageData.data.size()];
CHECK_NULL_VOID(data);
for (uint32_t i = 0; i < imageData.data.size(); ++i) {
data[i] = imageData.data[i].GetValue();
}
RSBitmap bitmap;
RSBitmapFormat format { RSColorType::COLORTYPE_BGRA_8888, RSAlphaType::ALPHATYPE_OPAQUE };
bitmap.Build(imageData.dirtyWidth, imageData.dirtyHeight, format);
bitmap.SetPixels(data);
bitmap.SetPixels(const_cast<void*>(reinterpret_cast<const void*>(imageData.data.data())));
RSBrush brush;
brush.SetBlendMode(RSBlendMode::SRC);
rsCanvas_->AttachBrush(brush);
rsCanvas_->DrawBitmap(bitmap, imageData.x, imageData.y);
rsCanvas_->DetachBrush();
delete[] data;
}
void CustomPaintPaintMethod::FillRect(const Rect& rect)