MCPcopy Create free account
hub / github.com/Tencent/libpag / GetBitmapSequence

Function GetBitmapSequence

exporter/src/export/sequence/BitmapSequence.cpp:51–164  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

49}
50
51void GetBitmapSequence(std::shared_ptr<PAGExportSession> session,
52 pag::BitmapComposition* composition, float compositionFactor) {
53 const auto& Suites = GetSuites();
54 const auto& PluginID = GetPluginID();
55
56 auto itemIter = session->itemHandleMap.find(composition->id);
57 if (itemIter == session->itemHandleMap.end()) {
58 session->pushWarning(AlertInfoType::CompositionHandleNotFound, std::to_string(composition->id));
59 return;
60 }
61 AEGP_ItemH itemHandle = itemIter->second;
62 float factor = compositionFactor;
63 float frameRate = std::min(session->configParam.frameRate, composition->frameRate);
64 auto duration =
65 static_cast<pag::Frame>(ceil(composition->duration * frameRate / composition->frameRate));
66
67 if (session->configParam.bitmapMaxResolution > 0) {
68 int shorterSideLength =
69 static_cast<int>(std::min(composition->width, composition->height) * compositionFactor);
70 if (shorterSideLength > session->configParam.bitmapMaxResolution) {
71 factor *= static_cast<float>(session->configParam.bitmapMaxResolution) /
72 static_cast<float>(shorterSideLength);
73 }
74 }
75
76 if (factor > 0.99) {
77 factor = 1.0;
78 }
79
80 auto sequence = new pag::BitmapSequence();
81 composition->sequences.push_back(sequence);
82 sequence->composition = composition;
83 sequence->frameRate = frameRate;
84 sequence->width = static_cast<int>(ceil(composition->width * factor));
85 sequence->height = static_cast<int>(ceil(composition->height * factor));
86
87 int width = sequence->width;
88 int height = sequence->height;
89 int stride = width * 4;
90 int compositionStride = composition->width * 4;
91 bool needToScale = (width != composition->width || height != composition->height);
92 std::vector<uint8_t> preData(stride * height + stride * 2);
93 std::vector<uint8_t> curData(stride * height + stride * 2);
94 std::vector<uint8_t> rgbaData(compositionStride * composition->height + compositionStride * 2);
95
96 ImageRect lastKeyFrameDiffRect = {0, 0, width, height};
97 pag::Frame lastKeyFrame = 0;
98 AEGP_RenderOptionsH renderOptions = nullptr;
99 Suites->RenderOptionsSuite3()->AEGP_NewFromItem(PluginID, itemHandle, &renderOptions);
100 if (renderOptions == nullptr) {
101 return;
102 }
103 Suites->RenderOptionsSuite3()->AEGP_SetWorldType(renderOptions, AEGP_WorldType_8);
104 for (pag::Frame frame = 0; frame < duration && !session->stopExport; frame++) {
105 A_long frameWidth = 0;
106 A_long frameHeight = 0;
107 A_u_long frameStride = 0;
108 uint8_t* buffer = needToScale ? rgbaData.data() : curData.data();

Callers 1

ExportBitmapCompositionFunction · 0.85

Calls 15

GetSuitesFunction · 0.85
GetPluginIDFunction · 0.85
SetRenderTimeFunction · 0.85
GetRenderFrameSizeFunction · 0.85
GetRenderFrameFunction · 0.85
ScalePixelsFunction · 0.85
GetImageDiffRectFunction · 0.85
IsKeyFrameFunction · 0.85
ClipTransparentEdgeFunction · 0.85
ExpandRectRangeFunction · 0.85
EncodeImageDataFunction · 0.85
findMethod · 0.80

Tested by

no test coverage detected