SliceMngr::SliceMngr(){ int result; uint16_t background = 0x000F; DISPMANX_UPDATE_HANDLE_T update; mState = 0; bcm_host_init(); mDisplay = vc_dispmanx_display_open(0); if(mDisplay == 0){ return; } result = vc_dispmanx_display_get_info(mDisplay, &mInfo); if(result != 0){ return; } initBackgroundLayer(&mBackground, background, 1); initImage(&(mImage.image), VC_IMAGE_RGBA32, mInfo.width, mInfo.height, false); createResourceImageLayer(&mImage, 0); vc_dispmanx_rect_set(&(mImage.srcRect), 0 << 16, 0 << 16, mImage.image.width << 16, mImage.image.height << 16); vc_dispmanx_rect_set(&(mImage.dstRect), (mInfo.width - mImage.image.width) / 2, (mInfo.height - mImage.image.height) / 2, mImage.image.width, mImage.image.height); update = vc_dispmanx_update_start(0); if(update == 0){ return; } addElementBackgroundLayer(&mBackground, mDisplay, update); addElementImageLayerCentered(&mImage, &mInfo, mDisplay, update); result = vc_dispmanx_update_submit_sync(update); if(result != 0){ return; } mState = 1; }
int main(int argc, char *argv[]) { uint16_t background = 0x000F; int32_t layer = 1; uint32_t displayNumber = 0; int32_t xOffset = 0; int32_t yOffset = 0; uint32_t timeout = 0; bool xOffsetSet = false; bool yOffsetSet = false; bool interactive = true; program = basename(argv[0]); //--------------------------------------------------------------------- int opt = 0; while ((opt = getopt(argc, argv, "b:d:l:x:y:t:n")) != -1) { switch(opt) { case 'b': background = strtol(optarg, NULL, 16); break; case 'd': displayNumber = strtol(optarg, NULL, 10); break; case 'l': layer = strtol(optarg, NULL, 10); break; case 'x': xOffset = strtol(optarg, NULL, 10); xOffsetSet = true; break; case 'y': yOffset = strtol(optarg, NULL, 10); yOffsetSet = true; break; case 't': timeout = atoi(optarg); break; case 'n': interactive = false; break; default: usage(); break; } } //--------------------------------------------------------------------- if (optind >= argc) { usage(); } //--------------------------------------------------------------------- IMAGE_LAYER_T imageLayer; const char *imagePath = argv[optind]; if(strcmp(imagePath, "-") == 0) { // Use stdin if (loadPngFile(&(imageLayer.image), stdin) == false) { fprintf(stderr, "unable to load %s\n", imagePath); exit(EXIT_FAILURE); } } else { // Load image from path if (loadPng(&(imageLayer.image), imagePath) == false) { fprintf(stderr, "unable to load %s\n", imagePath); exit(EXIT_FAILURE); } } //--------------------------------------------------------------------- if (signal(SIGINT, signalHandler) == SIG_ERR) { perror("installing SIGINT signal handler"); exit(EXIT_FAILURE); } //--------------------------------------------------------------------- if (signal(SIGTERM, signalHandler) == SIG_ERR) { perror("installing SIGTERM signal handler"); exit(EXIT_FAILURE); } //--------------------------------------------------------------------- bcm_host_init(); //--------------------------------------------------------------------- DISPMANX_DISPLAY_HANDLE_T display = vc_dispmanx_display_open(displayNumber); assert(display != 0); //--------------------------------------------------------------------- DISPMANX_MODEINFO_T info; int result = vc_dispmanx_display_get_info(display, &info); assert(result == 0); //--------------------------------------------------------------------- BACKGROUND_LAYER_T backgroundLayer; if (background > 0) { initBackgroundLayer(&backgroundLayer, background, 0); } createResourceImageLayer(&imageLayer, layer); //--------------------------------------------------------------------- DISPMANX_UPDATE_HANDLE_T update = vc_dispmanx_update_start(0); assert(update != 0); if (background > 0) { addElementBackgroundLayer(&backgroundLayer, display, update); } if (xOffsetSet == false) { xOffset = (info.width - imageLayer.image.width) / 2; } if (yOffsetSet == false) { yOffset = (info.height - imageLayer.image.height) / 2; } addElementImageLayerOffset(&imageLayer, xOffset, yOffset, display, update); result = vc_dispmanx_update_submit_sync(update); assert(result == 0); //--------------------------------------------------------------------- int32_t step = 1; uint32_t currentTime = 0; // Sleep for 10 milliseconds every run-loop const int sleepMilliseconds = 10; while (run) { int c = 0; if (interactive && keyPressed(&c)) { c = tolower(c); bool moveLayer = false; switch (c) { case 27: run = false; break; case 'a': xOffset -= step; moveLayer = true; break; case 'd': xOffset += step; moveLayer = true; break; case 'w': yOffset -= step; moveLayer = true; break; case 's': yOffset += step; moveLayer = true; break; case '+': if (step == 1) { step = 5; } else if (step == 5) { step = 10; } else if (step == 10) { step = 20; } break; case '-': if (step == 20) { step = 10; } else if (step == 10) { step = 5; } else if (step == 5) { step = 1; } break; } if (moveLayer) { update = vc_dispmanx_update_start(0); assert(update != 0); moveImageLayer(&imageLayer, xOffset, yOffset, update); result = vc_dispmanx_update_submit_sync(update); assert(result == 0); } } //--------------------------------------------------------------------- usleep(sleepMilliseconds * 1000); currentTime += sleepMilliseconds; if (timeout != 0 && currentTime >= timeout) { run = false; } } //--------------------------------------------------------------------- keyboardReset(); //--------------------------------------------------------------------- if (background > 0) { destroyBackgroundLayer(&backgroundLayer); } destroyImageLayer(&imageLayer); //--------------------------------------------------------------------- result = vc_dispmanx_display_close(display); assert(result == 0); //--------------------------------------------------------------------- return 0; }