26 , eventDistributor(vdp.getReactor().getEventDistributor())
27 , realTime(vdp.getMotherBoard().getRealTime())
28 , renderSettings(vdp.getReactor().getDisplay().getRenderSettings())
29 , videoSourceSetting(vdp.getMotherBoard().getVideoSource())
30 , rasterizer(vdp.getReactor().getDisplay().
31 getVideoSystem().createV9990Rasterizer(vdp))
33 frameSkipCounter = 999;
34 finishFrameDuration = 0;
36 prevDrawFrame =
false;
52 return rasterizer->getPostProcessor();
66 if (!rasterizer->isActive()) {
67 frameSkipCounter = 999;
69 prevDrawFrame =
false;
72 prevDrawFrame = drawFrame;
77 if (frameSkipCounter <
81 }
else if (frameSkipCounter >=
87 if (rasterizer->isRecording()) {
91 unsigned(finishFrameDuration), time);
98 if (!drawFrame)
return;
107 rasterizer->frameStart();
112 bool skipEvent = !drawFrame;
118 rasterizer->frameEnd(time);
120 auto current = time2 - time1;
121 const double ALPHA = 0.2;
122 finishFrameDuration = finishFrameDuration * (1 - ALPHA) +
135 std::make_shared<FinishFrameEvent>(
136 rasterizer->getPostProcessor()->getVideoSource(),
143 if (!drawFrame)
return;
175 if ((toX == lastX) && (toY == lastY))
return;
182 if (displayEnabled) {
184 subdivide(lastX, lastY, toX, toY, 0, left, DRAW_BORDER);
190 subdivide(lastX, lastY, toX, toY, left, right, DRAW_DISPLAY);
192 subdivide(lastX, lastY, toX, toY, right, rightEdge, DRAW_BORDER);
195 subdivide(lastX, lastY, toX, toY, 0, rightEdge, DRAW_BORDER);
202 void V9990PixelRenderer::subdivide(
int fromX,
int fromY,
int toX,
int toY,
203 int clipL,
int clipR, DrawType drawType)
208 bool atEnd = (fromY != toY) || (toX >= clipR);
209 draw(fromX, fromY, (atEnd ? clipR : toX), fromY + 1,
212 if (fromY == toY)
return;
216 bool drawLast =
false;
219 }
else if (toX > clipL) {
224 draw(clipL, fromY, clipR, toY, drawType);
228 if (drawLast) draw(clipL, toY, toX, toY + 1, drawType);
231 void V9990PixelRenderer::draw(
int fromX,
int fromY,
int toX,
int toY,
234 if (type == DRAW_BORDER) {
235 rasterizer->drawBorder(fromX, fromY, toX, toY);
238 assert(type == DRAW_DISPLAY);
242 int displayYA = fromY - verticalOffsetA;
243 int displayYB = fromY - verticalOffsetB;
245 rasterizer->drawDisplay(fromX, fromY, toX, toY,
247 displayY, displayYA, displayYB);
254 displayEnabled = enabled;
260 rasterizer->setDisplayMode(mode);
266 if (displayEnabled) {
272 rasterizer->setPalette(index, r, g, b, ys);
277 rasterizer->setSuperimpose(enabled);
282 rasterizer->setColorMode(mode);
292 if (displayEnabled) sync(time);
297 if (displayEnabled) sync(time);
301 if (displayEnabled) {
305 verticalOffsetA = lastY;
311 if (displayEnabled) {
315 verticalOffsetB = lastY;
319 void V9990PixelRenderer::update(
const Setting& setting)
324 frameSkipCounter = 999;