/[projet1]/public/pc/tools/osdk/main/pictconv/sources/oric_converter.cpp
Defence Force logotype

Diff of /public/pc/tools/osdk/main/pictconv/sources/oric_converter.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1259 by Jylam, Tue May 6 21:15:53 2014 UTC revision 1260 by dbug, Sat Feb 14 20:26:49 2015 UTC
# Line 45  void dither_riemersma_rgb(ImageContainer Line 45  void dither_riemersma_rgb(ImageContainer
45  class OricRgbColor : public RgbColor  class OricRgbColor : public RgbColor
46  {  {
47  public:  public:
48      ORIC_COLOR GetOricColor()
49      {
50        ORIC_COLOR color=ORIC_COLOR_BLACK;
51        if ((m_red)>128)    color|=ORIC_COLOR_RED;
52        if ((m_green)>128)  color|=ORIC_COLOR_GREEN;
53        if ((m_blue)>128)   color|=ORIC_COLOR_BLUE;
54        return (ORIC_COLOR)color;
55      }
56    
57    void SetOricColor(ORIC_COLOR color)    void SetOricColor(ORIC_COLOR color)
58    {    {
59      if (color&1)        m_red=255;      if (color&1)        m_red=255;
# Line 55  public: Line 64  public:
64    
65      if (color&4)        m_blue=255;      if (color&4)        m_blue=255;
66      else                m_blue=0;      else                m_blue=0;
67    
68        m_alpha=255;
69    }    }
70  };  };
71    
72    
73    
74  // ============================================================================  // ============================================================================
75  //  //
76  //                                       OricPictureConverter  //                                       OricPictureConverter
# Line 72  PictureConverter(MACHINE_ORIC), Line 84  PictureConverter(MACHINE_ORIC),
84  {  {
85    m_Buffer.SetBufferSize(240,200);      // Default size    m_Buffer.SetBufferSize(240,200);      // Default size
86    m_Buffer.ClearBuffer(m_flag_setbit6);    m_Buffer.ClearBuffer(m_flag_setbit6);
87    
88      // Define the default AIC palette (should be possible to override at some point)
89      m_PaletteAIC[0][0]=ORIC_COLOR_BLACK;
90      m_PaletteAIC[0][1]=ORIC_COLOR_CYAN;
91      m_PaletteAIC[1][0]=ORIC_COLOR_BLACK;
92      m_PaletteAIC[1][1]=ORIC_COLOR_YELLOW;
93  }  }
94    
95  OricPictureConverter::~OricPictureConverter()  OricPictureConverter::~OricPictureConverter()
# Line 87  ORIC_COLOR OricPictureConverter::convert Line 105  ORIC_COLOR OricPictureConverter::convert
105    unsigned char r=rgb.m_red;    unsigned char r=rgb.m_red;
106    unsigned char g=rgb.m_green;    unsigned char g=rgb.m_green;
107    unsigned char b=rgb.m_blue;    unsigned char b=rgb.m_blue;
108      unsigned char a=rgb.m_alpha;
109    
110      ORIC_COLOR alphaMask=ORIC_COLOR_OPAQUE;
111      if ( (m_transparency==TRANSPARENCY_HOLES) && (a<128) )
112      {
113        alphaMask|=ORIC_COLOR_TRANSPARENT;
114      }
115    
116    switch (m_dither)    switch (m_dither)
117    {    {
# Line 122  ORIC_COLOR OricPictureConverter::convert Line 147  ORIC_COLOR OricPictureConverter::convert
147        b=255;        b=255;
148      }      }
149      else      else
150        if ((r+g+b)<85*3)      if ((r+g+b)<85*3)
151        {
152          r=0;
153          g=0;
154          b=0;
155        }
156        else
157        {
158          if ((x^y)&1)
159        {        {
160          r=0;          if (m_dither==DITHER_ALTERNATE_INVERSED)
161          g=0;          {
162          b=0;            r=255;
163              g=255;
164              b=255;
165            }
166            else
167            {
168              r=0;
169              g=0;
170              b=0;
171            }
172        }        }
173        else        else
174        {        {
175          if ((x^y)&1)          if (m_dither==DITHER_ALTERNATE_INVERSED)
176          {          {
177            if (m_dither==DITHER_ALTERNATE_INVERSED)            r=0;
178            {            g=0;
179              r=255;            b=0;
             g=255;  
             b=255;  
           }  
           else  
           {  
             r=0;  
             g=0;  
             b=0;  
           }  
180          }          }
181          else          else
182          {          {
183            if (m_dither==DITHER_ALTERNATE_INVERSED)            r=255;
184            {            g=255;
185              r=0;            b=255;
             g=0;  
             b=0;  
           }  
           else  
           {  
             r=255;  
             g=255;  
             b=255;  
           }  
186          }          }
187        }        }
188        break;      }
189        break;
190    
191    case DITHER_ORDERED:    case DITHER_ORDERED:
192      {      {
193        //        //
194        // Use a dithering matrix        // Use a dithering matrix
195        //        //
196        int       bit=1 << ((x&3) | ((y&3)<<2));        int bit=1 << ((x&3) | ((y&3)<<2));
197    
198        unsigned char c=(r+g+b)/3;        unsigned char c=(r+g+b)/3;
199        if (DitherMask[(c*8)/255]&bit)    c=255;        if (DitherMask[(c*8)/255]&bit)    c=255;
200        else                                                      c=0;        else                              c=0;
201    
202        r=g=b=c;        r=g=b=c;
203      }      }
204      break;      break;
205    
   case DITHER_RIEMERSMA:  
     break;  
   case DITHER_FLOYD:  
     break;  
   
