mirror of
https://gitea.nishi.boats/pyrite-dev/milsko
synced 2026-01-08 02:13:29 +00:00
pixmap works
git-svn-id: http://svn2.nishi.boats/svn/milsko/trunk@70 b9cfdab3-6d41-4d17-bbe4-086880011989
This commit is contained in:
@@ -64,8 +64,6 @@ int main() {
|
|||||||
MwNbackground, "#66f",
|
MwNbackground, "#66f",
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
MwVaCreateWidget(MwFrameClass, "frame", window, 50, 50, 300, 300, NULL);
|
|
||||||
|
|
||||||
MwAddUserHandler(window, MwNresizeHandler, resize, NULL);
|
MwAddUserHandler(window, MwNresizeHandler, resize, NULL);
|
||||||
MwAddUserHandler(button, MwNactivateHandler, handler, NULL);
|
MwAddUserHandler(button, MwNactivateHandler, handler, NULL);
|
||||||
MwAddUserHandler(button2, MwNactivateHandler, handler, NULL);
|
MwAddUserHandler(button2, MwNactivateHandler, handler, NULL);
|
||||||
|
|||||||
20
src/frame.c
20
src/frame.c
@@ -1,25 +1,8 @@
|
|||||||
/* $Id$ */
|
/* $Id$ */
|
||||||
#include <Mw/Milsko.h>
|
#include <Mw/Milsko.h>
|
||||||
|
|
||||||
MwLLPixmap pixmap;
|
|
||||||
|
|
||||||
static void create(MwWidget handle) {
|
static void create(MwWidget handle) {
|
||||||
MwSetDefault(handle);
|
MwSetDefault(handle);
|
||||||
|
|
||||||
int y, x;
|
|
||||||
unsigned char* dat = malloc(640 * 480 * 3);
|
|
||||||
for(y = 0; y < 480; y++) {
|
|
||||||
for(x = 0; x < 640; x++) {
|
|
||||||
unsigned char* px = &dat[(y * 640 + x) * 3];
|
|
||||||
double c = (double)x / 640 * 255 / 2 + (double)y / 480 * 255 / 2;
|
|
||||||
|
|
||||||
px[0] = c;
|
|
||||||
px[1] = 0;
|
|
||||||
px[2] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pixmap = MwLLCreatePixmap(handle->lowlevel, dat, 640, 480);
|
|
||||||
free(dat);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void draw(MwWidget handle) {
|
static void draw(MwWidget handle) {
|
||||||
@@ -33,8 +16,7 @@ static void draw(MwWidget handle) {
|
|||||||
|
|
||||||
MwDrawFrameEx(handle, &r, base, 1, 1);
|
MwDrawFrameEx(handle, &r, base, 1, 1);
|
||||||
MwDrawFrameEx(handle, &r, base, 0, 1);
|
MwDrawFrameEx(handle, &r, base, 0, 1);
|
||||||
MwLLDrawPixmap(handle->lowlevel, &r, pixmap);
|
MwDrawRect(handle, &r, base);
|
||||||
// MwDrawRect(handle, &r, base);
|
|
||||||
|
|
||||||
MwLLFreeColor(base);
|
MwLLFreeColor(base);
|
||||||
}
|
}
|
||||||
|
|||||||
59
src/x11.c
59
src/x11.c
@@ -144,12 +144,19 @@ MwLLPixmap MwLLCreatePixmap(MwLL handle, unsigned char* data, int width, int hei
|
|||||||
MwLLPixmap r = malloc(sizeof(*r));
|
MwLLPixmap r = malloc(sizeof(*r));
|
||||||
char* d = malloc(4 * width * height);
|
char* d = malloc(4 * width * height);
|
||||||
int y, x;
|
int y, x;
|
||||||
|
int evbase, erbase;
|
||||||
|
|
||||||
r->width = width;
|
r->width = width;
|
||||||
r->height = height;
|
r->height = height;
|
||||||
r->display = handle->display;
|
r->display = handle->display;
|
||||||
r->use_shm = XShmQueryExtension(handle->display) ? 1 : 0;
|
r->use_shm = XShmQueryExtension(handle->display) ? 1 : 0;
|
||||||
|
|
||||||
|
if(!XRenderQueryExtension(handle->display, &evbase, &erbase)) {
|
||||||
|
fprintf(stderr, "XRender missing - cannot proceed pixmap creation\n");
|
||||||
|
r->image = NULL;
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
if(r->use_shm) {
|
if(r->use_shm) {
|
||||||
r->image = XShmCreateImage(handle->display, DefaultVisual(handle->display, DefaultScreen(handle->display)), 24, ZPixmap, NULL, &r->shm, width, height);
|
r->image = XShmCreateImage(handle->display, DefaultVisual(handle->display, DefaultScreen(handle->display)), 24, ZPixmap, NULL, &r->shm, width, height);
|
||||||
free(d);
|
free(d);
|
||||||
@@ -163,7 +170,7 @@ MwLLPixmap MwLLCreatePixmap(MwLL handle, unsigned char* data, int width, int hei
|
|||||||
}
|
}
|
||||||
|
|
||||||
for(y = 0; y < height; y++) {
|
for(y = 0; y < height; y++) {
|
||||||
for(x = 0; x < height; x++) {
|
for(x = 0; x < width; x++) {
|
||||||
unsigned char* px = &data[(y * width + x) * 3];
|
unsigned char* px = &data[(y * width + x) * 3];
|
||||||
unsigned long p = 0;
|
unsigned long p = 0;
|
||||||
p <<= 8;
|
p <<= 8;
|
||||||
@@ -180,13 +187,15 @@ MwLLPixmap MwLLCreatePixmap(MwLL handle, unsigned char* data, int width, int hei
|
|||||||
}
|
}
|
||||||
|
|
||||||
void MwLLDestroyPixmap(MwLLPixmap pixmap) {
|
void MwLLDestroyPixmap(MwLLPixmap pixmap) {
|
||||||
if(pixmap->use_shm) {
|
if(pixmap->image != NULL) {
|
||||||
XShmDetach(pixmap->display, &pixmap->shm);
|
if(pixmap->use_shm) {
|
||||||
}
|
XShmDetach(pixmap->display, &pixmap->shm);
|
||||||
XDestroyImage(pixmap->image);
|
}
|
||||||
if(pixmap->use_shm) {
|
XDestroyImage(pixmap->image);
|
||||||
shmdt(pixmap->shm.shmaddr);
|
if(pixmap->use_shm) {
|
||||||
shmctl(pixmap->shm.shmid, IPC_RMID, 0);
|
shmdt(pixmap->shm.shmaddr);
|
||||||
|
shmctl(pixmap->shm.shmid, IPC_RMID, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
free(pixmap);
|
free(pixmap);
|
||||||
@@ -194,10 +203,40 @@ void MwLLDestroyPixmap(MwLLPixmap pixmap) {
|
|||||||
|
|
||||||
void MwLLDrawPixmap(MwLL handle, MwRect* rect, MwLLPixmap pixmap) {
|
void MwLLDrawPixmap(MwLL handle, MwRect* rect, MwLLPixmap pixmap) {
|
||||||
if(pixmap->image != NULL) {
|
if(pixmap->image != NULL) {
|
||||||
|
Pixmap px = XCreatePixmap(handle->display, handle->window, pixmap->width, pixmap->height, 24);
|
||||||
|
XRenderPictFormat* format = XRenderFindStandardFormat(handle->display, PictStandardRGB24);
|
||||||
|
XRenderPictureAttributes attr;
|
||||||
|
Picture src, dest;
|
||||||
|
XTransform m;
|
||||||
|
double xsc = (double)pixmap->width / rect->width;
|
||||||
|
double ysc = (double)pixmap->height / rect->height;
|
||||||
|
|
||||||
|
m.matrix[0][0] = XDoubleToFixed(xsc);
|
||||||
|
m.matrix[0][1] = XDoubleToFixed(0);
|
||||||
|
m.matrix[0][2] = XDoubleToFixed(0);
|
||||||
|
|
||||||
|
m.matrix[1][0] = XDoubleToFixed(0);
|
||||||
|
m.matrix[1][1] = XDoubleToFixed(ysc);
|
||||||
|
m.matrix[1][2] = XDoubleToFixed(0);
|
||||||
|
|
||||||
|
m.matrix[2][0] = XDoubleToFixed(0);
|
||||||
|
m.matrix[2][1] = XDoubleToFixed(0);
|
||||||
|
m.matrix[2][2] = XDoubleToFixed(1.0);
|
||||||
|
|
||||||
|
memset(&attr, 0, sizeof(attr));
|
||||||
|
|
||||||
if(pixmap->use_shm) {
|
if(pixmap->use_shm) {
|
||||||
XShmPutImage(handle->display, handle->window, handle->gc, pixmap->image, 0, 0, rect->x, rect->y, rect->width, rect->height, False);
|
XShmPutImage(handle->display, px, handle->gc, pixmap->image, 0, 0, 0, 0, pixmap->width, pixmap->height, False);
|
||||||
} else {
|
} else {
|
||||||
XPutImage(handle->display, handle->window, handle->gc, pixmap->image, 0, 0, rect->x, rect->y, rect->width, rect->height);
|
XPutImage(handle->display, px, handle->gc, pixmap->image, 0, 0, 0, 0, pixmap->width, pixmap->height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
src = XRenderCreatePicture(handle->display, px, format, 0, &attr);
|
||||||
|
dest = XRenderCreatePicture(handle->display, handle->window, format, 0, &attr);
|
||||||
|
|
||||||
|
XRenderSetPictureTransform(handle->display, src, &m);
|
||||||
|
XRenderComposite(handle->display, PictOpSrc, src, 0, dest, 0, 0, 0, 0, rect->x, rect->y, rect->width, rect->height);
|
||||||
|
|
||||||
|
XFreePixmap(handle->display, px);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user