AtlatestRepositorysigil-wm
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>8
int 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;51
}