⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jpeg.c

📁 redboy for gba 是BPNS为GBA编写的一个小软件。软件的邹形是BASIC高级语言解释执行器。几经修改和扩展
💻 C
📖 第 1 页 / 共 3 页
字号:
#include <CsAgb.h>
#include <jpeg.h>
#include <rb_mem.h>
#include <rb_stdio.h>
#define J_RGB *(u16 *)0x06012C00

u8* jpgdata;

u16 JRGB(s16 y0,s16 cb0,s16 cr0);
s16 JPGReceiveBits (u16 cat);

u8 *JPGZig1;
/* [64] = {
   0,0,1,2,1,0,0,1,2,3,4,3,2,1,0,0,1,2,3,4,5,6,5,4,3,2,1,0,0,1,2,3,
   4,5,6,7,7,6,5,4,3,2,1,2,3,4,5,6,7,7,6,5,4,3,4,5,6,7,7,6,5,6,7,7
   };*/

u8 *JPGZig2;
/*[64] = {
   0,1,0,0,1,2,3,2,1,0,0,1,2,3,4,5,4,3,2,1,0,0,1,2,3,4,5,6,7,6,5,4,
   3,2,1,0,1,2,3,4,5,6,7,7,6,5,4,3,2,3,4,5,6,7,7,6,5,4,5,6,7,7,6,7
   };*/

u16 *aanscales;
//[64] = {
   /* precomputed values scaled up by 14 bits */
 /*  16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
   22725, 31521, 29692, 26722, 22725, 17855, 12299,  6270,
   21407, 29692, 27969, 25172, 21407, 16819, 11585,  5906,
   19266, 26722, 25172, 22654, 19266, 15137, 10426,  5315,
   16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
   12873, 17855, 16819, 15137, 12873, 10114,  6967,  3552,
    8867, 12299, 11585, 10426,  8867,  6967,  4799,  2446,
    4520,  6270,  5906,  5315,  4520,  3552,  2446,  1247
   };*/

#define FIX_1_082392200  277     /* FIX(1.082392200) */
#define FIX_1_414213562  362     /* FIX(1.414213562) */
#define FIX_1_847759065  473     /* FIX(1.847759065) */
#define FIX_2_613125930  669     /* FIX(2.613125930) */

struct JpegType {                      // some type definitions (for coherence)
   u16 Rows;                           // image height
   u16 Cols;                           // image width
   u16 SamplesY;                       // sampling ratios
   u16 SamplesCbCr;
   u16 QuantTableY;                    // quantization table numbers
   u16 QuantTableCbCr;
   u16 HuffDCTableY;                   // huffman table numbers
   u16 HuffDCTableCbCr;
   u16 HuffACTableY;
   u16 HuffACTableCbCr;
   u16 NumComp;                        // number of components
   };

struct JPGHuffmanEntry {                   // a type for huffman tables
   u16 Index;
   s16 Code;
   u16 Length;
   }__attribute__ ((packed));

u32 findex;
u16 DCTables;
u16 ACTables;
u16 QTables;
u8 curByte;
u8 curBits;
u8 EOI;
struct JPGHuffmanEntry *HuffmanDC0;
struct JPGHuffmanEntry *HuffmanDC1;
struct JPGHuffmanEntry *HuffmanAC0;
struct JPGHuffmanEntry *HuffmanAC1;
//u16 ZigIndex;
u16 QuantTable[2][8][8];    // 2 quantization tables (Y, CbCr)
struct JpegType Image;
//u16 flen;
//s16 i;

/*u32 JPGpower2 (u16 pwr)
{
   u8 i;
   u16 total = 1;

   for (i=0; i<pwr; i++)
      total <<= 1;
   return (total);
   return ((u16)0x1)<<pwr;
}*/
#define JPGpower2(pwr) (((u32)0x1)<<pwr)

/*u8 JPGGetByte (void)
{
   return (jpgdata[findex++]);
}
*/


u32 gfxJpeg4 (u8 x0, u8 y0, u16 *vram)
{
   u8 exit = 1;
   s16 y;
   u16 Restart = 0;
   u16 XPos; u16 YPos;
   s16 dcY; s16 dcCb; s16 dcCr;
   int xindex,yindex;
   u16 mcu;
   s16 YVector1[8][8];              // 4 vectors for Y attribute
   s16 YVector2[8][8];              // (not all may be needed)
   s16 YVector3[8][8];
   s16 YVector4[8][8];
   s16 CbVector[8][8];              // 1 vector for Cb attribute
   s16 CrVector[8][8];              // 1 vector for Cr attribute
   int i,j;
   int i2,j2;
   s16 cb; s16 cr;
   s16 r; s16 g; s16 b;
   int loc;
   int xstep,ystep;
   QTables = 0;
   ACTables = 0;
   DCTables = 0;
   findex = 0;
   if (jpgdata[findex++] == 0xff)
   {
      if (jpgdata[findex++] == 0xd8) exit = 0;
   }
   if (exit) return(0);
   while (!exit)
   {
      if (jpgdata[findex++] == 0xff)
      {
         switch (jpgdata[findex++])
         {
         case 0x00: //not important
         break;
         case 0xc0: //SOF0
            JPGGetImageAttr();
         break;
         case 0xc1: //SOF1
            JPGGetImageAttr();
         break;
         case 0xc4: //DHT
            if ((ACTables < 2) || (DCTables < 2)) JPGGetHuffTables();
         break;
         case 0xc9: //SOF9
         break;
         case 0xd9: //EOI
            exit = 1;
         break;
         case 0xda: //SOS
            JPGGetSOS();
            if (((DCTables == 2)&&(ACTables == 2)&&(QTables == 2))||(Image.NumComp == 1))
            {
               EOI = 0;
               exit = 1;        // Go on to secondary control loop
            }
         break;
         case 0xdb: //DQT
            if (QTables < 2) JPGGetQuantTables();
         break;
         case 0xdd: //DRI
            Restart = JPGGetWord();
         break;
         case 0xe0: //APP0
            JPGGetWord();        // Length of segment
            findex += 5;
            /*JPGGetByte();        // Major revision
            JPGGetByte();        // Minor revision
            JPGGetByte();        // Density definition
            JPGGetByte();        // X density
            JPGGetByte();        // Y density
            JPGGetByte();        // Thumbnail width
            JPGGetByte();        // Thumbnail height*/
            findex+=7;
         break;
         case 0xfe: //COM
         break;
         }
      }
   }

   XPos = 0;
   YPos = 0;                            // Initialize active variables
   dcY = 0; dcCb = 0; dcCr = 0;
   xindex = 0; yindex = 0; mcu = 0;
   r = 0; g = 0; b = 0;

   curBits = 128;                // Start with the seventh bit
   curByte = jpgdata[findex++];       // Of the first byte
   if (x0==255)
   {
      x0=(240-Image.Cols)/2;
      y0=(160-Image.Rows)/2;
   }
   switch (Image.NumComp)        // How many components does the image have?
   {
   case 3:                     // 3 components (Y-Cb-Cr)
      {
         switch (Image.SamplesY)   // What's the sampling ratio of Y to CbCr?
         {
         case 4:                 // 4 pixels to 1
            do                    // Process 16x16 blocks of pixels
            {
               JPGGetBlock (YVector1, Image.HuffDCTableY,    Image.HuffACTableY,    Image.QuantTableY,    &dcY);
               JPGGetBlock (YVector2, Image.HuffDCTableY,    Image.HuffACTableY,    Image.QuantTableY,    &dcY);
               JPGGetBlock (YVector3, Image.HuffDCTableY,    Image.HuffACTableY,    Image.QuantTableY,    &dcY);
               JPGGetBlock (YVector4, Image.HuffDCTableY,    Image.HuffACTableY,    Image.QuantTableY,    &dcY);
               JPGGetBlock (CbVector, Image.HuffDCTableCbCr, Image.HuffACTableCbCr, Image.QuantTableCbCr, &dcCb);
               JPGGetBlock (CrVector, Image.HuffDCTableCbCr, Image.HuffACTableCbCr, Image.QuantTableCbCr, &dcCr);
               loc=(y0+yindex)*240+(xindex+x0);//计算地址
               for (i=0; i<8; i++)  // Draw top left 8x8 pixels
               {
                  for (j=0; j<8; j++)
                  {
                  y = YVector1[i][j];
                  i2 = i >> 1;
                  j2 = j >> 1;
                  cb = CbVector[i2][j2];
                  cr = CrVector[i2][j2];
                  //if (xindex+j>=Image.Cols) break;
                  vram[loc+j]=JRGB(y,cb,cr);
                  }
                  loc+=240;
               }
               loc=(y0+yindex)*240+(xindex+x0);//计算地址
               for (i=0; i<8; i++)  // Draw top right 8x8 pixels
               {
                  if (xindex+16>=Image.Cols) xstep=Image.Cols-xindex;
                  else xstep=16;
                 for (j=8; j<xstep; j++)
                 {//if (xindex+j>=Image.Cols) break;
                 y = YVector2[i][j - 8];
                 i2 = i >> 1;
                 j2 = j >> 1;
                 cb = CbVector[i2][j2];
                 cr = CrVector[i2][j2];
                 vram[loc+j]=JRGB(y,cb,cr);
                }
                loc+=240;
              }
              loc=(y0+yindex+8)*240+(xindex+x0);//计算地址
              if (yindex+16>=Image.Rows) ystep=Image.Rows-yindex;
              else ystep=16;
               for (i=8; i<ystep; i++)  // Draw bottom left 8x8 pixels
               {
                for (j=0; j<8; j++)
                {
                 //if (xindex+j>=Image.Cols) break;
                 y = YVector3[i - 8][j];
                 i2 = i >> 1;
                 j2 = j >> 1;
                 cb = CbVector[i2][j2];
                 cr = CrVector[i2][j2];
                 vram[loc+j]=JRGB(y,cb,cr);
                }
                loc+=240;
              }
              loc=(y0+yindex+8)*240+(xindex+x0);//计算地址
              if (yindex+16>=Image.Rows) ystep=Image.Rows-yindex;
              else ystep=16;
               for (i=8; i<16; i++)          // Draw bottom right 8x8 pixels
               {
                  if (xindex+16>=Image.Cols) xstep=Image.Cols-xindex;
                  else xstep=16;
                 for (j=8; j<xstep; j++)
                 {
                 y = YVector4[i - 8][j - 8];
                 i2 = i >> 1;
                 j2 = j >> 1;
                 cb = CbVector[i2][j2];
                 cr = CrVector[i2][j2];
                 vram[loc+j]=JRGB(y,cb,cr);//优化之一:直接计算RGB值
                }
                loc+=240;//优化之二:将乘法转换为加法,大大提升了速度
              }
               xindex += 16;
               if (xindex >= Image.Cols)
               {
                xindex = 0; yindex += 16; mcu = 1;
               }
               if ((mcu == 1) && (Restart != 0))    //Execute the restart interval
               {
                curByte = jpgdata[findex++]; curByte = jpgdata[findex++]; curByte = jpgdata[findex++];
                curBits = 128;
                dcY = 0; dcCb = 0; dcCr = 0; mcu = 0;  //Reset the DC value
               }
             }
//           while ((findex < flen) && (yindex < Image.Rows));
           while (yindex < Image.Rows);
           break;
           case 2:           // 2 pixels to 1
           do
             {
             JPGGetBlock (YVector1, Image.HuffDCTableY,    Image.HuffACTableY,    Image.QuantTableY,    &dcY);
             JPGGetBlock (YVector2, Image.HuffDCTableY,    Image.HuffACTableY,    Image.QuantTableY,    &dcY);
             JPGGetBlock (CbVector, Image.HuffDCTableCbCr, Image.HuffACTableCbCr, Image.QuantTableCbCr, &dcCb);
             JPGGetBlock (CrVector, Image.HuffDCTableCbCr, Image.HuffACTableCbCr, Image.QuantTableCbCr, &dcCr);
             // YCbCr vectors have been obtained
             loc=(y0+yindex)*240+(xindex+x0);//计算地址
             if (yindex+8>=Image.Rows) ystep=Image.Rows-yindex;
              else ystep=8;
             for (i=0; i<ystep; i++)       // Draw left 8x8 pixels
             {
                for (j=0; j<8; j++)
                {//if (xindex+j>=Image.Cols) break;
                 y = YVector1[i][j];
                 i2 = i >> 1;
                 j2 = j >> 1;
                 cb = CbVector[i2][j2];
                 cr = CrVector[i2][j2];
                 vram[loc+j]=JRGB(y,cb,cr);
                 }
                 loc+=240;
             }
             loc=(y0+yindex)*240+(xindex+x0);//计算地址
             if (yindex+8>=Image.Rows) ystep=Image.Rows-yindex;
              else ystep=8;
             for (i=0; i<ystep; i++)       // Draw right 8x8 pixels
             {
                if (xindex+16>=Image.Cols) xstep=Image.Cols-xindex;
                else xstep=16;
               for (j=8; j<xstep; j++)
               {
                 y = YVector2[i][j - 8];
                 i2 = i >> 1;
                 j2 = j >> 1;
                 cb = CbVector[i2][j2];
                 cr = CrVector[i2][j2];
                 vram[loc+j]=JRGB(y,cb,cr);
               }
               loc+=240;
            }
             xindex += 16;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -