📄 util.pm
字号:
$v=hex(substr($name,5,2))/0xff;
} elsif(length($name)<11) {
$h=360*hex(substr($name,1,3))/0xfff;
$s=hex(substr($name,4,3))/0xfff;
$v=hex(substr($name,7,3))/0xfff;
} else {
$h=360*hex(substr($name,1,4))/0xffff;
$s=hex(substr($name,5,4))/0xffff;
$v=hex(substr($name,9,4))/0xffff;
}
($r,$g,$b)=HSVtoRGB($h,$s,$v);
$col=[$r,$g,$b];
} else {
$col = $colors{$name} || [0,0,0];
}
return(@{$col});
}
sub pdfkey {
my $ddata=join('',@_);
my $mdkey='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789gT';
my $xdata="0" x 8;
my $off=0;
foreach my $set (0..(length($ddata)<<1)) {
$off+=vec($ddata,$set,4);
$off+=vec($xdata,($set & 7),8);
vec($xdata,($set & 7),8)=vec($mdkey,($off & 0x3f),8);
}
return($xdata);
}
sub digestx {
my $len=shift @_;
my $mask=$len-1;
my $ddata=join('',@_);
my $mdkey='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789gT';
my $xdata="0" x $len;
my $off=0;
my $set;
foreach $set (0..(length($ddata)<<1)) {
$off+=vec($ddata,$set,4);
$off+=vec($xdata,($set & $mask),8);
vec($xdata,($set & ($mask<<1 |1)),4)=vec($mdkey,($off & 0x7f),4);
}
# foreach $set (0..$mask) {
# vec($xdata,$set,8)=(vec($xdata,$set,8) & 0x7f) | 0x40;
# }
# $off=0;
# foreach $set (0..$mask) {
# $off+=vec($xdata,$set,8);
# vec($xdata,$set,8)=vec($mdkey,($off & 0x3f),8);
# }
return($xdata);
}
sub digest {
return(digestx(32,@_));
}
sub digest16 {
return(digestx(16,@_));
}
sub digest32 {
return(digestx(32,@_));
}
sub xlog10 {
my $n = shift;
if($n) {
return log(abs($n))/log(10);
} else { return 0; }
}
sub float {
my $f=shift @_;
my $mxd=shift @_||4;
$f=0 if(abs($f)<0.0000000000000001);
my $ad=floor(xlog10($f)-$mxd);
if(abs($f-int($f)) < (10**(-$mxd))) {
# just in case we have an integer
return sprintf('%i',$f);
} elsif($ad>0){
return sprintf('%f',$f);
} else {
return sprintf('%.'.abs($ad).'f',$f);
}
}
sub floats { return map { float($_); } @_; }
sub floats5 { return map { float($_,5); } @_; }
sub intg {
my $f=shift @_;
return sprintf('%i',$f);
}
sub intgs { return map { intg($_); } @_; }
my @cp1252 = (1 .. 127,
0x20AC, 0x0081, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x008D, 0x017D, 0x008F,
0x0090, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x009D, 0x017E, 0x0178,
0xA0 .. 0xFF);
%winfonts=(
'arialblack' => {
'-widths' => [ 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 333, 333, 500, 660, 666, 1000, 889, 277, 389, 389, 556, 660, 333, 333, 333, 277, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 333, 333, 660, 660, 660, 610, 740, 777, 777, 777, 777, 722, 666, 833, 833, 389, 666, 833, 666, 943, 833, 833, 722, 833, 777, 722, 722, 833, 777, 1000, 777, 777, 722, 389, 277, 389, 660, 500, 333, 666, 666, 666, 666, 666, 389, 666, 666, 333, 333, 666, 333, 1000, 666, 666, 666, 666, 443, 610, 443, 666, 610, 943, 666, 610, 556, 389, 277, 389, 660, 750, 666, 750, 277, 666, 500, 1000, 666, 666, 333, 1000, 722, 333, 1000, 750, 722, 750, 750, 277, 277, 500, 500, 500, 500, 1000, 333, 950, 610, 333, 1000, 750, 556, 777, 333, 333, 666, 666, 660, 666, 277, 666, 333, 799, 399, 666, 660, 333, 799, 500, 399, 660, 399, 399, 333, 666, 850, 333, 333, 399, 399, 666, 1000, 1000, 1000, 610, 777, 777, 777, 777, 777, 777, 1000, 777, 722, 722, 722, 722, 389, 389, 389, 389, 777, 833, 833, 833, 833, 833, 833, 660, 833, 833, 833, 833, 833, 777, 722, 666, 666, 666, 666, 666, 666, 666, 1000, 666, 666, 666, 666, 666, 333, 333, 333, 333, 666, 666, 666, 666, 666, 666, 666, 660, 666, 666, 666, 666, 666, 610, 666, 610 ],
'-descent' => -309,
'-firstchar' => 1,
'-fontname' => 'ArialBlack',
'-capheight' => 715,
'-italicangle' => '0',
'-flags' => 40,
'-ascent' => 1100,
'-xheight' => 518,
'-fontbbox' => [ -193, -306, 1687, 1083 ],
'-type' => 'TrueType',
'-lastchar' => 255
},
'arialbolditalic' => {
'-widths' => [ 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 277, 333, 474, 556, 556, 889, 722, 237, 333, 333, 389, 583, 277, 333, 277, 277, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 333, 333, 583, 583, 583, 610, 975, 722, 722, 722, 722, 666, 610, 777, 722, 277, 556, 722, 610, 833, 722, 777, 666, 777, 722, 666, 610, 722, 666, 943, 666, 666, 610, 333, 277, 333, 583, 556, 333, 556, 610, 556, 610, 556, 333, 610, 610, 277, 277, 556, 277, 889, 610, 610, 610, 610, 389, 556, 333, 610, 556, 777, 556, 556, 500, 389, 279, 389, 583, 750, 556, 750, 277, 556, 500, 1000, 556, 556, 333, 1000, 666, 333, 1000, 750, 610, 750, 750, 277, 277, 500, 500, 350, 556, 1000, 333, 1000, 556, 333, 943, 750, 500, 666, 277, 333, 556, 556, 556, 556, 279, 556, 333, 736, 370, 556, 583, 333, 736, 552, 399, 548, 333, 333, 333, 576, 556, 277, 333, 333, 365, 556, 833, 833, 833, 610, 722, 722, 722, 722, 722, 722, 1000, 722, 666, 666, 666, 666, 277, 277, 277, 277, 722, 722, 777, 777, 777, 777, 777, 583, 777, 722, 722, 722, 722, 666, 666, 610, 556, 556, 556, 556, 556, 556, 889, 556, 556, 556, 556, 556, 277, 277, 277, 277, 610, 610, 610, 610, 610, 610, 610, 548, 610, 610, 610, 610, 610, 556, 610, 556 ],
'-descent' => -211,
'-firstchar' => 1,
'-fontname' => 'ArialBoldItalic',
'-capheight' => 715,
'-italicangle' => -12,
'-flags' => 104,
'-ascent' => 905,
'-xheight' => 518,
'-type' => 'TrueType',
'-fontbbox' => [ -559, -376, 1156, 1030 ],
'-lastchar' => 255
},
'arialbold' => {
'-widths' => [ 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 277, 333, 474, 556, 556, 889, 722, 237, 333, 333, 389, 583, 277, 333, 277, 277, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 333, 333, 583, 583, 583, 610, 975, 722, 722, 722, 722, 666, 610, 777, 722, 277, 556, 722, 610, 833, 722, 777, 666, 777, 722, 666, 610, 722, 666, 943, 666, 666, 610, 333, 277, 333, 583, 556, 333, 556, 610, 556, 610, 556, 333, 610, 610, 277, 277, 556, 277, 889, 610, 610, 610, 610, 389, 556, 333, 610, 556, 777, 556, 556, 500, 389, 279, 389, 583, 750, 556, 750, 277, 556, 500, 1000, 556, 556, 333, 1000, 666, 333, 1000, 750, 610, 750, 750, 277, 277, 500, 500, 350, 556, 1000, 333, 1000, 556, 333, 943, 750, 500, 666, 277, 333, 556, 556, 556, 556, 279, 556, 333, 736, 370, 556, 583, 333, 736, 552, 399, 548, 333, 333, 333, 576, 556, 277, 333, 333, 365, 556, 833, 833, 833, 610, 722, 722, 722, 722, 722, 722, 1000, 722, 666, 666, 666, 666, 277, 277, 277, 277, 722, 722, 777, 777, 777, 777, 777, 583, 777, 722, 722, 722, 722, 666, 666, 610, 556, 556, 556, 556, 556, 556, 889, 556, 556, 556, 556, 556, 277, 277, 277, 277, 610, 610, 610, 610, 610, 610, 610, 548, 610, 610, 610, 610, 610, 556, 610, 556 ],
'-descent' => -211,
'-firstchar' => 1,
'-fontname' => 'ArialBold',
'-capheight' => 715,
'-italicangle' => '0',
'-flags' => 40,
'-ascent' => 905,
'-xheight' => 518,
'-type' => 'TrueType',
'-fontbbox' => [ -627, -376, 2033, 1047 ],
'-lastchar' => 255
},
'arialitalic' => {
'-widths' => [ 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 277, 277, 354, 556, 556, 889, 666, 190, 333, 333, 389, 583, 277, 333, 277, 277, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 277, 277, 583, 583, 583, 556, 1015, 666, 666, 722, 722, 666, 610, 777, 722, 277, 500, 666, 556, 833, 722, 777, 666, 777, 722, 666, 610, 722, 666, 943, 666, 666, 610, 277, 277, 277, 469, 556, 333, 556, 556, 500, 556, 556, 277, 556, 556, 222, 222, 500, 222, 833, 556, 556, 556, 556, 333, 500, 277, 556, 500, 722, 500, 500, 500, 333, 259, 333, 583, 750, 556, 750, 222, 556, 333, 1000, 556, 556, 333, 1000, 666, 333, 1000, 750, 610, 750, 750, 222, 222, 333, 333, 350, 556, 1000, 333, 1000, 500, 333, 943, 750, 500, 666, 277, 333, 556, 556, 556, 556, 259, 556, 333, 736, 370, 556, 583, 333, 736, 552, 399, 548, 333, 333, 333, 576, 537, 277, 333, 333, 365, 556, 833, 833, 833, 610, 666, 666, 666, 666, 666, 666, 1000, 722, 666, 666, 666, 666, 277, 277, 277, 277, 722, 722, 777, 777, 777, 777, 777, 583, 777, 722, 722, 722, 722, 666, 666, 610, 556, 556, 556, 556, 556, 556, 889, 500, 556, 556, 556, 556, 277, 277, 277, 277, 556, 556, 556, 556, 556, 556, 556, 548, 610, 556, 556, 556, 556, 500, 556, 500 ],
'-descent' => -211,
'-firstchar' => 1,
'-fontname' => 'ArialItalic',
'-capheight' => 715,
'-italicangle' => -12,
'-flags' => 104,
'-ascent' => 905,
'-xheight' => 518,
'-type' => 'TrueType',
'-fontbbox' => [ -517, -324, 1081, 1024 ],
'-lastchar' => 255
},
'arial' => {
'-widths' => [ 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 277, 277, 354, 556, 556, 889, 666, 190, 333, 333, 389, 583, 277, 333, 277, 277, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 277, 277, 583, 583, 583, 556, 1015, 666, 666, 722, 722, 666, 610, 777, 722, 277, 500, 666, 556, 833, 722, 777, 666, 777, 722, 666, 610, 722, 666, 943, 666, 666, 610, 277, 277, 277, 469, 556, 333, 556, 556, 500, 556, 556, 277, 556, 556, 222, 222, 500, 222, 833, 556, 556, 556, 556, 333, 500, 277, 556, 500, 722, 500, 500, 500, 333, 259, 333, 583, 750, 556, 750, 222, 556, 333, 1000, 556, 556, 333, 1000, 666, 333, 1000, 750, 610, 750, 750, 222, 222, 333, 333, 350, 556, 1000, 333, 1000, 500, 333, 943, 750, 500, 666, 277, 333, 556, 556, 556, 556, 259, 556, 333, 736, 370, 556, 583, 333, 736, 552, 399, 548, 333, 333, 333, 576, 537, 277, 333, 333, 365, 556, 833, 833, 833, 610, 666, 666, 666, 666, 666, 666, 1000, 722, 666, 666, 666, 666, 277, 277, 277, 277, 722, 722, 777, 777, 777, 777, 777, 583, 777, 722, 722, 722, 722, 666, 666, 610, 556, 556, 556, 556, 556, 556, 889, 500, 556, 556, 556, 556, 277, 277, 277, 277, 556, 556, 556, 556, 556, 556, 556, 548, 610, 556, 556, 556, 556, 500, 556, 500 ],
'-descent' => -211,
'-firstchar' => 1,
'-fontname' => 'Arial',
'-capheight' => 715,
'-italicangle' => '0',
'-flags' => 40,
'-ascent' => 905,
'-xheight' => 518,
'-type' => 'TrueType',
'-fontbbox' => [ -664, -324, 2028, 1037 ],
'-lastchar' => 255
},
'comicsansmsbold' => {
'-widths' => [ 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 433, 237, 437, 842, 693, 820, 654, 433, 366, 366, 529, 610, 433, 610, 433, 511, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 433, 433, 610, 610, 610, 565, 931, 731, 630, 618, 721, 624, 606, 679, 768, 546, 665, 610, 550, 882, 812, 798, 532, 876, 640, 693, 695, 736, 674, 1039, 723, 635, 693, 376, 549, 376, 610, 626, 556, 555, 593, 513, 587, 559, 508, 530, 577, 280, 403, 540, 273, 776, 523, 525, 534, 520, 480, 486, 471, 520, 486, 684, 590, 552, 538, 366, 421, 366, 610, 500, 618, 500, 433, 588, 429, 675, 610, 596, 556, 1241, 693, 610, 1193, 500, 693, 500, 500, 226, 226, 433, 433, 610, 441, 882, 556, 882, 507, 610, 896, 500, 538, 635, 476, 237, 610, 793, 610, 610, 421, 634, 556, 795, 610, 638, 610, 610, 795, 626, 610, 610, 610, 610, 556, 610, 760, 610, 556, 610, 610, 638, 610, 610, 610, 565, 731, 731, 731, 731, 731, 731, 1086, 618, 624, 624, 624, 624, 546, 546, 546, 546, 721, 812, 798, 798, 798, 798, 798, 610, 798, 736, 736, 736, 736, 635, 520, 533, 555, 555, 555, 555, 555, 555, 911, 513, 559, 559, 559, 559, 280, 280, 280, 280, 508, 523, 525, 525, 525, 525, 525, 610, 533, 520, 520, 520, 520, 552, 534, 552 ],
'-descent' => -291,
'-firstchar' => 1,
'-fontname' => 'ComicSansMSBold',
'-capheight' => 758,
'-italicangle' => '0',
'-flags' => 34,
'-ascent' => 1102,
'-xheight' => 539,
'-type' => 'TrueType',
'-fontbbox' => [ -111, -291, 1229, 1102 ],
'-lastchar' => 255
},
'comicsansms' => {
'-widths' => [ 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 298, 237, 424, 842, 693, 820, 654, 388, 366, 366, 529, 480, 276, 416, 249, 511, 610, 450, 610, 610, 610, 610, 610, 610, 610, 610, 298, 298, 381, 510, 381, 523, 931, 731, 630, 602, 721, 624, 606, 679, 768, 546, 665, 610, 550, 882, 796, 798, 520, 876, 628, 693, 679, 736, 649, 1039, 723, 635, 693, 376, 549, 376, 581, 626, 556, 511, 593, 513, 587, 547, 508, 530, 577, 280, 403, 540, 273, 776, 523, 525, 534, 520, 480, 486, 471, 520, 486, 684, 590, 520, 538, 366, 421, 366, 597, 500, 610, 500, 298, 426, 411, 675, 596, 596, 556, 1241, 693, 381, 1193, 500, 693, 500, 500, 180, 180, 393, 393, 387, 441, 882, 556, 882, 403, 381, 896, 500, 538, 635, 298, 237, 623, 793, 611, 635, 404, 634, 556, 795, 526, 577, 480, 416, 795, 626, 409, 480, 650, 650, 556, 520, 693, 249, 556, 650, 449, 577, 650, 650, 650, 523, 731, 731, 731, 731, 731, 731, 1086, 602, 624, 624, 624, 624, 546, 546, 546, 546, 721, 796, 798, 798, 798, 798, 798, 480, 798, 736, 736, 736, 736, 635, 520, 443, 511, 511, 511, 511, 511, 511, 911, 513, 547, 547, 547, 547, 280, 280, 280, 280, 508, 523, 525, 525, 525, 525, 525, 480, 525, 520, 520, 520, 520, 520, 534, 431 ],
'-descent' => -291,
'-firstchar' => 1,
'-fontname' => 'ComicSansMS',
'-capheight' => 758,
'-italicangle' => '0',
'-flags' => 34,
'-ascent' => 1102,
'-xheight' => 539,
'-type' => 'TrueType',
'-fontbbox' => [ -92, -312, 1186, 1102 ],
'-lastchar' => 255
},
'couriernewbolditalic' => {
'-widths' => [ 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -