📄 demo6.c
字号:
/* * Demonstrates loading a binary PPM file and displaying it in a window * as a Pixmap. *//* Comment this definition out if you don't want to use server side pixmaps *//* (it will be slower but will work on device drivers without bitblt) */#define USE_PIXMAPS#include <stdio.h>#include <stdlib.h>#include <string.h>#include <errno.h>#include <nano-X.h>GR_WINDOW_ID window; /* ID for output window */#ifdef USE_PIXMAPSGR_WINDOW_ID pmap; /* ID for pixmap */#endifGR_GC_ID gc; /* Graphics context */int width, height; /* Size of image */unsigned char *data; /* Local copy of image data */void do_exposure(GR_EVENT_EXPOSURE *event){ /* The window has been exposed so redraw it */#ifdef USE_PIXMAPS GrCopyArea(window, gc, 0, 0, width, height, pmap, 0, 0, MWROP_SRCCOPY);#else GrArea(window, gc, 0, 0, width, height, data, MWPF_RGB);#endif}void errorhandler(GR_EVENT *ep){ printf("Error (%s) code %d id %d", ep->error.name, ep->error.code, ep->error.id); exit(1);}int main(int argc, char *argv[]){ unsigned char line[256]; GR_EVENT event; FILE *infile; int i, o; unsigned char *p; if(argc != 2) { printf("Usage: demo6 <filename.ppm>\n"); exit(1); } if(!(infile = fopen(argv[1], "r"))) { printf("Couldn't open \"%s\" for reading: %s\n", argv[1], strerror(errno)); exit(2); } /* Read magic number (P6 = colour, binary encoded PPM file) */ if(!fgets(line, 256, infile)) goto truncated; if(line[0] != 'P' || line[1] != '6') { printf("Unsupported PPM type or not a PPM file.\n"); printf("Please supply a valid P6 format file (colour, with " "binary encoding).\n"); } /* Strip comments */ do { if(!fgets(line, 256, infile)) goto truncated; } while(line[0] == '#'); /* Read width and height */ sscanf(line, "%i %i", &width, &height); /* Read the maximum colour value */ if(!fgets(line, 256, infile)) goto truncated; sscanf(line, "%i", &i); if(i != 255) { printf("Truecolour mode only is supported\n"); exit(4); } /* Calculate how many bytes of image data there is */ i = width * height * 3; /* Calculate how many bytes of data there will be after unpacking */ o = width * height * 4; /* Allocate the space to store the data whilst it's being loaded */ if(!(data = malloc(o))) { printf("Not enough memory to load image\n"); exit(5); } /* Read the data in and unpack it to RGBX format */ /* The lower byte isn't used so we don't set it to anything */ p = data; while(o) { if(fread(p, 1, 3, infile) != 3) goto truncated; p += 4; o -= 4; } /* We don't need the input file anymore so close it */ fclose(infile); /* Register the error handler */ GrSetErrorHandler(errorhandler); if(GrOpen() < 0) { printf("Couldn't connect to Nano-X server\n"); exit(6); }#ifdef USE_PIXMAPS /* Create the pixmap to store the picture in */ pmap = GrNewPixmap(width, height, NULL);#endif /* Create a graphics context */ gc = GrNewGC();#ifdef USE_PIXMAPS /* Copy the image data into the pixmap */ GrArea(pmap, gc, 0, 0, width, height, data, MWPF_RGB); /* We can free the image data now because it's stored in the pixmap */ free(data);#endif /* Create a window to output the image to */ window = GrNewWindow(GR_ROOT_WINDOW_ID, 0, 0, width, height, 0, 0, 0); /* Select expose events so we can redraw the image when necessary */ GrSelectEvents(window, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_CLOSE_REQ); /* Make the window visible */ GrMapWindow(window);#ifdef USE_PIXMAPS /* Paint the pixmap onto it */ GrCopyArea(window, gc, 0, 0, width, height, pmap, 0, 0, MWROP_SRCCOPY);#else GrArea(window, gc, 0, 0, width, height, data, MWPF_RGB);#endif while(1) { GrGetNextEvent(&event); switch(event.type) { case GR_EVENT_TYPE_EXPOSURE: do_exposure(&event.exposure); break; case GR_EVENT_TYPE_CLOSE_REQ: GrClose(); exit(0); } } return 0;truncated: printf("Error: File appears to be truncated\n"); exit(3);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -