Add some buffer management routines

This commit is contained in:
Sasha Koshka
2023-11-06 02:53:19 -05:00
parent e042d5b45e
commit e6ca2a97fc
4 changed files with 124 additions and 1 deletions

61
libXmd/src/Buffer.c Normal file
View File

@@ -0,0 +1,61 @@
#include <Xmd/Buffer.h>
#include <stdlib.h>
#include <string.h>
#define XmdBUFFER_GROWTH_FACTOR 2
struct _XmdBuffer {
void * data;
size_t element;
size_t length;
size_t capacity;
};
static void XmdBufferResize (XmdBuffer *buffer, size_t length);
static void XmdBufferFit (XmdBuffer *buffer);
static void *XmdBufferOffset (XmdBuffer *buffer, size_t index);
XmdBuffer *XmdBufferNew (size_t element) {
XmdBuffer *buffer = calloc(1, sizeof(XmdBuffer));
buffer->element = element;
buffer->capacity = 1;
XmdBufferFit(buffer);
return buffer;
}
void XmdBufferResize (XmdBuffer *buffer, size_t length) {
buffer->length = length;
XmdBufferFit(buffer);
}
void XmdBufferFit (XmdBuffer *buffer) {
if (buffer->length > buffer->capacity) {
buffer->capacity *= XmdBUFFER_GROWTH_FACTOR;
buffer->data = realloc (
buffer->data,
buffer->capacity * buffer->element);
}
}
void *XmdBufferOffset (XmdBuffer *buffer, size_t index) {
return buffer->data + (index * buffer->element);
}
void XmdBufferPush (XmdBuffer *buffer, void *element) {
XmdBufferResize(buffer, buffer->length + 1);
memcpy (
XmdBufferOffset(buffer, buffer->length - 1),
element,
buffer->element);
}
void *XmdBufferBreak (XmdBuffer *buffer) {
void *data = buffer->data;
free(buffer);
return data;
}
void XmdBufferFree (XmdBuffer *buffer) {
free(buffer->data);
free(buffer);
}

37
libXmd/src/Icon.c Normal file
View File

@@ -0,0 +1,37 @@
#include <Xmd/Icon.h>
Pixmap _XmdLoadBitmapIcon (Widget widget, unsigned char *bits, int width, int height) {
Pixel fg, bg;
XtVaGetValues (widget,
XmNforeground, &fg,
XmNbackground, &bg,
NULL);
return XCreatePixmapFromBitmapData (
XtDisplay (widget),
RootWindowOfScreen(XtScreen(widget)),
(char *)(bits), width, height,
fg, bg, DefaultDepthOfScreen(XtScreen(widget)));
}
Pixmap XmdReadBitmapFile (Widget widget, const char *filename) {
Pixel fg, bg;
XtVaGetValues (widget,
XmNforeground, &fg,
XmNbackground, &bg,
NULL);
unsigned int width, height;
unsigned char *data;
int garbage;
XReadBitmapFileData (
filename,
&width, &height,
&data,
&garbage, &garbage);
Pixmap result = XCreatePixmapFromBitmapData (
XtDisplay (widget),
RootWindowOfScreen(XtScreen(widget)),
(char *)(data), width, height,
fg, bg, DefaultDepthOfScreen(XtScreen(widget)));
XFree(data);
return result;
}