ref: d56a6fadc5118e7fddba6294245a355ef2d3def9
parent: def87d60167d13c92328b6f0f81800787eedf03a
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Tue Nov 12 16:42:05 EST 2013
libmemdraw: change memimageinit() to return integer error (for kernel), minor cleanups
--- a/sys/include/memdraw.h
+++ b/sys/include/memdraw.h
@@ -149,7 +149,7 @@
extern Rectangle memlinebbox(Point, Point, int, int, int);
extern int memlineendsize(int);
extern void _memmkcmap(void);
-extern void memimageinit(void);
+extern int memimageinit(void);
/*
* Subfont management
--- a/sys/man/2/memdraw
+++ b/sys/man/2/memdraw
@@ -94,7 +94,7 @@
.PP
.ft L
.nf
-void memimageinit(void)
+int memimageinit(void)
ulong* wordaddr(Memimage *i, Point p)
uchar* byteaddr(Memimage *i, Point p)
void memimagemove(void *from, void *to)
@@ -213,7 +213,8 @@
and
.BR memwhite .
It should be called before referring to any of these images
-and before calling any of the other library functions.
+and before calling any of the other library functions. It
+returns non-zero on error.
.PP
Each
.B Memimage
--- a/sys/src/libmemdraw/alloc.c
+++ b/sys/src/libmemdraw/alloc.c
@@ -121,7 +121,7 @@
{if(i == nil)
return;
- if(i->data->ref-- == 1 && i->data->allocd){+ if(--i->data->ref == 0 && i->data->allocd){if(i->data->base)
poolfree(imagmem, i->data->base);
free(i->data);
--- a/sys/src/libmemdraw/draw.c
+++ b/sys/src/libmemdraw/draw.c
@@ -6,7 +6,6 @@
extern Pool* imagmem;
int drawdebug;
-static int tablesbuilt;
/* perfect approximation to NTSC = .299r+.587g+.114b when 0 ≤ r,g,b < 256 */
#define RGB2K(r,g,b) ((156763*(r)+307758*(g)+59769*(b))>>19)
@@ -54,16 +53,15 @@
int _ifmt(Fmt*);
-void
+int
memimageinit(void)
{static int didinit = 0;
if(didinit)
- return;
+ return 0;
- didinit = 1;
-
+ if(imagmem != nil)
if(strcmp(imagmem->name, "Image") == 0 || strcmp(imagmem->name, "image") == 0)
imagmem->move = memimagemove;
@@ -75,22 +73,25 @@
fmtinstall('b', _ifmt);memones = allocmemimage(Rect(0,0,1,1), GREY1);
+ memzeros = allocmemimage(Rect(0,0,1,1), GREY1);
+ if(memones == nil || memzeros == nil)
+ return -1;
+
memones->flags |= Frepl;
memones->clipr = Rect(-0x3FFFFFF, -0x3FFFFFF, 0x3FFFFFF, 0x3FFFFFF);
*byteaddr(memones, ZP) = ~0;
- memzeros = allocmemimage(Rect(0,0,1,1), GREY1);
memzeros->flags |= Frepl;
memzeros->clipr = Rect(-0x3FFFFFF, -0x3FFFFFF, 0x3FFFFFF, 0x3FFFFFF);
*byteaddr(memzeros, ZP) = 0;
- if(memones == nil || memzeros == nil)
- assert(0 /*cannot initialize memimage library */); /* RSC BUG */
-
memwhite = memones;
memblack = memzeros;
memopaque = memones;
memtransparent = memzeros;
+
+ didinit = 1;
+ return 0;
}
static ulong imgtorgba(Memimage*, ulong);
@@ -354,13 +355,6 @@
{int i, j, mask, sh, small;
- if(tablesbuilt)
- return;
-
- fmtinstall('R', Rfmt);- fmtinstall('P', Pfmt);- tablesbuilt = 1;
-
/* bit replication up to 8 bits */
for(i=0; i<256; i++){ for(j=0; j<=8; j++){ /* j <= 8 [sic] */--- a/sys/src/libmemdraw/fillpoly.c
+++ b/sys/src/libmemdraw/fillpoly.c
@@ -79,7 +79,7 @@
Point p0;
int i;
- if(nvert == 0)
+ if(nvert <= 0)
return;
seg = malloc((nvert+2)*sizeof(Seg*));
--
⑨