2012-09-02 12:41:38 +00:00
|
|
|
/* RetroArch - A frontend for libretro.
|
|
|
|
* Copyright (C) 2010-2012 - Hans-Kristian Arntzen
|
|
|
|
*
|
|
|
|
* RetroArch is free software: you can redistribute it and/or modify it under the terms
|
|
|
|
* of the GNU General Public License as published by the Free Software Found-
|
|
|
|
* ation, either version 3 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
|
|
|
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
|
|
* PURPOSE. See the GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License along with RetroArch.
|
|
|
|
* If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
2012-09-02 12:30:46 +00:00
|
|
|
#ifndef SCALER_H__
|
|
|
|
#define SCALER_H__
|
|
|
|
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <stddef.h>
|
2012-09-02 13:30:15 +00:00
|
|
|
#include "../../boolean.h"
|
2012-09-02 12:30:46 +00:00
|
|
|
|
|
|
|
#define FILTER_UNITY (1 << 14)
|
|
|
|
|
|
|
|
enum scaler_pix_fmt
|
|
|
|
{
|
|
|
|
SCALER_FMT_ARGB8888 = 0,
|
|
|
|
SCALER_FMT_0RGB1555,
|
|
|
|
SCALER_FMT_BGR24
|
|
|
|
};
|
|
|
|
|
|
|
|
enum scaler_type
|
|
|
|
{
|
|
|
|
SCALER_TYPE_UNKNOWN = 0,
|
|
|
|
SCALER_TYPE_POINT,
|
|
|
|
SCALER_TYPE_BILINEAR,
|
|
|
|
SCALER_TYPE_SINC
|
|
|
|
};
|
|
|
|
|
|
|
|
struct scaler_filter
|
|
|
|
{
|
|
|
|
int16_t *filter;
|
|
|
|
size_t filter_len;
|
|
|
|
size_t filter_stride;
|
|
|
|
int *filter_pos;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct scaler_ctx
|
|
|
|
{
|
|
|
|
int in_width;
|
|
|
|
int in_height;
|
|
|
|
int in_stride;
|
|
|
|
|
|
|
|
int out_width;
|
|
|
|
int out_height;
|
|
|
|
int out_stride;
|
|
|
|
|
|
|
|
enum scaler_pix_fmt in_fmt;
|
|
|
|
enum scaler_pix_fmt out_fmt;
|
|
|
|
enum scaler_type scaler_type;
|
|
|
|
|
|
|
|
void (*scaler_horiz)(const struct scaler_ctx*,
|
|
|
|
const void*, int);
|
|
|
|
void (*scaler_vert)(const struct scaler_ctx*,
|
|
|
|
void*, int);
|
2012-09-02 22:48:00 +00:00
|
|
|
void (*scaler_special)(const struct scaler_ctx*,
|
|
|
|
void*, const void*, int, int, int, int, int, int);
|
2012-09-02 12:30:46 +00:00
|
|
|
|
|
|
|
void (*in_pixconv)(void*, const void*, int, int, int, int);
|
|
|
|
void (*out_pixconv)(void*, const void*, int, int, int, int);
|
|
|
|
void (*direct_pixconv)(void*, const void*, int, int, int, int);
|
|
|
|
|
|
|
|
bool unscaled;
|
|
|
|
struct scaler_filter horiz, vert;
|
|
|
|
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
uint32_t *frame;
|
|
|
|
int stride;
|
|
|
|
} input;
|
|
|
|
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
uint64_t *frame;
|
|
|
|
int width;
|
|
|
|
int height;
|
|
|
|
int stride;
|
|
|
|
} scaled;
|
|
|
|
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
uint32_t *frame;
|
|
|
|
int stride;
|
|
|
|
} output;
|
2012-09-02 21:49:30 +00:00
|
|
|
|
|
|
|
#ifdef SCALER_PERF
|
|
|
|
double elapsed_time_ms;
|
|
|
|
unsigned elapsed_frames;
|
|
|
|
#endif
|
2012-09-02 12:30:46 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
bool scaler_ctx_gen_filter(struct scaler_ctx *ctx);
|
|
|
|
void scaler_ctx_gen_reset(struct scaler_ctx *ctx);
|
|
|
|
|
2012-09-02 21:49:30 +00:00
|
|
|
void scaler_ctx_scale(struct scaler_ctx *ctx,
|
2012-09-02 12:30:46 +00:00
|
|
|
void *output, const void *input);
|
|
|
|
|
|
|
|
void *scaler_alloc(size_t elem_size, size_t size);
|
|
|
|
void scaler_free(void *ptr);
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|