mirror of
https://github.com/gnif/LookingGlass.git
synced 2025-05-02 04:31:09 +00:00
117 lines
2.7 KiB
C
117 lines
2.7 KiB
C
/**
|
|
* Looking Glass
|
|
* Copyright © 2017-2025 The Looking Glass Authors
|
|
* https://looking-glass.io
|
|
*
|
|
* This program 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 Foundation; either version 2 of the License, or (at your option)
|
|
* any later version.
|
|
*
|
|
* This program 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 this program; if not, write to the Free Software Foundation, Inc., 59
|
|
* Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
#include "downsample_parser.h"
|
|
#include "common/debug.h"
|
|
|
|
#include <string.h>
|
|
|
|
Vector downsampleRules = {0};
|
|
|
|
bool downsampleParser(struct Option * opt, const char * str)
|
|
{
|
|
if (!str)
|
|
return false;
|
|
|
|
opt->value.x_string = strdup(str);
|
|
|
|
Vector * downsampleRules = (Vector *)opt->opaque;
|
|
if (downsampleRules->data)
|
|
vector_destroy(downsampleRules);
|
|
|
|
if (!vector_create(downsampleRules, sizeof(DownsampleRule), 10))
|
|
{
|
|
DEBUG_ERROR("Failed to allocate ram");
|
|
return false;
|
|
}
|
|
|
|
char * tmp = strdup(str);
|
|
char * token = strtok(tmp, ",");
|
|
int count = 0;
|
|
while(token)
|
|
{
|
|
DownsampleRule rule = {0};
|
|
if (token[0] == '>')
|
|
{
|
|
rule.greater = true;
|
|
++token;
|
|
}
|
|
|
|
rule.module = opt->module;
|
|
if (sscanf(token, "%ux%u:%ux%u",
|
|
&rule.x,
|
|
&rule.y,
|
|
&rule.targetX,
|
|
&rule.targetY) != 4)
|
|
{
|
|
DEBUG_INFO("Unable to parse downsample rules");
|
|
free(tmp);
|
|
return false;
|
|
}
|
|
|
|
rule.id = count++;
|
|
|
|
DEBUG_INFO(
|
|
"%s:%s rule %u: %ux%u IF X %s %4u %s Y %s %4u",
|
|
opt->module,
|
|
opt->name,
|
|
rule.id,
|
|
rule.targetX,
|
|
rule.targetY,
|
|
rule.greater ? "> " : "==",
|
|
rule.x,
|
|
rule.greater ? "OR " : "AND",
|
|
rule.greater ? "> " : "==",
|
|
rule.y
|
|
);
|
|
vector_push(downsampleRules, &rule);
|
|
|
|
token = strtok(NULL, ",");
|
|
}
|
|
free(tmp);
|
|
|
|
return true;
|
|
}
|
|
|
|
void downsampleCleanup(struct Option * opt)
|
|
{
|
|
Vector * downsampleRules = (Vector *)opt->opaque;
|
|
if (downsampleRules->data)
|
|
vector_destroy(downsampleRules);
|
|
}
|
|
|
|
DownsampleRule * downsampleRule_match(Vector * rules, int x, int y)
|
|
{
|
|
DownsampleRule * rule, * match = NULL;
|
|
vector_forEachRef(rule, rules)
|
|
{
|
|
if (( rule->greater && (x > rule->x || y > rule->y)) ||
|
|
(!rule->greater && (x == rule->x && y == rule->y)))
|
|
{
|
|
match = rule;
|
|
}
|
|
}
|
|
|
|
if (match)
|
|
DEBUG_INFO("Matched downsample rule %d", rule->id);
|
|
|
|
return match;
|
|
}
|