mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-01-19 16:57:31 +01:00
54 lines
2.3 KiB
C++
54 lines
2.3 KiB
C++
#include <kandinsky/postprocess_zoom_context.h>
|
|
#include <ion.h>
|
|
|
|
KDPostProcessZoomContext::KDPostProcessZoomContext() : m_viewingArea(KDRectZero), m_targetArea(KDRectZero)
|
|
{
|
|
}
|
|
|
|
void KDPostProcessZoomContext::pushRect(KDRect rect, const KDColor * pixels) {
|
|
auto translatedRect = rect.translatedBy(KDPoint(-m_viewingArea.x(),-m_viewingArea.y()));
|
|
auto targetRect = KDRect(translatedRect.x()*2, translatedRect.y()*2, translatedRect.width()*2, translatedRect.height()*2);
|
|
auto clippedTargetRect = m_targetArea.intersectedWith(targetRect);
|
|
|
|
KDColor targetBuffer[targetRect.width()];
|
|
|
|
for (int y = 0; y < rect.height(); y++) {
|
|
for (int x = 0; x < rect.width(); x++) {
|
|
targetBuffer[2*x+1] = targetBuffer[2*x] = pixels[y*rect.width()+x];
|
|
}
|
|
|
|
for (int i = 0; i < 2; i++) {
|
|
auto outputRect = KDRect(targetRect.x(), targetRect.y()+y*2+i, targetRect.width(), 1);
|
|
KDPostProcessContext::pushRect(m_targetArea.intersectedWith(outputRect), targetBuffer+(clippedTargetRect.x()-targetRect.x()));
|
|
}
|
|
}
|
|
}
|
|
|
|
void KDPostProcessZoomContext::pushRectUniform(KDRect rect, KDColor color) {
|
|
auto clippedRect = m_viewingArea.intersectedWith(rect);
|
|
auto targetRect = KDRect(clippedRect.x()*2, clippedRect.y()*2, clippedRect.width()*2, clippedRect.height()*2);
|
|
targetRect = targetRect.translatedBy(KDPoint(-m_viewingArea.x()*2,-m_viewingArea.y()*2));
|
|
targetRect = m_targetArea.intersectedWith(targetRect);
|
|
|
|
KDPostProcessContext::pushRectUniform(targetRect, color);
|
|
}
|
|
|
|
void KDPostProcessZoomContext::pullRect(KDRect rect, KDColor * pixels) {
|
|
auto translatedRect = rect.translatedBy(KDPoint(-m_viewingArea.x(),-m_viewingArea.y()));
|
|
auto targetRect = KDRect(translatedRect.x()*2, translatedRect.y()*2, translatedRect.width()*2, translatedRect.height()*2);
|
|
auto clippedTargetRect = m_targetArea.intersectedWith(targetRect);
|
|
|
|
KDColor targetBuffer[targetRect.width()];
|
|
|
|
for (int y = 0; y < rect.height(); y++) {
|
|
memset(targetBuffer, 0x00, sizeof(targetBuffer));
|
|
|
|
auto outputRect = KDRect(targetRect.x(), targetRect.y()+y*2, targetRect.width(), 1).intersectedWith(m_targetArea);
|
|
KDPostProcessContext::pullRect(outputRect, targetBuffer+(clippedTargetRect.x()-targetRect.x()));
|
|
|
|
for (int x = 0; x < rect.width(); x++) {
|
|
pixels[y*rect.width()+x] = targetBuffer[x*2];
|
|
}
|
|
}
|
|
}
|