From a2634a316fb9540a5dc43083340dc38fd28f40f2 Mon Sep 17 00:00:00 2001 From: Ketmar Dark Date: Mon, 17 Oct 2016 19:52:07 +0300 Subject: [PATCH] x11gfx now works for non-x11 targets --- x11gfx.d | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 75 insertions(+), 19 deletions(-) diff --git a/x11gfx.d b/x11gfx.d index d1e81f8..a99fa53 100644 --- a/x11gfx.d +++ b/x11gfx.d @@ -118,24 +118,58 @@ void initVBuf () { private { void blit2xImpl(string op, bool scanlines=true) (Image img) { - auto s = cast(const(ubyte)*)vbuf.ptr; - immutable iw = img.width; - auto dd = cast(uint*)img.getDataPointer; - foreach (immutable int dy; 0..vbufH) { - if (dy*2+1 >= img.height) return; - auto d = dd+iw*(dy*2); - foreach (immutable int dx; 0..vbufW) { - if (dx+1 < iw) { - static if (op.length) mixin(op); - static if (scanlines) { - immutable uint c1 = ((((c0&0x00ff00ff)*6)>>3)&0x00ff00ff)|(((c0&0x0000ff00)*6)>>3)&0x0000ff00; - } else { - alias c1 = c0; + static if (UsingSimpledisplayX11) { + auto s = cast(const(ubyte)*)vbuf.ptr; + immutable iw = img.width; + auto dd = cast(uint*)img.getDataPointer; + foreach (immutable int dy; 0..vbufH) { + if (dy*2+1 >= img.height) return; + auto d = dd+iw*(dy*2); + foreach (immutable int dx; 0..vbufW) { + if (dx+1 < iw) { + static if (op.length) mixin(op); + static if (scanlines) { + immutable uint c1 = ((((c0&0x00ff00ff)*6)>>3)&0x00ff00ff)|(((c0&0x0000ff00)*6)>>3)&0x0000ff00; + } else { + alias c1 = c0; + } + d[0] = d[1] = c0; + d[iw+0] = d[iw+1] = c1; + d += 2; + s += 4; + } + } + } + } else { + // this sux + immutable bpp = img.bytesPerPixel(); + immutable rofs = img.redByteOffset; + immutable gofs = img.greenByteOffset; + immutable bofs = img.blueByteOffset; + immutable nlo = img.adjustmentForNextLine; + auto s = cast(const(ubyte)*)vbuf.ptr; + immutable iw = img.width; + auto dd = cast(ubyte*)img.getDataPointer; + foreach (immutable int dy; 0..vbufH) { + if (dy*2+1 >= img.height) return; + auto d = dd+img.offsetForPixel(0, dy*2); + foreach (immutable int dx; 0..vbufW) { + if (dx+1 < iw) { + static if (op.length) mixin(op); + static if (scanlines) { + immutable uint c1 = ((((c0&0x00ff00ff)*6)>>3)&0x00ff00ff)|(((c0&0x0000ff00)*6)>>3)&0x0000ff00; + } else { + alias c1 = c0; + } + d[bofs] = d[bofs+bpp] = c0&0xff; + d[gofs] = d[gofs+bpp] = (c0>>8)&0xff; + d[rofs] = d[rofs+bpp] = (c0>>16)&0xff; + d[bofs+nlo] = d[bofs+nlo+bpp] = c0&0xff; + d[gofs+nlo] = d[gofs+nlo+bpp] = (c0>>8)&0xff; + d[rofs+nlo] = d[rofs+nlo+bpp] = (c0>>16)&0xff; + d += bpp*2; + s += 4; } - d[0] = d[1] = c0; - d[iw+0] = d[iw+1] = c1; - d += 2; - s += 4; } } } @@ -155,14 +189,36 @@ void realizeVBuf (Image img) { memcpy(dp, sp, vbufW*vbufH*4); */ if (blit2x) { + if (img.width < vbufW*2 || img.height < vbufH*2) return; switch (blitType) { case BlitType.BlackWhite: blit2xTVBW(img); break; case BlitType.Green: blit2xTVGreen(img); break; default: blit2xTV(img); break; } } else { - auto dp = cast(uint*)img.getDataPointer; - dp[0..vbufW*vbufH] = vbuf.ptr[0..vbufW*vbufH]; + if (img.width < vbufW || img.height < vbufH) return; + static if (UsingSimpledisplayX11) { + auto dp = cast(uint*)img.getDataPointer; + dp[0..vbufW*vbufH] = vbuf.ptr[0..vbufW*vbufH]; + } else { + // this sux + auto sp = cast(ubyte*)vbuf.ptr; + auto dp = cast(ubyte*)img.getDataPointer; + immutable bpp = img.bytesPerPixel(); + immutable rofs = img.redByteOffset; + immutable gofs = img.greenByteOffset; + immutable bofs = img.blueByteOffset; + foreach (immutable y; 0..vbufH) { + auto d = dp+img.offsetForTopLeftPixel; + foreach (immutable x; 0..vbufW) { + d[bofs] = *sp++; + d[gofs] = *sp++; + d[rofs] = *sp++; + ++sp; + d += bpp; + } + } + } } } -- 2.11.4.GIT