Home | History | Annotate | Download | only in ports
      1 /* libs/graphics/ports/SkImageDecoder_Factory.cpp
      2 **
      3 ** Copyright 2006, The Android Open Source Project
      4 **
      5 ** Licensed under the Apache License, Version 2.0 (the "License");
      6 ** you may not use this file except in compliance with the License.
      7 ** You may obtain a copy of the License at
      8 **
      9 **     http://www.apache.org/licenses/LICENSE-2.0
     10 **
     11 ** Unless required by applicable law or agreed to in writing, software
     12 ** distributed under the License is distributed on an "AS IS" BASIS,
     13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14 ** See the License for the specific language governing permissions and
     15 ** limitations under the License.
     16 */
     17 
     18 #include "SkImageDecoder.h"
     19 #include "SkMovie.h"
     20 #include "SkStream.h"
     21 
     22 extern SkImageDecoder* SkImageDecoder_GIF_Factory(SkStream*);
     23 extern SkImageDecoder* SkImageDecoder_BMP_Factory(SkStream*);
     24 extern SkImageDecoder* SkImageDecoder_ICO_Factory(SkStream*);
     25 extern SkImageDecoder* SkImageDecoder_PNG_Factory(SkStream*);
     26 extern SkImageDecoder* SkImageDecoder_WBMP_Factory(SkStream*);
     27 extern SkImageDecoder* SkImageDecoder_JPEG_Factory(SkStream*);
     28 
     29 typedef SkImageDecoder* (*SkImageDecoderFactoryProc)(SkStream*);
     30 
     31 struct CodecFormat {
     32     SkImageDecoderFactoryProc   fProc;
     33     SkImageDecoder::Format      fFormat;
     34 };
     35 
     36 static const CodecFormat gPairs[] = {
     37 #if 0
     38     { SkImageDecoder_GIF_Factory,   SkImageDecoder::kGIF_Format },
     39     { SkImageDecoder_PNG_Factory,   SkImageDecoder::kPNG_Format },
     40     { SkImageDecoder_ICO_Factory,   SkImageDecoder::kICO_Format },
     41     { SkImageDecoder_WBMP_Factory,  SkImageDecoder::kWBMP_Format },
     42     { SkImageDecoder_BMP_Factory,   SkImageDecoder::kBMP_Format },
     43     { SkImageDecoder_JPEG_Factory,  SkImageDecoder::kJPEG_Format }
     44 #endif
     45 };
     46 
     47 SkImageDecoder* SkImageDecoder::Factory(SkStream* stream) {
     48     for (size_t i = 0; i < SK_ARRAY_COUNT(gPairs); i++) {
     49         SkImageDecoder* codec = gPairs[i].fProc(stream);
     50         stream->rewind();
     51         if (NULL != codec) {
     52             return codec;
     53         }
     54     }
     55     return NULL;
     56 }
     57 
     58 bool SkImageDecoder::SupportsFormat(Format format) {
     59     for (size_t i = 0; i < SK_ARRAY_COUNT(gPairs); i++) {
     60         if (gPairs[i].fFormat == format) {
     61             return true;
     62         }
     63     }
     64     return false;
     65 }
     66 
     67 /////////////////////////////////////////////////////////////////////////
     68 
     69 typedef SkMovie* (*SkMovieFactoryProc)(SkStream*);
     70 
     71 extern SkMovie* SkMovie_GIF_Factory(SkStream*);
     72 
     73 static const SkMovieFactoryProc gMovieProcs[] = {
     74 #if 0
     75     SkMovie_GIF_Factory
     76 #endif
     77 };
     78 
     79 SkMovie* SkMovie::DecodeStream(SkStream* stream) {
     80     for (unsigned i = 0; i < SK_ARRAY_COUNT(gMovieProcs); i++) {
     81         SkMovie* movie = gMovieProcs[i](stream);
     82         if (NULL != movie) {
     83             return movie;
     84         }
     85         stream->rewind();
     86     }
     87     return NULL;
     88 }
     89 
     90 /////////////////////////////////////////////////////////////////////////
     91 
     92 extern SkImageEncoder* SkImageEncoder_JPEG_Factory();
     93 extern SkImageEncoder* SkImageEncoder_PNG_Factory();
     94 
     95 SkImageEncoder* SkImageEncoder::Create(Type t) {
     96     switch (t) {
     97 #if 0
     98         case kJPEG_Type:
     99             return SkImageEncoder_JPEG_Factory();
    100         case kPNG_Type:
    101             return SkImageEncoder_PNG_Factory();
    102 #endif
    103         default:
    104             return NULL;
    105     }
    106 }
    107 
    108