fix: wrong sample points on mac os 13.
This commit is contained in:
parent
09799cb2d5
commit
782f3bf029
@ -51,12 +51,13 @@ impl LedColorsPublisher {
|
|||||||
&self,
|
&self,
|
||||||
display_id: u32,
|
display_id: u32,
|
||||||
sample_points: Vec<Vec<LedSamplePoints>>,
|
sample_points: Vec<Vec<LedSamplePoints>>,
|
||||||
|
bound_scale_factor: f32,
|
||||||
display_colors_tx: broadcast::Sender<(u32, Vec<u8>)>,
|
display_colors_tx: broadcast::Sender<(u32, Vec<u8>)>,
|
||||||
) {
|
) {
|
||||||
let internal_tasks_version = self.inner_tasks_version.clone();
|
let internal_tasks_version = self.inner_tasks_version.clone();
|
||||||
|
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
let colors = screenshot_manager::get_display_colors(display_id, &sample_points);
|
let colors = screenshot_manager::get_display_colors(display_id, &sample_points, bound_scale_factor);
|
||||||
|
|
||||||
if let Err(err) = colors {
|
if let Err(err) = colors {
|
||||||
warn!("Failed to get colors: {}", err);
|
warn!("Failed to get colors: {}", err);
|
||||||
@ -85,7 +86,7 @@ impl LedColorsPublisher {
|
|||||||
|
|
||||||
// log::info!("tick: {}ms", start.elapsed().as_millis());
|
// log::info!("tick: {}ms", start.elapsed().as_millis());
|
||||||
start = tokio::time::Instant::now();
|
start = tokio::time::Instant::now();
|
||||||
let colors = screenshot_manager::get_display_colors(display_id, &sample_points);
|
let colors = screenshot_manager::get_display_colors(display_id, &sample_points, bound_scale_factor);
|
||||||
|
|
||||||
if let Err(err) = colors {
|
if let Err(err) = colors {
|
||||||
warn!("Failed to get colors: {}", err);
|
warn!("Failed to get colors: {}", err);
|
||||||
@ -222,10 +223,12 @@ impl LedColorsPublisher {
|
|||||||
for sample_point_group in configs.sample_point_groups.clone() {
|
for sample_point_group in configs.sample_point_groups.clone() {
|
||||||
let display_id = sample_point_group.display_id;
|
let display_id = sample_point_group.display_id;
|
||||||
let sample_points = sample_point_group.points;
|
let sample_points = sample_point_group.points;
|
||||||
|
let bound_scale_factor = sample_point_group.bound_scale_factor;
|
||||||
|
|
||||||
publisher.start_one_display_colors_fetcher(
|
publisher.start_one_display_colors_fetcher(
|
||||||
display_id,
|
display_id,
|
||||||
sample_points,
|
sample_points,
|
||||||
|
bound_scale_factor,
|
||||||
display_colors_tx.clone(),
|
display_colors_tx.clone(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -338,7 +341,9 @@ impl LedColorsPublisher {
|
|||||||
.map(|config| screenshot.get_sample_points(&config))
|
.map(|config| screenshot.get_sample_points(&config))
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
let colors_config = DisplaySamplePointGroup { display_id, points };
|
let bound_scale_factor = screenshot.bound_scale_factor;
|
||||||
|
|
||||||
|
let colors_config = DisplaySamplePointGroup { display_id, points, bound_scale_factor };
|
||||||
|
|
||||||
colors_configs.push(colors_config);
|
colors_configs.push(colors_config);
|
||||||
}
|
}
|
||||||
@ -369,4 +374,5 @@ pub struct AllColorConfig {
|
|||||||
pub struct DisplaySamplePointGroup {
|
pub struct DisplaySamplePointGroup {
|
||||||
pub display_id: u32,
|
pub display_id: u32,
|
||||||
pub points: Vec<Vec<LedSamplePoints>>,
|
pub points: Vec<Vec<LedSamplePoints>>,
|
||||||
|
pub bound_scale_factor: f32,
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
use std::iter;
|
use std::iter;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use core_graphics::display::CGDisplay;
|
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use tauri::async_runtime::RwLock;
|
use tauri::async_runtime::RwLock;
|
||||||
|
|
||||||
@ -15,9 +15,10 @@ pub struct Screenshot {
|
|||||||
pub bytes_per_row: usize,
|
pub bytes_per_row: usize,
|
||||||
pub bytes: Arc<RwLock<Vec<u8>>>,
|
pub bytes: Arc<RwLock<Vec<u8>>>,
|
||||||
pub scale_factor: f32,
|
pub scale_factor: f32,
|
||||||
|
pub bound_scale_factor: f32,
|
||||||
}
|
}
|
||||||
|
|
||||||
static SINGLE_AXIS_POINTS: usize = 1;
|
static SINGLE_AXIS_POINTS: usize = 5;
|
||||||
|
|
||||||
impl Screenshot {
|
impl Screenshot {
|
||||||
pub fn new(
|
pub fn new(
|
||||||
@ -27,6 +28,7 @@ impl Screenshot {
|
|||||||
bytes_per_row: usize,
|
bytes_per_row: usize,
|
||||||
bytes: Vec<u8>,
|
bytes: Vec<u8>,
|
||||||
scale_factor: f32,
|
scale_factor: f32,
|
||||||
|
bound_scale_factor: f32,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
Self {
|
Self {
|
||||||
display_id,
|
display_id,
|
||||||
@ -35,24 +37,22 @@ impl Screenshot {
|
|||||||
bytes_per_row,
|
bytes_per_row,
|
||||||
bytes: Arc::new(RwLock::new(bytes)),
|
bytes: Arc::new(RwLock::new(bytes)),
|
||||||
scale_factor,
|
scale_factor,
|
||||||
|
bound_scale_factor,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_sample_points(&self, config: &LedStripConfig) -> Vec<LedSamplePoints> {
|
pub fn get_sample_points(&self, config: &LedStripConfig) -> Vec<LedSamplePoints> {
|
||||||
let height = CGDisplay::new(self.display_id).bounds().size.height as usize;
|
let height = self.height as usize;
|
||||||
let width = CGDisplay::new(self.display_id).bounds().size.width as usize;
|
let width = self.width as usize;
|
||||||
|
// let height = CGDisplay::new(self.display_id).bounds().size.height as usize;
|
||||||
|
// let width = CGDisplay::new(self.display_id).bounds().size.width as usize;
|
||||||
|
|
||||||
match config.border {
|
match config.border {
|
||||||
crate::ambient_light::Border::Top => {
|
crate::ambient_light::Border::Top => {
|
||||||
Self::get_one_edge_sample_points(height / 18, width, config.len, SINGLE_AXIS_POINTS)
|
Self::get_one_edge_sample_points(height / 18, width, config.len, SINGLE_AXIS_POINTS)
|
||||||
}
|
}
|
||||||
crate::ambient_light::Border::Bottom => {
|
crate::ambient_light::Border::Bottom => {
|
||||||
let points = Self::get_one_edge_sample_points(
|
let points = Self::get_one_edge_sample_points(height / 18, width, config.len, SINGLE_AXIS_POINTS);
|
||||||
height / 18,
|
|
||||||
width,
|
|
||||||
config.len,
|
|
||||||
SINGLE_AXIS_POINTS,
|
|
||||||
);
|
|
||||||
points
|
points
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|groups| -> Vec<Point> {
|
.map(|groups| -> Vec<Point> {
|
||||||
@ -61,12 +61,7 @@ impl Screenshot {
|
|||||||
.collect()
|
.collect()
|
||||||
}
|
}
|
||||||
crate::ambient_light::Border::Left => {
|
crate::ambient_light::Border::Left => {
|
||||||
let points = Self::get_one_edge_sample_points(
|
let points = Self::get_one_edge_sample_points(width / 32, height, config.len, SINGLE_AXIS_POINTS);
|
||||||
width / 32,
|
|
||||||
height,
|
|
||||||
config.len,
|
|
||||||
SINGLE_AXIS_POINTS,
|
|
||||||
);
|
|
||||||
points
|
points
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|groups| -> Vec<Point> {
|
.map(|groups| -> Vec<Point> {
|
||||||
@ -75,12 +70,7 @@ impl Screenshot {
|
|||||||
.collect()
|
.collect()
|
||||||
}
|
}
|
||||||
crate::ambient_light::Border::Right => {
|
crate::ambient_light::Border::Right => {
|
||||||
let points = Self::get_one_edge_sample_points(
|
let points = Self::get_one_edge_sample_points(width / 32, height, config.len, SINGLE_AXIS_POINTS);
|
||||||
width / 32,
|
|
||||||
height,
|
|
||||||
config.len,
|
|
||||||
SINGLE_AXIS_POINTS,
|
|
||||||
);
|
|
||||||
points
|
points
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|groups| -> Vec<Point> {
|
.map(|groups| -> Vec<Point> {
|
||||||
@ -168,6 +158,7 @@ impl Screenshot {
|
|||||||
b += bitmap[position] as f64;
|
b += bitmap[position] as f64;
|
||||||
g += bitmap[position + 1] as f64;
|
g += bitmap[position + 1] as f64;
|
||||||
r += bitmap[position + 2] as f64;
|
r += bitmap[position + 2] as f64;
|
||||||
|
// log::info!("position: {}, total: {}", position, bitmap.len());
|
||||||
}
|
}
|
||||||
let color = LedColor::new((r / len) as u8, (g / len) as u8, (b / len) as u8);
|
let color = LedColor::new((r / len) as u8, (g / len) as u8, (b / len) as u8);
|
||||||
colors.push(color);
|
colors.push(color);
|
||||||
|
@ -11,7 +11,7 @@ use tokio::time::{self, Duration};
|
|||||||
|
|
||||||
use crate::screenshot::LedSamplePoints;
|
use crate::screenshot::LedSamplePoints;
|
||||||
use crate::{
|
use crate::{
|
||||||
ambient_light::{SamplePointConfig, SamplePointMapper},
|
ambient_light::SamplePointMapper,
|
||||||
led_color::LedColor,
|
led_color::LedColor,
|
||||||
screenshot::Screenshot,
|
screenshot::Screenshot,
|
||||||
};
|
};
|
||||||
@ -36,6 +36,10 @@ pub fn take_screenshot(display_id: u32, scale_factor: f32) -> anyhow::Result<Scr
|
|||||||
|
|
||||||
let bytes = buffer.bytes().to_owned();
|
let bytes = buffer.bytes().to_owned();
|
||||||
|
|
||||||
|
|
||||||
|
let cg_display = CGDisplay::new(display_id);
|
||||||
|
let bound_scale_factor = (cg_display.bounds().size.width / width as f64) as f32;
|
||||||
|
|
||||||
Ok(Screenshot::new(
|
Ok(Screenshot::new(
|
||||||
display_id,
|
display_id,
|
||||||
height as u32,
|
height as u32,
|
||||||
@ -43,12 +47,14 @@ pub fn take_screenshot(display_id: u32, scale_factor: f32) -> anyhow::Result<Scr
|
|||||||
bytes_per_row,
|
bytes_per_row,
|
||||||
bytes,
|
bytes,
|
||||||
scale_factor,
|
scale_factor,
|
||||||
|
bound_scale_factor
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_display_colors(
|
pub fn get_display_colors(
|
||||||
display_id: u32,
|
display_id: u32,
|
||||||
sample_points: &Vec<Vec<LedSamplePoints>>,
|
sample_points: &Vec<Vec<LedSamplePoints>>,
|
||||||
|
bound_scale_factor: f32,
|
||||||
) -> anyhow::Result<Vec<LedColor>> {
|
) -> anyhow::Result<Vec<LedColor>> {
|
||||||
log::debug!("take_screenshot");
|
log::debug!("take_screenshot");
|
||||||
let cg_display = CGDisplay::new(display_id);
|
let cg_display = CGDisplay::new(display_id);
|
||||||
@ -68,8 +74,8 @@ pub fn get_display_colors(
|
|||||||
let (start_y, end_y) = (usize::min(start_y, end_y), usize::max(start_y, end_y));
|
let (start_y, end_y) = (usize::min(start_y, end_y), usize::max(start_y, end_y));
|
||||||
|
|
||||||
let origin = CGPoint {
|
let origin = CGPoint {
|
||||||
x: start_x as f64 + cg_display.bounds().origin.x,
|
x: start_x as f64 * bound_scale_factor as f64 + cg_display.bounds().origin.x,
|
||||||
y: start_y as f64 + cg_display.bounds().origin.y,
|
y: start_y as f64 * bound_scale_factor as f64 + cg_display.bounds().origin.y,
|
||||||
};
|
};
|
||||||
let size = CGSize {
|
let size = CGSize {
|
||||||
width: (end_x - start_x + 1) as f64,
|
width: (end_x - start_x + 1) as f64,
|
||||||
|
Loading…
Reference in New Issue
Block a user