📄 adaptive_filter.c
字号:
/*!
************************************************************************
* \file adaptive_filter.c
*
* \brief
* adaptive filter routines
*
* \author
* Yuri Vatis <vatis@tnt.uni-hannover.de> \n
*
* This software may be used for research purposes only.
* Universitaet Hannover would also appreciate that all those using the
* software or any extension of it in any way comply with the
* following condition:
* Including in any technical report, conference or journal paper
* produced which uses the software or any extension of it in
* any way, at least one of bibliographic references:
* Yuri Vatis, Bernd Edler, Dieu Thanh Nguyen, J鰎n Ostermann,
* "Motion-and Aliasing-compensated Prediction using a two-dimensional non-separable Adaptive Wiener Interpolation Filter",
* Proc. ICIP 2005, IEEE International Conference on Image Processing, Genova, Italy, September 2005.
* Yuri Vatis, Bernd Edler, Ingolf Wassermann, Dieu Thanh Nguyen, J鰎n Ostermann,
* "Coding of Coefficients of two-dimensional non-separable Adaptive Wiener Interpolation Filter",
* Proc. VCIP 2005, SPIE Visual Communication & Image Processing, Beijing, China, July 2005.
************************************************************************
*/
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include "defines.h"
#include "adaptive_filter.h"
#ifdef ADAPTIVE_FILTER
#include "global.h"
#ifdef DIRECTIONAL_FILTER
#include <memory.h>
#include "../../lcommon/inc/adaptive_filter_1DAIF.h"
#include "../../lcommon/inc/adaptive_filter_orig.h"
#endif
#ifdef EIGHTH_PEL
#include "image.h"
#endif
double STANDARD_2D_FILTER[15][SQR_FILTER] = {
{ 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ,
1.0/64.0 , -5.0/64.0 , 52.0/64.0 , 20.0/64.0 , -5.0/64.0 , 1.0/64.0 ,
0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0
}, // a_pos
{ 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ,
1.0/32.0 , -5.0/32.0 , 20.0/32.0 , 20.0/32.0 , -5.0/32.0 , 1.0/32.0 ,
0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0
}, // b_pos
{ 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ,
1.0/64.0 , -5.0/64.0 , 20.0/64.0 , 52.0/64.0 , -5.0/64.0 , 1.0/64.0 ,
0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0
}, // c_pos
{ 0.0 , 0.0 , 1.0/64.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , -5.0/64.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 52.0/64.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 20.0/64.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , -5.0/64.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 1.0/64.0 , 0.0 , 0.0 , 0.0
}, // d_pos
{ 0.0 , 0.0 , 1.0/64.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , -5.0/64.0 , 0.0 , 0.0 , 0.0 ,
1.0/64.0 , -5.0/64.0 , 40.0/64.0 , 20.0/64.0 , -5.0/64.0 , 1.0/64.0 ,
0.0 , 0.0 , 20.0/64.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , -5.0/64.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 1.0/64.0 , 0.0 , 0.0 , 0.0
}, // e_pos
{ 1.0/2048.0, -5.0/2048.0, 20.0/2048.0, 20.0/2048.0, -5.0/2048.0, 1.0/2048.0,
-5.0/2048.0, 25.0/2048.0, -100.0/2048.0, -100.0/2048.0, 25.0/2048.0, -5.0/2048.0,
52.0/2048.0, -260.0/2048.0, 1040.0/2048.0, 1040.0/2048.0, -260.0/2048.0, 52.0/2048.0,
20.0/2048.0, -100.0/2048.0, 400.0/2048.0, 400.0/2048.0, -100.0/2048.0, 20.0/2048.0,
-5.0/2048.0, 25.0/2048.0, -100.0/2048.0, -100.0/2048.0, 25.0/2048.0, -5.0/2048.0,
1.0/2048.0, -5.0/2048.0, 20.0/2048.0, 20.0/2048.0, -5.0/2048.0, 1.0/2048.0
}, // f_pos
{ 0.0 , 0.0 , 0.0 , 1.0/64.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 0.0 , -5.0/64.0 , 0.0 , 0.0 ,
1.0/64.0 , -5.0/64.0 , 20.0/64.0 , 40.0/64.0 , -5.0/64.0 , 1.0/64.0 ,
0.0 , 0.0 , 0.0 , 20.0/64.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 0.0 , -5.0/64.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 0.0 , 1.0/64.0 , 0.0 , 0.0
}, // g_pos
{ 0.0 , 0.0 , 1.0/32.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , -5.0/32.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 20.0/32.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 20.0/32.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , -5.0/32.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 1.0/32.0 , 0.0 , 0.0 , 0.0
}, // h_pos
{ 1.0/2048.0, -5.0/2048.0, 52.0/2048.0, 20.0/2048.0, -5.0/2048.0, 1.0/2048.0,
-5.0/2048.0, 25.0/2048.0, -260.0/2048.0, -100.0/2048.0, 25.0/2048.0, -5.0/2048.0,
20.0/2048.0, -100.0/2048.0, 1040.0/2048.0, 400.0/2048.0, -100.0/2048.0, 20.0/2048.0,
20.0/2048.0, -100.0/2048.0, 1040.0/2048.0, 400.0/2048.0, -100.0/2048.0, 20.0/2048.0,
-5.0/2048.0, 25.0/2048.0, -260.0/2048.0, -100.0/2048.0, 25.0/2048.0, -5.0/2048.0,
1.0/2048.0, -5.0/2048.0, 52.0/2048.0, 20.0/2048.0, -5.0/2048.0, 1.0/2048.0
}, // i_pos
{ 1.0/1024.0, -5.0/1024.0, 20.0/1024.0, 20.0/1024.0, -5.0/1024.0, 1.0/1024.0,
-5.0/1024.0, 25.0/1024.0, -100.0/1024.0, -100.0/1024.0, 25.0/1024.0, -5.0/1024.0,
20.0/1024.0, -100.0/1024.0, 400.0/1024.0, 400.0/1024.0, -100.0/1024.0, 20.0/1024.0,
20.0/1024.0, -100.0/1024.0, 400.0/1024.0, 400.0/1024.0, -100.0/1024.0, 20.0/1024.0,
-5.0/1024.0, 25.0/1024.0, -100.0/1024.0, -100.0/1024.0, 25.0/1024.0, -5.0/1024.0,
1.0/1024.0, -5.0/1024.0, 20.0/1024.0, 20.0/1024.0, -5.0/1024.0, 1.0/1024.0
}, // j_pos
{ 1.0/2048.0, -5.0/2048.0, 20.0/2048.0, 52.0/2048.0, -5.0/2048.0, 1.0/2048.0,
-5.0/2048.0, 25.0/2048.0, -100.0/2048.0, -260.0/2048.0, 25.0/2048.0, -5.0/2048.0,
20.0/2048.0, -100.0/2048.0, 400.0/2048.0, 1040.0/2048.0, -100.0/2048.0, 20.0/2048.0,
20.0/2048.0, -100.0/2048.0, 400.0/2048.0, 1040.0/2048.0, -100.0/2048.0, 20.0/2048.0,
-5.0/2048.0, 25.0/2048.0, -100.0/2048.0, -260.0/2048.0, 25.0/2048.0, -5.0/2048.0,
1.0/2048.0, -5.0/2048.0, 20.0/2048.0, 52.0/2048.0, -5.0/2048.0, 1.0/2048.0
}, // i_pos
{ 0.0 , 0.0 , 1.0/64.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , -5.0/64.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 20.0/64.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 52.0/64.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , -5.0/64.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 1.0/64.0 , 0.0 , 0.0 , 0.0
}, // l_pos
{ 0.0 , 0.0 , 1.0/64.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , -5.0/64.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 20.0/64.0 , 0.0 , 0.0 , 0.0 ,
1.0/64.0 , -5.0/64.0 , 40.0/64.0 , 20.0/64.0 , -5.0/64.0 , 1.0/64.0 ,
0.0 , 0.0 , -5.0/64.0 , 0.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 1.0/64.0 , 0.0 , 0.0 , 0.0
}, // m_pos
{ 1.0/2048.0, -5.0/2048.0, 20.0/2048.0, 20.0/2048.0, -5.0/2048.0, 1.0/2048.0,
-5.0/2048.0, 25.0/2048.0, -100.0/2048.0, -100.0/2048.0, 25.0/2048.0, -5.0/2048.0,
20.0/2048.0, -100.0/2048.0, 400.0/2048.0, 400.0/2048.0, -100.0/2048.0, 20.0/2048.0,
52.0/2048.0, -260.0/2048.0, 1040.0/2048.0, 1040.0/2048.0, -260.0/2048.0, 52.0/2048.0,
-5.0/2048.0, 25.0/2048.0, -100.0/2048.0, -100.0/2048.0, 25.0/2048.0, -5.0/2048.0,
1.0/2048.0, -5.0/2048.0, 20.0/2048.0, 20.0/2048.0, -5.0/2048.0, 1.0/2048.0
}, // n_pos
{ 0.0 , 0.0 , 0.0 , 1.0/64.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 0.0 , -5.0/64.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 0.0 , 20.0/64.0 , 0.0 , 0.0 ,
1.0/64.0 , -5.0/64.0 , 20.0/64.0, 40.0/64.0 , -5.0/64.0 , 1.0/64.0 ,
0.0 , 0.0 , 0.0 , -5.0/64.0 , 0.0 , 0.0 ,
0.0 , 0.0 , 0.0 , 1.0/64.0 , 0.0 , 0.0
} // o_pos
};
// separable aif (BEGIN)
static double STANDARD_2D_FILTER_SEP[15][SQR_FILTER] = {
{1.0 / 64.0, -5.0 / 64.0, 52.0 / 64.0, 20.0 / 64.0, -5.0 / 64.0, 1.0 / 64.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // a_pos
{1.0 / 32.0, -5.0 / 32.0, 20.0 / 32.0, 20.0 / 32.0, -5.0 / 32.0, 1.0 / 32.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // b_pos
{1.0 / 64.0, -5.0 / 64.0, 20.0 / 64.0, 52.0 / 64.0, -5.0 / 64.0, 1.0 / 64.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // c_pos
{1.0 / 64.0, -5.0 / 64.0, 52.0 / 64.0, 20.0 / 64.0, -5.0 / 64.0, 1.0 / 64.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // d_pos
{1.0 / 64.0, -5.0 / 64.0, 52.0 / 64.0, 20.0 / 64.0, -5.0 / 64.0, 1.0 / 64.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // e_pos
{1.0 / 64.0, -5.0 / 64.0, 52.0 / 64.0, 20.0 / 64.0, -5.0 / 64.0, 1.0 / 64.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // f_pos
{1.0 / 64.0, -5.0 / 64.0, 52.0 / 64.0, 20.0 / 64.0, -5.0 / 64.0, 1.0 / 64.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // g_pos
{1.0 / 32.0, -5.0 / 32.0, 20.0 / 32.0, 20.0 / 32.0, -5.0 / 32.0, 1.0 / 32.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // h_pos
{1.0 / 32.0, -5.0 / 32.0, 20.0 / 32.0, 20.0 / 32.0, -5.0 / 32.0, 1.0 / 32.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // i_pos
{1.0 / 32.0, -5.0 / 32.0, 20.0 / 32.0, 20.0 / 32.0, -5.0 / 32.0, 1.0 / 32.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // j_pos
{1.0 / 32.0, -5.0 / 32.0, 20.0 / 32.0, 20.0 / 32.0, -5.0 / 32.0, 1.0 / 32.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // k_pos
{1.0 / 64.0, -5.0 / 64.0, 20.0 / 64.0, 52.0 / 64.0, -5.0 / 64.0, 1.0 / 64.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // l_pos
{1.0 / 64.0, -5.0 / 64.0, 20.0 / 64.0, 52.0 / 64.0, -5.0 / 64.0, 1.0 / 64.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // m_pos
{1.0 / 64.0, -5.0 / 64.0, 20.0 / 64.0, 52.0 / 64.0, -5.0 / 64.0, 1.0 / 64.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // n_pos
{1.0 / 64.0, -5.0 / 64.0, 20.0 / 64.0, 52.0 / 64.0, -5.0 / 64.0, 1.0 / 64.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // o_pos
};
// separable aif (END)
int TwoDSymmetricPattern[15][SQR_FILTER] = // get one filter from another one, if symmetry properties are used (used e.g. in ExtendFilterCoefficients)
{
{ 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
12, 13, 14, 15, 16, 17, // a_pos - not used actually
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
12, 13, 14, 14, 13, 12, // b_pos
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
17, 16, 15, 14, 13, 12, // c_pos
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0 },
{ 0, 0, 12, 0, 0, 0,
0, 0, 13, 0, 0, 0,
0, 0, 14, 0, 0, 0, // d_pos
0, 0, 15, 0, 0, 0,
0, 0, 16, 0, 0, 0,
0, 0, 17, 0, 0, 0 },
{ 0, 1, 2, 3, 4, 5,
1, 7, 8, 9, 10, 11,
2, 8, 14, 15, 16, 17, // e_pos
3, 9, 15, 21, 22, 23,
4, 10, 16, 22, 28, 29,
5, 11, 17, 23, 29, 35 },
{ 0, 1, 2, 2, 1, 0,
6, 7, 8, 8, 7, 6,
12, 13, 14, 14, 13, 12, // f_pos
18, 19, 20, 20, 19, 18,
24, 25, 26, 26, 25, 24,
30, 31, 32, 32, 31, 30 },
{ 5, 4, 3, 2, 1, 0,
11, 10, 9, 8, 7, 1,
17, 16, 15, 14, 8, 2, // g_pos
23, 22, 21, 15, 9, 3,
29, 28, 22, 16, 10, 4,
35, 29, 23, 17, 11, 5 },
{ 0, 0, 12, 0, 0, 0,
0, 0, 13, 0, 0, 0,
0, 0, 14, 0, 0, 0, // h_pos
0, 0, 14, 0, 0, 0,
0, 0, 13, 0, 0, 0,
0, 0, 12, 0, 0, 0 },
{ 0, 6, 12, 18, 24, 30,
1, 7, 13, 19, 25, 31,
2, 8, 14, 20, 26, 32, // i_pos
2, 8, 14, 20, 26, 32,
1, 7, 13, 19, 25, 31,
0, 6, 12, 18, 24, 30 },
{ 0, 1, 2, 2, 1, 0,
1, 7, 8, 8, 7, 1,
2, 8, 14, 14, 8, 2, // j_pos
2, 8, 14, 14, 8, 2,
1, 7, 8, 8, 7, 1,
0, 1, 2, 2, 1, 0 },
{30, 24, 18, 12, 6, 0,
31, 25, 19, 13, 7, 1,
32, 26, 20, 14, 8, 2, // k_pos
32, 26, 20, 14, 8, 2,
31, 25, 19, 13, 7, 1,
30, 24, 18, 12, 6, 0 },
{ 0, 0, 17, 0, 0, 0,
0, 0, 16, 0, 0, 0,
0, 0, 15, 0, 0, 0, // l_pos
0, 0, 14, 0, 0, 0,
0, 0, 13, 0, 0, 0,
0, 0, 12, 0, 0, 0 },
{ 5, 11, 17, 23, 29, 35,
4, 10, 16, 22, 28, 29,
3, 9, 15, 21, 22, 23, // m_pos
2, 8, 14, 15, 16, 17,
1, 7, 8, 9, 10, 11,
0, 1, 2, 3, 4, 5 },
{30, 31, 32, 32, 31, 30,
24, 25, 26, 26, 25, 24,
18, 19, 20, 20, 19, 18, // n_pos
12, 13, 14, 14, 13, 12,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -