1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
|
/*
** ClanLib SDK
** Copyright (c) 1997-2005 The ClanLib Team
**
** This software is provided 'as-is', without any express or implied
** warranty. In no event will the authors be held liable for any damages
** arising from the use of this software.
**
** Permission is granted to anyone to use this software for any purpose,
** including commercial applications, and to alter it and redistribute it
** freely, subject to the following restrictions:
**
** 1. The origin of this software must not be misrepresented; you must not
** claim that you wrote the original software. If you use this software
** in a product, an acknowledgment in the product documentation would be
** appreciated but is not required.
** 2. Altered source versions must be plainly marked as such, and must not be
** misrepresented as being the original software.
** 3. This notice may not be removed or altered from any source distribution.
**
** Note: Some of the libraries ClanLib may link to may have additional
** requirements or restrictions.
**
** File Author(s):
**
** Magnus Norddahl
** (if your name is missing here, please add it)
*/
#ifndef header_jpeg_provider_generic
#define header_jpeg_provider_generic
#if _MSC_VER > 1000
#pragma once
#endif
#if _MSC_VER >= 1300
#define HAVE_BOOLEAN
#endif
#ifdef WIN32
#define XMD_H
#endif
#include <stdio.h>
extern "C"
{
#undef FAR
#ifdef __APPLE__
#include <libjpeg/jpeglib.h>
#else
#include <jpeglib.h>
#endif
}
#include "API/Display/Providers/jpeg_provider.h"
#include "Display/pixel_buffer_generic.h"
#include "API/Core/IOData/inputsource.h"
#include "API/Core/IOData/inputsource_provider.h"
class CL_InputSourceProvider;
//: Surface provider that can load JPEG (.jpg) files.
class CL_JPEGProvider_Generic : public CL_PixelBuffer_Generic
{
//! Construction:
public:
//: Constructs a surface provider that can read JPEG files.
CL_JPEGProvider_Generic(
const std::string &name,
CL_InputSourceProvider *provider);
~CL_JPEGProvider_Generic();
//! Attributes:
public:
//: Returns the pitch of the image (bytes per line).
unsigned int get_pitch() const { return pitch; }
//: Returns the width of the image.
unsigned int get_width() const { return width; }
//: Returns the height of the image.
unsigned int get_height() const { return height; }
//: Returns the number of subsprites in the image.
unsigned int get_num_frames() const { return 1; }
//: Returns the pixelformat used by the image.
// EPixelFormat get_pixel_format() const { return RGB888; }
//: Returns the red color mask used by the target.
unsigned int get_red_mask() const;
//: Returns the green color mask by the target.
unsigned int get_green_mask() const;
//: Returns the blue color mask by the target.
unsigned int get_blue_mask() const;
//: Returns the alpha mask by the target.
unsigned int get_alpha_mask() const;
//! Operations:
public:
//: Returns the image data. Provider must be locked before pointer is valid.
void *get_data();
//: Reference counted lock function. Allocate pixel buffer in this function.
virtual void perform_lock() { return; }
//: Reference counted unlock function. Free pixel buffer in this function.
virtual void perform_unlock() { return; }
//: Loads the JPEG data into the pixel buffer.
void init();
//: Cleans up.
void deinit();
//! Implementation:
private:
// Functions for managing the input handling
static void jpeg_InputSource_src (j_decompress_ptr cinfo, CL_JPEGProvider_Generic* prov);
static void init_source (j_decompress_ptr cinfo);
static boolean fill_input_buffer (j_decompress_ptr cinfo);
static void skip_input_data (j_decompress_ptr cinfo, long num_bytes);
static void term_source (j_decompress_ptr cinfo);
std::string filename;
unsigned char *image;
int pitch;
int width, height;
int bpp;
int pos;
typedef struct
{
struct jpeg_source_mgr pub; /* public fields */
CL_JPEGProvider_Generic* jpeg_provider; /* source stream */
JOCTET * buffer; /* start of buffer */
boolean start_of_file; /* have we gotten any data yet? */
} InputSource_source_mgr;
typedef InputSource_source_mgr* InputSource_src_ptr;
CL_InputSourceProvider* input_provider;
CL_InputSource* input_source;
};
#endif
|