DispmanX API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкрд╛рдИ рдореЗрдВ рдПрдХ рд╡реАрдбрд┐рдпреЛ рд▓реЗрдпрд░ рдХреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ


рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рд░рд╛рд╕реНрдкрдмреЗрд░реА рд╕рд┐рдВрдЧрд▓ рдмреЛрд░реНрдб рдХрдВрдкреНрдпреВрдЯрд░ рдХреЗ рдбрд┐рд╕реНрдкреЗрдВрдХреНрд╕ рдПрдкреАрдЖрдИ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред DispmanX API рд░рд╛рд╕реНрдкрдмреЗрд░реА рдбреЗрд╕реНрдХрдЯреЙрдк рдкрд░ рдирдИ рд░реЗрдВрдбрд░ рдХреА рдЧрдИ рдкрд░рддреЗрдВ рдмрдирд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдкрд░рддреЗрдВ рдкрд░рддреЛрдВ рдкрд░ рд▓рдЯрдХрддреА рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдЫреЛрдЯрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрд╕реА рд╕рдордп, рд╡реАрдбрд┐рдпреЛ рдирд┐рдпрдВрддреНрд░рдХ рдЦреБрдж рдЙрдиреНрд╣реЗрдВ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдореЙрдирд┐рдЯрд░ рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдкрд░рддреЛрдВ рдореЗрдВ рдПрдХ рдЕрд▓реНрдлрд╛ рдЪреИрдирд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░, рд╕рднреА рдкрд░рддреЛрдВ рдХреА рдЫрд╡рд┐рдпрд╛рдВ рдЦреБрдж рд╕реЗ рдорд┐рд╢реНрд░рдг рдХрд░реЗрдВрдЧреАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, 32 рджреЛ-рдмрд┐рдЯ ARGB рдкрд░рддреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, YUV420 рдкрд░рддреЗрдВ, рдпрд╛ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рддреЗрдВред рд░рд╛рд╕реНрдкрдмреЗрд░реА рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рджреЛ рдкрд░рддреЗрдВ рд╣реИрдВред рд╕рдмрд╕реЗ рдХрдо рдореЗрдВ рдПрдХ рдбреЗрд╕реНрдХрдЯреЙрдк рдЫрд╡рд┐ рд╣реЛрддреА рд╣реИред рдПрдХреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рднреА рдЖрдЙрдЯрдкреБрдЯ рдЗрд╕ рдкрд░рдд рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВред рдФрд░ рдПрдХ рджреВрд╕рд░реА, рд╕рдмрд╕реЗ рдКрдкрд░реА рдкрд░рдд рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдорд╛рдЙрд╕ рдХрд░реНрд╕рд░ рдХреА рдЫрд╡рд┐ рд░рд╣рддреА рд╣реИред

рдореИрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдПрдХ рдирдИ рдкрд░рдд рдХреИрд╕реЗ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ, рдЗрд╕рдореЗрдВ рдПрдХ рдЫрд╡рд┐ рд▓рд┐рдЦреЗрдВ рдФрд░ рдЗрд╕реЗ рд╕реНрдХреНрд░реАрди рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдХреИрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВред рджрд░рдЕрд╕рд▓, рдКрдкрд░ рдбреЗрдореЛ рд╡реАрдбрд┐рдпреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рдЪрд╛рд░ рдирдП 32-рдмрд┐рдЯ ARGB рд▓реЗрдпрд░ рдпрд╣рд╛рдВ рдмрдирд╛рдП рдЧрдП рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдкрд░рддреЛрдВ рдореЗрдВ рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рддреИрдпрд╛рд░ рдмрд┐рдЯрдореИрдк рд╕реЗ рдкрд┐рдХреНрд╕реЗрд▓ рд▓рд┐рдЦрддрд╛ рд╣реВрдВред рдореЗрд░реЗ рдмрд┐рдЯрдореИрдк рдмрд╛рджрд▓реЛрдВ, рд╕реВрд░рдЬ рдФрд░ рдЧреБрдмреНрдмрд╛рд░реЛрдВ рдХреА рдЫрд╡рд┐рдпрд╛рдВ рд╣реИрдВред рдкрд░рддреЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЧрддрд┐ рд╕реЗ рд╕реНрдХреНрд░реАрди рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрдорддреА рд╣реИрдВ, рд╕рдмрд╕реЗ рдХрдо X рдкрд░рдд рдкрд░ рд▓рдЯрдХрддреА рд╣реИрдВред
рддреЛ, DispmanX рдПрдкреАрдЖрдИред рдпрд╣ рд░рд╛рд╕реНрдкрдмреЗрд░реА рдФрд░ рдЗрд╕рдХреЗ рд╡реАрдбрд┐рдпреЛ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рдирд┐рдореНрди рд╕реНрддрд░ рдХреА рдЪреАрдЬрд╝ рд╣реИред рдФрд░ рдпрд╣ рдПрдХ "рдЧреИрд░-рдорд╛рдирдХ" рдЪреАрдЬ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдФрд░ рд▓рд┐рдирдХреНрд╕ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдбреАрдЖрд░рдПрдо, рдбрд╛рдпрд░реЗрдХреНрдЯ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдореИрдиреЗрдЬрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡реАрдбрд┐рдпреЛ рдкрд░рддреЛрдВ рдХреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЬрдЧрд╣ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рд░рд╛рд╕реНрдкрдмреЗрд░реА рдХреЗ рд░рдЪрдирд╛рдХрд╛рд░реЛрдВ рдиреЗ рдЕрдкрдиреА рдмрд╛рдЗрдХ рдмрдирд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рджреВрд╕рд░реА рдУрд░, рдпрд╣ рдПрдХ рдЬрдЯрд┐рд▓ рдмрд╛рдЗрдХ рдирд╣реАрдВ рд╣реИ, рдЬреЛ рд╕рд╡рд╛рд░реА рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рдВрднрд╡ рд╣реИред DispmanX, Raspberry Pi / Pi2 / Pi3 рдФрд░ Pi4 рдкрд░ Pi-Zero рдкрд░ рдЪрд▓рддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рднреА рд░рд╕рднрд░реА рдкрд░ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рдЪ рдореЗрдВ, Pi4 рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд╛рдорд╛рдиреНрдп OpenGLESv3 рд╣реИред рдпрд╣рд╛рдБ рдЗрд╕ рддрд░рд╣ рдХреЗ рддрдореНрдмреБрдУрдВ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд░рд╣ рд╕рдХрддреА рд╣реИред рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рдУрд░, DispmanX OpenGLES рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рд╕рд░рд▓ (рдХрдо рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде) рд╣реИред

рдЗрд╕ DispmanX API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ /opt/vc/include/bcm_host.h рд╣реИрдбрд░ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ libbcm_host.so рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рднреА рд▓рд┐рдВрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ / рдСрдкреНрдЯ / vc / lib рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред

рдПрдкреАрдЖрдИ рдХреЗ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ vc_dispmanx_ * рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ...

рдирдИ рдкрд░рддреЗрдВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдкрд╣рд▓реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЬреЛрдбрд╝реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рджрд░реНрд╢рди рддрдХ рдкрд╣реБрдВрдЪ рдмрдирд╛рдИ рдЬрд╛рдП:

bcm_host_init();
DISPMANX_DISPLAY_HANDLE_T display = vc_dispmanx_display_open( 0 );

рдЕрдм рдЖрдк рдПрдХ "рд╕рдВрд╕рд╛рдзрди" рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдкрд░рдд рдХреА рдЫрд╡рд┐ рд╣реЛрдЧреА:

VC_IMAGE_TYPE_T type = VC_IMAGE_ARGB8888;
uint32_t UnusedImagePtr;
int SrcImageWidth = 512; //image must be 32 bytes aligned size
int SrcImageWidth = 196;
DISPMANX_RESOURCE_HANDLE_T resource = vc_dispmanx_resource_create( type, SrcImageWidth, SrcImageHeight,  &UnusedImagePtr );

рдпрд╣рд╛рдВ, рдЕрд▓реНрдлрд╛ рдЪреИрдирд▓ рдХреЗ рд╕рд╛рде рд▓реЗрдпрд░ рдЯрд╛рдЗрдк 32-рдмрд┐рдЯ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рднреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рд▓рд┐рдЦрд╛ рдерд╛, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╡рд╛рдИрдпреВрд╡реА рднреАред рд╡рд╛рдИрдпреВрд╡реА рдкрд░рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдЧрддрд┐рд╢реАрд▓ рдкрд░рддреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд╡реАрдбрд┐рдпреЛ рдЦреЗрд▓рддреЗ рд╕рдордпред рдлрд┐рд░ рд╕реНрдХреНрд░реАрди рдкрд░ рд▓рд┐рдЦреЗ рдЧрдП рдбреЗрдЯрд╛ рдХреА рдорд╛рддреНрд░рд╛ рдХрд╛рдлреА рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдФрд░ рдЖрдкрдХреЛ YUV рдХреЛ RGB рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рдХреЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдореВрд▓реНрдпрд╡рд╛рди рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреНрд▓реЙрдХ рд╕рд╛рдЗрдХрд┐рд▓ рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реИред