206    default:    default:
207      break;      break;
208    }    }
209    
210    if (r|g|b)    if (r|g|b)
211      return ORIC_COLOR_WHITE;      return ORIC_COLOR_WHITE|alphaMask;
212    return ORIC_COLOR_BLACK;    return ORIC_COLOR_BLACK|alphaMask;
213  }  }
214    
215    
# Line 253  ORIC_COLOR OricPictureConverter::convert Line 273  ORIC_COLOR OricPictureConverter::convert
273      case 0:      case 0:
274        if (r>170)        r=255;        if (r>170)        r=255;
275        else        else
276          if (r<85)       r=0;        if (r<85) r=0;
277          else            r=(unsigned char)(255*((x^y)&1));        else              r=(unsigned char)(255*((x^y)&1));
278          g=0;        g=0;
279          b=0;        b=0;
280          break;        break;
281      case 1:      case 1:
282        if (g>170)        g=255;        if (g>170)        g=255;
283        else        else
284          if (g<85)       g=0;        if (g<85) g=0;
285          else            g=(unsigned char)(255*((x^y)&1));        else              g=(unsigned char)(255*((x^y)&1));
286          r=0;        r=0;
287          b=0;        b=0;
288          break;        break;
289      case 2:      case 2:
290        if (b>170)        b=255;        if (b>170)        b=255;
291        else        else
# Line 457  void OricPictureConverter::convert_monoc Line 477  void OricPictureConverter::convert_monoc
477      for (int col=0;col<m_Buffer.m_buffer_cols;col++)      for (int col=0;col<m_Buffer.m_buffer_cols;col++)
478      {      {
479        unsigned char val=0;        unsigned char val=0;
480          unsigned char transparentPixelMask=0;
481        for (int bit=0;bit<6;bit++)        for (int bit=0;bit<6;bit++)
482        {        {
483          val<<=1;          val<<=1;
484            transparentPixelMask<<=1;
485          ORIC_COLOR color=convert_pixel_monochrom(convertedPicture,x,y);          ORIC_COLOR color=convert_pixel_monochrom(convertedPicture,x,y);
486    
487            if ( (m_transparency==TRANSPARENCY_HOLES) && (color & ORIC_COLOR_TRANSPARENT) )
488            {
489              color&=~ORIC_COLOR_TRANSPARENT;
490              transparentPixelMask|=1;
491            }
492    
493          if (color!=ORIC_COLOR_BLACK)          if (color!=ORIC_COLOR_BLACK)
494          {          {
495            val|=1;            val|=1;
496          }          }
497          x++;          x++;
498        }        }
499          if ( (m_transparency==TRANSPARENCY_HOLES) && (transparentPixelMask==(1+2+4+8+16+32)) )
500          {
501            val=0;
502          }
503          else
504        if (m_flag_setbit6)        if (m_flag_setbit6)
505        {        {
506          // In some cases you don't want to get the bit 6 to be set at all          // In some cases you don't want to get the bit 6 to be set at all
# Line 478  void OricPictureConverter::convert_monoc Line 512  void OricPictureConverter::convert_monoc
512  }  }
513    
514    
515    
516    
517    
518    
519    class OricImageContainer : public ImageContainer
520    {
521    public:
522      OricImageContainer(const ImageContainer& otherImage)
523        : ImageContainer(otherImage)
524      {}
525    
526      OricRgbColor ReadOricColor(int x,int y)
527      {
528        OricRgbColor oricColor;
529        BYTE *ptr_byte=FreeImage_GetBitsRowCol(GetBitmap(),x,y);
530    
531        oricColor.m_blue    =*ptr_byte++;
532        oricColor.m_green   =*ptr_byte++;
533        oricColor.m_red     =*ptr_byte++;
534        oricColor.m_alpha   =*ptr_byte++;
535    
536        return oricColor;
537      }
538    
539    };
540    
541    
542    void OricPictureConverter::convert_aic(const ImageContainer& sourcePicture)
543    {
544      OricImageContainer convertedPicture(sourcePicture);
545    
546      //
547      // Perform the global dithering, if required
548      //
549      switch (m_dither)
550      {
551      case DITHER_RIEMERSMA:
552        dither_riemersma_monochrom(convertedPicture,m_Buffer.m_buffer_width,m_Buffer.m_buffer_height);
553        m_dither=DITHER_NONE;
554        break;
555      }
556    
557      //
558      // Perform the HIRES conversion
559      //
560      unsigned char* ptr_hires=m_Buffer.m_buffer;
561      for (unsigned int y=0;y<m_Buffer.m_buffer_height;y++)
562      {
563        ORIC_COLOR paper=m_PaletteAIC[y&1][0];
564        ORIC_COLOR ink  =m_PaletteAIC[y&1][1];
565    
566        int x=0;
567        for (int col=0;col<m_Buffer.m_buffer_cols;col++)
568        {
569          BlocOf6 pixelBloc;
570    
571          bool isOpaque=false;
572          for (int bit=0;bit<6;bit++)
573          {
574            // Read the source color
575            OricRgbColor rgb=convertedPicture.ReadOricColor(x,y);
576            if (rgb.m_alpha>128)
577            {
578              isOpaque=true;
579            }
580    
581            pixelBloc.AddColor(rgb.GetOricColor());
582            x++;
583          }
584          unsigned char val;
585          if (isOpaque || (m_transparency!=TRANSPARENCY_HOLES))
586          {
587            pixelBloc.UsePalette(paper,ink);
588            val=pixelBloc.value;
589            if (m_flag_setbit6)
590            {
591              // In some cases you don't want to get the bit 6 to be set at all
592              val|=64;
593            }
594          }
595          else
596          {
597            val=0;
598          }
599          *ptr_hires++=val;
600        }
601      }
602    }
603    
604    
605  void OricPictureConverter::convert_twilighte_mask(const ImageContainer& sourcePicture)  void OricPictureConverter::convert_twilighte_mask(const ImageContainer& sourcePicture)
606  {  {
607    ImageContainer convertedPicture(sourcePicture);    ImageContainer convertedPicture(sourcePicture);
# Line 749  bool OricPictureConverter::Convert(const Line 873  bool OricPictureConverter::Convert(const
873      convert_sam_hocevar(sourcePicture);      convert_sam_hocevar(sourcePicture);
874      break;      break;
875    
876      case FORMAT_AIC:
877        convert_aic(sourcePicture);
878        break;
879    
880    default:    default:
881      // Oops      // Oops
882      return false;      return false;
# Line 761  bool OricPictureConverter::Convert(const Line 889  bool OricPictureConverter::Convert(const
889    
890  bool OricPictureConverter::TakeSnapShot(ImageContainer& sourcePicture)  bool OricPictureConverter::TakeSnapShot(ImageContainer& sourcePicture)
891  {  {
892    if (!sourcePicture.Allocate(m_Buffer.m_buffer_width,m_Buffer.m_buffer_height,24))    if (!sourcePicture.Allocate(m_Buffer.m_buffer_width,m_Buffer.m_buffer_height,32))
893    {    {
894      return false;      return false;
895    }    }
# Line 769  bool OricPictureConverter::TakeSnapShot( Line 897  bool OricPictureConverter::TakeSnapShot(
897    unsigned char *ptr_hires=m_Buffer.m_buffer;    unsigned char *ptr_hires=m_Buffer.m_buffer;
898    for (unsigned int y=0;y<m_Buffer.m_buffer_height;y++)    for (unsigned int y=0;y<m_Buffer.m_buffer_height;y++)
899    {    {
900      ORIC_COLOR paper=ORIC_COLOR_BLACK;      ORIC_COLOR paper,ink;
901      ORIC_COLOR ink      =ORIC_COLOR_WHITE;  
902        if (m_format==FORMAT_AIC)
903        {
904          paper=m_PaletteAIC[y&1][0];
905          ink  =m_PaletteAIC[y&1][1];
906        }
907        else
908        {
909          paper=ORIC_COLOR_BLACK;
910          ink  =ORIC_COLOR_WHITE;
911        }
912    
913      int x=0;      int x=0;
914      for (int col=0;col<m_Buffer.m_buffer_cols;col++)      for (int col=0;col<m_Buffer.m_buffer_cols;col++)

Legend:
Removed from v.1259  
changed lines
  Added in v.1260

  ViewVC Help
Powered by ViewVC 1.1.26