1a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik/*
2a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik * Copyright (C) 2013 The Android Open Source Project
3a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik *
4a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik * Licensed under the Apache License, Version 2.0 (the "License");
5a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik * you may not use this file except in compliance with the License.
6a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik * You may obtain a copy of the License at
7a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik *
8a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik *      http://www.apache.org/licenses/LICENSE-2.0
9a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik *
10a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik * Unless required by applicable law or agreed to in writing, software
11a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik * distributed under the License is distributed on an "AS IS" BASIS,
12a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik * See the License for the specific language governing permissions and
14a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik * limitations under the License.
15a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik */
16a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik
17a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik#ifndef RASTERMILL_REGISTRY_H
18a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik#define RASTERMILL_REGISTRY_H
19a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik
206a61141137c7a46d747aa611c9caf62436bc119fChris Craik#include "jni.h"
216a61141137c7a46d747aa611c9caf62436bc119fChris Craik#include <stdint.h>
226a61141137c7a46d747aa611c9caf62436bc119fChris Craik
23a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craikclass FrameSequence;
24a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craikclass Decoder;
25a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craikclass Stream;
26a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik
27a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craikstruct RegistryEntry {
28a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik    int requiredHeaderBytes;
29a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik    bool (*checkHeader)(void* header, int header_size);
30a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik    FrameSequence* (*createFrameSequence)(Stream* stream);
31a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik    Decoder* (*createDecoder)(Stream* stream);
326a61141137c7a46d747aa611c9caf62436bc119fChris Craik    bool (*acceptsBuffer)();
33a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik};
34a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik
35a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik/**
36a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik * Template class for registering subclasses that can produce instances of themselves given a
37a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik * DataStream pointer.
38a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik *
39a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik * The super class / root constructable type only needs to define a single static construction
40a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik * meathod that creates an instance by iterating through all factory methods.
41a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik */
42a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craikclass Registry {
43a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craikpublic:
44a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik    Registry(const RegistryEntry& entry);
45a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik
46a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik    static const RegistryEntry* Find(Stream* stream);
47a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik
48a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craikprivate:
49a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik    RegistryEntry mImpl;
50a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik    Registry* mNext;
51a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik};
52a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik
53a1265c3d8a20e805e0c45083d5c7d728d4b70009Chris Craik#endif // RASTERMILL_REGISTRY_H
54