AtlatestRepositorysigil-wm

sigil-wm / tree / testreadback.c

1/* SPDX-License-Identifier: BSD-3-Clause */
2#include <png.h>
3#include <stdint.h>
4#include <stdbool.h>
5#include <stdio.h>
6#include <stdlib.h>
7#include <string.h>
8int main(int argc,char **argv) {
9 if(argc<4 || (argc>4 && strcmp(argv[3],"samples"))) return 2;
10 FILE *file=fopen(argv[1],"rb");
11 unsigned width,height,max;
12 if(!file || fscanf(file,"P6\n%u %u\n%u",&width,&height,&max)!=3 || max!=255 ||
13 width>16384 || height>16384 || !width || !height || fgetc(file)!='\n') return 2;
14 size_t size=(size_t)width*height*3;
15 unsigned char *pixels=malloc(size);
16 if(!pixels || fread(pixels,1,size,file)!=size) return 2;
17 fclose(file);
18 size_t green=0,red=0,white=0,gray=0,blue=0,icon=0;
19 for(size_t i=0;i<size;i+=3) {
20 uint32_t rgb=(pixels[i]<<16)|(pixels[i+1]<<8)|pixels[i+2];
21 green+=rgb==0x00cc44; red+=rgb==0xcc2244;
22 white+=rgb==0xffffff; gray+=rgb==0x888888;
23 blue+=rgb==0x1155bb; icon+=rgb==0xaa44dd;
24 }
25 bool samples_ok=true;
26 if(!strcmp(argv[3],"samples")) {
27 if(argc<5) return 2;
28 for(int argument=4;argument<argc;argument++) {
29 unsigned x,y,wanted;
30 if(sscanf(argv[argument],"%u,%u:%x",&x,&y,&wanted)!=3 || x>=width || y>=height || wanted>0xffffff) return 2;
31 size_t offset=((size_t)y*width+x)*3;
32 unsigned actual=(pixels[offset]<<16)|(pixels[offset+1]<<8)|pixels[offset+2];
33 printf("SAMPLE=%u,%u actual=%06x expected=%06x\n",x,y,actual,wanted);
34 if(actual!=wanted) samples_ok=false;
35 }
36 }
37 png_image image={.version=PNG_IMAGE_VERSION,.width=width,.height=height,.format=PNG_FORMAT_RGB};
38 if(!png_image_write_to_file(&image,argv[2],0,pixels,0,NULL)) return 2;
39 printf("PIXELS mode=%s width=%u height=%u green=%zu red=%zu white=%zu gray=%zu\n",argv[3],width,height,green,red,white,gray);
40 free(pixels);
41 if(!strcmp(argv[3],"samples")) return samples_ok ? 0 : 1;
42 if(!strcmp(argv[3],"manager")) return green>10000 && red>10000 && white>20 ? 0 : 1;
43 if(!strcmp(argv[3],"stacking")) return green>10000 && red>10000 ? 0 : 1;
44 if(!strcmp(argv[3],"tiling")) return green==(size_t)width*height/2 && red==green ? 0 : 1;
45 if(!strcmp(argv[3],"tabbed")) return green==0 && red==(size_t)width*(height-32) && white>20 && gray>20 ? 0 : 1;
46 if(!strcmp(argv[3],"drag")) { printf("DRAG_ICON_PIXELS=%zu\n",icon); return icon==144 ? 0 : 1; }
47 if(!strcmp(argv[3],"x11")) return width==960 && height==640 && red==480u*320u && green==160u*100u ? 0 : 1;
48 if(!strcmp(argv[3],"layer")) return width==960 && height==640 && green==950u*32u && red==0 ? 0 : 1;
49 if(!strcmp(argv[3],"locked")) return green==0 && red==0 && blue==(size_t)width*height ? 0 : 1;
50 return 0;