fix: wrong sample points on mac os 13.

This commit is contained in:
Ivan Li 2023-04-14 21:27:14 +08:00
parent aa7430c54e
commit 9cbccedc72
3 changed files with 25 additions and 29 deletions

View File

@ -1,9 +1,9 @@
use std::cell::RefCell; use std::iter;
use std::{iter, cell::Ref};
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, Mutex}; use tauri::async_runtime::RwLock;
use crate::{ambient_light::LedStripConfig, led_color::LedColor}; use crate::{ambient_light::LedStripConfig, led_color::LedColor};
@ -17,7 +17,7 @@ pub struct Screenshot {
pub scale_factor: f32, pub scale_factor: f32,
} }
static SINGLE_AXIS_POINTS: usize = 5; static SINGLE_AXIS_POINTS: usize = 1;
impl Screenshot { impl Screenshot {
pub fn new( pub fn new(
@ -39,15 +39,20 @@ impl Screenshot {
} }
pub fn get_sample_points(&self, config: &LedStripConfig) -> Vec<LedSamplePoints> { pub fn get_sample_points(&self, config: &LedStripConfig) -> Vec<LedSamplePoints> {
let height = self.height as usize; let height = CGDisplay::new(self.display_id).bounds().size.height as usize;
let width = self.width 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(height / 18, width, config.len, SINGLE_AXIS_POINTS); let points = Self::get_one_edge_sample_points(
height / 18,
width,
config.len,
SINGLE_AXIS_POINTS,
);
points points
.into_iter() .into_iter()
.map(|groups| -> Vec<Point> { .map(|groups| -> Vec<Point> {
@ -56,7 +61,12 @@ impl Screenshot {
.collect() .collect()
} }
crate::ambient_light::Border::Left => { crate::ambient_light::Border::Left => {
let points = Self::get_one_edge_sample_points(width / 32, height, config.len, SINGLE_AXIS_POINTS); let points = Self::get_one_edge_sample_points(
width / 32,
height,
config.len,
SINGLE_AXIS_POINTS,
);
points points
.into_iter() .into_iter()
.map(|groups| -> Vec<Point> { .map(|groups| -> Vec<Point> {
@ -65,7 +75,12 @@ impl Screenshot {
.collect() .collect()
} }
crate::ambient_light::Border::Right => { crate::ambient_light::Border::Right => {
let points = Self::get_one_edge_sample_points(width / 32, height, config.len, SINGLE_AXIS_POINTS); let points = Self::get_one_edge_sample_points(
width / 32,
height,
config.len,
SINGLE_AXIS_POINTS,
);
points points
.into_iter() .into_iter()
.map(|groups| -> Vec<Point> { .map(|groups| -> Vec<Point> {

View File

@ -1,4 +1,3 @@
use std::cell::{Ref, RefCell};
use std::{collections::HashMap, sync::Arc}; use std::{collections::HashMap, sync::Arc};
use core_graphics::display::{ use core_graphics::display::{
@ -14,7 +13,7 @@ use crate::screenshot::LedSamplePoints;
use crate::{ use crate::{
ambient_light::{SamplePointConfig, SamplePointMapper}, ambient_light::{SamplePointConfig, SamplePointMapper},
led_color::LedColor, led_color::LedColor,
screenshot::{ScreenSamplePoints, Screenshot}, screenshot::Screenshot,
}; };
pub fn take_screenshot(display_id: u32, scale_factor: f32) -> anyhow::Result<Screenshot> { pub fn take_screenshot(display_id: u32, scale_factor: f32) -> anyhow::Result<Screenshot> {

View File

@ -24,12 +24,6 @@ type PixelProps = {
color: string; color: string;
}; };
async function subscribeScreenshotUpdate(displayId: number) {
await invoke('subscribe_encoded_screenshot_updated', {
displayId,
});
}
export const Pixel: Component<PixelProps> = (props) => { export const Pixel: Component<PixelProps> = (props) => {
const style = createMemo(() => ({ const style = createMemo(() => ({
background: props.color, background: props.color,
@ -51,7 +45,6 @@ export const LedStripPart: Component<LedStripPartProps> = (props) => {
const [localProps, rootProps] = splitProps(props, ['config']); const [localProps, rootProps] = splitProps(props, ['config']);
const [stripConfiguration] = useContext(LedStripConfigurationContext); const [stripConfiguration] = useContext(LedStripConfigurationContext);
const [ledSamplePoints, setLedSamplePoints] = createSignal();
const [colors, setColors] = createSignal<string[]>([]); const [colors, setColors] = createSignal<string[]>([]);
// update led strip colors from global store // update led strip colors from global store
@ -87,17 +80,6 @@ export const LedStripPart: Component<LedStripPartProps> = (props) => {
setColors(colors); setColors(colors);
}); });
// get led strip sample points
createEffect(() => {
if (localProps.config) {
invoke('get_led_strips_sample_points', {
config: localProps.config,
}).then((points) => {
setLedSamplePoints(points);
});
}
});
const [anchor, setAnchor] = createSignal<HTMLElement>(); const [anchor, setAnchor] = createSignal<HTMLElement>();
useTippy(anchor, { useTippy(anchor, {