mirror of
https://gitee.com/openharmony/arkui_ace_engine
synced 2025-04-01 14:02:13 +00:00
commit
7990608757
@ -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;
|
||||
|
@ -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());
|
||||
|
@ -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());
|
||||
|
@ -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;
|
||||
|
@ -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 {
|
||||
|
@ -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);
|
||||
|
@ -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:
|
||||
|
@ -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) {};
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user