10 #if GFX_USE_GDISP && GDISP_NEED_IMAGE && GDISP_NEED_IMAGE_NATIVE
18 #define BLIT_BUFFER_SIZE_NATIVE 32
20 #define HEADER_SIZE_NATIVE 8
21 #define FRAME0POS_NATIVE (HEADER_SIZE_NATIVE)
26 void *gdispImageAlloc(
gImage *img, gMemSize sz);
27 void gdispImageFree(
gImage *img,
void *ptr, gMemSize sz);
29 typedef struct gdispImagePrivate_NATIVE {
31 gPixel buf[BLIT_BUFFER_SIZE_NATIVE];
32 } gdispImagePrivate_NATIVE;
34 void gdispImageClose_NATIVE(
gImage *img) {
35 gdispImagePrivate_NATIVE * priv;
37 priv = (gdispImagePrivate_NATIVE *)img->priv;
39 if (priv->frame0cache)
40 gdispImageFree(img, (
void *)priv->frame0cache, img->width * img->height *
sizeof(
gPixel));
41 gdispImageFree(img, (
void *)priv,
sizeof(gdispImagePrivate_NATIVE));
47 gU8 hdr[HEADER_SIZE_NATIVE];
51 return GDISP_IMAGE_ERR_BADFORMAT;
53 if (hdr[0] !=
'N' || hdr[1] !=
'I')
54 return GDISP_IMAGE_ERR_BADFORMAT;
56 if (hdr[6] != GDISP_PIXELFORMAT/256 || hdr[7] != (GDISP_PIXELFORMAT & 0xFF))
57 return GDISP_IMAGE_ERR_UNSUPPORTED;
61 img->width = (((gU16)hdr[2])<<8) | (hdr[3]);
62 img->height = (((gU16)hdr[4])<<8) | (hdr[5]);
63 if (img->width < 1 || img->height < 1)
64 return GDISP_IMAGE_ERR_BADDATA;
65 if (!(img->priv = gdispImageAlloc(img,
sizeof(gdispImagePrivate_NATIVE))))
66 return GDISP_IMAGE_ERR_NOMEMORY;
67 ((gdispImagePrivate_NATIVE *)(img->priv))->frame0cache = 0;
69 img->type = GDISP_IMAGE_TYPE_NATIVE;
70 return GDISP_IMAGE_ERR_OK;
75 gdispImagePrivate_NATIVE * priv;
78 priv = (gdispImagePrivate_NATIVE *)img->priv;
79 if (priv->frame0cache)
80 return GDISP_IMAGE_ERR_OK;
83 len = img->width * img->height *
sizeof(
gPixel);
84 priv->frame0cache = (
gPixel *)gdispImageAlloc(img, len);
85 if (!priv->frame0cache)
86 return GDISP_IMAGE_ERR_NOMEMORY;
90 if (
gfileRead(img->f, priv->frame0cache, len) != len)
91 return GDISP_IMAGE_ERR_BADDATA;
93 return GDISP_IMAGE_ERR_OK;
100 gdispImagePrivate_NATIVE * priv;
102 priv = (gdispImagePrivate_NATIVE *)img->priv;
105 if (sx >= img->width || sy >= img->height)
return GDISP_IMAGE_ERR_OK;
106 if (sx + cx > img->width) cx = img->width - sx;
107 if (sy + cy > img->height) cy = img->height - sy;
110 if (priv->frame0cache) {
111 gdispGBlitArea(g, x, y, cx, cy, sx, sy, img->width, priv->frame0cache);
112 return GDISP_IMAGE_ERR_OK;
116 pos = FRAME0POS_NATIVE + (img->width * sy + sx) *
sizeof(
gPixel);
124 for(mx = x, mcx = cx; mcx > 0; mcx -= len, mx += len) {
128 mcx > BLIT_BUFFER_SIZE_NATIVE ? (BLIT_BUFFER_SIZE_NATIVE*
sizeof(
gPixel)) : (mcx *
sizeof(
gPixel)))
131 return GDISP_IMAGE_ERR_BADDATA;
138 pos += img->width*
sizeof(
gPixel);
141 return GDISP_IMAGE_ERR_OK;
144 gDelay gdispImageNext_NATIVE(
gImage *img) {
148 return gDelayForever;
GDISP image support routines header file.
void gdispGBlitArea(GDisplay *g, gCoord x, gCoord y, gCoord cx, gCoord cy, gCoord srcx, gCoord srcy, gCoord srccx, const gPixel *buffer)
Fill an area using the supplied bitmap.
gColor gPixel
The pixel format.
gI16 gCoord
The type for a coordinate or length on the screen.
gBool gfileSetPos(GFILE *f, gFileSize pos)
Set the position of the read/write cursor.
gMemSize gfileRead(GFILE *f, void *buf, gMemSize len)
Read from file.
gU16 gdispImageError
An image error code.
The structure for an image.