diff --git a/src/DRenderer.cpp b/src/DRenderer.cpp index 23bd256..dbdab42 100644 --- a/src/DRenderer.cpp +++ b/src/DRenderer.cpp @@ -529,19 +529,30 @@ FILE_SCOPE void BitmapFontCreate(const PlatformAPI api, FILE_SCOPE void DrawBitmap(PlatformRenderBuffer *const renderBuffer, DRBitmap *const bitmap, i32 x, i32 y) { - if (!bitmap || !bitmap->memory) return; + if (!bitmap || !bitmap->memory || !renderBuffer) return; + + DqnRect viewport = DqnRect_4i(0, 0, renderBuffer->width, renderBuffer->height); + DqnRect bitmapRect = DqnRect_4i(x, y, x + bitmap->dim.w, y + bitmap->dim.h); + bitmapRect = DqnRect_ClipRect(bitmapRect, viewport); + if (bitmapRect.max.x < 0 || bitmapRect.max.y < 0) return; + + i32 startX = (x > 0) ? 0 : DQN_ABS(x); + i32 startY = (y > 0) ? 0 : DQN_ABS(y); + + i32 endX, endY; + DqnRect_GetSize2i(bitmapRect, &endX, &endY); const i32 pitch = bitmap->dim.w * bitmap->bytesPerPixel; - for (i32 bitmapY = 0; bitmapY < bitmap->dim.w; bitmapY++) + for (i32 bitmapY = startY; bitmapY < endY; bitmapY++) { u8 *const srcRow = bitmap->memory + (bitmapY * pitch); - i32 bufferY = y + bitmapY; + i32 bufferY = (i32)bitmapRect.min.y + bitmapY; - for (i32 bitmapX = 0; bitmapX < bitmap->dim.w; bitmapX++) + for (i32 bitmapX = startX; bitmapX < endX; bitmapX++) { u32 *pixelPtr = (u32 *)srcRow; u32 pixel = pixelPtr[bitmapX]; - i32 bufferX = x + bitmapX; + i32 bufferX = (i32)bitmapRect.min.x + bitmapX; DqnV4 color = {}; color.a = (f32)(pixel >> 24); @@ -658,7 +669,6 @@ void DebugUpdate(PlatformRenderBuffer *const renderBuffer, debug->totalSetPixels += debug->setPixelsPerFrame; debug->totalSetPixels = DQN_MAX(0, debug->totalSetPixels); - debug->setPixelsPerFrame = 0; // totalSetPixels { @@ -683,6 +693,8 @@ void DebugUpdate(PlatformRenderBuffer *const renderBuffer, DebugDisplayMemBuffer(renderBuffer, "TransBuffer", &memory->transientBuffer, &debugP, font); } + + debug->setPixelsPerFrame = 0; } extern "C" void DR_Update(PlatformRenderBuffer *const renderBuffer, @@ -745,8 +757,7 @@ extern "C" void DR_Update(PlatformRenderBuffer *const renderBuffer, DqnV2 fontP = DqnV2_2i(200, 180); DrawText(renderBuffer, state->font, fontP, "hello world!"); + DrawBitmap(renderBuffer, &state->bitmap, 700, 400); - DebugUpdate(renderBuffer, input, memory, state->font); - } diff --git a/src/dqn.h b/src/dqn.h index 5d876b2..a576fdd 100644 --- a/src/dqn.h +++ b/src/dqn.h @@ -589,10 +589,14 @@ typedef struct DqnRect DqnV2 max; } DqnRect; +DQN_FILE_SCOPE DqnRect DqnRect_4f (f32 minX, f32 minY, f32 maxX, f32 maxY); +DQN_FILE_SCOPE DqnRect DqnRect_4i (i32 minX, i32 minY, i32 maxX, i32 maxY); DQN_FILE_SCOPE DqnRect DqnRect_Init (DqnV2 origin, DqnV2 size); DQN_FILE_SCOPE void DqnRect_GetSize2f(DqnRect rect, f32 *width, f32 *height); -DQN_FILE_SCOPE DqnV2 DqnRect_GetSizev2(DqnRect rect); +DQN_FILE_SCOPE void DqnRect_GetSize2i(DqnRect rect, i32 *width, i32 *height); +DQN_FILE_SCOPE DqnV2 DqnRect_GetSizeV2(DqnRect rect); DQN_FILE_SCOPE DqnV2 DqnRect_GetCenter(DqnRect rect); +DQN_FILE_SCOPE DqnRect DqnRect_ClipRect (DqnRect rect, DqnRect clip); DQN_FILE_SCOPE DqnRect DqnRect_Move (DqnRect rect, DqnV2 shift); DQN_FILE_SCOPE bool DqnRect_ContainsP(DqnRect rect, DqnV2 p); @@ -2229,6 +2233,24 @@ DQN_FILE_SCOPE DqnV4 DqnMat4_MulV4(DqnMat4 a, DqnV4 b) //////////////////////////////////////////////////////////////////////////////// // Rect //////////////////////////////////////////////////////////////////////////////// +DQN_FILE_SCOPE DqnRect DqnRect_4f(f32 minX, f32 minY, f32 maxX, f32 maxY) +{ + DqnRect result = {}; + result.min = DqnV2_2f(minX, minY); + result.max = DqnV2_2f(maxX, maxY); + + return result; +} + +DQN_FILE_SCOPE DqnRect DqnRect_4i(i32 minX, i32 minY, i32 maxX, i32 maxY) +{ + DqnRect result = {}; + result.min = DqnV2_2i(minX, minY); + result.max = DqnV2_2i(maxX, maxY); + + return result; +} + DQN_FILE_SCOPE DqnRect DqnRect_Init(DqnV2 origin, DqnV2 size) { DqnRect result = {}; @@ -2244,6 +2266,12 @@ DQN_FILE_SCOPE void DqnRect_GetSize2f(DqnRect rect, f32 *width, f32 *height) *height = DQN_ABS(rect.max.y - rect.min.y); } +DQN_FILE_SCOPE void DqnRect_GetSize2i(DqnRect rect, i32 *width, i32 *height) +{ + *width = (i32)DQN_ABS(rect.max.x - rect.min.x); + *height = (i32)DQN_ABS(rect.max.y - rect.min.y); +} + DQN_FILE_SCOPE DqnV2 DqnRect_GetSizeV2(DqnRect rect) { f32 width = DQN_ABS(rect.max.x - rect.min.x); @@ -2261,6 +2289,18 @@ DQN_FILE_SCOPE DqnV2 DqnRect_GetCentre(DqnRect rect) return result; } +DQN_FILE_SCOPE DqnRect DqnRect_ClipRect(DqnRect rect, DqnRect clip) +{ + DqnRect result = {}; + DqnV2 clipSize = DqnRect_GetSizeV2(clip); + + result.max.x = DQN_MIN(rect.max.x, clipSize.w); + result.max.y = DQN_MIN(rect.max.y, clipSize.h); + result.min.x = DQN_MAX(clip.min.x, rect.min.x); + result.min.y = DQN_MAX(clip.min.y, rect.min.y); + return result; +} + DQN_FILE_SCOPE DqnRect DqnRect_Move(DqnRect rect, DqnV2 shift) { DqnRect result = {0};