рдПрдХ рдирдпрд╛ рд╕рдВрд╕рд╛рдзрди рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдкрд╣рд▓реЗ рдкреНрд░рд╛рдкреНрдд рдбрд┐рд╕реНрдкреНрд▓реЗ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдПрдХ рдирдИ рддрддреНрд╡ рдкрд░рдд рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

VC_DISPMANX_ALPHA_T alpha;
	alpha.flags =
		(DISPMANX_FLAGS_ALPHA_T)(DISPMANX_FLAGS_ALPHA_FROM_SOURCE | DISPMANX_FLAGS_ALPHA_MIX);
	alpha.opacity = 255;
	alpha.mask = 0;
int OutLayer = 200;
DISPMANX_ELEMENT_HANDLE_T vc_element = vc_dispmanx_element_add(
		update,
		display,
		OutLayer,
		&dst_rect, resource, &src_rect, DISPMANX_PROTECTION_NONE, &alpha, NULL, DISPMANX_NO_ROTATE );

рдПрдХ рдФрд░ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрджреНрдпрддрди рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИред рд╣рд░ рдмрд╛рд░ рдЖрдкрдХреЛ рдкреНрд░рджрд░реНрд╢рди рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ, рдПрдХ рдкрд░рдд рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдпрд╛ рд╣рдЯрд╛рдиреЗ, рдпрд╛ рдЗрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ, рдпрд╛ рдкрд░рдд рдкрд░ рдПрдХ рдирдИ рдЫрд╡рд┐ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЖрдкрдХреЛ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рд╢реБрд░реБрдЖрдд рдФрд░ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдЕрдВрдд рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рддрддреНрд╡реЛрдВ рдХреЛ рдмрджрд▓рдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛:

DISPMANX_UPDATE_HANDLE_T update =  vc_dispmanx_update_start( Priority );

рдлрд┐рд░ рдЕрдкрдиреА рдЬрд╝рд░реВрд░рдд рдХреА рд╕рднреА рдЪреАрдЬрд╝реЛрдВ рдХреЛ рдмрджрд▓реЗрдВ, рдПрдХ рдкрд░рдд рдмрдирд╛рдПрдВ рдпрд╛ рдЗрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ, рдкрд░рдд рдкрд░ рдирдП рдкрд┐рдХреНрд╕реЗрд▓ рд▓рд┐рдЦреЗрдВ рдФрд░ рдлрд┐рд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдмрдВрдж рдХрд░реЗрдВ:

vc_dispmanx_update_submit_sync( update );

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд╛рдо рд╕реЗ рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ, рд╡реАрдбрд┐рдпреЛ рд╕реНрдХреИрди рдХреЗ рдЕрдЧрд▓реЗ рдлреНрд░реЗрдо рдкрд▓реНрд╕ рдХреЗ рдмрд╛рдж рдкрд░рд┐рд╡рд░реНрддрди рдкреНрд░рднрд╛рд╡реА рд╣реЛрдВрдЧреЗред

рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдПрдХ рдкрд░рдд рдкрд░ рдкрд┐рдХреНрд╕реЗрд▓ рд▓рд┐рдЦрдирд╛:

vc_dispmanx_resource_write_data(
		resource,
		type,
		pitch,
		Pixels, //pointer to ARGB pixels
		&rect );

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд░реВрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдЫрд╡рд┐ рдХреЗ рдЕрдВрджрд░ рдПрдХ рдордирдорд╛рдирд╛ рдЯреБрдХрдбрд╝рд╛ рдЕрджреНрдпрддрди рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рдХреЗрд╡рд▓ "рдкрдЯреНрдЯреА" рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдЖрдпрдд рдХреЗ рдКрдкрд░ рдФрд░ рдиреАрдЪреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╛рдПрдВ рд╣рдореЗрд╢рд╛ 0 рд╣реЛрдЧрд╛ рдФрд░ рджрд╛рдПрдВ рд╣рдореЗрд╢рд╛ рдЫрд╡рд┐ рдХреА рдЪреМрдбрд╝рд╛рдИ рд╣реЛрдЧреАред

