SDL_ph_image.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:9k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.     SDL - Simple DirectMedia Layer
  3.     Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002  Sam Lantinga
  4.     This library is free software; you can redistribute it and/or
  5.     modify it under the terms of the GNU Library General Public
  6.     License as published by the Free Software Foundation; either
  7.     version 2 of the License, or (at your option) any later version.
  8.     This library is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.     Library General Public License for more details.
  12.     You should have received a copy of the GNU Library General Public
  13.     License along with this library; if not, write to the Free
  14.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  15.     Sam Lantinga
  16.     slouken@libsdl.org
  17. */
  18. #ifdef SAVE_RCSID
  19. static char rcsid =
  20.  "@(#) $Id: SDL_ph_image.c,v 1.4 2002/04/22 21:38:05 wmay Exp $";
  21. #endif
  22. #include <stdlib.h>
  23. #include <Ph.h>
  24. #include <photon/Pg.h>
  25. #include "SDL_error.h"
  26. #include "SDL_endian.h"
  27. #include "SDL_ph_image_c.h"
  28. /* remove this line, if photon headers updates */
  29. int PgWaitHWIdle(void);
  30. int ph_SetupImage(_THIS, SDL_Surface *screen)
  31. {
  32.     int type=0;
  33.     PgColor_t* palette=NULL;
  34.     /* Determine image type */
  35.     switch(screen->format->BitsPerPixel)
  36.     {
  37.         case 8:{
  38.             type = Pg_IMAGE_PALETTE_BYTE;
  39.         }
  40.         break;
  41.         case 15:{
  42.             type = Pg_IMAGE_DIRECT_555; 
  43.         }
  44.         break;
  45.         case 16:{
  46.             type = Pg_IMAGE_DIRECT_565; 
  47.         }
  48.         break;
  49.         case 24:{
  50.             type = Pg_IMAGE_DIRECT_888;
  51.         }
  52.         break;
  53.         case 32:{
  54.             type = Pg_IMAGE_DIRECT_8888;
  55.         }
  56.         break;
  57.         default:{
  58.             /* should never get here */
  59.             fprintf(stderr,"error: unsupported bbp = %dn",
  60.                     screen->format->BitsPerPixel);
  61.             return -1;
  62.         }
  63.         break;
  64.     }
  65.     /* palette emulation code */
  66.     if ((screen->format->BitsPerPixel==8) && (desktoppal==SDLPH_PAL_EMULATE))
  67.     {
  68.         /* creating image palette */
  69.         palette=malloc(_Pg_MAX_PALETTE*sizeof(PgColor_t));
  70.         PgGetPalette(palette);
  71.         /* using shared memory for speed (set last param to 1) */
  72.         if ((SDL_Image = PhCreateImage(NULL, screen->w, screen->h, type, palette, _Pg_MAX_PALETTE, 1)) == NULL)
  73.         {
  74.             fprintf(stderr,"ph_SetupImage: PhCreateImage failed for bpp=8.n");
  75.             return -1;
  76.         }
  77.     }
  78.     else
  79.     {
  80.         /* using shared memory for speed (set last param to 1) */
  81.         if ((SDL_Image = PhCreateImage(NULL, screen->w, screen->h, type, NULL, 0, 1)) == NULL)
  82.         {
  83.             fprintf(stderr,"ph_SetupImage: PhCreateImage failed.n");
  84.             return -1;
  85.         }
  86.     }
  87.     screen->pixels = SDL_Image->image;
  88.     this->UpdateRects = ph_NormalUpdate;
  89.     return 0;
  90. }
  91. int ph_SetupOCImage(_THIS, SDL_Surface *screen)
  92. {
  93. int type = 0;
  94. /* Determine image type */
  95. switch(screen->format->BitsPerPixel)
  96. {
  97. case 8:{
  98. type = Pg_IMAGE_PALETTE_BYTE;
  99. }
  100. break;
  101. case 15:{
  102. type = Pg_IMAGE_DIRECT_555; 
  103. }
  104. break;
  105. case 16:{
  106. type = Pg_IMAGE_DIRECT_565; 
  107. }
  108. break;
  109. case 24:{
  110. type = Pg_IMAGE_DIRECT_888;
  111. }
  112. break;
  113. case 32:{
  114. type = Pg_IMAGE_DIRECT_8888;
  115. }
  116. break;
  117. default:{
  118. /* should never get here */
  119. fprintf(stderr,"error: unsupported bbp = %dn",
  120. screen->format->BitsPerPixel);
  121. return -1;
  122. }
  123. break;
  124. }
  125. OCImage.FrameData0 = (FRAMEDATA *) malloc((size_t)(sizeof( FRAMEDATA)));
  126. OCImage.FrameData1 = (FRAMEDATA *) malloc((size_t)(sizeof( FRAMEDATA)));
  127. if(OCImage.direct_context == NULL)
  128.    OCImage.direct_context = PdCreateDirectContext();
  129. OCImage.offscreen_context = PdCreateOffscreenContext(0,screen->w,screen->h, Pg_OSC_MEM_PAGE_ALIGN);
  130. if (OCImage.offscreen_context == NULL)
  131. {
  132.    printf("PdCreateOffscreenContext  failedn");
  133.    return -1;
  134. }
  135. OCImage.Stride = OCImage.offscreen_context->pitch;
  136.         if (OCImage.flags & SDL_DOUBLEBUF)
  137.           printf("hardware flag for doublebuf offscreen contextn");
  138. OCImage.dc_ptr.ptr8 = (unsigned char *) PdGetOffscreenContextPtr(OCImage.offscreen_context);
  139. OCImage.CurrentFrameData = OCImage.FrameData0;
  140. OCImage.CurrentFrameData->Y = OCImage.dc_ptr.ptr8;
  141. OCImage.CurrentFrameData->U = NULL;
  142. OCImage.CurrentFrameData->V = NULL;
  143. OCImage.current = 0;
  144. if(OCImage.dc_ptr.ptr8 == NULL)
  145. {
  146.   printf("PdGetOffscreenContextPtr failedn");
  147.   return -1;
  148. }
  149. PhDCSetCurrent(OCImage.offscreen_context);
  150. screen->pixels = OCImage.CurrentFrameData->Y;
  151. this->UpdateRects = ph_OCUpdate;
  152. return 0;
  153. }
  154. int ph_SetupOpenGLImage(_THIS, SDL_Surface* screen)
  155. {
  156.    this->UpdateRects = ph_OpenGLUpdate;
  157.    
  158.    return 0;
  159. }
  160. void ph_DestroyImage(_THIS, SDL_Surface *screen)
  161. {
  162.     if (OCImage.offscreen_context != NULL)
  163.     {
  164.         PhDCRelease(OCImage.offscreen_context);
  165.         OCImage.offscreen_context = NULL;
  166.         free(OCImage.FrameData0);
  167.         OCImage.FrameData0 = NULL;
  168.         free(OCImage.FrameData1);
  169.         OCImage.FrameData1 = NULL;
  170.     }
  171.     if (SDL_Image)
  172.     {
  173.         /* if palette allocated, free it */
  174.         if (SDL_Image->palette)
  175.         {
  176.             free(SDL_Image->palette);
  177.         }
  178.         PgShmemDestroy(SDL_Image->image);
  179.         free(SDL_Image);
  180.     }
  181.     /* Must be zeroed everytime */
  182.     SDL_Image = NULL;
  183.     if (screen)
  184.     {
  185.         screen->pixels = NULL;
  186.     }
  187. }
  188. int ph_ResizeImage(_THIS, SDL_Surface *screen, Uint32 flags)
  189. {
  190.     ph_DestroyImage(this, screen);
  191.     
  192.     if (flags & SDL_HWSURFACE)
  193.     {
  194.         OCImage.flags = flags;  /* needed for SDL_DOUBLEBUF check */
  195.         return ph_SetupOCImage(this, screen);
  196.     }
  197.     else if (flags & SDL_OPENGL)
  198.     {
  199.         return ph_SetupOpenGLImage(this, screen);
  200.     } 
  201.     else
  202.     {
  203.         return ph_SetupImage(this, screen);
  204.     }      
  205. }
  206. int ph_AllocHWSurface(_THIS, SDL_Surface *surface)
  207. {
  208.     return(-1);
  209. }
  210. void ph_FreeHWSurface(_THIS, SDL_Surface *surface)
  211. {
  212.     return;
  213. }
  214. int ph_FlipHWSurface(_THIS, SDL_Surface *surface)
  215. {
  216.     return(0);
  217. }
  218. int ph_LockHWSurface(_THIS, SDL_Surface *surface)
  219. {
  220.     if ((surface == SDL_VideoSurface) && blit_queued) {
  221. PgFlush();
  222.         blit_queued = 0;
  223.     }
  224.     return(0);
  225. }
  226. void ph_UnlockHWSurface(_THIS, SDL_Surface *surface)
  227. {
  228.     return;
  229. }
  230. static PhPoint_t ph_pos;
  231. static PhRect_t ph_rect;
  232. static int i;
  233. void ph_OpenGLUpdate(_THIS, int numrects, SDL_Rect* rects)
  234. {
  235.    this->GL_SwapBuffers(this);
  236.    
  237.    return;
  238. }
  239. void ph_NormalUpdate(_THIS, int numrects, SDL_Rect *rects)
  240. {
  241.     for ( i=0; i<numrects; ++i ) 
  242.     {
  243.      if (rects[i].w==0) /* Clipped? */
  244.         { 
  245.             continue;
  246.         }
  247.         ph_pos.x = rects[i].x;
  248.         ph_pos.y = rects[i].y;
  249.         ph_rect.ul.x = rects[i].x;
  250.         ph_rect.ul.y = rects[i].y;
  251.         ph_rect.lr.x = rects[i].x + rects[i].w;
  252.         ph_rect.lr.y = rects[i].y + rects[i].h;
  253.         if (PgDrawPhImageRectmx(&ph_pos, SDL_Image, &ph_rect, 0) < 0)
  254.         {
  255.             fprintf(stderr,"ph_NormalUpdate: PgDrawPhImageRectmx failed.n");
  256.         }
  257.     }
  258.     if (PgFlush() < 0)
  259.     {
  260.      fprintf(stderr,"ph_NormalUpdate: PgFlush failed.n");
  261.     }
  262. }
  263. void ph_OCUpdate(_THIS, int numrects, SDL_Rect *rects)
  264. {
  265.     PhPoint_t zero = {0};
  266.     PhRect_t src_rect;
  267.     PhRect_t dest_rect;
  268.     if(OCImage.direct_context == NULL)
  269.     {
  270.         return;
  271.     }
  272.     PgSetRegion(PtWidgetRid(window));
  273.     PgSetClipping(0,NULL);
  274.     PgWaitHWIdle();
  275.     for (i=0; i<numrects; ++i)
  276.     {
  277.         if (rects[i].w == 0)  /* Clipped? */
  278.         {
  279.             continue;
  280.         }
  281.         src_rect.ul.x=rects[i].x;
  282.         src_rect.ul.y=rects[i].y;
  283.         dest_rect.ul.x=rects[i].x;
  284.         dest_rect.ul.y=rects[i].y;
  285.         dest_rect.lr.x=src_rect.lr.x= rects[i].x +rects[i].w;
  286.         dest_rect.lr.y=src_rect.lr.y= rects[i].y +rects[i].h;
  287.         zero.x = zero.y = 0;
  288.         PgSetTranslation (&zero, 0);
  289.         PgSetRegion(PtWidgetRid(window));
  290.         PgSetClipping(0,NULL);
  291.         PgContextBlitArea(OCImage.offscreen_context, (PhArea_t *)(&src_rect), NULL, (PhArea_t *)(&dest_rect));
  292.     }
  293.     if (PgFlush() < 0)
  294.     {
  295.         fprintf(stderr,"ph_OCUpdate: PgFlush failed.n");
  296.     }
  297.     
  298.     /* later used to toggling double buffer */
  299.     if (OCImage.current == 0)
  300.     {
  301.         OCImage.CurrentFrameData = OCImage.FrameData0;
  302.     }
  303.     else
  304.     {
  305.         OCImage.CurrentFrameData = OCImage.FrameData1;
  306.     }
  307. }