import "instance"
-#if (defined(__unix__) || defined(__APPLE__)) && !defined(ECERE_MINIGLX)
+#if (defined(__unix__) || defined(__APPLE__)) && !defined(ECERE_MINIGLX) && !defined(__EMSCRIPTEN__) && !defined(__pnacl__)
default:
#include <X11/Xlib.h>
#include <X11/Xutil.h>
+#if !defined(__EMSCRIPTEN__) && !defined(__pnacl__)
#include <X11/extensions/shape.h>
#include <X11/extensions/Xrender.h>
+#endif
#include <X11/extensions/XShm.h>
#include <sys/ipc.h>
#include <sys/shm.h>
bool opaqueText;
int xOffset;
bool writingText;
+ bool writingOutline;
ColorAlpha foreground, background;
bool opaque;
break;
case pixelFormat888:
format = XRenderFindStandardFormat(xGlobalDisplay, alphaBlend ? PictStandardARGB32 : PictStandardRGB24);
- // printf("R: %d G: %d B: %d\n", format->direct.red, format->direct.green, format->direct.blue);
+ // printf("R: %d G: %d B: %d\n", format->direct.red, format->direct.green, format->direct.blue);
break;
case pixelFormat555:
{
XRenderPictFormat info = { 0 };
-
+
info.depth = 16;
info.type = PictTypeDirect;
info.direct.red = 10;
info.direct.redMask = 0x1F;
info.direct.greenMask = 0x1F;
info.direct.blueMask = 0x1F;
-
+
format = XRenderFindFormat(xGlobalDisplay,
/*PictFormatDepth|*/PictFormatType| PictFormatAlpha|PictFormatRed|PictFormatGreen|PictFormatBlue|
PictFormatRedMask|PictFormatGreenMask|PictFormatBlueMask|PictFormatAlphaMask, &info, 0);
info.direct.blueMask = 0x1F;
info.direct.alphaMask = 0;
info.id = 0xba;
-
- format = XRenderFindFormat(xGlobalDisplay,
+
+ format = XRenderFindFormat(xGlobalDisplay,
/*PictFormatDepth|*/PictFormatType|PictFormatAlpha|PictFormatRed|PictFormatGreen|PictFormatBlue|
PictFormatRedMask|PictFormatGreenMask|PictFormatBlueMask|PictFormatAlphaMask, &info, 0);
break;
{
*w = Abs(*w);
*sw = Abs(*sw);
- *flip = true;
+ *flip = true;
}
s2dw=(float)*w / *sw;
XImage image = {0};
GC maskGC = XCreateGC(xGlobalDisplay, mask, 0, null);
uint wordWidth = (bitmap.width+31) >> 5;
-
+
uint x,y;
uint32 *b = new0 uint32[wordWidth * bitmap.height];
uint32 f = 1;
-
+
XSetGraphicsExposures(xGlobalDisplay, maskGC, False);
-
+
image.width = bitmap.width;
image.height = bitmap.height;
-
+
image.format = XYBitmap;
#ifdef __BIG_ENDIAN__
image.byte_order = MSBFirst;
image.bitmap_pad = 32;
image.depth = 1;
image.bytes_per_line = wordWidth << 2;
-
+
image.data = (char*)b;
-
+
XInitImage(&image);
-
+
switch(bitmap.pixelFormat) {
case pixelFormat4: {
-
+
} break;
case pixelFormat8: {
byte *p = (byte*)bitmap.picture;
-
+
for(y = 0; y<bitmap.height; y++, p+=bitmap.stride) {
for(x = 0; x<bitmap.width; x++) {
if(p[x])
case pixelFormat555:
case pixelFormat565: {
uint16 *p = (uint16*)bitmap.picture;
+#ifdef _DEBUG
PrintLn(bitmap.pixelFormat);
+#endif
for(y = 0; y<bitmap.height; y++, p+=bitmap.stride) {
for(x = 0; x<bitmap.width; x++) {
if(p[x])
}
} break;
case pixelFormatAlpha: {
-
+
} break;
case pixelFormatText: {
-
+
} break;
case pixelFormatRGBA: {
-
+
} break;
}
-
+
XSetForeground(xGlobalDisplay, maskGC, 1);
XSetBackground(xGlobalDisplay, maskGC, 0);
-
+
XPutImage(xGlobalDisplay, mask, maskGC, &image,
0, 0, 0, 0, //coordinates
bitmap.width, bitmap.height);
-
+
XFreeGC(xGlobalDisplay, maskGC);
delete image.data;
}
if(xDisplay.shminfoShape.shmaddr != (void *)-1)
shmdt(xDisplay.shminfoShape.shmaddr);
shmctl(xDisplay.shminfoShape.shmid, IPC_RMID, 0);
- }
+ }
XDestroyImage(xDisplay.shapeImage);
xDisplay.shapeImage = None;
}
if(display)
{
- xDisplay.windowGC = XCreateGC(xGlobalDisplay, (int)display.window, 0, null);
+ xDisplay.windowGC = XCreateGC(xGlobalDisplay, (X11Window)display.window, 0, null);
XSetGraphicsExposures(xGlobalDisplay, xDisplay.windowGC, False);
result = true;
}
if(xDisplay.shminfoShape.shmaddr != (void *)-1)
shmdt(xDisplay.shminfoShape.shmaddr);
shmctl(xDisplay.shminfoShape.shmid, IPC_RMID, 0);
- }
+ }
XDestroyImage(xDisplay.shapeImage);
xDisplay.shapeImage = None;
}
xDisplay.image = XShmCreateImage(xGlobalDisplay, xSystemVisual /*DefaultVisual(xGlobalDisplay, DefaultScreen(xGlobalDisplay))*/,
format->depth, ZPixmap, null, &xDisplay.shminfo, width, height);
}
+ else if(display.useSharedMemory && !xSharedMemory)
+ printf("%s", $"Error: Requested shared memory but shared memory pixmaps are not supported by X server.\n");
#endif
if(xDisplay.image)
{
xDisplay.bitmap.height = height;
xDisplay.bitmap.stride = xDisplay.image->bytes_per_line >> GetColorDepthShifts(display.pixelFormat);
xDisplay.bitmap.pixelFormat = display.pixelFormat;
- xDisplay.bitmap.picture = xDisplay.shminfo.shmaddr;
+ xDisplay.bitmap.picture = (byte *)xDisplay.shminfo.shmaddr;
xDisplay.bitmap.size = width * height;
xDisplay.bitmap.sizeBytes = (uint)xDisplay.bitmap.size << GetColorDepthShifts(display.pixelFormat);
}
if(xDisplay.shminfo.shmaddr != (void *)-1)
shmdt(xDisplay.shminfo.shmaddr);
shmctl(xDisplay.shminfo.shmid, IPC_RMID, 0);
- }
+ }
XDestroyImage(xDisplay.image);
xDisplay.image = None;
}
if(xDisplay.shminfoShape.shmaddr != (void *)-1)
shmdt(xDisplay.shminfoShape.shmaddr);
shmctl(xDisplay.shminfoShape.shmid, IPC_RMID, 0);
- }
+ }
XDestroyImage(xDisplay.shapeImage);
xDisplay.shapeImage = None;
}
}
if(!xDisplay.pixmap && format)
- xDisplay.pixmap = XCreatePixmap(xGlobalDisplay, (int)display.window, width, height, format->depth);
+ xDisplay.pixmap = XCreatePixmap(xGlobalDisplay, (X11Window)display.window, width, height, format->depth);
if(display.alphaBlend && !xDisplay.shapePixmap)
- xDisplay.shapePixmap = XCreatePixmap(xGlobalDisplay, (int)display.window, width, height, 1);
+ xDisplay.shapePixmap = XCreatePixmap(xGlobalDisplay, (X11Window)display.window, width, height, 1);
if(!xDisplay.gc)
{
- xDisplay.gc = XCreateGC(xGlobalDisplay, (int)xDisplay.pixmap, 0, null);
+ xDisplay.gc = XCreateGC(xGlobalDisplay, (Pixmap)xDisplay.pixmap, 0, null);
XSetGraphicsExposures(xGlobalDisplay, xDisplay.gc, False);
}
void RestorePalette(Display display)
{
- XDisplay xDisplay = display.driverData;
+
}
void FreeBitmap(DisplaySystem displaySystem, Bitmap bitmap)
{
XBitmap xBitmap = bitmap.driverData;
-
- if(xBitmap.pixmap)
- XFreePixmap(xGlobalDisplay, xBitmap.pixmap);
- if(xBitmap.mask)
- XFreePixmap(xGlobalDisplay, xBitmap.mask);
- if(xBitmap.picture)
- XRenderFreePicture(xGlobalDisplay, xBitmap.picture);
- if(xBitmap.maskPicture)
- XRenderFreePicture(xGlobalDisplay, xBitmap.maskPicture);
- delete xBitmap;
+ if(xBitmap)
+ {
+ if(xBitmap.pixmap)
+ XFreePixmap(xGlobalDisplay, xBitmap.pixmap);
+ if(xBitmap.mask)
+ XFreePixmap(xGlobalDisplay, xBitmap.mask);
+ if(xBitmap.picture)
+ XRenderFreePicture(xGlobalDisplay, xBitmap.picture);
+ if(xBitmap.maskPicture)
+ XRenderFreePicture(xGlobalDisplay, xBitmap.maskPicture);
+ delete xBitmap;
+ bitmap.driverData = null;
+ }
((subclass(DisplayDriver))class(LFBDisplayDriver)).FreeBitmap(displaySystem, bitmap);
}
//bitmap.Convert(null, pixelFormatRGBA, null);
//bitmap.Convert(null, pixelFormat888, null);
- xBitmap.pixmap =
- XCreatePixmap(xGlobalDisplay, confineWindow /*(int)display.window*/, bitmap.width, bitmap.height,
+ xBitmap.pixmap =
+ XCreatePixmap(xGlobalDisplay, confineWindow /*(X11Window)display.window*/, bitmap.width, bitmap.height,
(bitmap.pixelFormat == pixelFormatAlpha) ? 8 : (bitmap.alphaBlend ? 32 : ((bitmap.pixelFormat == pixelFormat888) ? 24 : xSystemDepth)));
if(bitmap.transparent)
- xBitmap.mask =
- XCreatePixmap(xGlobalDisplay, confineWindow /*(int)display.window*/, bitmap.width, bitmap.height, 1);
+ xBitmap.mask =
+ XCreatePixmap(xGlobalDisplay, confineWindow /*(X11Window)display.window*/, bitmap.width, bitmap.height, 1);
{
XRenderPictureAttributes attributes = { 0 };
xBitmap.maskPicture = XRenderCreatePicture(xGlobalDisplay, xBitmap.mask, XRenderFindStandardFormat(xGlobalDisplay, PictStandardA1), CPComponentAlpha, &attributes);
}
- gc = XCreateGC(xGlobalDisplay, (int)xBitmap.pixmap, 0, null);
+ gc = XCreateGC(xGlobalDisplay, (Pixmap)xBitmap.pixmap, 0, null);
XSetGraphicsExposures(xGlobalDisplay, gc, False);
image.width = bitmap.width;
image.height = bitmap.height;
-
+
if(bitmap.pixelFormat == pixelFormatAlpha)
{
image.depth = 8;
image.green_mask = 0x7E0;
image.blue_mask = 0x1F;
*/
-
+
/*
image.red_mask = 0x0000FF;
image.green_mask = 0x00FF00;
*/
// image.red_mask = 0xFFFF0000;
- image.data = bitmap.picture;
+ image.data = (char *)bitmap.picture;
XInitImage(&image);
if(bitmap.pixelFormat != pixelFormatAlpha && bitmap.alphaBlend)
}
}
- XPutImage(xGlobalDisplay, (int)xBitmap.pixmap, gc, &image,
+ XPutImage(xGlobalDisplay, (Pixmap)xBitmap.pixmap, gc, &image,
0, 0, 0, 0, bitmap.width,bitmap.height);
if(bitmap.transparent && !bitmap.alphaBlend && bitmap.pixelFormat != pixelFormatAlpha)
PutBitmapMask(xBitmap.mask, bitmap);
-
+
XFreeGC(xGlobalDisplay, gc);
if(!bitmap.keepData)
void ReleaseSurface(Display display, Surface surface)
{
XSurface xSurface = surface.driverData;
- XDisplay xDisplay = display.driverData;
+ XDisplay xDisplay = display ? display.driverData : null;
XRectangle rectangle;
if(xSurface.colorPicture)
rectangle.x = 0;
rectangle.y = 0;
- rectangle.width = (uint16)display.width;
- rectangle.height = (uint16)display.height;
-
- XRenderSetPictureClipRectangles(xGlobalDisplay, xDisplay.picture, 0, 0, &rectangle, 1);
+ if(display)
+ {
+ rectangle.width = (uint16)display.width;
+ rectangle.height = (uint16)display.height;
+ XRenderSetPictureClipRectangles(xGlobalDisplay, xDisplay.picture, 0, 0, &rectangle, 1);
+ }
if(xSurface.colorPixmap)
XFreePixmap(xGlobalDisplay, xSurface.colorPixmap);
surface.unclippedBox = surface.box = clip;
xSurface.pixmap = xBitmap.pixmap;
-
+
result = true;
}
return result;
xSurface.pixmap = xDisplay.pixmap;
xSurface.picture = xDisplay.picture;
- xSurface.colorPixmap = XCreatePixmap(xGlobalDisplay, (int)confineWindow /*display.window*/, 1, 1, /*(xSystemDepth == 16) ? 16 : */32);
+ xSurface.colorPixmap = XCreatePixmap(xGlobalDisplay, (X11Window)confineWindow /*display.window*/, 1, 1, /*(xSystemDepth == 16) ? 16 : */32);
rectangle.x = (short)(clip.left + x);
rectangle.y = (short)(clip.top + y);
XSurface xSurface = surface.driverData;
XDisplay xDisplay = display.driverData;
bool changed = false;
- XRectangle rectangle;
if(clip != null)
{
Box box = clip;
}
if(changed)
{
- XRectangle rectangle =
+ XRectangle rectangle =
{
(short)(surface.box.left + surface.offset.x),
(short)(surface.box.top + surface.offset.y),
(short)(surface.box.right - surface.box.left + 1),
(short)(surface.box.bottom - surface.box.top + 1)
};
- XSetClipRectangles(xGlobalDisplay, xDisplay.gc,
+ XSetClipRectangles(xGlobalDisplay, xDisplay.gc,
0,0, &rectangle, 1, YXBanded);
}
}
if(display)
xImage = XGetImage(xGlobalDisplay, xDisplay.pixmap, sx, sy, sw, sh, MAXDWORD, ZPixmap);
- else
+ else
xImage = XGetImage(xGlobalDisplay, DefaultRootWindow(xGlobalDisplay), sx, sy, sw, sh, MAXDWORD, ZPixmap);
source.pixelFormat = format;
- source.picture = xImage->data;
+ source.picture = (byte *)xImage->data;
source.width = sw;
source.height = sh;
source.stride = xImage->bytes_per_line / 4;
void SetForeground(Display display, Surface surface, ColorAlpha color)
{
XSurface xSurface = surface.driverData;
- XDisplay xDisplay = display.driverData;
- XRenderColor renderColor = { color.color.r * color.a, color.color.g * color.a, color.color.b * color.a, color.a * 255};
- X11Picture colorPicture;
+ XDisplay xDisplay = display ? display.driverData : null;
+ XRenderColor renderColor = { (uint16)(color.color.r * color.a), (uint16)(color.color.g * color.a), (uint16)(color.color.b * color.a), (uint16)(color.a * 255) };
if(xSurface.colorPicture)
XRenderFreePicture(xGlobalDisplay, xSurface.colorPicture);
// xSurface.foreground = ARGB(A(color),B(color),G(color),R(color));
xSurface.foreground = color;
- XSetForeground(xGlobalDisplay, xDisplay.gc, (xSystemPixelFormat == pixelFormat888) ? xSurface.foreground :
- ((xSystemPixelFormat == pixelFormat565) ? ((Color565)xSurface.foreground) : ((Color555)xSurface.foreground)));
+ if(xDisplay)
+ XSetForeground(xGlobalDisplay, xDisplay.gc, (xSystemPixelFormat == pixelFormat888) ? xSurface.foreground :
+ ((xSystemPixelFormat == pixelFormat565) ? ((Color565)xSurface.foreground) : ((Color555)xSurface.foreground)));
}
void SetBackground(Display display, Surface surface, ColorAlpha color)
{
XSurface xSurface = surface.driverData;
- XDisplay xDisplay = display.driverData;
+ XDisplay xDisplay = display ? display.driverData : null;
// xSurface.background = ARGB(A(color),B(color),G(color),R(color));
xSurface.background = color;
- XSetBackground(xGlobalDisplay, xDisplay.gc, (xSystemPixelFormat == pixelFormat888) ? xSurface.background :
- ((xSystemPixelFormat == pixelFormat565) ? ((Color565)xSurface.background) : ((Color555)xSurface.background)));
+ if(xDisplay)
+ XSetBackground(xGlobalDisplay, xDisplay.gc, (xSystemPixelFormat == pixelFormat888) ? xSurface.background :
+ ((xSystemPixelFormat == pixelFormat565) ? ((Color565)xSurface.background) : ((Color555)xSurface.background)));
}
ColorAlpha GetPixel(Display display, Surface surface, int x, int y)
- {
+ {
return 0;
}
if(xSurface.foreground.a < 255)
DrawLine(display, surface, x,y,x,y);
else
- XDrawPoint(xGlobalDisplay, (int)xDisplay.pixmap, xDisplay.gc,
+ XDrawPoint(xGlobalDisplay, (Pixmap)xDisplay.pixmap, xDisplay.gc,
x + surface.offset.x,
y + surface.offset.y);
}
void DrawLine(Display display, Surface surface, int x1, int y1, int x2, int y2)
{
- XDisplay xDisplay = display.driverData;
+ XDisplay xDisplay = display ? display.driverData : null;
XSurface xSurface = surface.driverData;
- if(xSurface.foreground.a < 255)
+ if(!xDisplay || xSurface.foreground.a < 255)
{
XTrapezoid traps[3];
int nTraps = 0;
{
XDoubleToFixed(y1 - width + offset), XDoubleToFixed(y1 + width + offset),
{ { XDoubleToFixed(Min(x1, x2) - 0 + offset), XDoubleToFixed(y1 - width + offset) }, { XDoubleToFixed(Min(x1, x2) + 0.0 + offset), XDoubleToFixed(y1 + width+ offset) } },
- { { XDoubleToFixed(Max(x1, x2) - 0 + offset), XDoubleToFixed(y1 - width + offset) }, { XDoubleToFixed(Max(x1, x2) + 0.0 + offset), XDoubleToFixed(y1 + width+ offset) } },
+ { { XDoubleToFixed(Max(x1, x2) - 0 + offset), XDoubleToFixed(y1 - width + offset) }, { XDoubleToFixed(Max(x1, x2) + 0.0 + offset), XDoubleToFixed(y1 + width+ offset) } }
};
traps[0] = trap1;
nTraps = 1;
{
XDoubleToFixed(Min(y1, y2) - 0.0 + offset), XDoubleToFixed(Max(y1, y2) + 0.0 + offset),
{ { XDoubleToFixed(x1 - width + offset), XDoubleToFixed(Min(y1, y2) - 0.0 + offset) }, { XDoubleToFixed(x1 - width + offset), XDoubleToFixed(Max(y1, y2) + 0.0 + offset) } },
- { { XDoubleToFixed(x1 + width + offset), XDoubleToFixed(Min(y1, y2) - 0.0 + offset) }, { XDoubleToFixed(x1 + width + offset), XDoubleToFixed(Max(y1, y2) + 0.0 + offset) } },
+ { { XDoubleToFixed(x1 + width + offset), XDoubleToFixed(Min(y1, y2) - 0.0 + offset) }, { XDoubleToFixed(x1 + width + offset), XDoubleToFixed(Max(y1, y2) + 0.0 + offset) } }
};
traps[0] = trap1;
nTraps = 1;
{
XDoubleToFixed(D.y + offset), XDoubleToFixed(F.y + offset),
{ { XDoubleToFixed(D.x + offset), XDoubleToFixed(D.y + offset) }, { XDoubleToFixed(F.x + offset), XDoubleToFixed(F.y + offset) } },
- { { XDoubleToFixed(E.x + offset), XDoubleToFixed(E.y + offset) }, { XDoubleToFixed(F.x + offset), XDoubleToFixed(F.y + offset) } },
+ { { XDoubleToFixed(E.x + offset), XDoubleToFixed(E.y + offset) }, { XDoubleToFixed(F.x + offset), XDoubleToFixed(F.y + offset) } }
};
traps[0] = trap1;
traps[1] = trap2;
traps[2] = trap3;
nTraps = 3;
- }
+ }
}
else
{
traps[1] = trap2;
traps[2] = trap3;
nTraps = 3;
- }
+ }
}
/*
printf("Line: (%d, %d)-(%d, %d)\n", x1,y1, x2,y2);
printf("Line: A = (%.2f, %.2f), B = (%.2f, %.2f), C = (%.2f, %.2f)\n", A.x,A.y, B.x,B.y, C.x,C.y);
printf("Line: D = (%.2f, %.2f), E = (%.2f, %.2f), F = (%.2f, %.2f)\n", D.x,D.y, E.x,E.y, F.x,F.y);
- printf("Trap1: top = %.2f, bottom = %.2f, left = (%.2f, %.2f)-(%.2f, %.2f), right = (%.2f, %.2f)-(%.2f, %.2f)\n",
+ printf("Trap1: top = %.2f, bottom = %.2f, left = (%.2f, %.2f)-(%.2f, %.2f), right = (%.2f, %.2f)-(%.2f, %.2f)\n",
traps[0].top / 65536.0, traps[0].bottom / 65536.0,
traps[0].left.p1.x / 65536.0, traps[0].left.p1.y / 65536.0, traps[0].left.p2.x / 65536.0, traps[0].left.p2.y / 65536.0,
traps[0].right.p1.x / 65536.0, traps[0].right.p1.y / 65536.0, traps[0].right.p2.x / 65536.0, traps[0].right.p2.y / 65536.0);
- printf("Trap2: top = %.2f, bottom = %.2f, left = (%.2f, %.2f)-(%.2f, %.2f), right = (%.2f, %.2f)-(%.2f, %.2f)\n",
+ printf("Trap2: top = %.2f, bottom = %.2f, left = (%.2f, %.2f)-(%.2f, %.2f), right = (%.2f, %.2f)-(%.2f, %.2f)\n",
traps[1].top / 65536.0, traps[1].bottom / 65536.0,
traps[1].left.p1.x / 65536.0, traps[1].left.p1.y / 65536.0, traps[1].left.p2.x / 65536.0, traps[1].left.p2.y / 65536.0,
traps[1].right.p1.x / 65536.0, traps[1].right.p1.y / 65536.0, traps[1].right.p2.x / 65536.0, traps[1].right.p2.y / 65536.0);
- printf("Trap3: top = %.2f, bottom = %.2f, left = (%.2f, %.2f)-(%.2f, %.2f), right = (%.2f, %.2f)-(%.2f, %.2f)\n",
+ printf("Trap3: top = %.2f, bottom = %.2f, left = (%.2f, %.2f)-(%.2f, %.2f), right = (%.2f, %.2f)-(%.2f, %.2f)\n",
traps[2].top / 65536.0, traps[2].bottom / 65536.0,
traps[2].left.p1.x / 65536.0, traps[2].left.p1.y / 65536.0, traps[2].left.p2.x / 65536.0, traps[2].left.p2.y / 65536.0,
traps[2].right.p1.x / 65536.0, traps[2].right.p1.y / 65536.0, traps[2].right.p2.x / 65536.0, traps[2].right.p2.y / 65536.0);
XRenderCompositeTrapezoids(xGlobalDisplay, PictOpOver, xSurface.colorPicture, xSurface.picture, None, 0, 0, traps, nTraps);
}
else
- XDrawLine(xGlobalDisplay, (int)xDisplay.pixmap, xDisplay.gc,
+ XDrawLine(xGlobalDisplay, (Pixmap)xDisplay.pixmap, xDisplay.gc,
x1 + surface.offset.x,
y1 + surface.offset.y,
x2 + surface.offset.x,
void Rectangle(Display display, Surface surface,int x1,int y1,int x2,int y2)
{
- XDisplay xDisplay = display.driverData;
+ XDisplay xDisplay = display ? display.driverData : null;
XSurface xSurface = surface.driverData;
-
- if(xSurface.foreground.a < 255)
+
+ if(!xDisplay || xSurface.foreground.a < 255)
{
DrawLine(display, surface,x1,y1,x2-1,y1);
DrawLine(display, surface,x2,y1,x2,y2-1);
DrawLine(display, surface,x1,y1+1,x1,y2-1);
}
else
- XDrawRectangle(xGlobalDisplay, (int)xDisplay.pixmap, xDisplay.gc,
+ XDrawRectangle(xGlobalDisplay, (Pixmap)xDisplay.pixmap, xDisplay.gc,
x1 + surface.offset.x,
y1 + surface.offset.y,
x2 - x1, y2 - y1);
void Area(Display display, Surface surface,int x1,int y1,int x2,int y2)
{
- XDisplay xDisplay = display.driverData;
+ XDisplay xDisplay = display ? display.driverData : null;
XSurface xSurface = surface.driverData;
- if(xSurface.background.a < 255)
+ if(!xDisplay || xSurface.background.a < 255)
{
XRenderColor renderColor =
{
(uint16)(xSurface.background.color.r * xSurface.background.a),
(uint16)(xSurface.background.color.g * xSurface.background.a),
(uint16)(xSurface.background.color.b * xSurface.background.a),
- (uint16)xSurface.background.a * 255
+ (uint16)(xSurface.background.a * 255)
};
x1 += surface.offset.x;
y1 += surface.offset.y;
}
else
{
- XSetForeground(xGlobalDisplay, xDisplay.gc, (xSystemPixelFormat == pixelFormat888) ? xSurface.background :
+ XSetForeground(xGlobalDisplay, xDisplay.gc, (xSystemPixelFormat == pixelFormat888) ? xSurface.background :
((xSystemPixelFormat == pixelFormat565) ? ((Color565)xSurface.background) : ((Color555)xSurface.background)));
- XFillRectangle(xGlobalDisplay, (int) xDisplay.pixmap, xDisplay.gc,
+ XFillRectangle(xGlobalDisplay, (Pixmap) xDisplay.pixmap, xDisplay.gc,
x1 + surface.offset.x,
y1 + surface.offset.y,
x2 - x1 + 1, y2 - y1 + 1);
- XSetForeground(xGlobalDisplay, xDisplay.gc, (xSystemPixelFormat == pixelFormat888) ? xSurface.foreground :
+ XSetForeground(xGlobalDisplay, xDisplay.gc, (xSystemPixelFormat == pixelFormat888) ? xSurface.foreground :
((xSystemPixelFormat == pixelFormat565) ? ((Color565)xSurface.foreground) : ((Color555)xSurface.foreground)));
}
}
-
+
void Clear(Display display, Surface surface, ClearType flags)
{
if(flags != depthBuffer)
{
- XDisplay xDisplay = display.driverData;
+ // XDisplay xDisplay = display.driverData;
XSurface xSurface = surface.driverData;
if(xSurface.background.a < 255)
{
(uint16)(xSurface.background.color.r * xSurface.background.a),
(uint16)(xSurface.background.color.g * xSurface.background.a),
(uint16)(xSurface.background.color.b * xSurface.background.a),
- (uint16)xSurface.background.a * 255
+ (uint16)(xSurface.background.a * 255)
};
x1 += surface.offset.x;
y1 += surface.offset.y;
}
else
Area(display, surface,surface.box.left,surface.box.top,surface.box.right,surface.box.bottom);
- }
+ }
}
bool ConvertBitmap(DisplaySystem displaySystem, Bitmap src, PixelFormat format, ColorAlpha * palette)
}
}
- bitmap.stride = stride;
+ bitmap.stride = stride;
bitmap.width = width;
bitmap.height = height;
bitmap.size = (uint)stride * (uint)height;
}
if(xSurface.xOffset)
{
- XTransform transform =
+ XTransform transform =
{
{
{ (int)(1.0f * (1<<16)), (int)(0.0f * (1<<16)), -(xSurface.xOffset << 10) },
}
};
// printf("XOffset: %d\n", xSurface.xOffset);
- XRenderSetPictureTransform(xGlobalDisplay, xBitmap.picture, &transform);
+ XRenderSetPictureTransform(xGlobalDisplay, xBitmap.picture, &transform);
}
if(src.alphaBlend || display.alphaBlend)
XRenderComposite(xGlobalDisplay, PictOpOver, xBitmap.picture, xBitmap.maskPicture, xSurface.picture, sx, sy, sx, sy, dx, dy, w, h);
}
else
- XCopyArea(xGlobalDisplay, (int)xBitmap.pixmap, (int)xSurface.pixmap, xDisplay.gc,
+ XCopyArea(xGlobalDisplay, (Pixmap)xBitmap.pixmap, (Pixmap)xSurface.pixmap, xDisplay.gc,
sx, sy, w, h, dx, dy);
if(xSurface.xOffset)
void Stretch(Display display, Surface surface, Bitmap src, int dx, int dy, int sx, int sy, int w, int h, int sw, int sh)
{
- XDisplay xDisplay = display.driverData;
XSurface xSurface = surface.driverData;
XBitmap xBitmap = src.driverData;
if(xBitmap)
{
- XTransform transform =
+ XTransform transform =
{
{
{ (int)((float)sw / w * (1<<16)), (int)(0.0f * (1<<16)), (int)(0.0f * (1<<16)) },
void BlitDI(Display display, Surface surface, Bitmap src, int dx, int dy, int sx, int sy, int w, int h)
{
XImage image = { 0 };
- XDisplay xDisplay = display.driverData;
+ XDisplay xDisplay = display ? display.driverData : null;
XSurface xSurface = surface.driverData;
bool flip;
- if(!src.picture || !ClipBlitCoords(surface, src, &dx, &dy, &sx, &sy, &w, &h, &flip))
+ if(!xDisplay || !src.picture || !ClipBlitCoords(surface, src, &dx, &dy, &sx, &sy, &w, &h, &flip))
return;
if(src.pixelFormat == display.pixelFormat)
image.bytes_per_line = ((src.pixelFormat == pixelFormat888) ? 4 : 2) * src.stride;
image.bits_per_pixel = (src.pixelFormat == pixelFormat888) ? 32 : 16;
- image.data = src.picture;
+ image.data = (char *)src.picture;
XInitImage(&image);
- XPutImage(xGlobalDisplay, (int)xSurface.pixmap, xDisplay.gc, &image,
+ XPutImage(xGlobalDisplay, (Pixmap)xSurface.pixmap, xDisplay.gc, &image,
sx, sy, dx + surface.offset.x, dy + surface.offset.y, w,h);
}
else
image.bytes_per_line = ((temp.pixelFormat == pixelFormat888) ? 4 : 2) * temp.stride;
image.bits_per_pixel = (temp.pixelFormat == pixelFormat888) ? 32 : 16;
- image.data = temp.picture;
+ image.data = (char *)temp.picture;
XInitImage(&image);
if(!src.transparent)
{
// printf("Stride: %d, dx: %d, dy: %d, w: %d, h: %d, %d\n", temp.stride, dx + surface.offset.x, dy + surface.offset.y, w,h, xSystemDepth);
- XPutImage(xGlobalDisplay, (int)xSurface.pixmap, xDisplay.gc, &image,
+ XPutImage(xGlobalDisplay, (Pixmap)xSurface.pixmap, xDisplay.gc, &image,
0, 0, dx + surface.offset.x, dy + surface.offset.y, w,h);
}
else
GC maskGC = 0, gc = 0;
Pixmap pixmap, mask;
- pixmap = XCreatePixmap(xGlobalDisplay, (int)confineWindow /*display.window*/, w, h, xSystemDepth /*24*/);
- mask = XCreatePixmap(xGlobalDisplay, (int)confineWindow /*display.window*/, w, h, 1);
+ pixmap = XCreatePixmap(xGlobalDisplay, (X11Window)confineWindow /*display.window*/, w, h, xSystemDepth /*24*/);
+ mask = XCreatePixmap(xGlobalDisplay, (X11Window)confineWindow /*display.window*/, w, h, 1);
gc = XCreateGC(xGlobalDisplay, pixmap, 0, null);
maskGC = XCreateGC(xGlobalDisplay, mask, 0, null);
}
}
}
-
+
XFreeGC(xGlobalDisplay, maskGC);
#else
GC gc = 0;
Pixmap pixmap, mask;
- pixmap = XCreatePixmap(xGlobalDisplay, (int)confineWindow /*display.window*/, w, h, xSystemDepth /*24*/);
- mask = XCreatePixmap(xGlobalDisplay, (int)confineWindow /*display.window*/, w, h, 1);
+ pixmap = XCreatePixmap(xGlobalDisplay, (X11Window)confineWindow /*display.window*/, w, h, xSystemDepth /*24*/);
+ mask = XCreatePixmap(xGlobalDisplay, (X11Window)confineWindow /*display.window*/, w, h, 1);
gc = XCreateGC(xGlobalDisplay, pixmap, 0, null);
XSetGraphicsExposures(xGlobalDisplay, gc, False);
XPutImage(xGlobalDisplay, pixmap, gc, &image, 0, 0, 0, 0, w,h);
-
+
PutBitmapMask(mask, temp);
#endif
XSetClipMask(xGlobalDisplay, xDisplay.gc, mask);
XSetClipOrigin(xGlobalDisplay, xDisplay.gc, dx + surface.offset.x, dy + surface.offset.y);
- XCopyArea(xGlobalDisplay, pixmap, (int)xSurface.pixmap, xDisplay.gc, 0, 0, w, h, dx + surface.offset.x, dy + surface.offset.y);
+ XCopyArea(xGlobalDisplay, pixmap, (Pixmap)xSurface.pixmap, xDisplay.gc, 0, 0, w, h, dx + surface.offset.x, dy + surface.offset.y);
XSetClipOrigin(xGlobalDisplay, xDisplay.gc, 0, 0);
{
XRectangle rectangle;
image.bytes_per_line = ((temp.pixelFormat == pixelFormat888) ? 4 : 2) * temp.stride;
image.bits_per_pixel = (temp.pixelFormat == pixelFormat888) ? 32 : 16;
- image.data = temp.picture;
+ image.data = (char *)temp.picture;
XInitImage(&image);
-
+
// printf("Blitting DI\n");
- XPutImage(xGlobalDisplay, (int)xSurface.pixmap, xDisplay.gc, &image,
+ XPutImage(xGlobalDisplay, (Pixmap)xSurface.pixmap, xDisplay.gc, &image,
0, 0, dx + surface.offset.x, dy + surface.offset.y, w,h);
delete s;
image.bytes_per_line = ((temp.pixelFormat == pixelFormat888) ? 4 : 2) * temp.stride;
image.bits_per_pixel = (temp.pixelFormat == pixelFormat888) ? 32 : 16;;
- image.data = temp.picture;
+ image.data = (char *)temp.picture;
XInitImage(&image);
-
+
// printf("Blitting DI\n");
- XPutImage(xGlobalDisplay, (int)xSurface.pixmap, xDisplay.gc, &image,
+ XPutImage(xGlobalDisplay, (Pixmap)xSurface.pixmap, xDisplay.gc, &image,
0, 0, dx + surface.offset.x, dy + surface.offset.y, w,h);
delete s;
}
}
- Font LoadFont(DisplaySystem displaySystem, char * faceName, float size, FontFlags flags)
+ Font LoadFont(DisplaySystem displaySystem, const char * faceName, float size, FontFlags flags)
{
Font font;
font = ((subclass(DisplayDriver))class(LFBDisplayDriver)).LoadFont(displaySystem, faceName, size, flags);
#define CHAR_WIDTH 6
#define CHAR_HEIGHT 14
- void WriteText(Display display, Surface surface, int x, int y, char * text, int len)
+ void WriteText(Display display, Surface surface, int x, int y, const char * text, int len)
{
XSurface xSurface = surface.driverData;
- XDisplay xDisplay = display.driverData;
+ //XDisplay xDisplay = display.driverData;
int tw, th;
-
+
((subclass(DisplayDriver))class(LFBDisplayDriver)).TextExtent(display, surface, text, len, &tw, &th);
if(xSurface.opaque)
{
#if 0
XSetForeground(xGlobalDisplay, xDisplay.gc, xSurface.background);
- XFillRectangle(xGlobalDisplay, (int)xDisplay.pixmap, xDisplay.gc,
+ XFillRectangle(xGlobalDisplay, (Pixmap)xDisplay.pixmap, xDisplay.gc,
x + surface.offset.x, y + surface.offset.y,
tw /*len * CHAR_WIDTH*/, th /*CHAR_HEIGHT*/);
(uint16)xSurface.background.a
};
//printf("Filling rectangle\n");
- XRenderFillRectangle(xGlobalDisplay, PictOpSrc /*PictOpOver*/, xSurface.picture, &renderColor,
+ XRenderFillRectangle(xGlobalDisplay, PictOpSrc /*PictOpOver*/, xSurface.picture, &renderColor,
x + surface.offset.x, y + surface.offset.y, tw, th);
}
/*
- XDrawString(xGlobalDisplay, (int)xDisplay.pixmap, xDisplay.gc,
+ XDrawString(xGlobalDisplay, (Pixmap)xDisplay.pixmap, xDisplay.gc,
x + surface.offset.x, y + surface.offset.y + 12, text, len);
*/
((subclass(DisplayDriver))class(LFBDisplayDriver)).WriteText(display, surface, x, y, text, len);
}
- void TextExtent(Display display, Surface surface, char * text, int len, int * width, int * height)
+ void TextExtent(Display display, Surface surface, const char * text, int len, int * width, int * height)
{
XSurface xSurface = surface.driverData;
/*
FontExtent(display.displaySystem, xSurface.font, text, len, width, height);
}
- void FontExtent(DisplaySystem displaySystem, Font font, char * text, int len, int * width, int * height)
+ void FontExtent(DisplaySystem displaySystem, Font font, const char * text, int len, int * width, int * height)
{
/*
if(width) *width = len * CHAR_WIDTH;
void LineStipple(Display display, Surface surface, uint stipple)
{
- XSurface xSurface = surface.driverData;
XDisplay xDisplay = display.driverData;
char list[32] = { 0 };
int count = 0;
XSetClipRectangles(xGlobalDisplay, xDisplay.gc, 0,0, &rectangle, 1, YXBanded);
}
/*if(display.alphaBlend)
- XRenderComposite(xGlobalDisplay, PictOpSrc, xDisplay.picture, None, xDisplay.windowPicture, box->left, box->top, 0, 0, box->left, box->top,
+ XRenderComposite(xGlobalDisplay, PictOpSrc, xDisplay.picture, None, xDisplay.windowPicture, box->left, box->top, 0, 0, box->left, box->top,
box->right - box->left + 1, box->bottom - box->top + 1);
else*/
- XCopyArea(xGlobalDisplay, (int)xDisplay.pixmap, (int)display.window, xDisplay.gc /*windowGC*/,
- box->left, box->top,
- box->right - box->left + 1,
+ XCopyArea(xGlobalDisplay, (Pixmap)xDisplay.pixmap, (X11Window)display.window, xDisplay.gc /*windowGC*/,
+ box->left, box->top,
+ box->right - box->left + 1,
box->bottom - box->top + 1,
box->left, box->top);
if(display.alphaBlend)
{
Box * box = &xDisplay.updateBox;
- XRenderComposite(xGlobalDisplay, PictOpSrc, xDisplay.picture, None, xDisplay.shapePicture, box->left, box->top, 0, 0, box->left, box->top,
+ XRenderComposite(xGlobalDisplay, PictOpSrc, xDisplay.picture, None, xDisplay.shapePicture, box->left, box->top, 0, 0, box->left, box->top,
box->right - box->left + 1, box->bottom - box->top + 1);
#if !defined(__APPLE__) && !defined(__OLDX__)
- XShapeCombineMask(xGlobalDisplay, (uint)display.window, ShapeInput, 0, 0, xDisplay.shapePixmap, ShapeSet);
+ XShapeCombineMask(xGlobalDisplay, (X11Window)display.window, ShapeInput, 0, 0, xDisplay.shapePixmap, ShapeSet);
#else
- XShapeCombineMask(xGlobalDisplay, (uint)display.window, 2, 0, 0, xDisplay.shapePixmap, ShapeSet);
+ XShapeCombineMask(xGlobalDisplay, (X11Window)display.window, 2, 0, 0, xDisplay.shapePixmap, ShapeSet);
#endif
}
}
}
-default dllexport int __attribute__((stdcall)) IS_XGetPixmap(Bitmap bitmap)
+default dllexport long IS_XGetPixmap(Bitmap bitmap)
{
XBitmap xBitmap = bitmap.driverData;
return xBitmap.pixmap;
}
-default dllexport void __attribute__((stdcall)) IS_XGetSurfaceInfo(Surface surface, Pixmap * pixmap, GC * gc, int *x, int * y)
+default dllexport void IS_XGetSurfaceInfo(Surface surface, Pixmap * pixmap, GC * gc, int *x, int * y)
{
Display display = surface.display;
XDisplay xDisplay = display.driverData;