78 lines
2.2 KiB
C
78 lines
2.2 KiB
C
// dvx_video.c — Layer 1: Video backend for DVX GUI
|
|
//
|
|
// Platform-independent video utilities. The actual VESA/VBE code
|
|
// now lives in dvxPlatformDos.c (or the platform file for whatever
|
|
// OS we're targeting).
|
|
|
|
#include "dvxVideo.h"
|
|
#include "platform/dvxPlatform.h"
|
|
#include "dvxPalette.h"
|
|
|
|
#include <string.h>
|
|
|
|
|
|
// ============================================================
|
|
// packColor
|
|
// ============================================================
|
|
|
|
uint32_t packColor(const DisplayT *d, uint8_t r, uint8_t g, uint8_t b) {
|
|
if (d->format.bitsPerPixel == 8) {
|
|
return dvxNearestPalEntry(d->palette, r, g, b);
|
|
}
|
|
|
|
uint32_t rv = ((uint32_t)r >> (8 - d->format.redBits)) << d->format.redShift;
|
|
uint32_t gv = ((uint32_t)g >> (8 - d->format.greenBits)) << d->format.greenShift;
|
|
uint32_t bv = ((uint32_t)b >> (8 - d->format.blueBits)) << d->format.blueShift;
|
|
|
|
return rv | gv | bv;
|
|
}
|
|
|
|
|
|
// ============================================================
|
|
// resetClipRect
|
|
// ============================================================
|
|
|
|
void resetClipRect(DisplayT *d) {
|
|
d->clipX = 0;
|
|
d->clipY = 0;
|
|
d->clipW = d->width;
|
|
d->clipH = d->height;
|
|
}
|
|
|
|
|
|
// ============================================================
|
|
// setClipRect
|
|
// ============================================================
|
|
|
|
void setClipRect(DisplayT *d, int32_t x, int32_t y, int32_t w, int32_t h) {
|
|
int32_t x2 = x + w;
|
|
int32_t y2 = y + h;
|
|
|
|
if (x < 0) { x = 0; }
|
|
if (y < 0) { y = 0; }
|
|
if (x2 > d->width) { x2 = d->width; }
|
|
if (y2 > d->height) { y2 = d->height; }
|
|
|
|
d->clipX = x;
|
|
d->clipY = y;
|
|
d->clipW = (x2 > x) ? x2 - x : 0;
|
|
d->clipH = (y2 > y) ? y2 - y : 0;
|
|
}
|
|
|
|
|
|
// ============================================================
|
|
// videoInit
|
|
// ============================================================
|
|
|
|
int32_t videoInit(DisplayT *d, int32_t requestedW, int32_t requestedH, int32_t preferredBpp) {
|
|
return platformVideoInit(d, requestedW, requestedH, preferredBpp);
|
|
}
|
|
|
|
|
|
// ============================================================
|
|
// videoShutdown
|
|
// ============================================================
|
|
|
|
void videoShutdown(DisplayT *d) {
|
|
platformVideoShutdown(d);
|
|
}
|