рдЕрдЬреАрдм рддрд░рд╣ рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдпрд╣ рдкрд░рддреЛрдВ рдХреЛ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЬреНрдЮрд╛рди рдХреА рдкреВрд░реА рдиреНрдпреВрдирддрдо рд╣реИред

рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ, рдореИрдВрдиреЗ DispmanX API рдкрд░ рдПрдХ рдЫреЛрдЯрд╛ рд░реИрдкрд░ рд▓рд┐рдЦрд╛ред рдпрд╣ рдореБрдЭреЗ рдПрдХ рдЕрд▓рдЧ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рдд рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:

struct DISPMANX_ELEMENT {
    DISPMANX_RESOURCE_HANDLE_T  res_;
    DISPMANX_ELEMENT_HANDLE_T   vc_element_;
    VC_IMAGE_TYPE_T type_;
    uint32_t src_width_;
    uint32_t src_height_;
    uint32_t dst_layer_;
    uint32_t dst_width_;
    uint32_t dst_height_;
    int32_t  dst_x_;
    int32_t  dst_y_;
};

рдареАрдХ рд╣реИ, рдореЗрд░реЗ рдХрдИ рд░реИрдкрд░ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдРрд╕реА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд▓реЗрддреЗ рд╣реИрдВ:

void dispmanx_init();
void dispmanx_element_init(struct DISPMANX_ELEMENT* Element);
struct DISPMANX_ELEMENT dispmanx_element_create( VC_IMAGE_TYPE_T type, int SrcW, int SrcH, int OutX, int OutY, int OutW, int OutH, int OutLayer );
void dispmanx_element_delete(struct DISPMANX_ELEMENT* Element);
void dispmanx_element_write(struct DISPMANX_ELEMENT* Element, char* Pixels);
void dispmanx_element_move( DISPMANX_UPDATE_HANDLE_T update, struct DISPMANX_ELEMENT* Element, int32_t NewX, int32_t NewY );
DISPMANX_UPDATE_HANDLE_T dispmanx_start_update( int Priority );
void dispmanx_sync( DISPMANX_UPDATE_HANDLE_T Update );

рдЗрд╕ рддрд░рд╣ рдореИрдВ рдХрдИ рдкрд░рддреЗрдВ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдЙрдирдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

рдореИрдВрдиреЗ рдПрдХ рдмрд┐рдЯрдореИрдк рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рднреА рд▓рд┐рдЦрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдлрд╝рдВрдХреНрд╢рди рдореБрд╢реНрдХрд┐рд▓ рд╣реИ - рдЕрдЧрд░ рдмрд┐рдЯрдореИрдк рдореЗрдВ рдПрдХ рд╢реБрджреНрдз рд╣рд░реЗ рд░рдВрдЧ рдХрд╛ рдкрд┐рдХреНрд╕реЗрд▓ 0x00FF00 рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕реЗ рдЕрдкрдиреА рдЫрд╡рд┐ рдореЗрдВ рдПрдХ рдкрд╛рд░рджрд░реНрд╢реА рдкрд┐рдХреНрд╕реЗрд▓ рдорд╛рдирддрд╛ рд╣реВрдВ рдФрд░ рддрджрдиреБрд╕рд╛рд░ рдЗрд╕ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдЕрд▓реНрдлрд╛ рдмрд╛рдЗрдЯ рдХреЛ рд╢реВрдиреНрдп рдкрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реВрдВред

рдкреЗрдВрдЯ рдореЗрдВ, рдореИрдВрдиреЗ рддреАрди рдЪрд┐рддреНрд░ рдЪрд┐рддреНрд░рд┐рдд рдХрд┐рдПред

рдмрд╛рджрд▓:



рд╕реВрд░реНрдп:



рдЧреБрдмреНрдмрд╛рд░реЗ:



рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрд╛рд░ рдкрд░рддреЗрдВ рдмрдирд╛рддрд╛ рд╣реИред рдкрд╣рд▓реЗ рджреЛ рдкрд░рддреЗрдВ рдмрд╛рджрд▓ рдХреЗ рдПрдХ рд╣реА рдмрд┐рдЯрдореИрдк рд╕реЗ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдкрд░рдд рдХрд╛ рдЖрдХрд╛рд░ рдЕрд▓рдЧ рдмрдирд╛рддрд╛ рд╣реВрдВ, рдореИрдВ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рджреВрд╕рд░реЗ рдмрд╛рджрд▓ рдкрд╣рд▓реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрдбрд╝реЗ рд╣реЛрддреЗ рд╣реИрдВред рддреАрд╕рд░реА рдкрд░рдд рдЧреБрдмреНрдмрд╛рд░реЗ рд╣реИрдВ рдФрд░ рдЪреМрдереА рдкрд░рдд рдореЗрдВ рдореИрдВ рд╕реВрд░рдЬ рдХреЛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реВрдВ:

typedef struct OBJ{
	int width_;
	int height_;
	int x_;
	int y_;
	int layer_;
	int speed_;
	char* pixels_;
} OBJ_;

int main(int argc , char *argv[])
{
	cout << "Hello Raspberry DispmanX API!\n";
	dispmanx_init();

	OBJ_ cloud1;
	cloud1.pixels_ = LoadBitmap( (char*)"clouds.bmp", &cloud1.width_, &cloud1.height_ );
	cloud1.layer_ = 100;
	cloud1.x_ = 100;
	cloud1.y_ = 120;
	cloud1.speed_ = 3;

	struct DISPMANX_ELEMENT cloud1_element = dispmanx_element_create(
		VC_IMAGE_ARGB8888, cloud1.width_, cloud1.height_, cloud1.x_, cloud1.y_, cloud1.width_, cloud1.height_, cloud1.layer_ );
	dispmanx_element_write( &cloud1_element, cloud1.pixels_ );

	OBJ_ cloud2;
	cloud2.pixels_ = LoadBitmap( (char*)"clouds.bmp", &cloud2.width_, &cloud2.height_ );
	cloud2.layer_ = 101;
	cloud2.x_ = 10;
	cloud2.y_ = 230;
	cloud2.speed_ = 2;

	struct DISPMANX_ELEMENT cloud2_element = dispmanx_element_create(
		VC_IMAGE_ARGB8888, cloud2.width_, cloud2.height_, cloud2.x_, cloud2.y_, cloud2.width_*1.3, cloud2.height_*1.4, cloud2.layer_ );
	dispmanx_element_write( &cloud2_element, cloud2.pixels_ );

	OBJ_ balls;
	balls.pixels_ = LoadBitmap( (char*)"balls.bmp", &balls.width_, &balls.height_ );
	balls.layer_ = 102;
	balls.x_ = -100;
	balls.y_ = 351;
	balls.speed_ = 5;

	struct DISPMANX_ELEMENT balls_element = dispmanx_element_create(
		VC_IMAGE_ARGB8888, balls.width_, balls.height_, balls.x_, balls.y_, balls.width_, balls.height_, balls.layer_ );
	dispmanx_element_write( &balls_element, balls.pixels_ );

	OBJ_ sun;
	sun.pixels_ = LoadBitmap( (char*)"sun.bmp", &sun.width_, &sun.height_ );
	sun.layer_ = 99;
	sun.x_ = -250;
	sun.y_ = 10;
	sun.speed_ = 1;

	struct DISPMANX_ELEMENT sun_element = dispmanx_element_create(
		VC_IMAGE_ARGB8888, sun.width_, sun.height_, sun.x_, sun.y_, sun.width_, sun.height_, sun.layer_ );
	dispmanx_element_write( &sun_element, sun.pixels_ );
.......................

рд╕рддрдд рдЪрдХреНрд░ рдореЗрдВ, рдореИрдВ рд╕реНрдХреНрд░реАрди рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдХреА рдкрд░рддреЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЧрддрд┐ рд╕реЗ рдШреБрдорд╛рддрд╛ рд╣реВрдБ:


while(1)
	{
		this_thread::sleep_for( chrono::milliseconds(20) );
		cloud1.x_ += cloud1.speed_;
		if( cloud1.x_>= 1920 )
			cloud1.x_ = 10 - cloud1.width_;

		cloud2.x_ += cloud2.speed_;
		if( cloud2.x_>= 1920 )
			cloud2.x_ = 133 - cloud2.width_;

		balls.x_ += balls.speed_;
		if( balls.x_>= 1920 )
			balls.x_ = 200 - balls.width_;

		sun.x_ += sun.speed_;
		if( sun.x_>= 1920 )
			sun.x_ = 250 - sun.width_;

		DISPMANX_UPDATE_HANDLE_T update = dispmanx_start_update(10);
		dispmanx_element_move( update, &cloud1_element, cloud1.x_, cloud1.y_ );
		dispmanx_element_move( update, &cloud2_element, cloud2.x_, cloud2.y_ );
		dispmanx_element_move( update, &balls_element, balls.x_, balls.y_ );
		dispmanx_element_move( update, &sun_element,   sun.x_,   sun.y_ );
		dispmanx_sync( update );
	}

рдмрд╕ рдЗрддрдирд╛ рд╣реАред

рдореЗрд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╕рднреА рдХреЛрдб рдЧрд┐рдердм рдкрд░ рд▓рд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ ред

рдореЗрдХ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде - рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВред рдлрд┐рд░ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╕реЗ рдЪрд▓рд╛рдПрдВ :/demo рдФрд░ рд╡реАрдбрд┐рдпреЛ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдЖрдкрдХреЛ рдЬреЛ рдХреБрдЫ рднреА рдКрдкрд░ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣рд╛ рд╣реИ рд╡рд╣ рдЖрдкрдХреЛ рдорд┐рд▓ рдЬрд╛рдПрдЧрд╛ред

рд╡реИрд╕реЗ, рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкрд░ рдЖрдк рд╕рднреА рд╡реАрдбрд┐рдпреЛ рдкрд░рддреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ vcgencmd рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде dispmanx_list рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИред рдпрд╣рд╛рдВ рдореЗрд░рд╛ рдбреЗрдореЛ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ Pi4 рдкрд░ рдЗрд╕ рдХрдорд╛рдВрдб рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рд╣реИ:



рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рд▓рд┐рдЦрд╛ рд╣реИ, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рджреЛ рдкрд░рддреЗрдВ рд╣реИрдВ: Xorg рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░рдд рдФрд░ рдорд╛рдЙрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░рддред

рдФрд░ рдпрд╣рд╛рдБ рдореЗрд░рд╛ рдбреЗрдореЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдкрд░рддреЛрдВ рдХреА рд╕реВрдЪреА рд╣реИ:



рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЪрд╛рд░ рдирдИ рдкрд░рддреЗрдВ рдЬреЛрдбрд╝реА рдЧрдИрдВред рдореИрдВрдиреЗ рд╕реНрдХреНрд░реЛрдЯ рдЯреАрдо рдореЗрдВ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рд▓рд┐рдпрд╛ред рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдирд┐рдЪрд▓реА рдПрдХреНрд╕-рдкрд░рдд рдХреЛ рдкрдХрдбрд╝рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ, рди рддреЛ рдмрд╛рджрд▓ рдФрд░ рди рд╣реА рдЧреБрдмреНрдмрд╛рд░реЗ рдЬреЛ рдЕрдиреНрдп рдкрд░рддреЛрдВ рдореЗрдВ рд╣реИрдВ, рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реЗ рд╣реИрдВред

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдХрднреА-рдХрднреА рд╡рд┐рднрд┐рдиреНрди рд╕реНрдЯрд╛рд▓реЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╛рд╕реНрдкрдмреЗрд░реА рдорд╛рдЗрдХреНрд░реЛ рдХрдВрдкреНрдпреВрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдХрд┐рдпреЛрд╕реНрдХ рдХреЗ рд▓рд┐рдП, рдХрднреА-рдХрднреА рдЖрдкрдХреЛ рдУрдПрд╕рдбреА, рдСрди рд╕реНрдХреНрд░реАрди рдбрд┐рд╕реНрдкреНрд▓реЗ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ - рдЕрд░реНрдерд╛рддреН, рдПрдХ рдЫрд╡рд┐ рдХреЛ рджреВрд╕рд░реЗ рдХреЗ рдКрдкрд░ рдУрд╡рд░рд▓реЗ рдХрд░реЗрдВред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП DispmanX API рдПрдХрджрдо рд╕рд╣реА рд╣реИред рд╢рд╛рдпрдж рдХрд┐рд╕реА рдХреЛ рдпрд╣ рд╕рдорд╛рдзрд╛рди рдкрд╕рдВрдж рдЖрдПрдЧрд╛ред

All Articles