CCApplication::Orientation CCApplication::setOrientation(Orientation orientation) { if(orientation == kOrientationPortrait) { PDL_SetOrientation(PDL_ORIENTATION_90 ); return kOrientationLandscapeRight; } if(orientation == kOrientationLandscapeRight) { PDL_SetOrientation(PDL_ORIENTATION_0 ); return kOrientationPortrait; } if(orientation==kOrientationLandscapeLeft) { PDL_SetOrientation(PDL_ORIENTATION_180 ); return kOrientationPortraitUpsideDown; } if(orientation==kOrientationPortraitUpsideDown) { PDL_SetOrientation(PDL_ORIENTATION_270 ); return kOrientationLandscapeLeft; } return orientation; }
void updateOrientation() { //XXX: This function is a beast, make it less crazy. // float screenAspect = (float)destWidth/(float)destHeight; float emulatedAspect = (float)srcWidth/(float)srcHeight; //XXX: Hack until skins support setting their orientation if ( use_on_screen && skin ) orientation = ORIENTATION_LANDSCAPE_R; switch( orientation ) { case ORIENTATION_LANDSCAPE_R: memcpy( vertexCoords, land_r_vertexCoords, 8*sizeof(float) ); break; case ORIENTATION_LANDSCAPE_L: memcpy( vertexCoords, land_l_vertexCoords, 8*sizeof(float) ); break; default: printf( "Unsupported orientation: %d!\n", orientation ); printf( "Defaulting to portrait orientation\n" ); //fall through orientation = ORIENTATION_PORTRAIT; case ORIENTATION_PORTRAIT: memcpy( vertexCoords, portrait_vertexCoords, 8*sizeof(float) ); break; } if ( orientation != ORIENTATION_PORTRAIT ) { emulatedAspect = 1/emulatedAspect;//landscape has reversed aspect ratio } if (!fullscreen) { for ( int i = 0; i < 4; i++ ) { vertexCoords[2*i+1] *= screenAspect / emulatedAspect; } if ( use_on_screen && skin ) { float csw = skin->controller_screen_width, csh = skin->controller_screen_height; float controller_aspect = csw / csh; int x_offset_center = 0, y_offset_center = 0; // Forcing b/c I know aspect ratios > 1 :( float effectiveHeight = destWidth; float effectiveWidth = effectiveHeight / emulatedAspect; // So, given these, we need to scale to max csw and csh. float scale_max_csw = csw/effectiveWidth; float scale_max_csh = csh/effectiveHeight; // Pick the leser, and use that to calculate centering offsets float scale_factor; if ( scale_max_csw < scale_max_csh ) { scale_factor = scale_max_csw; //We're scaling to the width, so we need to center the height: y_offset_center = (effectiveHeight * scale_max_csh - effectiveHeight * scale_max_csw) / 2; } else { scale_factor = scale_max_csh; //We're scaling to the height, so we need to center the width: x_offset_center = (effectiveWidth * scale_max_csw - effectiveWidth * scale_max_csh) / 2; } for ( int i = 0; i < 4; i++ ) { //scale vertexCoords[2*i] *= scale_factor; vertexCoords[2*i+1] *= scale_factor; } float y_offset = 1.0 - vertexCoords[0]; float x_offset = 1.0 - vertexCoords[1]; //push the screen to the coordinates indicated y_offset -= ( (float)skin->controller_screen_y_offset / (float)destWidth ) * 2; x_offset -= ( (float)skin->controller_screen_x_offset / (float)destHeight ) * 2; //And account for centering... y_offset -= ( y_offset_center / (float)destWidth ) * 2; x_offset -= ( x_offset_center / (float)destHeight ) * 2; for ( int i = 0; i < 4; i++ ) { //translate vertexCoords[2*i] += y_offset; vertexCoords[2*i+1] += x_offset; } } } int notification_direction; switch ( orientation ) { case ORIENTATION_PORTRAIT: notification_direction = PDL_ORIENTATION_BOTTOM; break; case ORIENTATION_LANDSCAPE_L: notification_direction = PDL_ORIENTATION_RIGHT; break; case ORIENTATION_LANDSCAPE_R: notification_direction = PDL_ORIENTATION_LEFT; break; default: //o_O invalid orientation. notification_direction = PDL_ORIENTATION_BOTTOM; break; } PDL_SetOrientation( notification_direction ); }
int main(int argc, char** argv) { int result; int fd; fz_context *ctx; char buf[10]; int c; int pagewidth, pageheight; result = SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER); if(result != 0) { printf("Could not init SDL: %s\n", SDL_GetError()); exit(1); } PDL_Init(0); PDL_SetOrientation(PDL_ORIENTATION_0); PDL_RegisterJSHandler("flipPage",flip_page); PDL_RegisterJSHandler("panPage",pan_page); // PDL_RegisterJSHandler("pause", pause); // PDL_RegisterJSHandler("resume", resume); PDL_JSRegistrationComplete(); PDL_CallJS("ready", NULL, 0); memset(&pitch_action, 0, sizeof(PDF_Pitch_t)); //gesture_data = (Gesture_Event *)malloc(sizeof(Gesture_Event)); memset(&gesture_data, 0, sizeof(Gesture_Event)); pitch_action.scale = 1.0; Surface = SDL_SetVideoMode(0, 0, 0, SDL_SWSURFACE); SDL_FillRect(Surface, NULL, 0xF0F0F); SDL_Flip(Surface); ctx = fz_new_context(NULL, FZ_STORE_DEFAULT); pdfapp_init(ctx, &app); app.scrw = 1024; app.scrh = 768; app.pageno = 10; src.x = 20; src.y = 20; src.w = 1024; src.h = 768; dest.x = 0; dest.y = 0; fd = open(argv[1], O_RDONLY, 0666); if (fd < 0) { printf("cannot open file\n"); fz_throw(app.ctx, "cannot open file '%s'", argv[1]); } pdfapp_open(&app,argv[1],fd,0); //app.rotate = 90 * 3; pdfapp_showpage(&app,1,1,1); draw_pdf(); #if 0 content = SDL_CreateRGBSurfaceFrom(app.image->samples, app.image->w, app.image->h, 32, app.image->w * 4, 0x00, 0x00, 0x00, 0x00); SDL_BlitSurface(content,NULL, Surface, NULL); SDL_Flip(Surface); #endif SDL_Event Event; Event.type = SDL_NOEVENT; int temp1, temp2; do { if (Paused) { SDL_WaitEvent(&Event); if (Event.type == SDL_ACTIVEEVENT) { if ((Event.active.state & SDL_APPACTIVE) && (Event.active.gain == 1)) { Paused = SDL_FALSE; } } } else { while(SDL_PollEvent(&Event)) { handle_events(Event); // switch (Event.type) { #if 0 case SDL_MOUSEBUTTONDOWN: fingerNum = Event.button.which + 1; mouse_state = SDL_MOUSEBUTTONDOWN; printf("%2d fingers touch down\n",Event.button.which); break; case SDL_MOUSEBUTTONUP: if(fingerNum == 2) { memset(&pitch_action, 0, sizeof(PDF_Pitch_t)-sizeof(float32)); pinch = SDL_FALSE; //pitch_action.scale = 1.0; } if(fingerNum == 1 && mouse_state == SDL_MOUSEBUTTONDOWN) { if(Event.button.x > (app.image->h / 2)) { buf[0] = '.'; } else { buf[0] = ','; } pdfapp_onkey(&app,buf[0]); printf("Flip page\n"); draw_pdf(); } // printf("%2d fingers touching\n",fingerNum); mouse_state = NULL; printf("%2d fingers touch up\n",Event.button.which); if(fingerNum > 0) fingerNum -= 1; break; case SDL_MOUSEMOTION: if(fingerNum == 2) { if(Event.motion.which == 0) { pitch_action.x0 = Event.motion.x; pitch_action.y0 = Event.motion.y; } if(Event.motion.which == 1) { pitch_action.x1 = Event.motion.x; pitch_action.y1 = Event.motion.y; } pitch_action.cx = (pitch_action.x0 + pitch_action.x1)/2; pitch_action.cy = (pitch_action.y0 + pitch_action.y1)/2; temp1 = pow((pitch_action.x0 - pitch_action.x1),2); temp2 = pow((pitch_action.y0 - pitch_action.y1),2); pitch_action.distance1 = sqrt(temp1 + temp2); pitch_action.offset = pitch_action.distance1 - pitch_action.distance0; pitch_action.distance0 = pitch_action.distance1; pitch_action.offset = (int)pitch_action.offset; // printf("cx:%4d, cy:%4d, offset:%4f \n",pitch_action.cx, // pitch_action.cy, pitch_action.offset); #if 1 if(pitch_action.offset > 0 && pitch_action.offset < 5) { #if 0 app.resolution *= (Uint16)pitch_action.offset; if (app.resolution > MAXRES) app.resolution = MAXRES; pdfapp_showpage(&app, 0, 1, 0); draw_pdf(); #endif pinch = SDL_TRUE; pitch_action.scale += 0.008; if(pitch_action.scale > 2) pitch_action.scale = 2; printf("-------------------------------------pinch out\n"); } else if(pitch_action.offset < 0) { #if 0 app.resolution /=(Uint16)( abs(pitch_action.offset)); if (app.resolution < MINRES) app.resolution = MINRES; pdfapp_showpage(&app, 0, 1, 0); draw_pdf(); #endif pinch = SDL_TRUE; pitch_action.scale -= 0.008; if(pitch_action.scale < 0.9) pitch_action.scale = 0.9; printf("----------------------------------pinch in\n"); } else { pinch = SDL_FALSE; } #endif } //printf("which: %d, x = %4d, y = %4d \n",Event.motion.which, // Event.motion.x, Event.motion.y); mouse_state = SDL_MOUSEMOTION; printf("Finger move \n"); break; #endif /* // handle deactivation by pausing our animation case SDL_ACTIVEEVENT: if ((Event.active.state & SDL_APPACTIVE) && (Event.active.gain == 0)) { Paused = SDL_TRUE; } break; default: break; // } */ } #if 1 if(pinch) { #if 1 if(pitch_action.scale == 1.4) { app.resolution = 72 * 1.4; pdfapp_showpage(&app,0,1,1); draw_pdf(); printf("----increase pdf resolution \n"); } if(pitch_action.scale == 1) { app.resolution = 72; pdfapp_showpage(&app,0,1,1); draw_pdf(); } content = zoomSurface(page_copy,pitch_action.scale,pitch_action.scale,SMOOTHING_OFF); SDL_FillRect(Surface, NULL, SDL_MapRGBA(Surface->format, 45, 45, 45, 0)); SDL_BlitSurface(content,NULL, Surface, NULL); SDL_Flip(Surface); SDL_FreeSurface(content); #else app.resolution *= pitch_action.scale; if(app.resolution > MAXRES) app.resolution = MAXRES; if (app.resolution < MINRES) app.resolution = MINRES; pdfapp_showpage(&app, 0, 1, 1); draw_pdf(); #endif } #endif SDL_Delay(0); } }while(Event.type != SDL_QUIT); //cleanup SDL_FreeSurface(content); SDL_FreeSurface(Surface); pdfapp_close(&app); PDL_Quit(); SDL_Quit(); return 0; }