зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1333923. Update webrender bcf3c371086894f5e1d098ee60f0592abf01f6b3. r=gfx?
This commit is contained in:
Родитель
fccb2406bb
Коммит
e56c66022e
|
@ -59,4 +59,4 @@ What if you have to make changes to webrender itself?
|
|||
|
||||
Yes, this is somewhat painful. It used to be worse. :)
|
||||
|
||||
Latest Commit: 6c15d14bb6b786cad979407e6ed7b86949b4ae48
|
||||
Latest Commit: bcf3c371086894f5e1d098ee60f0592abf01f6b3
|
||||
|
|
|
@ -30,6 +30,9 @@ threadpool = "1.3.2"
|
|||
webrender_traits = {path = "../webrender_traits", default-features = false}
|
||||
bitflags = "0.7"
|
||||
|
||||
[dev-dependencies]
|
||||
angle = {git = "https://github.com/servo/angle", branch = "servo"}
|
||||
|
||||
[target.'cfg(any(target_os = "android", all(unix, not(target_os = "macos"))))'.dependencies]
|
||||
freetype = { version = "0.2", default-features = false }
|
||||
|
||||
|
|
|
@ -3,32 +3,23 @@
|
|||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use app_units::Au;
|
||||
use euclid::Point3D;
|
||||
use fnv::FnvHasher;
|
||||
use geometry::ray_intersects_rect;
|
||||
use internal_types::{ANGLE_FLOAT_TO_FIXED, AxisDirection};
|
||||
use internal_types::{CompositionOp};
|
||||
use internal_types::{LowLevelFilterOp};
|
||||
use internal_types::{RendererFrame};
|
||||
use layer::{Layer, ScrollingState};
|
||||
use layer::Layer;
|
||||
use resource_cache::ResourceCache;
|
||||
use scene::Scene;
|
||||
use std::collections::{HashMap, HashSet};
|
||||
use scroll_tree::{ScrollTree, ScrollStates};
|
||||
use std::collections::HashMap;
|
||||
use std::hash::BuildHasherDefault;
|
||||
use tiling::{AuxiliaryListsMap, FrameBuilder, FrameBuilderConfig, LayerMap, PrimitiveFlags};
|
||||
use webrender_traits::{AuxiliaryLists, PipelineId, Epoch, ScrollPolicy, ScrollLayerId};
|
||||
use webrender_traits::{ClipRegion, ColorF, DisplayItem, StackingContext, FilterOp, MixBlendMode};
|
||||
use webrender_traits::{ScrollEventPhase, ScrollLayerInfo, ScrollLocation, SpecificDisplayItem, ScrollLayerState};
|
||||
use webrender_traits::{LayerRect, LayerPoint, LayerSize};
|
||||
use webrender_traits::{ServoScrollRootId, ScrollLayerRect, as_scroll_parent_rect, ScrollLayerPixel};
|
||||
use webrender_traits::{WorldPoint, WorldPoint4D};
|
||||
use webrender_traits::{LayerToScrollTransform, ScrollToWorldTransform};
|
||||
|
||||
#[cfg(target_os = "macos")]
|
||||
const CAN_OVERSCROLL: bool = true;
|
||||
|
||||
#[cfg(not(target_os = "macos"))]
|
||||
const CAN_OVERSCROLL: bool = false;
|
||||
use tiling::{AuxiliaryListsMap, FrameBuilder, FrameBuilderConfig, PrimitiveFlags};
|
||||
use webrender_traits::{AuxiliaryLists, ClipRegion, ColorF, DisplayItem, Epoch, FilterOp};
|
||||
use webrender_traits::{LayerPoint, LayerRect, LayerSize, LayerToScrollTransform};
|
||||
use webrender_traits::{MixBlendMode, PipelineId, ScrollEventPhase, ScrollLayerId, ScrollLayerState};
|
||||
use webrender_traits::{ScrollLocation, ScrollPolicy, ServoScrollRootId, SpecificDisplayItem};
|
||||
use webrender_traits::{StackingContext, WorldPoint};
|
||||
|
||||
#[derive(Copy, Clone, PartialEq, PartialOrd, Debug)]
|
||||
pub struct FrameId(pub u32);
|
||||
|
@ -43,12 +34,9 @@ struct FlattenContext<'a> {
|
|||
|
||||
// TODO: doc
|
||||
pub struct Frame {
|
||||
pub layers: LayerMap,
|
||||
pub scroll_tree: ScrollTree,
|
||||
pub pipeline_epoch_map: HashMap<PipelineId, Epoch, BuildHasherDefault<FnvHasher>>,
|
||||
pub pipeline_auxiliary_lists: AuxiliaryListsMap,
|
||||
pub root_scroll_layer_id: Option<ScrollLayerId>,
|
||||
pending_scroll_offsets: HashMap<(PipelineId, ServoScrollRootId), LayerPoint>,
|
||||
current_scroll_layer_id: Option<ScrollLayerId>,
|
||||
id: FrameId,
|
||||
debug: bool,
|
||||
frame_builder_config: FrameBuilderConfig,
|
||||
|
@ -207,10 +195,7 @@ impl Frame {
|
|||
Frame {
|
||||
pipeline_epoch_map: HashMap::with_hasher(Default::default()),
|
||||
pipeline_auxiliary_lists: HashMap::with_hasher(Default::default()),
|
||||
layers: HashMap::with_hasher(Default::default()),
|
||||
root_scroll_layer_id: None,
|
||||
pending_scroll_offsets: HashMap::new(),
|
||||
current_scroll_layer_id: None,
|
||||
scroll_tree: ScrollTree::new(),
|
||||
id: FrameId(0),
|
||||
debug: debug,
|
||||
frame_builder: None,
|
||||
|
@ -218,82 +203,17 @@ impl Frame {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn reset(&mut self)
|
||||
-> HashMap<ScrollLayerId, ScrollingState, BuildHasherDefault<FnvHasher>> {
|
||||
pub fn reset(&mut self) -> ScrollStates {
|
||||
self.pipeline_epoch_map.clear();
|
||||
|
||||
// Free any render targets from last frame.
|
||||
// TODO: This should really re-use existing targets here...
|
||||
let mut old_layer_scrolling_states = HashMap::with_hasher(Default::default());
|
||||
for (layer_id, old_layer) in &mut self.layers.drain() {
|
||||
old_layer_scrolling_states.insert(layer_id, old_layer.scrolling);
|
||||
}
|
||||
|
||||
// Advance to the next frame.
|
||||
self.id.0 += 1;
|
||||
|
||||
old_layer_scrolling_states
|
||||
}
|
||||
|
||||
pub fn get_scroll_layer(&self, cursor: &WorldPoint, scroll_layer_id: ScrollLayerId)
|
||||
-> Option<ScrollLayerId> {
|
||||
self.layers.get(&scroll_layer_id).and_then(|layer| {
|
||||
for child_layer_id in layer.children.iter().rev() {
|
||||
if let Some(layer_id) = self.get_scroll_layer(cursor, *child_layer_id) {
|
||||
return Some(layer_id);
|
||||
}
|
||||
}
|
||||
|
||||
match scroll_layer_id.info {
|
||||
ScrollLayerInfo::Fixed => {
|
||||
None
|
||||
}
|
||||
ScrollLayerInfo::Scrollable(..) => {
|
||||
let inv = layer.world_viewport_transform.inverse().unwrap();
|
||||
let z0 = -10000.0;
|
||||
let z1 = 10000.0;
|
||||
|
||||
let p0 = inv.transform_point4d(&WorldPoint4D::new(cursor.x, cursor.y, z0, 1.0));
|
||||
let p0 = Point3D::new(p0.x / p0.w,
|
||||
p0.y / p0.w,
|
||||
p0.z / p0.w);
|
||||
let p1 = inv.transform_point4d(&WorldPoint4D::new(cursor.x, cursor.y, z1, 1.0));
|
||||
let p1 = Point3D::new(p1.x / p1.w,
|
||||
p1.y / p1.w,
|
||||
p1.z / p1.w);
|
||||
|
||||
let is_unscrollable = layer.content_size.width <= layer.local_viewport_rect.size.width &&
|
||||
layer.content_size.height <= layer.local_viewport_rect.size.height;
|
||||
if is_unscrollable {
|
||||
None
|
||||
} else {
|
||||
let result = ray_intersects_rect(p0, p1, layer.local_viewport_rect.to_untyped());
|
||||
if result {
|
||||
Some(scroll_layer_id)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
self.scroll_tree.drain()
|
||||
}
|
||||
|
||||
pub fn get_scroll_layer_state(&self) -> Vec<ScrollLayerState> {
|
||||
let mut result = vec![];
|
||||
for (scroll_layer_id, scroll_layer) in &self.layers {
|
||||
match scroll_layer_id.info {
|
||||
ScrollLayerInfo::Scrollable(_, servo_scroll_root_id) => {
|
||||
result.push(ScrollLayerState {
|
||||
pipeline_id: scroll_layer.pipeline_id,
|
||||
scroll_root_id: servo_scroll_root_id,
|
||||
scroll_offset: scroll_layer.scrolling.offset,
|
||||
})
|
||||
}
|
||||
ScrollLayerInfo::Fixed => {}
|
||||
}
|
||||
}
|
||||
result
|
||||
self.scroll_tree.get_scroll_layer_state()
|
||||
}
|
||||
|
||||
/// Returns true if any layers actually changed position or false otherwise.
|
||||
|
@ -302,30 +222,7 @@ impl Frame {
|
|||
pipeline_id: PipelineId,
|
||||
scroll_root_id: ServoScrollRootId)
|
||||
-> bool {
|
||||
let origin = LayerPoint::new(origin.x.max(0.0), origin.y.max(0.0));
|
||||
|
||||
let mut scrolled_a_layer = false;
|
||||
let mut found_layer = false;
|
||||
for (layer_id, layer) in self.layers.iter_mut() {
|
||||
if layer_id.pipeline_id != pipeline_id {
|
||||
continue;
|
||||
}
|
||||
|
||||
match layer_id.info {
|
||||
ScrollLayerInfo::Scrollable(_, id) if id != scroll_root_id => continue,
|
||||
ScrollLayerInfo::Fixed => continue,
|
||||
_ => {}
|
||||
}
|
||||
|
||||
found_layer = true;
|
||||
scrolled_a_layer |= layer.set_scroll_origin(&origin);
|
||||
}
|
||||
|
||||
if !found_layer {
|
||||
self.pending_scroll_offsets.insert((pipeline_id, scroll_root_id), origin);
|
||||
}
|
||||
|
||||
scrolled_a_layer
|
||||
self.scroll_tree.scroll_layers(origin, pipeline_id, scroll_root_id)
|
||||
}
|
||||
|
||||
/// Returns true if any layers actually changed position or false otherwise.
|
||||
|
@ -334,172 +231,11 @@ impl Frame {
|
|||
cursor: WorldPoint,
|
||||
phase: ScrollEventPhase)
|
||||
-> bool {
|
||||
let root_scroll_layer_id = match self.root_scroll_layer_id {
|
||||
Some(root_scroll_layer_id) => root_scroll_layer_id,
|
||||
None => return false,
|
||||
};
|
||||
|
||||
let scroll_layer_id = match (
|
||||
phase,
|
||||
self.get_scroll_layer(&cursor, root_scroll_layer_id),
|
||||
self.current_scroll_layer_id) {
|
||||
(ScrollEventPhase::Start, Some(scroll_layer_id), _) => {
|
||||
self.current_scroll_layer_id = Some(scroll_layer_id);
|
||||
scroll_layer_id
|
||||
},
|
||||
(ScrollEventPhase::Start, None, _) => return false,
|
||||
(_, _, Some(scroll_layer_id)) => scroll_layer_id,
|
||||
(_, _, None) => return false,
|
||||
};
|
||||
|
||||
let non_root_overscroll = if scroll_layer_id != root_scroll_layer_id {
|
||||
// true if the current layer is overscrolling,
|
||||
// and it is not the root scroll layer.
|
||||
let child_layer = self.layers.get(&scroll_layer_id).unwrap();
|
||||
let overscroll_amount = child_layer.overscroll_amount();
|
||||
overscroll_amount.width != 0.0 || overscroll_amount.height != 0.0
|
||||
} else {
|
||||
false
|
||||
};
|
||||
|
||||
let switch_layer = match phase {
|
||||
ScrollEventPhase::Start => {
|
||||
// if this is a new gesture, we do not switch layer,
|
||||
// however we do save the state of non_root_overscroll,
|
||||
// for use in the subsequent Move phase.
|
||||
let mut current_layer = self.layers.get_mut(&scroll_layer_id).unwrap();
|
||||
current_layer.scrolling.should_handoff_scroll = non_root_overscroll;
|
||||
false
|
||||
},
|
||||
ScrollEventPhase::Move(_) => {
|
||||
// Switch layer if movement originated in a new gesture,
|
||||
// from a non root layer in overscroll.
|
||||
let current_layer = self.layers.get_mut(&scroll_layer_id).unwrap();
|
||||
current_layer.scrolling.should_handoff_scroll && non_root_overscroll
|
||||
},
|
||||
ScrollEventPhase::End => {
|
||||
// clean-up when gesture ends.
|
||||
let mut current_layer = self.layers.get_mut(&scroll_layer_id).unwrap();
|
||||
current_layer.scrolling.should_handoff_scroll = false;
|
||||
false
|
||||
},
|
||||
};
|
||||
|
||||
let scroll_root_id = match (switch_layer, scroll_layer_id.info, root_scroll_layer_id.info) {
|
||||
(true, _, ScrollLayerInfo::Scrollable(_, scroll_root_id)) |
|
||||
(true, ScrollLayerInfo::Scrollable(_, scroll_root_id), ScrollLayerInfo::Fixed) |
|
||||
(false, ScrollLayerInfo::Scrollable(_, scroll_root_id), _) => scroll_root_id,
|
||||
(_, ScrollLayerInfo::Fixed, _) => unreachable!("Tried to scroll a fixed position layer."),
|
||||
};
|
||||
|
||||
let mut scrolled_a_layer = false;
|
||||
for (layer_id, layer) in self.layers.iter_mut() {
|
||||
if layer_id.pipeline_id != scroll_layer_id.pipeline_id {
|
||||
continue;
|
||||
}
|
||||
|
||||
match layer_id.info {
|
||||
ScrollLayerInfo::Scrollable(_, id) if id != scroll_root_id => continue,
|
||||
ScrollLayerInfo::Fixed => continue,
|
||||
_ => {}
|
||||
}
|
||||
|
||||
if layer.scrolling.started_bouncing_back && phase == ScrollEventPhase::Move(false) {
|
||||
continue;
|
||||
}
|
||||
|
||||
let mut delta = match scroll_location {
|
||||
ScrollLocation::Delta(delta) => delta,
|
||||
ScrollLocation::Start => {
|
||||
if layer.scrolling.offset.y.round() >= 0.0 {
|
||||
// Nothing to do on this layer.
|
||||
continue;
|
||||
}
|
||||
|
||||
layer.scrolling.offset.y = 0.0;
|
||||
scrolled_a_layer = true;
|
||||
continue;
|
||||
},
|
||||
ScrollLocation::End => {
|
||||
let end_pos = layer.local_viewport_rect.size.height
|
||||
- layer.content_size.height;
|
||||
|
||||
if layer.scrolling.offset.y.round() <= end_pos {
|
||||
// Nothing to do on this layer.
|
||||
continue;
|
||||
}
|
||||
|
||||
layer.scrolling.offset.y = end_pos;
|
||||
scrolled_a_layer = true;
|
||||
continue;
|
||||
}
|
||||
};
|
||||
|
||||
let overscroll_amount = layer.overscroll_amount();
|
||||
let overscrolling = CAN_OVERSCROLL && (overscroll_amount.width != 0.0 ||
|
||||
overscroll_amount.height != 0.0);
|
||||
if overscrolling {
|
||||
if overscroll_amount.width != 0.0 {
|
||||
delta.x /= overscroll_amount.width.abs()
|
||||
}
|
||||
if overscroll_amount.height != 0.0 {
|
||||
delta.y /= overscroll_amount.height.abs()
|
||||
}
|
||||
}
|
||||
|
||||
let is_unscrollable =
|
||||
layer.content_size.width <= layer.local_viewport_rect.size.width &&
|
||||
layer.content_size.height <= layer.local_viewport_rect.size.height;
|
||||
|
||||
let original_layer_scroll_offset = layer.scrolling.offset;
|
||||
|
||||
if layer.content_size.width > layer.local_viewport_rect.size.width {
|
||||
layer.scrolling.offset.x = layer.scrolling.offset.x + delta.x;
|
||||
if is_unscrollable || !CAN_OVERSCROLL {
|
||||
layer.scrolling.offset.x = layer.scrolling.offset.x.min(0.0);
|
||||
layer.scrolling.offset.x =
|
||||
layer.scrolling.offset.x.max(-layer.content_size.width +
|
||||
layer.local_viewport_rect.size.width);
|
||||
}
|
||||
}
|
||||
|
||||
if layer.content_size.height > layer.local_viewport_rect.size.height {
|
||||
layer.scrolling.offset.y = layer.scrolling.offset.y + delta.y;
|
||||
if is_unscrollable || !CAN_OVERSCROLL {
|
||||
layer.scrolling.offset.y = layer.scrolling.offset.y.min(0.0);
|
||||
layer.scrolling.offset.y =
|
||||
layer.scrolling.offset.y.max(-layer.content_size.height +
|
||||
layer.local_viewport_rect.size.height);
|
||||
}
|
||||
}
|
||||
|
||||
if phase == ScrollEventPhase::Start || phase == ScrollEventPhase::Move(true) {
|
||||
layer.scrolling.started_bouncing_back = false
|
||||
} else if overscrolling &&
|
||||
((delta.x < 1.0 && delta.y < 1.0) || phase == ScrollEventPhase::End) {
|
||||
layer.scrolling.started_bouncing_back = true;
|
||||
layer.scrolling.bouncing_back = true
|
||||
}
|
||||
|
||||
layer.scrolling.offset.x = layer.scrolling.offset.x.round();
|
||||
layer.scrolling.offset.y = layer.scrolling.offset.y.round();
|
||||
|
||||
if CAN_OVERSCROLL {
|
||||
layer.stretch_overscroll_spring();
|
||||
}
|
||||
|
||||
scrolled_a_layer = scrolled_a_layer ||
|
||||
layer.scrolling.offset != original_layer_scroll_offset ||
|
||||
layer.scrolling.started_bouncing_back;
|
||||
}
|
||||
|
||||
scrolled_a_layer
|
||||
self.scroll_tree.scroll(scroll_location, cursor, phase,)
|
||||
}
|
||||
|
||||
pub fn tick_scrolling_bounce_animations(&mut self) {
|
||||
for (_, layer) in &mut self.layers {
|
||||
layer.tick_scrolling_bounce_animation()
|
||||
}
|
||||
self.scroll_tree.tick_scrolling_bounce_animations();
|
||||
}
|
||||
|
||||
pub fn create(&mut self,
|
||||
|
@ -521,7 +257,7 @@ impl Frame {
|
|||
None => return,
|
||||
};
|
||||
|
||||
let old_layer_scrolling_states = self.reset();
|
||||
let old_scrolling_states = self.reset();
|
||||
self.pipeline_auxiliary_lists = scene.pipeline_auxiliary_lists.clone();
|
||||
|
||||
self.pipeline_epoch_map.insert(root_pipeline_id, root_pipeline.epoch);
|
||||
|
@ -534,19 +270,18 @@ impl Frame {
|
|||
}
|
||||
};
|
||||
|
||||
let root_scroll_layer_id = ScrollLayerId::root(root_pipeline_id);
|
||||
self.root_scroll_layer_id = Some(root_scroll_layer_id);
|
||||
|
||||
// Insert global position: fixed elements layer
|
||||
debug_assert!(self.layers.is_empty());
|
||||
debug_assert!(self.scroll_tree.layers.is_empty());
|
||||
let root_scroll_layer_id = ScrollLayerId::root(root_pipeline_id);
|
||||
let root_fixed_layer_id = ScrollLayerId::create_fixed(root_pipeline_id);
|
||||
let root_viewport = LayerRect::new(LayerPoint::zero(), root_pipeline.viewport_size);
|
||||
let layer = Layer::new(&root_viewport,
|
||||
root_clip.main.size,
|
||||
&LayerToScrollTransform::identity(),
|
||||
root_pipeline_id);
|
||||
self.layers.insert(root_fixed_layer_id, layer.clone());
|
||||
self.layers.insert(root_scroll_layer_id, layer);
|
||||
self.scroll_tree.add_layer(layer.clone(), root_fixed_layer_id, None);
|
||||
self.scroll_tree.add_layer(layer, root_scroll_layer_id, None);
|
||||
self.scroll_tree.root_scroll_layer_id = Some(root_scroll_layer_id);
|
||||
|
||||
let background_color = root_pipeline.background_color.and_then(|color| {
|
||||
if color.a > 0.0 {
|
||||
|
@ -581,29 +316,7 @@ impl Frame {
|
|||
}
|
||||
|
||||
self.frame_builder = Some(frame_builder);
|
||||
|
||||
// TODO(gw): These are all independent - can be run through thread pool if it shows up
|
||||
// in the profile!
|
||||
for (scroll_layer_id, layer) in &mut self.layers {
|
||||
let scrolling_state = match old_layer_scrolling_states.get(&scroll_layer_id) {
|
||||
Some(old_scrolling_state) => *old_scrolling_state,
|
||||
None => ScrollingState::new(),
|
||||
};
|
||||
|
||||
layer.finalize(&scrolling_state);
|
||||
|
||||
let scroll_root_id = match scroll_layer_id.info {
|
||||
ScrollLayerInfo::Scrollable(_, scroll_root_id) => scroll_root_id,
|
||||
_ => continue,
|
||||
};
|
||||
|
||||
|
||||
let pipeline_id = scroll_layer_id.pipeline_id;
|
||||
if let Some(pending_offset) =
|
||||
self.pending_scroll_offsets.get_mut(&(pipeline_id, scroll_root_id)) {
|
||||
layer.set_scroll_origin(pending_offset);
|
||||
}
|
||||
}
|
||||
self.scroll_tree.finalize_and_apply_pending_scroll_offsets(old_scrolling_states);
|
||||
}
|
||||
|
||||
fn flatten_scroll_layer<'a>(&mut self,
|
||||
|
@ -623,17 +336,8 @@ impl Frame {
|
|||
return;
|
||||
}
|
||||
|
||||
debug_assert!(!self.layers.contains_key(&new_scroll_layer_id));
|
||||
|
||||
let layer = Layer::new(&clip, *content_size, &layer_relative_transform, pipeline_id);
|
||||
debug_assert!(current_scroll_layer_id != new_scroll_layer_id);
|
||||
|
||||
self.layers
|
||||
.get_mut(¤t_scroll_layer_id)
|
||||
.unwrap()
|
||||
.add_child(new_scroll_layer_id);
|
||||
|
||||
self.layers.insert(new_scroll_layer_id, layer);
|
||||
self.scroll_tree.add_layer(layer, new_scroll_layer_id, Some(current_scroll_layer_id));
|
||||
current_scroll_layer_id = new_scroll_layer_id;
|
||||
|
||||
let layer_rect = LayerRect::new(LayerPoint::zero(),
|
||||
|
@ -746,11 +450,11 @@ impl Frame {
|
|||
|
||||
if level == 0 && self.frame_builder_config.enable_scrollbars {
|
||||
let scrollbar_rect = LayerRect::new(LayerPoint::zero(), LayerSize::new(10.0, 70.0));
|
||||
context.builder.add_solid_rectangle(&scrollbar_rect,
|
||||
&ClipRegion::simple(&scrollbar_rect),
|
||||
&DEFAULT_SCROLLBAR_COLOR,
|
||||
PrimitiveFlags::Scrollbar(self.root_scroll_layer_id.unwrap(),
|
||||
4.0));
|
||||
context.builder.add_solid_rectangle(
|
||||
&scrollbar_rect,
|
||||
&ClipRegion::simple(&scrollbar_rect),
|
||||
&DEFAULT_SCROLLBAR_COLOR,
|
||||
PrimitiveFlags::Scrollbar(self.scroll_tree.root_scroll_layer_id.unwrap(), 4.0));
|
||||
}
|
||||
|
||||
context.builder.pop_layer();
|
||||
|
@ -797,9 +501,8 @@ impl Frame {
|
|||
iframe_clip.main.size,
|
||||
&transform,
|
||||
pipeline_id);
|
||||
self.layers.insert(iframe_fixed_layer_id, layer.clone());
|
||||
self.layers.insert(iframe_scroll_layer_id, layer);
|
||||
self.layers.get_mut(¤t_scroll_layer_id).unwrap().add_child(iframe_scroll_layer_id);
|
||||
self.scroll_tree.add_layer(layer.clone(), iframe_fixed_layer_id, None);
|
||||
self.scroll_tree.add_layer(layer, iframe_scroll_layer_id, Some(current_scroll_layer_id));
|
||||
|
||||
let mut traversal = DisplayListTraversal::new_skipping_first(display_list);
|
||||
|
||||
|
@ -929,7 +632,7 @@ impl Frame {
|
|||
auxiliary_lists_map: &AuxiliaryListsMap,
|
||||
device_pixel_ratio: f32)
|
||||
-> RendererFrame {
|
||||
self.update_layer_transforms();
|
||||
self.scroll_tree.update_all_layer_transforms();
|
||||
let frame = self.build_frame(resource_cache,
|
||||
auxiliary_lists_map,
|
||||
device_pixel_ratio);
|
||||
|
@ -937,72 +640,6 @@ impl Frame {
|
|||
frame
|
||||
}
|
||||
|
||||
fn update_layer_transform(&mut self,
|
||||
layer_id: ScrollLayerId,
|
||||
parent_world_transform: &ScrollToWorldTransform,
|
||||
parent_viewport_rect: &ScrollLayerRect) {
|
||||
// TODO(gw): This is an ugly borrow check workaround to clone these.
|
||||
// Restructure this to avoid the clones!
|
||||
let (layer_transform_for_children, viewport_rect, layer_children) = {
|
||||
match self.layers.get_mut(&layer_id) {
|
||||
Some(layer) => {
|
||||
let inv_transform = layer.local_transform.inverse().unwrap();
|
||||
let parent_viewport_rect_in_local_space = inv_transform.transform_rect(parent_viewport_rect)
|
||||
.translate(&-layer.scrolling.offset);
|
||||
let local_viewport_rect = layer.local_viewport_rect
|
||||
.translate(&-layer.scrolling.offset);
|
||||
let viewport_rect = parent_viewport_rect_in_local_space.intersection(&local_viewport_rect)
|
||||
.unwrap_or(LayerRect::zero());
|
||||
|
||||
layer.combined_local_viewport_rect = viewport_rect;
|
||||
layer.world_viewport_transform = parent_world_transform.pre_mul(&layer.local_transform);
|
||||
layer.world_content_transform = layer.world_viewport_transform
|
||||
.pre_translated(layer.scrolling.offset.x,
|
||||
layer.scrolling.offset.y,
|
||||
0.0);
|
||||
|
||||
(layer.world_content_transform.with_source::<ScrollLayerPixel>(),
|
||||
viewport_rect,
|
||||
layer.children.clone())
|
||||
}
|
||||
None => return,
|
||||
}
|
||||
};
|
||||
|
||||
for child_layer_id in layer_children {
|
||||
self.update_layer_transform(child_layer_id,
|
||||
&layer_transform_for_children,
|
||||
&as_scroll_parent_rect(&viewport_rect));
|
||||
}
|
||||
}
|
||||
|
||||
fn update_layer_transforms(&mut self) {
|
||||
if let Some(root_scroll_layer_id) = self.root_scroll_layer_id {
|
||||
let root_viewport = self.layers[&root_scroll_layer_id].local_viewport_rect;
|
||||
|
||||
self.update_layer_transform(root_scroll_layer_id,
|
||||
&ScrollToWorldTransform::identity(),
|
||||
&as_scroll_parent_rect(&root_viewport));
|
||||
|
||||
// Update any fixed layers
|
||||
let mut fixed_layers = Vec::new();
|
||||
for (layer_id, _) in &self.layers {
|
||||
match layer_id.info {
|
||||
ScrollLayerInfo::Scrollable(..) => {}
|
||||
ScrollLayerInfo::Fixed => {
|
||||
fixed_layers.push(*layer_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for layer_id in fixed_layers {
|
||||
self.update_layer_transform(layer_id,
|
||||
&ScrollToWorldTransform::identity(),
|
||||
&as_scroll_parent_rect(&root_viewport));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn build_frame(&mut self,
|
||||
resource_cache: &mut ResourceCache,
|
||||
auxiliary_lists_map: &AuxiliaryListsMap,
|
||||
|
@ -1011,26 +648,13 @@ impl Frame {
|
|||
let frame = frame_builder.as_mut().map(|builder|
|
||||
builder.build(resource_cache,
|
||||
self.id,
|
||||
&self.layers,
|
||||
&self.scroll_tree,
|
||||
auxiliary_lists_map,
|
||||
device_pixel_ratio)
|
||||
);
|
||||
self.frame_builder = frame_builder;
|
||||
|
||||
let layers_bouncing_back = self.collect_layers_bouncing_back();
|
||||
RendererFrame::new(self.pipeline_epoch_map.clone(),
|
||||
layers_bouncing_back,
|
||||
frame)
|
||||
}
|
||||
|
||||
fn collect_layers_bouncing_back(&self)
|
||||
-> HashSet<ScrollLayerId, BuildHasherDefault<FnvHasher>> {
|
||||
let mut layers_bouncing_back = HashSet::with_hasher(Default::default());
|
||||
for (scroll_layer_id, layer) in &self.layers {
|
||||
if layer.scrolling.bouncing_back {
|
||||
layers_bouncing_back.insert(*scroll_layer_id);
|
||||
}
|
||||
}
|
||||
layers_bouncing_back
|
||||
let layers_bouncing_back = self.scroll_tree.collect_layers_bouncing_back();
|
||||
RendererFrame::new(self.pipeline_epoch_map.clone(), layers_bouncing_back, frame)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,10 +2,20 @@
|
|||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use euclid::Point3D;
|
||||
use geometry::ray_intersects_rect;
|
||||
use spring::{DAMPING, STIFFNESS, Spring};
|
||||
use webrender_traits::{PipelineId, ScrollLayerId};
|
||||
use webrender_traits::{LayerRect, LayerPoint, LayerSize};
|
||||
use webrender_traits::{LayerToScrollTransform, LayerToWorldTransform};
|
||||
use webrender_traits::{LayerPoint, LayerRect, LayerSize, LayerToScrollTransform};
|
||||
use webrender_traits::{LayerToWorldTransform, PipelineId, ScrollEventPhase, ScrollLayerId};
|
||||
use webrender_traits::{ScrollLayerRect, ScrollLocation, ScrollToWorldTransform, WorldPoint};
|
||||
use webrender_traits::{WorldPoint4D};
|
||||
|
||||
#[cfg(target_os = "macos")]
|
||||
const CAN_OVERSCROLL: bool = true;
|
||||
|
||||
#[cfg(not(target_os = "macos"))]
|
||||
const CAN_OVERSCROLL: bool = false;
|
||||
|
||||
|
||||
/// Contains scrolling and transform information stacking contexts.
|
||||
#[derive(Clone)]
|
||||
|
@ -66,19 +76,20 @@ impl Layer {
|
|||
}
|
||||
|
||||
pub fn overscroll_amount(&self) -> LayerSize {
|
||||
let scrollable_width = self.scrollable_width();
|
||||
let overscroll_x = if self.scrolling.offset.x > 0.0 {
|
||||
-self.scrolling.offset.x
|
||||
} else if self.scrolling.offset.x < self.local_viewport_rect.size.width - self.content_size.width {
|
||||
self.local_viewport_rect.size.width - self.content_size.width - self.scrolling.offset.x
|
||||
} else if self.scrolling.offset.x < -scrollable_width {
|
||||
-scrollable_width - self.scrolling.offset.x
|
||||
} else {
|
||||
0.0
|
||||
};
|
||||
|
||||
let scrollable_height = self.scrollable_height();
|
||||
let overscroll_y = if self.scrolling.offset.y > 0.0 {
|
||||
-self.scrolling.offset.y
|
||||
} else if self.scrolling.offset.y < self.local_viewport_rect.size.height -
|
||||
self.content_size.height {
|
||||
self.local_viewport_rect.size.height - self.content_size.height - self.scrolling.offset.y
|
||||
} else if self.scrolling.offset.y < -scrollable_height {
|
||||
-scrollable_height - self.scrolling.offset.y
|
||||
} else {
|
||||
0.0
|
||||
};
|
||||
|
@ -87,15 +98,14 @@ impl Layer {
|
|||
}
|
||||
|
||||
pub fn set_scroll_origin(&mut self, origin: &LayerPoint) -> bool {
|
||||
if self.content_size.width <= self.local_viewport_rect.size.width &&
|
||||
self.content_size.height <= self.local_viewport_rect.size.height {
|
||||
let scrollable_height = self.scrollable_height();
|
||||
let scrollable_width = self.scrollable_width();
|
||||
if scrollable_height <= 0. && scrollable_width <= 0. {
|
||||
return false;
|
||||
}
|
||||
|
||||
let new_offset = LayerPoint::new(
|
||||
(-origin.x).max(-self.content_size.width + self.local_viewport_rect.size.width),
|
||||
(-origin.y).max(-self.content_size.height + self.local_viewport_rect.size.height));
|
||||
let new_offset = LayerPoint::new(new_offset.x.min(0.0).round(), new_offset.y.min(0.0).round());
|
||||
let new_offset = LayerPoint::new((-origin.x).max(-scrollable_width).min(0.0).round(),
|
||||
(-origin.y).max(-scrollable_height).min(0.0).round());
|
||||
if new_offset == self.scrolling.offset {
|
||||
return false;
|
||||
}
|
||||
|
@ -106,6 +116,110 @@ impl Layer {
|
|||
return true;
|
||||
}
|
||||
|
||||
pub fn update_transform(&mut self,
|
||||
parent_world_transform: &ScrollToWorldTransform,
|
||||
parent_viewport_rect: &ScrollLayerRect) {
|
||||
let inv_transform = self.local_transform.inverse().unwrap();
|
||||
let parent_viewport_rect_in_local_space = inv_transform.transform_rect(parent_viewport_rect)
|
||||
.translate(&-self.scrolling.offset);
|
||||
let local_viewport_rect = self.local_viewport_rect.translate(&-self.scrolling.offset);
|
||||
let viewport_rect = parent_viewport_rect_in_local_space.intersection(&local_viewport_rect)
|
||||
.unwrap_or(LayerRect::zero());
|
||||
|
||||
self.combined_local_viewport_rect = viewport_rect;
|
||||
self.world_viewport_transform = parent_world_transform.pre_mul(&self.local_transform);
|
||||
self.world_content_transform = self.world_viewport_transform
|
||||
.pre_translated(self.scrolling.offset.x,
|
||||
self.scrolling.offset.y,
|
||||
0.0);
|
||||
}
|
||||
|
||||
pub fn scrollable_height(&self) -> f32 {
|
||||
self.content_size.height - self.local_viewport_rect.size.height
|
||||
}
|
||||
|
||||
pub fn scrollable_width(&self) -> f32 {
|
||||
self.content_size.width - self.local_viewport_rect.size.width
|
||||
}
|
||||
|
||||
pub fn scroll(&mut self, scroll_location: ScrollLocation, phase: ScrollEventPhase) -> bool {
|
||||
if self.scrolling.started_bouncing_back && phase == ScrollEventPhase::Move(false) {
|
||||
return false;
|
||||
}
|
||||
|
||||
let mut delta = match scroll_location {
|
||||
ScrollLocation::Delta(delta) => delta,
|
||||
ScrollLocation::Start => {
|
||||
if self.scrolling.offset.y.round() >= 0.0 {
|
||||
// Nothing to do on this layer.
|
||||
return false;
|
||||
}
|
||||
|
||||
self.scrolling.offset.y = 0.0;
|
||||
return true;
|
||||
},
|
||||
ScrollLocation::End => {
|
||||
let end_pos = self.local_viewport_rect.size.height - self.content_size.height;
|
||||
|
||||
if self.scrolling.offset.y.round() <= end_pos {
|
||||
// Nothing to do on this layer.
|
||||
return false;
|
||||
}
|
||||
|
||||
self.scrolling.offset.y = end_pos;
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
let overscroll_amount = self.overscroll_amount();
|
||||
let overscrolling = CAN_OVERSCROLL && (overscroll_amount.width != 0.0 ||
|
||||
overscroll_amount.height != 0.0);
|
||||
if overscrolling {
|
||||
if overscroll_amount.width != 0.0 {
|
||||
delta.x /= overscroll_amount.width.abs()
|
||||
}
|
||||
if overscroll_amount.height != 0.0 {
|
||||
delta.y /= overscroll_amount.height.abs()
|
||||
}
|
||||
}
|
||||
|
||||
let scrollable_width = self.scrollable_width();
|
||||
let scrollable_height = self.scrollable_height();
|
||||
let is_unscrollable = scrollable_width <= 0. && scrollable_height <= 0.;
|
||||
let original_layer_scroll_offset = self.scrolling.offset;
|
||||
|
||||
if scrollable_width > 0. {
|
||||
self.scrolling.offset.x = self.scrolling.offset.x + delta.x;
|
||||
if is_unscrollable || !CAN_OVERSCROLL {
|
||||
self.scrolling.offset.x =
|
||||
self.scrolling.offset.x.min(0.0).max(-scrollable_width).round();
|
||||
}
|
||||
}
|
||||
|
||||
if scrollable_height > 0. {
|
||||
self.scrolling.offset.y = self.scrolling.offset.y + delta.y;
|
||||
if is_unscrollable || !CAN_OVERSCROLL {
|
||||
self.scrolling.offset.y =
|
||||
self.scrolling.offset.y.min(0.0).max(-scrollable_height).round();
|
||||
}
|
||||
}
|
||||
|
||||
if phase == ScrollEventPhase::Start || phase == ScrollEventPhase::Move(true) {
|
||||
self.scrolling.started_bouncing_back = false
|
||||
} else if overscrolling &&
|
||||
((delta.x < 1.0 && delta.y < 1.0) || phase == ScrollEventPhase::End) {
|
||||
self.scrolling.started_bouncing_back = true;
|
||||
self.scrolling.bouncing_back = true
|
||||
}
|
||||
|
||||
if CAN_OVERSCROLL {
|
||||
self.stretch_overscroll_spring();
|
||||
}
|
||||
|
||||
self.scrolling.offset != original_layer_scroll_offset ||
|
||||
self.scrolling.started_bouncing_back
|
||||
}
|
||||
|
||||
pub fn stretch_overscroll_spring(&mut self) {
|
||||
let overscroll_amount = self.overscroll_amount();
|
||||
self.scrolling.spring.coords(self.scrolling.offset,
|
||||
|
@ -120,6 +234,26 @@ impl Layer {
|
|||
self.scrolling.bouncing_back = false
|
||||
}
|
||||
}
|
||||
|
||||
pub fn ray_intersects_layer(&self, cursor: &WorldPoint) -> bool {
|
||||
let inv = self.world_viewport_transform.inverse().unwrap();
|
||||
let z0 = -10000.0;
|
||||
let z1 = 10000.0;
|
||||
|
||||
let p0 = inv.transform_point4d(&WorldPoint4D::new(cursor.x, cursor.y, z0, 1.0));
|
||||
let p0 = Point3D::new(p0.x / p0.w,
|
||||
p0.y / p0.w,
|
||||
p0.z / p0.w);
|
||||
let p1 = inv.transform_point4d(&WorldPoint4D::new(cursor.x, cursor.y, z1, 1.0));
|
||||
let p1 = Point3D::new(p1.x / p1.w,
|
||||
p1.y / p1.w,
|
||||
p1.z / p1.w);
|
||||
|
||||
if self.scrollable_width() <= 0. && self.scrollable_height() <= 0. {
|
||||
return false;
|
||||
}
|
||||
ray_intersects_rect(p0, p1, self.local_viewport_rect.to_untyped())
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone)]
|
||||
|
|
|
@ -67,6 +67,7 @@ mod record;
|
|||
mod render_backend;
|
||||
mod resource_cache;
|
||||
mod scene;
|
||||
mod scroll_tree;
|
||||
mod spring;
|
||||
mod texture_cache;
|
||||
mod tiling;
|
||||
|
|
|
@ -15,7 +15,7 @@ use core_text::font_descriptor::kCTFontDefaultOrientation;
|
|||
use core_text;
|
||||
use std::collections::HashMap;
|
||||
use std::collections::hash_map::Entry;
|
||||
use webrender_traits::{FontKey, FontRenderMode, GlyphDimensions};
|
||||
use webrender_traits::{ColorU, FontKey, FontRenderMode, GlyphDimensions};
|
||||
|
||||
pub type NativeFontHandle = CGFont;
|
||||
|
||||
|
@ -178,6 +178,7 @@ impl FontContext {
|
|||
pub fn rasterize_glyph(&mut self,
|
||||
font_key: FontKey,
|
||||
size: Au,
|
||||
color: ColorU,
|
||||
character: u32,
|
||||
render_mode: FontRenderMode) -> Option<RasterizedGlyph> {
|
||||
match self.get_ct_font(font_key, size) {
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use app_units::Au;
|
||||
use webrender_traits::{FontKey, FontRenderMode, GlyphDimensions, NativeFontHandle};
|
||||
use webrender_traits::{FontKey, ColorU, FontRenderMode, GlyphDimensions, NativeFontHandle};
|
||||
|
||||
use freetype::freetype::{FT_Render_Mode, FT_Pixel_Mode};
|
||||
use freetype::freetype::{FT_Done_FreeType, FT_Library_SetLcdFilter};
|
||||
|
@ -133,6 +133,7 @@ impl FontContext {
|
|||
pub fn rasterize_glyph(&mut self,
|
||||
font_key: FontKey,
|
||||
size: Au,
|
||||
color: ColorU,
|
||||
character: u32,
|
||||
render_mode: FontRenderMode) -> Option<RasterizedGlyph> {
|
||||
let mut glyph = None;
|
||||
|
@ -146,40 +147,41 @@ impl FontContext {
|
|||
FontRenderMode::Subpixel => FT_Render_Mode::FT_RENDER_MODE_LCD,
|
||||
};
|
||||
|
||||
unsafe {
|
||||
let result = FT_Render_Glyph(slot, render_mode);
|
||||
let result = unsafe { FT_Render_Glyph(slot, render_mode) };
|
||||
|
||||
if result.succeeded() {
|
||||
let bitmap = &(*slot).bitmap;
|
||||
if result.succeeded() {
|
||||
let bitmap = unsafe { &(*slot).bitmap };
|
||||
|
||||
let metrics = &(*slot).metrics;
|
||||
let mut glyph_width = (metrics.width >> 6) as i32;
|
||||
let glyph_height = (metrics.height >> 6) as i32;
|
||||
let mut final_buffer = Vec::with_capacity(glyph_width as usize *
|
||||
glyph_height as usize *
|
||||
4);
|
||||
let metrics = unsafe { &(*slot).metrics };
|
||||
let mut glyph_width = (metrics.width >> 6) as i32;
|
||||
let glyph_height = (metrics.height >> 6) as i32;
|
||||
let mut final_buffer = Vec::with_capacity(glyph_width as usize *
|
||||
glyph_height as usize *
|
||||
4);
|
||||
|
||||
if bitmap.pixel_mode == FT_Pixel_Mode::FT_PIXEL_MODE_MONO as u8 {
|
||||
// This is not exactly efficient... but it's only used by the
|
||||
// reftest pass when we have AA disabled on glyphs.
|
||||
let offset_x = (metrics.horiBearingX >> 6) as i32 - (*slot).bitmap_left;
|
||||
let offset_y = (metrics.horiBearingY >> 6) as i32 - (*slot).bitmap_top;
|
||||
if bitmap.pixel_mode == FT_Pixel_Mode::FT_PIXEL_MODE_MONO as u8 {
|
||||
// This is not exactly efficient... but it's only used by the
|
||||
// reftest pass when we have AA disabled on glyphs.
|
||||
let offset_x = unsafe { (metrics.horiBearingX >> 6) as i32 - (*slot).bitmap_left };
|
||||
let offset_y = unsafe { (metrics.horiBearingY >> 6) as i32 - (*slot).bitmap_top };
|
||||
|
||||
// Due to AA being disabled, the bitmap produced for mono
|
||||
// glyphs is often smaller than the reported glyph dimensions.
|
||||
// To account for this, place the rendered glyph within the
|
||||
// box of the glyph dimensions, filling in invalid pixels with
|
||||
// zero alpha.
|
||||
for iy in 0..glyph_height {
|
||||
let y = iy - offset_y;
|
||||
for ix in 0..glyph_width {
|
||||
let x = ix + offset_x;
|
||||
let valid_byte = x >= 0 &&
|
||||
y >= 0 &&
|
||||
x < bitmap.width as i32 &&
|
||||
y < bitmap.rows as i32;
|
||||
let byte_value = if valid_byte {
|
||||
let byte_index = (y * bitmap.pitch as i32) + (x >> 3);
|
||||
// Due to AA being disabled, the bitmap produced for mono
|
||||
// glyphs is often smaller than the reported glyph dimensions.
|
||||
// To account for this, place the rendered glyph within the
|
||||
// box of the glyph dimensions, filling in invalid pixels with
|
||||
// zero alpha.
|
||||
for iy in 0..glyph_height {
|
||||
let y = iy - offset_y;
|
||||
for ix in 0..glyph_width {
|
||||
let x = ix + offset_x;
|
||||
let valid_byte = x >= 0 &&
|
||||
y >= 0 &&
|
||||
x < bitmap.width as i32 &&
|
||||
y < bitmap.rows as i32;
|
||||
let byte_value = if valid_byte {
|
||||
let byte_index = (y * bitmap.pitch as i32) + (x >> 3);
|
||||
|
||||
unsafe {
|
||||
let bit_index = x & 7;
|
||||
let byte_ptr = bitmap.buffer.offset(byte_index as isize);
|
||||
let bit = (*byte_ptr & (0x80 >> bit_index)) != 0;
|
||||
|
@ -188,50 +190,56 @@ impl FontContext {
|
|||
} else {
|
||||
0
|
||||
}
|
||||
} else {
|
||||
0
|
||||
};
|
||||
}
|
||||
} else {
|
||||
0
|
||||
};
|
||||
|
||||
final_buffer.extend_from_slice(&[ 0xff, 0xff, 0xff, byte_value ]);
|
||||
}
|
||||
final_buffer.extend_from_slice(&[ 0xff, 0xff, 0xff, byte_value ]);
|
||||
}
|
||||
} else if bitmap.pixel_mode == FT_Pixel_Mode::FT_PIXEL_MODE_GRAY as u8 {
|
||||
// We can assume that the reported glyph dimensions exactly
|
||||
// match the rasterized bitmap for normal alpha coverage glyphs.
|
||||
}
|
||||
} else if bitmap.pixel_mode == FT_Pixel_Mode::FT_PIXEL_MODE_GRAY as u8 {
|
||||
// We can assume that the reported glyph dimensions exactly
|
||||
// match the rasterized bitmap for normal alpha coverage glyphs.
|
||||
|
||||
let buffer = slice::from_raw_parts(
|
||||
let buffer = unsafe {
|
||||
slice::from_raw_parts(
|
||||
bitmap.buffer,
|
||||
(bitmap.width * bitmap.rows) as usize
|
||||
);
|
||||
)
|
||||
};
|
||||
|
||||
// Convert to RGBA.
|
||||
for &byte in buffer.iter() {
|
||||
final_buffer.extend_from_slice(&[ 0xff, 0xff, 0xff, byte ]);
|
||||
}
|
||||
} else if bitmap.pixel_mode == FT_Pixel_Mode::FT_PIXEL_MODE_LCD as u8 {
|
||||
// Extra subpixel on each side of the glyph.
|
||||
glyph_width += 2;
|
||||
// Convert to RGBA.
|
||||
for &byte in buffer.iter() {
|
||||
final_buffer.extend_from_slice(&[ 0xff, 0xff, 0xff, byte ]);
|
||||
}
|
||||
} else if bitmap.pixel_mode == FT_Pixel_Mode::FT_PIXEL_MODE_LCD as u8 {
|
||||
// Extra subpixel on each side of the glyph.
|
||||
glyph_width += 2;
|
||||
|
||||
for y in 0..bitmap.rows {
|
||||
for x in 0..(bitmap.width / 3) {
|
||||
let index = (y as i32 * bitmap.pitch) + (x as i32 * 3);
|
||||
for y in 0..bitmap.rows {
|
||||
for x in 0..(bitmap.width / 3) {
|
||||
let index = (y as i32 * bitmap.pitch) + (x as i32 * 3);
|
||||
|
||||
unsafe {
|
||||
let ptr = bitmap.buffer.offset(index as isize);
|
||||
let b = *ptr;
|
||||
let g = *(ptr.offset(1));
|
||||
let r = *(ptr.offset(2));
|
||||
final_buffer.extend_from_slice(&[ r, g, b, 0xff ]);
|
||||
|
||||
final_buffer.extend_from_slice(&[r, g, b, 0xff]);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
panic!("Unexpected render mode: {}!", bitmap.pixel_mode);
|
||||
}
|
||||
|
||||
glyph = Some(RasterizedGlyph {
|
||||
width: glyph_width as u32,
|
||||
height: glyph_height as u32,
|
||||
bytes: final_buffer,
|
||||
});
|
||||
} else {
|
||||
panic!("Unexpected render mode: {}!", bitmap.pixel_mode);
|
||||
}
|
||||
|
||||
glyph = Some(RasterizedGlyph {
|
||||
width: glyph_width as u32,
|
||||
height: glyph_height as u32,
|
||||
bytes: final_buffer,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
use app_units::Au;
|
||||
use std::collections::HashMap;
|
||||
use webrender_traits::{FontKey, FontRenderMode, GlyphDimensions};
|
||||
use webrender_traits::{FontKey, ColorU, FontRenderMode, GlyphDimensions};
|
||||
|
||||
use dwrote;
|
||||
|
||||
|
@ -182,6 +182,7 @@ impl FontContext {
|
|||
pub fn rasterize_glyph(&mut self,
|
||||
font_key: FontKey,
|
||||
size: Au,
|
||||
color: ColorU,
|
||||
glyph: u32,
|
||||
render_mode: FontRenderMode) -> Option<RasterizedGlyph> {
|
||||
let (_, maybe_glyph) =
|
||||
|
|
|
@ -737,9 +737,9 @@ impl PrimitiveStore {
|
|||
|
||||
let dest_rects = self.gpu_resource_rects.get_slice_mut(text.resource_address,
|
||||
text.glyph_range.length);
|
||||
|
||||
let texture_id = resource_cache.get_glyphs(text.font_key,
|
||||
font_size_dp,
|
||||
text.color,
|
||||
&text.glyph_indices,
|
||||
text.render_mode, |index, uv0, uv1| {
|
||||
let dest_rect = &mut dest_rects[index];
|
||||
|
@ -933,6 +933,7 @@ impl PrimitiveStore {
|
|||
text.glyph_range.length);
|
||||
let mut glyph_key = GlyphKey::new(text.font_key,
|
||||
font_size_dp,
|
||||
text.color,
|
||||
src_glyphs[0].index);
|
||||
let mut local_rect = LayerRect::zero();
|
||||
let mut actual_glyph_count = 0;
|
||||
|
@ -998,6 +999,7 @@ impl PrimitiveStore {
|
|||
|
||||
resource_cache.request_glyphs(text.font_key,
|
||||
font_size_dp,
|
||||
text.color,
|
||||
&text.glyph_indices,
|
||||
text.render_mode);
|
||||
}
|
||||
|
@ -1014,7 +1016,7 @@ impl PrimitiveStore {
|
|||
// right now, but if we introduce a cache for images for some other
|
||||
// reason then we might as well cache this with it.
|
||||
let image_properties = resource_cache.get_image_properties(image_key);
|
||||
metadata.is_opaque = image_properties.is_opaque &&
|
||||
metadata.is_opaque = image_properties.descriptor.is_opaque &&
|
||||
tile_spacing.width == 0.0 &&
|
||||
tile_spacing.height == 0.0;
|
||||
}
|
||||
|
|
|
@ -125,23 +125,14 @@ impl RenderBackend {
|
|||
};
|
||||
tx.send(glyph_dimensions).unwrap();
|
||||
}
|
||||
ApiMsg::AddImage(id, width, height, stride, format, data) => {
|
||||
ApiMsg::AddImage(id, descriptor, data) => {
|
||||
if let ImageData::Raw(ref bytes) = data {
|
||||
profile_counters.image_templates.inc(bytes.len());
|
||||
}
|
||||
self.resource_cache.add_image_template(id,
|
||||
width,
|
||||
height,
|
||||
stride,
|
||||
format,
|
||||
data);
|
||||
self.resource_cache.add_image_template(id, descriptor, data);
|
||||
}
|
||||
ApiMsg::UpdateImage(id, width, height, format, bytes) => {
|
||||
self.resource_cache.update_image_template(id,
|
||||
width,
|
||||
height,
|
||||
format,
|
||||
bytes);
|
||||
ApiMsg::UpdateImage(id, descriptor, bytes) => {
|
||||
self.resource_cache.update_image_template(id, descriptor, bytes);
|
||||
}
|
||||
ApiMsg::DeleteImage(id) => {
|
||||
self.resource_cache.delete_image_template(id);
|
||||
|
|
|
@ -39,6 +39,7 @@ use util::TransformedRectKind;
|
|||
use webrender_traits::{ColorF, Epoch, PipelineId, RenderNotifier, RenderDispatcher};
|
||||
use webrender_traits::{ExternalImageId, ImageFormat, RenderApiSender, RendererKind};
|
||||
use webrender_traits::{DeviceIntRect, DevicePoint, DeviceIntPoint, DeviceIntSize, DeviceUintSize};
|
||||
use webrender_traits::ImageDescriptor;
|
||||
use webrender_traits::channel;
|
||||
use webrender_traits::VRCompositorHandler;
|
||||
|
||||
|
@ -551,19 +552,25 @@ impl Renderer {
|
|||
// TODO: Ensure that the white texture can never get evicted when the cache supports LRU eviction!
|
||||
let white_image_id = texture_cache.new_item_id();
|
||||
texture_cache.insert(white_image_id,
|
||||
2,
|
||||
2,
|
||||
None,
|
||||
ImageFormat::RGBA8,
|
||||
ImageDescriptor {
|
||||
width: 2,
|
||||
height: 2,
|
||||
stride: None,
|
||||
format: ImageFormat::RGBA8,
|
||||
is_opaque: false,
|
||||
},
|
||||
TextureFilter::Linear,
|
||||
Arc::new(white_pixels));
|
||||
|
||||
let dummy_mask_image_id = texture_cache.new_item_id();
|
||||
texture_cache.insert(dummy_mask_image_id,
|
||||
2,
|
||||
2,
|
||||
None,
|
||||
ImageFormat::A8,
|
||||
ImageDescriptor {
|
||||
width: 2,
|
||||
height: 2,
|
||||
stride: None,
|
||||
format: ImageFormat::A8,
|
||||
is_opaque: false,
|
||||
},
|
||||
TextureFilter::Linear,
|
||||
Arc::new(mask_pixels));
|
||||
|
||||
|
@ -734,6 +741,12 @@ impl Renderer {
|
|||
self.pipeline_epoch_map.get(&pipeline_id).cloned()
|
||||
}
|
||||
|
||||
/// Returns a HashMap containing the pipeline ids that have been received by the renderer and
|
||||
/// their respective epochs since the last time the method was called.
|
||||
pub fn flush_rendered_epochs(&mut self) -> HashMap<PipelineId, Epoch, BuildHasherDefault<FnvHasher>> {
|
||||
return mem::replace(&mut self.pipeline_epoch_map, HashMap::with_hasher(Default::default()));
|
||||
}
|
||||
|
||||
/// Processes the result queue.
|
||||
///
|
||||
/// Should be called before `render()`, as texture cache updates are done here.
|
||||
|
|
|
@ -21,7 +21,7 @@ use std::thread;
|
|||
use texture_cache::{TextureCache, TextureCacheItemId};
|
||||
use webrender_traits::{Epoch, FontKey, GlyphKey, ImageKey, ImageFormat, ImageRendering};
|
||||
use webrender_traits::{FontRenderMode, ImageData, GlyphDimensions, WebGLContextId};
|
||||
use webrender_traits::{DevicePoint, DeviceIntSize};
|
||||
use webrender_traits::{DevicePoint, DeviceIntSize, ImageDescriptor, ColorF};
|
||||
use webrender_traits::ExternalImageId;
|
||||
use threadpool::ThreadPool;
|
||||
|
||||
|
@ -36,7 +36,7 @@ enum GlyphCacheMsg {
|
|||
/// Add a new font.
|
||||
AddFont(FontKey, FontTemplate),
|
||||
/// Request glyphs for a text run.
|
||||
RequestGlyphs(FontKey, Au, Vec<u32>, FontRenderMode),
|
||||
RequestGlyphs(FontKey, Au, ColorF, Vec<u32>, FontRenderMode),
|
||||
/// Finished requesting glyphs. Reply with new glyphs.
|
||||
EndFrame,
|
||||
}
|
||||
|
@ -71,22 +71,19 @@ pub struct RenderedGlyphKey {
|
|||
impl RenderedGlyphKey {
|
||||
pub fn new(font_key: FontKey,
|
||||
size: Au,
|
||||
color: ColorF,
|
||||
index: u32,
|
||||
render_mode: FontRenderMode) -> RenderedGlyphKey {
|
||||
RenderedGlyphKey {
|
||||
key: GlyphKey::new(font_key, size, index),
|
||||
key: GlyphKey::new(font_key, size, color, index),
|
||||
render_mode: render_mode,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub struct ImageProperties {
|
||||
pub format: ImageFormat,
|
||||
pub is_opaque: bool,
|
||||
pub descriptor: ImageDescriptor,
|
||||
pub external_id: Option<ExternalImageId>,
|
||||
pub width: u32,
|
||||
pub height: u32,
|
||||
pub stride: Option<u32>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Copy, Clone, PartialEq)]
|
||||
|
@ -98,12 +95,8 @@ enum State {
|
|||
|
||||
struct ImageResource {
|
||||
data: ImageData,
|
||||
width: u32,
|
||||
height: u32,
|
||||
stride: Option<u32>,
|
||||
format: ImageFormat,
|
||||
descriptor: ImageDescriptor,
|
||||
epoch: Epoch,
|
||||
is_opaque: bool,
|
||||
}
|
||||
|
||||
struct CachedImageInfo {
|
||||
|
@ -245,21 +238,10 @@ impl ResourceCache {
|
|||
|
||||
pub fn add_image_template(&mut self,
|
||||
image_key: ImageKey,
|
||||
width: u32,
|
||||
height: u32,
|
||||
stride: Option<u32>,
|
||||
format: ImageFormat,
|
||||
descriptor: ImageDescriptor,
|
||||
data: ImageData) {
|
||||
let is_opaque = match data {
|
||||
ImageData::Raw(ref bytes) => is_image_opaque(format, bytes),
|
||||
ImageData::External(..) => false, // TODO: Allow providing this through API.
|
||||
};
|
||||
let resource = ImageResource {
|
||||
is_opaque: is_opaque,
|
||||
width: width,
|
||||
height: height,
|
||||
stride: stride,
|
||||
format: format,
|
||||
descriptor: descriptor,
|
||||
data: data,
|
||||
epoch: Epoch(0),
|
||||
};
|
||||
|
@ -269,9 +251,7 @@ impl ResourceCache {
|
|||
|
||||
pub fn update_image_template(&mut self,
|
||||
image_key: ImageKey,
|
||||
width: u32,
|
||||
height: u32,
|
||||
format: ImageFormat,
|
||||
descriptor: ImageDescriptor,
|
||||
bytes: Vec<u8>) {
|
||||
let next_epoch = match self.image_templates.get(&image_key) {
|
||||
Some(image) => {
|
||||
|
@ -292,11 +272,7 @@ impl ResourceCache {
|
|||
};
|
||||
|
||||
let resource = ImageResource {
|
||||
is_opaque: is_image_opaque(format, &bytes),
|
||||
width: width,
|
||||
height: height,
|
||||
stride: None,
|
||||
format: format,
|
||||
descriptor: descriptor,
|
||||
data: ImageData::new(bytes),
|
||||
epoch: next_epoch,
|
||||
};
|
||||
|
@ -350,6 +326,7 @@ impl ResourceCache {
|
|||
pub fn request_glyphs(&mut self,
|
||||
key: FontKey,
|
||||
size: Au,
|
||||
color: ColorF,
|
||||
glyph_indices: &[u32],
|
||||
render_mode: FontRenderMode) {
|
||||
debug_assert!(self.state == State::AddResources);
|
||||
|
@ -359,6 +336,7 @@ impl ResourceCache {
|
|||
// already cached.
|
||||
let msg = GlyphCacheMsg::RequestGlyphs(key,
|
||||
size,
|
||||
color,
|
||||
glyph_indices.to_vec(),
|
||||
render_mode);
|
||||
self.glyph_cache_tx.send(msg).unwrap();
|
||||
|
@ -375,6 +353,7 @@ impl ResourceCache {
|
|||
pub fn get_glyphs<F>(&self,
|
||||
font_key: FontKey,
|
||||
size: Au,
|
||||
color: ColorF,
|
||||
glyph_indices: &[u32],
|
||||
render_mode: FontRenderMode,
|
||||
mut f: F) -> SourceTexture where F: FnMut(usize, DevicePoint, DevicePoint) {
|
||||
|
@ -383,6 +362,7 @@ impl ResourceCache {
|
|||
let render_mode = self.get_glyph_render_mode(render_mode);
|
||||
let mut glyph_key = RenderedGlyphKey::new(font_key,
|
||||
size,
|
||||
color,
|
||||
0,
|
||||
render_mode);
|
||||
let mut texture_id = None;
|
||||
|
@ -463,12 +443,8 @@ impl ResourceCache {
|
|||
};
|
||||
|
||||
ImageProperties {
|
||||
format: image_template.format,
|
||||
is_opaque: image_template.is_opaque,
|
||||
descriptor: image_template.descriptor,
|
||||
external_id: external_id,
|
||||
width: image_template.width,
|
||||
height: image_template.height,
|
||||
stride: image_template.stride,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -523,10 +499,13 @@ impl ResourceCache {
|
|||
if glyph.width > 0 && glyph.height > 0 {
|
||||
let image_id = self.texture_cache.new_item_id();
|
||||
self.texture_cache.insert(image_id,
|
||||
glyph.width,
|
||||
glyph.height,
|
||||
None,
|
||||
ImageFormat::RGBA8,
|
||||
ImageDescriptor {
|
||||
width: glyph.width,
|
||||
height: glyph.height,
|
||||
stride: None,
|
||||
format: ImageFormat::RGBA8,
|
||||
is_opaque: false,
|
||||
},
|
||||
TextureFilter::Linear,
|
||||
Arc::new(glyph.bytes));
|
||||
Some(image_id)
|
||||
|
@ -558,10 +537,7 @@ impl ResourceCache {
|
|||
if entry.get().epoch != image_template.epoch {
|
||||
// TODO: Can we avoid the clone of the bytes here?
|
||||
self.texture_cache.update(image_id,
|
||||
image_template.width,
|
||||
image_template.height,
|
||||
image_template.stride,
|
||||
image_template.format,
|
||||
image_template.descriptor,
|
||||
bytes.clone());
|
||||
|
||||
// Update the cached epoch
|
||||
|
@ -581,10 +557,7 @@ impl ResourceCache {
|
|||
|
||||
// TODO: Can we avoid the clone of the bytes here?
|
||||
self.texture_cache.insert(image_id,
|
||||
image_template.width,
|
||||
image_template.height,
|
||||
image_template.stride,
|
||||
image_template.format,
|
||||
image_template.descriptor,
|
||||
filter,
|
||||
bytes.clone());
|
||||
|
||||
|
@ -635,30 +608,6 @@ impl Resource for CachedImageInfo {
|
|||
}
|
||||
}
|
||||
|
||||
// TODO(gw): If this ever shows up in profiles, consider calculating
|
||||
// this lazily on demand, possibly via the resource cache thread.
|
||||
// It can probably be made a lot faster with SIMD too!
|
||||
// This assumes that A8 textures are never opaque, since they are
|
||||
// typically used for alpha masks. We could revisit that if it
|
||||
// ever becomes an issue in real world usage.
|
||||
fn is_image_opaque(format: ImageFormat, bytes: &[u8]) -> bool {
|
||||
match format {
|
||||
ImageFormat::RGBA8 => {
|
||||
let mut is_opaque = true;
|
||||
for i in 0..(bytes.len() / 4) {
|
||||
if bytes[i * 4 + 3] != 255 {
|
||||
is_opaque = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
is_opaque
|
||||
}
|
||||
ImageFormat::RGB8 => true,
|
||||
ImageFormat::A8 => false,
|
||||
ImageFormat::Invalid | ImageFormat::RGBAF32 => unreachable!(),
|
||||
}
|
||||
}
|
||||
|
||||
fn spawn_glyph_cache_thread() -> (Sender<GlyphCacheMsg>, Receiver<GlyphCacheResultMsg>) {
|
||||
// Used for messages from resource cache -> glyph cache thread.
|
||||
let (msg_tx, msg_rx) = channel();
|
||||
|
@ -719,7 +668,7 @@ fn spawn_glyph_cache_thread() -> (Sender<GlyphCacheMsg>, Receiver<GlyphCacheResu
|
|||
});
|
||||
}
|
||||
}
|
||||
GlyphCacheMsg::RequestGlyphs(key, size, indices, render_mode) => {
|
||||
GlyphCacheMsg::RequestGlyphs(key, size, color, indices, render_mode) => {
|
||||
// Request some glyphs for a text run.
|
||||
// For any glyph that isn't currently in the cache,
|
||||
// immeediately push a job to the worker thread pool
|
||||
|
@ -729,6 +678,7 @@ fn spawn_glyph_cache_thread() -> (Sender<GlyphCacheMsg>, Receiver<GlyphCacheResu
|
|||
for glyph_index in indices {
|
||||
let glyph_key = RenderedGlyphKey::new(key,
|
||||
size,
|
||||
color,
|
||||
glyph_index,
|
||||
render_mode);
|
||||
|
||||
|
@ -742,6 +692,7 @@ fn spawn_glyph_cache_thread() -> (Sender<GlyphCacheMsg>, Receiver<GlyphCacheResu
|
|||
let mut font_context = font_context.borrow_mut();
|
||||
let result = font_context.rasterize_glyph(glyph_key.key.font_key,
|
||||
glyph_key.key.size,
|
||||
glyph_key.key.color,
|
||||
glyph_key.key.index,
|
||||
render_mode);
|
||||
glyph_tx.send((glyph_key, result)).unwrap();
|
||||
|
|
|
@ -0,0 +1,309 @@
|
|||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use fnv::FnvHasher;
|
||||
use layer::{Layer, ScrollingState};
|
||||
use std::collections::{HashMap, HashSet};
|
||||
use std::hash::BuildHasherDefault;
|
||||
use webrender_traits::{LayerPoint, PipelineId, ScrollEventPhase, ScrollLayerId, ScrollLayerInfo};
|
||||
use webrender_traits::{ScrollLayerPixel, ScrollLayerRect, ScrollLayerState, ScrollLocation};
|
||||
use webrender_traits::{ScrollToWorldTransform, ServoScrollRootId, WorldPoint};
|
||||
use webrender_traits::as_scroll_parent_rect;
|
||||
|
||||
pub type ScrollStates = HashMap<ScrollLayerId, ScrollingState, BuildHasherDefault<FnvHasher>>;
|
||||
|
||||
pub struct ScrollTree {
|
||||
pub layers: HashMap<ScrollLayerId, Layer, BuildHasherDefault<FnvHasher>>,
|
||||
pub pending_scroll_offsets: HashMap<(PipelineId, ServoScrollRootId), LayerPoint>,
|
||||
pub current_scroll_layer_id: Option<ScrollLayerId>,
|
||||
pub root_scroll_layer_id: Option<ScrollLayerId>,
|
||||
}
|
||||
|
||||
impl ScrollTree {
|
||||
pub fn new() -> ScrollTree {
|
||||
ScrollTree {
|
||||
layers: HashMap::with_hasher(Default::default()),
|
||||
pending_scroll_offsets: HashMap::new(),
|
||||
current_scroll_layer_id: None,
|
||||
root_scroll_layer_id: None,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn collect_layers_bouncing_back(&self)
|
||||
-> HashSet<ScrollLayerId, BuildHasherDefault<FnvHasher>> {
|
||||
let mut layers_bouncing_back = HashSet::with_hasher(Default::default());
|
||||
for (scroll_layer_id, layer) in self.layers.iter() {
|
||||
if layer.scrolling.bouncing_back {
|
||||
layers_bouncing_back.insert(*scroll_layer_id);
|
||||
}
|
||||
}
|
||||
layers_bouncing_back
|
||||
}
|
||||
|
||||
pub fn get_scroll_layer(&self,
|
||||
cursor: &WorldPoint,
|
||||
scroll_layer_id: ScrollLayerId)
|
||||
-> Option<ScrollLayerId> {
|
||||
self.layers.get(&scroll_layer_id).and_then(|layer| {
|
||||
for child_layer_id in layer.children.iter().rev() {
|
||||
if let Some(layer_id) = self.get_scroll_layer(cursor, *child_layer_id) {
|
||||
return Some(layer_id);
|
||||
}
|
||||
}
|
||||
|
||||
if scroll_layer_id.info == ScrollLayerInfo::Fixed {
|
||||
return None;
|
||||
}
|
||||
|
||||
if layer.ray_intersects_layer(cursor) {
|
||||
Some(scroll_layer_id)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
pub fn get_scroll_layer_state(&self) -> Vec<ScrollLayerState> {
|
||||
let mut result = vec![];
|
||||
for (scroll_layer_id, scroll_layer) in self.layers.iter() {
|
||||
match scroll_layer_id.info {
|
||||
ScrollLayerInfo::Scrollable(_, servo_scroll_root_id) => {
|
||||
result.push(ScrollLayerState {
|
||||
pipeline_id: scroll_layer.pipeline_id,
|
||||
scroll_root_id: servo_scroll_root_id,
|
||||
scroll_offset: scroll_layer.scrolling.offset,
|
||||
})
|
||||
}
|
||||
ScrollLayerInfo::Fixed => {}
|
||||
}
|
||||
}
|
||||
result
|
||||
}
|
||||
|
||||
pub fn drain(&mut self) -> ScrollStates {
|
||||
let mut scroll_states = HashMap::with_hasher(Default::default());
|
||||
for (layer_id, old_layer) in &mut self.layers.drain() {
|
||||
scroll_states.insert(layer_id, old_layer.scrolling);
|
||||
}
|
||||
scroll_states
|
||||
}
|
||||
|
||||
pub fn scroll_layers(&mut self,
|
||||
origin: LayerPoint,
|
||||
pipeline_id: PipelineId,
|
||||
scroll_root_id: ServoScrollRootId)
|
||||
-> bool {
|
||||
let origin = LayerPoint::new(origin.x.max(0.0), origin.y.max(0.0));
|
||||
|
||||
let mut scrolled_a_layer = false;
|
||||
let mut found_layer = false;
|
||||
for (layer_id, layer) in self.layers.iter_mut() {
|
||||
if layer_id.pipeline_id != pipeline_id {
|
||||
continue;
|
||||
}
|
||||
|
||||
match layer_id.info {
|
||||
ScrollLayerInfo::Scrollable(_, id) if id != scroll_root_id => continue,
|
||||
ScrollLayerInfo::Fixed => continue,
|
||||
_ => {}
|
||||
}
|
||||
|
||||
found_layer = true;
|
||||
scrolled_a_layer |= layer.set_scroll_origin(&origin);
|
||||
}
|
||||
|
||||
if !found_layer {
|
||||
self.pending_scroll_offsets.insert((pipeline_id, scroll_root_id), origin);
|
||||
}
|
||||
|
||||
scrolled_a_layer
|
||||
}
|
||||
|
||||
pub fn scroll(&mut self,
|
||||
scroll_location: ScrollLocation,
|
||||
cursor: WorldPoint,
|
||||
phase: ScrollEventPhase)
|
||||
-> bool {
|
||||
let root_scroll_layer_id = match self.root_scroll_layer_id {
|
||||
Some(root_scroll_layer_id) => root_scroll_layer_id,
|
||||
None => return false,
|
||||
};
|
||||
|
||||
let scroll_layer_id = match (
|
||||
phase,
|
||||
self.get_scroll_layer(&cursor, root_scroll_layer_id),
|
||||
self.current_scroll_layer_id) {
|
||||
(ScrollEventPhase::Start, Some(scroll_layer_id), _) => {
|
||||
self.current_scroll_layer_id = Some(scroll_layer_id);
|
||||
scroll_layer_id
|
||||
},
|
||||
(ScrollEventPhase::Start, None, _) => return false,
|
||||
(_, _, Some(scroll_layer_id)) => scroll_layer_id,
|
||||
(_, _, None) => return false,
|
||||
};
|
||||
|
||||
let non_root_overscroll = if scroll_layer_id != root_scroll_layer_id {
|
||||
// true if the current layer is overscrolling,
|
||||
// and it is not the root scroll layer.
|
||||
let child_layer = self.layers.get(&scroll_layer_id).unwrap();
|
||||
let overscroll_amount = child_layer.overscroll_amount();
|
||||
overscroll_amount.width != 0.0 || overscroll_amount.height != 0.0
|
||||
} else {
|
||||
false
|
||||
};
|
||||
|
||||
let switch_layer = match phase {
|
||||
ScrollEventPhase::Start => {
|
||||
// if this is a new gesture, we do not switch layer,
|
||||
// however we do save the state of non_root_overscroll,
|
||||
// for use in the subsequent Move phase.
|
||||
let mut current_layer = self.layers.get_mut(&scroll_layer_id).unwrap();
|
||||
current_layer.scrolling.should_handoff_scroll = non_root_overscroll;
|
||||
false
|
||||
},
|
||||
ScrollEventPhase::Move(_) => {
|
||||
// Switch layer if movement originated in a new gesture,
|
||||
// from a non root layer in overscroll.
|
||||
let current_layer = self.layers.get_mut(&scroll_layer_id).unwrap();
|
||||
current_layer.scrolling.should_handoff_scroll && non_root_overscroll
|
||||
},
|
||||
ScrollEventPhase::End => {
|
||||
// clean-up when gesture ends.
|
||||
let mut current_layer = self.layers.get_mut(&scroll_layer_id).unwrap();
|
||||
current_layer.scrolling.should_handoff_scroll = false;
|
||||
false
|
||||
},
|
||||
};
|
||||
|
||||
let scroll_layer_info = if switch_layer {
|
||||
root_scroll_layer_id.info
|
||||
} else {
|
||||
scroll_layer_id.info
|
||||
};
|
||||
|
||||
let scroll_root_id = match scroll_layer_info {
|
||||
ScrollLayerInfo::Scrollable(_, scroll_root_id) => scroll_root_id,
|
||||
_ => unreachable!("Tried to scroll a non-scrolling layer."),
|
||||
|
||||
};
|
||||
|
||||
let mut scrolled_a_layer = false;
|
||||
for (layer_id, layer) in self.layers.iter_mut() {
|
||||
if layer_id.pipeline_id != scroll_layer_id.pipeline_id {
|
||||
continue;
|
||||
}
|
||||
|
||||
match layer_id.info {
|
||||
ScrollLayerInfo::Scrollable(_, id) if id != scroll_root_id => continue,
|
||||
ScrollLayerInfo::Fixed => continue,
|
||||
_ => {}
|
||||
}
|
||||
|
||||
let scrolled_this_layer = layer.scroll(scroll_location, phase);
|
||||
scrolled_a_layer = scrolled_a_layer || scrolled_this_layer;
|
||||
}
|
||||
scrolled_a_layer
|
||||
}
|
||||
|
||||
pub fn update_all_layer_transforms(&mut self) {
|
||||
let root_scroll_layer_id = self.root_scroll_layer_id;
|
||||
self.update_layer_transforms(root_scroll_layer_id);
|
||||
}
|
||||
|
||||
fn update_layer_transform(&mut self,
|
||||
layer_id: ScrollLayerId,
|
||||
parent_world_transform: &ScrollToWorldTransform,
|
||||
parent_viewport_rect: &ScrollLayerRect) {
|
||||
// TODO(gw): This is an ugly borrow check workaround to clone these.
|
||||
// Restructure this to avoid the clones!
|
||||
let (layer_transform_for_children, viewport_rect, layer_children) = {
|
||||
match self.layers.get_mut(&layer_id) {
|
||||
Some(layer) => {
|
||||
layer.update_transform(parent_world_transform, parent_viewport_rect);
|
||||
|
||||
(layer.world_content_transform.with_source::<ScrollLayerPixel>(),
|
||||
as_scroll_parent_rect(&layer.combined_local_viewport_rect),
|
||||
layer.children.clone())
|
||||
}
|
||||
None => return,
|
||||
}
|
||||
};
|
||||
|
||||
for child_layer_id in layer_children {
|
||||
self.update_layer_transform(child_layer_id,
|
||||
&layer_transform_for_children,
|
||||
&viewport_rect);
|
||||
}
|
||||
}
|
||||
|
||||
pub fn update_layer_transforms(&mut self, root_scroll_layer_id: Option<ScrollLayerId>) {
|
||||
if let Some(root_scroll_layer_id) = root_scroll_layer_id {
|
||||
let root_viewport = self.layers[&root_scroll_layer_id].local_viewport_rect;
|
||||
|
||||
self.update_layer_transform(root_scroll_layer_id,
|
||||
&ScrollToWorldTransform::identity(),
|
||||
&as_scroll_parent_rect(&root_viewport));
|
||||
|
||||
// Update any fixed layers
|
||||
let mut fixed_layers = Vec::new();
|
||||
for (layer_id, _) in &self.layers {
|
||||
match layer_id.info {
|
||||
ScrollLayerInfo::Scrollable(..) => {}
|
||||
ScrollLayerInfo::Fixed => {
|
||||
fixed_layers.push(*layer_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for layer_id in fixed_layers {
|
||||
self.update_layer_transform(layer_id,
|
||||
&ScrollToWorldTransform::identity(),
|
||||
&as_scroll_parent_rect(&root_viewport));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn tick_scrolling_bounce_animations(&mut self) {
|
||||
for (_, layer) in &mut self.layers {
|
||||
layer.tick_scrolling_bounce_animation()
|
||||
}
|
||||
}
|
||||
|
||||
pub fn finalize_and_apply_pending_scroll_offsets(&mut self, old_states: ScrollStates) {
|
||||
// TODO(gw): These are all independent - can be run through thread pool if it shows up
|
||||
// in the profile!
|
||||
for (scroll_layer_id, layer) in &mut self.layers {
|
||||
let scrolling_state = match old_states.get(&scroll_layer_id) {
|
||||
Some(old_scrolling_state) => *old_scrolling_state,
|
||||
None => ScrollingState::new(),
|
||||
};
|
||||
|
||||
layer.finalize(&scrolling_state);
|
||||
|
||||
let scroll_root_id = match scroll_layer_id.info {
|
||||
ScrollLayerInfo::Scrollable(_, scroll_root_id) => scroll_root_id,
|
||||
_ => continue,
|
||||
};
|
||||
|
||||
|
||||
let pipeline_id = scroll_layer_id.pipeline_id;
|
||||
if let Some(pending_offset) =
|
||||
self.pending_scroll_offsets.get_mut(&(pipeline_id, scroll_root_id)) {
|
||||
layer.set_scroll_origin(pending_offset);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
pub fn add_layer(&mut self, layer: Layer, id: ScrollLayerId, parent_id: Option<ScrollLayerId>) {
|
||||
debug_assert!(!self.layers.contains_key(&id));
|
||||
self.layers.insert(id, layer);
|
||||
|
||||
if let Some(parent_id) = parent_id {
|
||||
debug_assert!(parent_id != id);
|
||||
self.layers.get_mut(&parent_id).unwrap().add_child(id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -18,6 +18,7 @@ use time;
|
|||
use util;
|
||||
use webrender_traits::{ImageFormat, DevicePixel, DeviceIntPoint};
|
||||
use webrender_traits::{DeviceUintRect, DeviceUintSize, DeviceUintPoint};
|
||||
use webrender_traits::ImageDescriptor;
|
||||
|
||||
/// The number of bytes we're allowed to use for a texture.
|
||||
const MAX_BYTES_PER_TEXTURE: u32 = 1024 * 1024 * 256; // 256MB
|
||||
|
@ -740,23 +741,20 @@ impl TextureCache {
|
|||
|
||||
pub fn update(&mut self,
|
||||
image_id: TextureCacheItemId,
|
||||
width: u32,
|
||||
height: u32,
|
||||
stride: Option<u32>,
|
||||
_format: ImageFormat,
|
||||
descriptor: ImageDescriptor,
|
||||
bytes: Arc<Vec<u8>>) {
|
||||
let existing_item = self.items.get(image_id);
|
||||
|
||||
// TODO(gw): Handle updates to size/format!
|
||||
debug_assert!(existing_item.requested_rect.size.width == width);
|
||||
debug_assert!(existing_item.requested_rect.size.height == height);
|
||||
debug_assert!(existing_item.requested_rect.size.width == descriptor.width);
|
||||
debug_assert!(existing_item.requested_rect.size.height == descriptor.height);
|
||||
|
||||
let op = TextureUpdateOp::Update(existing_item.requested_rect.origin.x,
|
||||
existing_item.requested_rect.origin.y,
|
||||
width,
|
||||
height,
|
||||
descriptor.width,
|
||||
descriptor.height,
|
||||
bytes,
|
||||
stride);
|
||||
descriptor.stride);
|
||||
|
||||
let update_op = TextureUpdate {
|
||||
id: existing_item.texture_id,
|
||||
|
@ -768,12 +766,14 @@ impl TextureCache {
|
|||
|
||||
pub fn insert(&mut self,
|
||||
image_id: TextureCacheItemId,
|
||||
width: u32,
|
||||
height: u32,
|
||||
stride: Option<u32>,
|
||||
format: ImageFormat,
|
||||
descriptor: ImageDescriptor,
|
||||
filter: TextureFilter,
|
||||
bytes: Arc<Vec<u8>>) {
|
||||
let width = descriptor.width;
|
||||
let height = descriptor.height;
|
||||
let format = descriptor.format;
|
||||
let stride = descriptor.stride;
|
||||
|
||||
let result = self.allocate(image_id,
|
||||
width,
|
||||
height,
|
||||
|
@ -782,12 +782,7 @@ impl TextureCache {
|
|||
|
||||
let op = match result.kind {
|
||||
AllocationKind::TexturePage => {
|
||||
let bpp = match format {
|
||||
ImageFormat::A8 => 1,
|
||||
ImageFormat::RGB8 => 3,
|
||||
ImageFormat::RGBA8 => 4,
|
||||
ImageFormat::Invalid | ImageFormat::RGBAF32 => unreachable!(),
|
||||
};
|
||||
let bpp = format.bytes_per_pixel().unwrap();
|
||||
|
||||
let mut top_row_bytes = Vec::new();
|
||||
let mut bottom_row_bytes = Vec::new();
|
||||
|
|
|
@ -9,7 +9,6 @@ use frame::FrameId;
|
|||
use gpu_store::GpuStoreAddress;
|
||||
use internal_types::{ANGLE_FLOAT_TO_FIXED, LowLevelFilterOp, CompositionOp};
|
||||
use internal_types::{BatchTextures, CacheTextureId, SourceTexture};
|
||||
use layer::Layer;
|
||||
use mask_cache::{ClipSource, MaskCacheInfo};
|
||||
use prim_store::{PrimitiveGeometry, RectanglePrimitive, PrimitiveContainer};
|
||||
use prim_store::{BorderPrimitiveCpu, BorderPrimitiveGpu, BoxShadowPrimitiveGpu};
|
||||
|
@ -23,6 +22,7 @@ use prim_store::{PrimitiveStore, GpuBlock16, GpuBlock32, GpuBlock64, GpuBlock128
|
|||
use profiler::FrameProfileCounters;
|
||||
use renderer::BlendMode;
|
||||
use resource_cache::ResourceCache;
|
||||
use scroll_tree::ScrollTree;
|
||||
use std::cmp;
|
||||
use std::collections::{HashMap};
|
||||
use std::{i32, f32};
|
||||
|
@ -49,9 +49,6 @@ const OPAQUE_TASK_INDEX: RenderTaskIndex = RenderTaskIndex(i32::MAX as usize);
|
|||
|
||||
const FLOATS_PER_RENDER_TASK_INFO: usize = 12;
|
||||
|
||||
pub type LayerMap = HashMap<ScrollLayerId,
|
||||
Layer,
|
||||
BuildHasherDefault<FnvHasher>>;
|
||||
pub type AuxiliaryListsMap = HashMap<PipelineId,
|
||||
AuxiliaryLists,
|
||||
BuildHasherDefault<FnvHasher>>;
|
||||
|
@ -2524,7 +2521,7 @@ impl FrameBuilder {
|
|||
/// primitives in screen space.
|
||||
fn cull_layers(&mut self,
|
||||
screen_rect: &DeviceIntRect,
|
||||
layer_map: &LayerMap,
|
||||
scroll_tree: &ScrollTree,
|
||||
auxiliary_lists_map: &AuxiliaryListsMap,
|
||||
x_tile_count: i32,
|
||||
y_tile_count: i32,
|
||||
|
@ -2548,7 +2545,7 @@ impl FrameBuilder {
|
|||
layer.xf_rect = None;
|
||||
layer.tile_range = None;
|
||||
|
||||
let scroll_layer = &layer_map[&layer.scroll_layer_id];
|
||||
let scroll_layer = &scroll_tree.layers[&layer.scroll_layer_id];
|
||||
packed_layer.transform = scroll_layer.world_content_transform
|
||||
.with_source::<ScrollLayerPixel>() // the scroll layer is considered a parent of layer
|
||||
.pre_mul(&layer.local_transform);
|
||||
|
@ -2670,11 +2667,16 @@ impl FrameBuilder {
|
|||
// that two primitives which are only clipped by the
|
||||
// stacking context stack can share clip masks during
|
||||
// render task assignment to targets.
|
||||
let mask_key = match prim_clip_info {
|
||||
Some(..) => MaskCacheKey::Primitive(prim_index),
|
||||
None => MaskCacheKey::StackingContext(*sc_index),
|
||||
let (mask_key, mask_rect) = match prim_clip_info {
|
||||
Some(..) => {
|
||||
(MaskCacheKey::Primitive(prim_index), prim_bounding_rect)
|
||||
}
|
||||
None => {
|
||||
let layer_rect = layer.xf_rect.as_ref().unwrap().bounding_rect;
|
||||
(MaskCacheKey::StackingContext(*sc_index), layer_rect)
|
||||
}
|
||||
};
|
||||
let mask_opt = RenderTask::new_mask(prim_bounding_rect,
|
||||
let mask_opt = RenderTask::new_mask(mask_rect,
|
||||
mask_key,
|
||||
&clip_info_stack,
|
||||
&self.layer_store);
|
||||
|
@ -2866,15 +2868,14 @@ impl FrameBuilder {
|
|||
}
|
||||
}
|
||||
|
||||
fn update_scroll_bars(&mut self,
|
||||
layer_map: &LayerMap) {
|
||||
fn update_scroll_bars(&mut self, scroll_tree: &ScrollTree) {
|
||||
let distance_from_edge = 8.0;
|
||||
|
||||
for scrollbar_prim in &self.scrollbar_prims {
|
||||
let mut geom = (*self.prim_store.gpu_geometry.get(GpuStoreAddress(scrollbar_prim.prim_index.0 as i32))).clone();
|
||||
let scroll_layer = &layer_map[&scrollbar_prim.scroll_layer_id];
|
||||
let scroll_layer = &scroll_tree.layers[&scrollbar_prim.scroll_layer_id];
|
||||
|
||||
let scrollable_distance = scroll_layer.content_size.height - scroll_layer.local_viewport_rect.size.height;
|
||||
let scrollable_distance = scroll_layer.scrollable_height();
|
||||
|
||||
if scrollable_distance <= 0.0 {
|
||||
geom.local_clip_rect.size = LayerSize::zero();
|
||||
|
@ -2915,7 +2916,7 @@ impl FrameBuilder {
|
|||
pub fn build(&mut self,
|
||||
resource_cache: &mut ResourceCache,
|
||||
frame_id: FrameId,
|
||||
layer_map: &LayerMap,
|
||||
scroll_tree: &ScrollTree,
|
||||
auxiliary_lists_map: &AuxiliaryListsMap,
|
||||
device_pixel_ratio: f32) -> Frame {
|
||||
let mut profile_counters = FrameProfileCounters::new();
|
||||
|
@ -2948,10 +2949,10 @@ impl FrameBuilder {
|
|||
|
||||
let (x_tile_count, y_tile_count, mut screen_tiles) = self.create_screen_tiles(device_pixel_ratio);
|
||||
|
||||
self.update_scroll_bars(layer_map);
|
||||
self.update_scroll_bars(scroll_tree);
|
||||
|
||||
self.cull_layers(&screen_rect,
|
||||
layer_map,
|
||||
scroll_tree,
|
||||
auxiliary_lists_map,
|
||||
x_tile_count,
|
||||
y_tile_count,
|
||||
|
|
|
@ -0,0 +1,85 @@
|
|||
extern crate angle;
|
||||
#[macro_use]
|
||||
extern crate lazy_static;
|
||||
extern crate webrender;
|
||||
|
||||
use angle::hl::{BuiltInResources, Output, ShaderSpec, ShaderValidator};
|
||||
|
||||
include!(concat!(env!("OUT_DIR"), "/shaders.rs"));
|
||||
|
||||
|
||||
// from glslang
|
||||
const FRAGMENT_SHADER: u32 = 0x8B30;
|
||||
const VERTEX_SHADER: u32 = 0x8B31;
|
||||
|
||||
|
||||
#[test]
|
||||
fn validate_shaders() {
|
||||
angle::hl::initialize().unwrap();
|
||||
|
||||
let shared_src = SHADERS.get("shared").unwrap();
|
||||
let prim_shared_src = SHADERS.get("prim_shared").unwrap();
|
||||
let clip_shared_src = SHADERS.get("clip_shared").unwrap();
|
||||
|
||||
for (filename, file_source) in SHADERS.iter() {
|
||||
let is_prim = filename.starts_with("ps_");
|
||||
let is_clip = filename.starts_with("cs_");
|
||||
let is_vert = filename.ends_with(".vs");
|
||||
let is_frag = filename.ends_with(".fs");
|
||||
if !(is_prim ^ is_clip) || !(is_vert ^ is_frag) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
let base_filename = filename.splitn(2, '.').next().unwrap();
|
||||
let mut shader_prefix = format!("#version 300 es\n
|
||||
// Base shader: {}\n
|
||||
#define WR_MAX_VERTEX_TEXTURE_WIDTH {}\n",
|
||||
base_filename, webrender::renderer::MAX_VERTEX_TEXTURE_WIDTH);
|
||||
|
||||
if is_vert {
|
||||
shader_prefix.push_str("#define WR_VERTEX_SHADER\n");
|
||||
} else {
|
||||
shader_prefix.push_str("#define WR_FRAGMENT_SHADER\n");
|
||||
}
|
||||
|
||||
let mut build_configs = vec!["#define WR_FEATURE_TRANSFORM\n"];
|
||||
if is_prim {
|
||||
// the transform feature may be disabled for the prim shaders
|
||||
build_configs.push("// WR_FEATURE_TRANSFORM disabled\n");
|
||||
}
|
||||
|
||||
for config_prefix in build_configs {
|
||||
let mut shader_source = String::new();
|
||||
shader_source.push_str(shader_prefix.as_str());
|
||||
shader_source.push_str(config_prefix);
|
||||
shader_source.push_str(shared_src);
|
||||
shader_source.push_str(prim_shared_src);
|
||||
if is_clip {
|
||||
shader_source.push_str(clip_shared_src);
|
||||
}
|
||||
if let Some(optional_src) = SHADERS.get(base_filename) {
|
||||
shader_source.push_str(optional_src);
|
||||
}
|
||||
shader_source.push_str(file_source);
|
||||
|
||||
|
||||
let gl_type = if is_vert { VERTEX_SHADER } else { FRAGMENT_SHADER };
|
||||
let resources = BuiltInResources::default();
|
||||
let validator = ShaderValidator::new(gl_type,
|
||||
ShaderSpec::Gles3,
|
||||
Output::Essl,
|
||||
&resources).unwrap();
|
||||
|
||||
match validator.compile_and_translate(&[&shader_source]) {
|
||||
Ok(_) => {
|
||||
println!("Shader translated succesfully: {}", filename);
|
||||
},
|
||||
Err(_) => {
|
||||
panic!("Shader compilation failed: {}\n{}",
|
||||
filename, validator.info_log());
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -7,7 +7,7 @@ use std::os::raw::{c_void, c_char};
|
|||
use gleam::gl;
|
||||
use webrender_traits::{BorderSide, BorderStyle, BorderRadius};
|
||||
use webrender_traits::{PipelineId, ClipRegion};
|
||||
use webrender_traits::{Epoch, ColorF, GlyphInstance};
|
||||
use webrender_traits::{Epoch, ColorF, GlyphInstance, ImageDescriptor};
|
||||
use webrender_traits::{ImageData, ImageFormat, ImageKey, ImageMask, ImageRendering, RendererKind, MixBlendMode};
|
||||
use webrender_traits::{ExternalImageId, RenderApi, FontKey};
|
||||
use webrender_traits::{DeviceUintSize, ExternalEvent};
|
||||
|
@ -685,20 +685,20 @@ pub extern fn wr_api_add_image(api: &mut RenderApi, width: u32, height: u32, str
|
|||
_ => Some(stride),
|
||||
};
|
||||
|
||||
api.add_image(width, height, stride_option, format, ImageData::new(bytes))
|
||||
api.add_image(ImageDescriptor{width: width, height: height, stride: stride_option, format: format, is_opaque: false}, ImageData::new(bytes))
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern fn wr_api_add_external_image_texture(api: &mut RenderApi, width: u32, height: u32, format: ImageFormat, external_image_id: u64) -> ImageKey {
|
||||
assert!( unsafe { is_in_compositor_thread() });
|
||||
api.add_image(width, height, None, format, ImageData::External(ExternalImageId(external_image_id)))
|
||||
api.add_image(ImageDescriptor{width:width, height:height, stride:None, format: format, is_opaque: false}, ImageData::External(ExternalImageId(external_image_id)))
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern fn wr_api_update_image(api: &mut RenderApi, key: ImageKey, width: u32, height: u32, format: ImageFormat, bytes: * const u8, size: usize) {
|
||||
assert!( unsafe { is_in_compositor_thread() });
|
||||
let bytes = unsafe { slice::from_raw_parts(bytes, size).to_owned() };
|
||||
api.update_image(key, width, height, format, bytes);
|
||||
api.update_image(key, ImageDescriptor{width:width, height:height, stride:None, format:format, is_opaque: false}, bytes);
|
||||
}
|
||||
#[no_mangle]
|
||||
pub extern fn wr_api_delete_image(api: &mut RenderApi, key: ImageKey) {
|
||||
|
|
|
@ -6,8 +6,8 @@ use byteorder::{LittleEndian, WriteBytesExt};
|
|||
use channel::{self, MsgSender, PayloadHelperMethods, PayloadSender};
|
||||
use offscreen_gl_context::{GLContextAttributes, GLLimits};
|
||||
use std::cell::Cell;
|
||||
use {ApiMsg, ColorF, DisplayListBuilder, Epoch};
|
||||
use {FontKey, IdNamespace, ImageFormat, ImageKey, NativeFontHandle, PipelineId};
|
||||
use {ApiMsg, ColorF, DisplayListBuilder, Epoch, ImageDescriptor};
|
||||
use {FontKey, IdNamespace, ImageKey, NativeFontHandle, PipelineId};
|
||||
use {RenderApiSender, ResourceId, ScrollEventPhase, ScrollLayerState, ScrollLocation, ServoScrollRootId};
|
||||
use {GlyphKey, GlyphDimensions, ImageData, WebGLContextId, WebGLCommand};
|
||||
use {DeviceIntSize, LayoutPoint, LayoutSize, WorldPoint};
|
||||
|
@ -90,13 +90,10 @@ impl RenderApi {
|
|||
|
||||
/// Adds an image and returns the corresponding `ImageKey`.
|
||||
pub fn add_image(&self,
|
||||
width: u32,
|
||||
height: u32,
|
||||
stride: Option<u32>,
|
||||
format: ImageFormat,
|
||||
descriptor: ImageDescriptor,
|
||||
data: ImageData) -> ImageKey {
|
||||
let key = self.alloc_image();
|
||||
let msg = ApiMsg::AddImage(key, width, height, stride, format, data);
|
||||
let msg = ApiMsg::AddImage(key, descriptor, data);
|
||||
self.api_sender.send(msg).unwrap();
|
||||
key
|
||||
}
|
||||
|
@ -107,11 +104,9 @@ impl RenderApi {
|
|||
// TODO: Support changing dimensions (and format) during image update?
|
||||
pub fn update_image(&self,
|
||||
key: ImageKey,
|
||||
width: u32,
|
||||
height: u32,
|
||||
format: ImageFormat,
|
||||
descriptor: ImageDescriptor,
|
||||
bytes: Vec<u8>) {
|
||||
let msg = ApiMsg::UpdateImage(key, width, height, format, bytes);
|
||||
let msg = ApiMsg::UpdateImage(key, descriptor, bytes);
|
||||
self.api_sender.send(msg).unwrap();
|
||||
}
|
||||
|
||||
|
|
|
@ -28,9 +28,9 @@ pub enum ApiMsg {
|
|||
/// Gets the glyph dimensions
|
||||
GetGlyphDimensions(Vec<GlyphKey>, MsgSender<Vec<Option<GlyphDimensions>>>),
|
||||
/// Adds an image from the resource cache.
|
||||
AddImage(ImageKey, u32, u32, Option<u32>, ImageFormat, ImageData),
|
||||
AddImage(ImageKey, ImageDescriptor, ImageData),
|
||||
/// Updates the the resource cache with the new image data.
|
||||
UpdateImage(ImageKey, u32, u32, ImageFormat, Vec<u8>),
|
||||
UpdateImage(ImageKey, ImageDescriptor, Vec<u8>),
|
||||
/// Drops an image from the resource cache.
|
||||
DeleteImage(ImageKey),
|
||||
CloneApi(MsgSender<IdNamespace>),
|
||||
|
@ -191,6 +191,64 @@ pub struct ColorF {
|
|||
}
|
||||
known_heap_size!(0, ColorF);
|
||||
|
||||
#[derive(Clone, Copy, Hash, Eq, Debug, Deserialize, PartialEq, PartialOrd, Ord, Serialize)]
|
||||
pub struct ColorU {
|
||||
pub r: u8,
|
||||
pub g: u8,
|
||||
pub b: u8,
|
||||
pub a: u8,
|
||||
}
|
||||
|
||||
impl From<ColorF> for ColorU {
|
||||
fn from(color: ColorF) -> ColorU {
|
||||
ColorU {
|
||||
r: ColorU::round_to_int(color.r),
|
||||
g: ColorU::round_to_int(color.g),
|
||||
b: ColorU::round_to_int(color.b),
|
||||
a: ColorU::round_to_int(color.a),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Into<ColorF> for ColorU {
|
||||
fn into(self) -> ColorF {
|
||||
ColorF {
|
||||
r: self.r as f32 / 255.0,
|
||||
g: self.g as f32 / 255.0,
|
||||
b: self.b as f32 / 255.0,
|
||||
a: self.a as f32 / 255.0,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl ColorU {
|
||||
fn round_to_int(x: f32) -> u8 {
|
||||
debug_assert!((0.0 <= x) && (x <= 1.0));
|
||||
let f = (255.0 * x) + 0.5;
|
||||
let val = f.floor();
|
||||
debug_assert!(val <= 255.0);
|
||||
val as u8
|
||||
}
|
||||
|
||||
pub fn new(r: u8, g: u8, b: u8, a: u8) -> ColorU {
|
||||
ColorU {
|
||||
r: r,
|
||||
g: g,
|
||||
b: b,
|
||||
a: a,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, Deserialize, PartialEq, Serialize)]
|
||||
pub struct ImageDescriptor {
|
||||
pub format: ImageFormat,
|
||||
pub width: u32,
|
||||
pub height: u32,
|
||||
pub stride: Option<u32>,
|
||||
pub is_opaque: bool,
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug, Deserialize, PartialEq, Serialize)]
|
||||
pub struct ImageMask {
|
||||
pub image: ImageKey,
|
||||
|
@ -263,15 +321,18 @@ pub struct GlyphKey {
|
|||
// or something similar to that.
|
||||
pub size: Au,
|
||||
pub index: u32,
|
||||
pub color: ColorU,
|
||||
}
|
||||
|
||||
impl GlyphKey {
|
||||
pub fn new(font_key: FontKey,
|
||||
size: Au,
|
||||
color: ColorF,
|
||||
index: u32) -> GlyphKey {
|
||||
GlyphKey {
|
||||
font_key: font_key,
|
||||
size: size,
|
||||
color: ColorU::from(color),
|
||||
index: index,
|
||||
}
|
||||
}
|
||||
|
@ -358,6 +419,18 @@ pub enum ImageFormat {
|
|||
RGBAF32,
|
||||
}
|
||||
|
||||
impl ImageFormat {
|
||||
pub fn bytes_per_pixel(self) -> Option<u32> {
|
||||
match self {
|
||||
ImageFormat::A8 => Some(1),
|
||||
ImageFormat::RGB8 => Some(3),
|
||||
ImageFormat::RGBA8 => Some(4),
|
||||
ImageFormat::RGBAF32 => Some(16),
|
||||
ImageFormat::Invalid => None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
|
||||
pub enum YuvColorSpace {
|
||||
Rec601 = 1, // The values must match the ones in prim_shared.glsl
|
||||
|
|
|
@ -1 +1 @@
|
|||
{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"172610b244a5ee8a8e2f1f045058b8abf9291d84bb76bf8779d2fd420419c2d6","Cargo.toml":"2abdbe33c0b8b7167287225ef902e43548a1b602959a1a9ace2525fe08550f59","README.md":"d69d75705e2582721cbfb2d3b4b2af052c71679057a0b2ac53a22c03f1755bba","build.rs":"fea382a72243440bcfc334229684fecd2e0021f740dd95d2e2df267744cce402","src/bitmap_render_target.rs":"53a172ef42447f8433c5c315f40459c0260a0c44f2ba9ae49ec546d284dd0c73","src/com_helpers.rs":"fccb4b36379ae3454a88aa32a8e5c09e46ef5f5626266dde1fe5f40a992de39c","src/comptr.rs":"218435689f505769686e07cfc5428852dda90b849a0d48e670f632307f5edc7c","src/font.rs":"e792eed304dfcc6ab99d16076d48b5ec941bd18113e506970898a58db4df5d5b","src/font_collection.rs":"969fa3abf141dc3504774886f4783fda4a74cd5a198c643f8a77fc1af4e75258","src/font_face.rs":"f76c3cfef079df9211cf26d67b07140199762293938889a7f4b120eda0427cd5","src/font_family.rs":"403da9f8f9903cbe7f9f79636497b273f9885e200f53af99f9d4e483f11d6889","src/font_file.rs":"60ad02fc25765a2c113175ea372e98a2be0d84aa65fef9246b6a0192e63ff708","src/font_file_loader_impl.rs":"0d304ad99ff1e6874510a1498223329d798ff75b417e3db7e823a695003dfe92","src/gdi_interop.rs":"627a39c72d162308826ac1090972179d39f9962c8e7f29925983744a96862d84","src/glyph_run_analysis.rs":"f816225daa285624f1a1a74c7a5803a1e6b255b494c80cc77760cbc2b45ffbc5","src/helpers.rs":"5d6f164468234ca8806dc1cea117b42dbfae80cc4c9ae965cb0556efdb364682","src/lib.rs":"ae3e07d640aff19442486dfe1501ee797a650598ea7519ee8525a9fa8bbdaa3f","src/rendering_params.rs":"9b132aef922f1ff3df06a1b126eccb6a397e81a04625afdb7b72dc2f968c92cd","src/test.rs":"d77e45f8866abeea070cbbafd4cbde62d875292e8d191310a04c70091978547c","src/types.rs":"53e81cee77c3011b6a82088adf890bd508c779c2ed6d6b0c92502e08d3c21ff0"},"package":"570707c940fc7b7fc627011fe2c8abedaea562b03bde715e3ee2dd3d6857a03c"}
|
||||
{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"172610b244a5ee8a8e2f1f045058b8abf9291d84bb76bf8779d2fd420419c2d6","Cargo.toml":"abcd85b16e3dd0a0b5213e74b9b23c0ac8e9e484d187588d4f64de717904bc88","README.md":"d69d75705e2582721cbfb2d3b4b2af052c71679057a0b2ac53a22c03f1755bba","build.rs":"b40ce243f62825724b4a45092a8e658d71fa952a6840b83f3bee58e719a56d3b","src/bitmap_render_target.rs":"d3b229f85a9804ac52976431657727b410e7d5253283df046e46d98c196f0a3a","src/com_helpers.rs":"fccb4b36379ae3454a88aa32a8e5c09e46ef5f5626266dde1fe5f40a992de39c","src/comptr.rs":"218435689f505769686e07cfc5428852dda90b849a0d48e670f632307f5edc7c","src/font.rs":"9bdf3134c6ad3639eab3da4419c9b43aad2673797f6fdc65841da2c82e1f3af4","src/font_collection.rs":"969fa3abf141dc3504774886f4783fda4a74cd5a198c643f8a77fc1af4e75258","src/font_face.rs":"47fe777fec8102ef665f5c02f57992e3a36c856fc9647ec69d04b7a39828e83b","src/font_family.rs":"403da9f8f9903cbe7f9f79636497b273f9885e200f53af99f9d4e483f11d6889","src/font_file.rs":"60ad02fc25765a2c113175ea372e98a2be0d84aa65fef9246b6a0192e63ff708","src/font_file_loader_impl.rs":"0d304ad99ff1e6874510a1498223329d798ff75b417e3db7e823a695003dfe92","src/gdi_interop.rs":"98922996afc5b8c8304cb65e7c965419003825dfa172a3e11fe69bf3d768551c","src/glyph_run_analysis.rs":"d30d8b41b047815ab5770c730b7a6d09939f2347b4a4257b87bebec08a5794fe","src/helpers.rs":"5d6f164468234ca8806dc1cea117b42dbfae80cc4c9ae965cb0556efdb364682","src/lib.rs":"6f6cc21f3cbe3403beb1d620c59284463a06b588f7344302310b7723b0eafcc2","src/rendering_params.rs":"be1d1c433f76926c285d8ecdb747c5d9cc6a6c10c1a1890c0760cd99755ed471","src/test.rs":"d77e45f8866abeea070cbbafd4cbde62d875292e8d191310a04c70091978547c","src/types.rs":"784235c15d61fb0d001373575169aa473c92af18dcbc1709a5b2bbaa3a7ceb22"},"package":"b5c3d72c5042f43ee02587b5f3256efc6252c2194fbbb0dfa0bd0b6da2491501"}
|
|
@ -3,7 +3,7 @@ name = "dwrote"
|
|||
description = "Lightweight binding to DirectWrite."
|
||||
repository = "https://github.com/vvuk/dwrote-rs"
|
||||
license = "MPL-2.0"
|
||||
version = "0.1.5"
|
||||
version = "0.1.6"
|
||||
authors = ["Vladimir Vukicevic <vladimir@pobox.com>"]
|
||||
build = "build.rs"
|
||||
|
||||
|
|
|
@ -1,46 +1,46 @@
|
|||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
#[cfg(all(feature = "serde_codegen", not(feature = "serde_derive")))]
|
||||
mod inner {
|
||||
extern crate serde_codegen;
|
||||
|
||||
use std::env;
|
||||
use std::path::Path;
|
||||
|
||||
pub fn main() {
|
||||
let out_dir = env::var_os("OUT_DIR").unwrap();
|
||||
|
||||
let src = Path::new("src/types.rs");
|
||||
let dst = Path::new(&out_dir).join("types.rs");
|
||||
|
||||
serde_codegen::expand(&src, &dst).unwrap();
|
||||
println!("cargo:rerun-if-changed=src/types.rs");
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(all(feature = "serde_derive", not(feature = "serde_codegen")))]
|
||||
mod inner {
|
||||
pub fn main() {}
|
||||
}
|
||||
|
||||
#[cfg(all(feature = "serde_codegen", feature = "serde_derive"))]
|
||||
mod inner {
|
||||
pub fn main() {
|
||||
panic!("serde_codegen and serde_derive are both used. \
|
||||
You probably forgot --no-default-features.")
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(any(feature = "serde_codegen", feature = "serde_derive")))]
|
||||
mod inner {
|
||||
pub fn main() {
|
||||
panic!("Neither serde_codegen nor serde_derive are used. "
|
||||
"You probably want --features serde_derive --no-default-features.")
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
inner::main();
|
||||
}
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
#[cfg(all(feature = "serde_codegen", not(feature = "serde_derive")))]
|
||||
mod inner {
|
||||
extern crate serde_codegen;
|
||||
|
||||
use std::env;
|
||||
use std::path::Path;
|
||||
|
||||
pub fn main() {
|
||||
let out_dir = env::var_os("OUT_DIR").unwrap();
|
||||
|
||||
let src = Path::new("src/types.rs");
|
||||
let dst = Path::new(&out_dir).join("types.rs");
|
||||
|
||||
serde_codegen::expand(&src, &dst).unwrap();
|
||||
println!("cargo:rerun-if-changed=src/types.rs");
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(all(feature = "serde_derive", not(feature = "serde_codegen")))]
|
||||
mod inner {
|
||||
pub fn main() {}
|
||||
}
|
||||
|
||||
#[cfg(all(feature = "serde_codegen", feature = "serde_derive"))]
|
||||
mod inner {
|
||||
pub fn main() {
|
||||
panic!("serde_codegen and serde_derive are both used. \
|
||||
You probably forgot --no-default-features.")
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(any(feature = "serde_codegen", feature = "serde_derive")))]
|
||||
mod inner {
|
||||
pub fn main() {
|
||||
panic!("Neither serde_codegen nor serde_derive are used. "
|
||||
"You probably want --features serde_derive --no-default-features.")
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
inner::main();
|
||||
}
|
||||
|
|
|
@ -1,124 +1,124 @@
|
|||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use std::slice;
|
||||
use std::cell::UnsafeCell;
|
||||
use std::mem::{zeroed, size_of};
|
||||
|
||||
use comptr::ComPtr;
|
||||
use winapi;
|
||||
use gdi32;
|
||||
use super::{FontFace, RenderingParams};
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct BitmapRenderTarget {
|
||||
native: UnsafeCell<ComPtr<winapi::IDWriteBitmapRenderTarget>>,
|
||||
}
|
||||
|
||||
impl BitmapRenderTarget {
|
||||
pub fn take(native: ComPtr<winapi::IDWriteBitmapRenderTarget>) -> BitmapRenderTarget {
|
||||
BitmapRenderTarget {
|
||||
native: UnsafeCell::new(native),
|
||||
}
|
||||
}
|
||||
|
||||
pub unsafe fn as_ptr(&self) -> *mut winapi::IDWriteBitmapRenderTarget {
|
||||
(*self.native.get()).as_ptr()
|
||||
}
|
||||
|
||||
// A dip is 1/96th of an inch, so this value is the number of pixels per inch divided by 96.
|
||||
pub fn set_pixels_per_dip(&self, ppd: f32) {
|
||||
unsafe {
|
||||
(*self.native.get()).SetPixelsPerDip(ppd);
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_memory_dc(&self) -> winapi::HDC {
|
||||
unsafe {
|
||||
(*self.native.get()).GetMemoryDC()
|
||||
}
|
||||
}
|
||||
|
||||
pub fn draw_glyph_run(&self,
|
||||
baseline_origin_x: f32,
|
||||
baseline_origin_y: f32,
|
||||
measuring_mode: winapi::DWRITE_MEASURING_MODE,
|
||||
font_face: &FontFace,
|
||||
em_size: f32,
|
||||
glyph_indices: &[u16],
|
||||
glyph_advances: &[f32],
|
||||
glyph_offsets: &[winapi::DWRITE_GLYPH_OFFSET],
|
||||
rendering_params: &RenderingParams,
|
||||
color: &(f32, f32, f32))
|
||||
-> winapi::RECT
|
||||
{
|
||||
unsafe {
|
||||
assert!(glyph_indices.len() == glyph_advances.len());
|
||||
assert!(glyph_indices.len() == glyph_offsets.len());
|
||||
|
||||
let r = (color.0 * 255.0) as u8;
|
||||
let g = (color.1 * 255.0) as u8;
|
||||
let b = (color.2 * 255.0) as u8;
|
||||
|
||||
let mut glyph_run: winapi::DWRITE_GLYPH_RUN = zeroed();
|
||||
glyph_run.fontFace = font_face.as_ptr();
|
||||
glyph_run.fontEmSize = em_size;
|
||||
glyph_run.glyphCount = glyph_indices.len() as u32;
|
||||
glyph_run.glyphIndices = glyph_indices.as_ptr();
|
||||
glyph_run.glyphAdvances = glyph_advances.as_ptr();
|
||||
glyph_run.glyphOffsets = glyph_offsets.as_ptr();
|
||||
glyph_run.isSideways = 0;
|
||||
glyph_run.bidiLevel = 0;
|
||||
|
||||
let mut rect: winapi::RECT = zeroed();
|
||||
let hr = (*self.native.get()).DrawGlyphRun(baseline_origin_x,
|
||||
baseline_origin_y,
|
||||
measuring_mode,
|
||||
&glyph_run,
|
||||
rendering_params.as_ptr(),
|
||||
winapi::RGB(r,g,b),
|
||||
&mut rect);
|
||||
assert!(hr == 0);
|
||||
rect
|
||||
}
|
||||
}
|
||||
|
||||
// This function expects to have glyphs rendered in WHITE,
|
||||
// and pulls out a u8 vector of width*height*4 size with
|
||||
// the coverage value (we pull out R) broadcast to the alpha
|
||||
// channel, with the color white. That is, it performs:
|
||||
// RGBX -> xxxR, where xxx = 0xff
|
||||
pub fn get_opaque_values_as_mask(&self) -> Vec<u8> {
|
||||
// Now grossness to pull out the pixels
|
||||
unsafe {
|
||||
let memory_dc = self.get_memory_dc();
|
||||
let mut bitmap: winapi::BITMAP = zeroed();
|
||||
let ret = gdi32::GetObjectW(gdi32::GetCurrentObject(memory_dc, winapi::OBJ_BITMAP),
|
||||
size_of::<winapi::BITMAP>() as i32,
|
||||
&mut bitmap as *mut _ as *mut winapi::c_void);
|
||||
assert!(ret == size_of::<winapi::BITMAP>() as i32);
|
||||
assert!(bitmap.bmBitsPixel == 32);
|
||||
|
||||
let width = bitmap.bmWidth as usize;
|
||||
let stride = bitmap.bmWidthBytes as usize;
|
||||
let height = bitmap.bmHeight as usize;
|
||||
|
||||
let mut out_bytes: Vec<u8> = vec![0; width * height * 4];
|
||||
let mut out_u32 = slice::from_raw_parts_mut(out_bytes.as_mut_ptr() as *mut u32,
|
||||
width * height);
|
||||
|
||||
for row in 0..height {
|
||||
let in_offset = (row * stride) as isize;
|
||||
let in_u32 = slice::from_raw_parts(bitmap.bmBits.offset(in_offset) as *const u32,
|
||||
width);
|
||||
for col in 0..width {
|
||||
let r = in_u32[col] & 0xff;
|
||||
out_u32[width*row + col] = (r << 24) | (0x00ffffffu32);
|
||||
}
|
||||
}
|
||||
|
||||
out_bytes
|
||||
}
|
||||
}
|
||||
}
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use std::slice;
|
||||
use std::cell::UnsafeCell;
|
||||
use std::mem::{zeroed, size_of};
|
||||
|
||||
use comptr::ComPtr;
|
||||
use winapi;
|
||||
use gdi32;
|
||||
use super::{FontFace, RenderingParams};
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct BitmapRenderTarget {
|
||||
native: UnsafeCell<ComPtr<winapi::IDWriteBitmapRenderTarget>>,
|
||||
}
|
||||
|
||||
impl BitmapRenderTarget {
|
||||
pub fn take(native: ComPtr<winapi::IDWriteBitmapRenderTarget>) -> BitmapRenderTarget {
|
||||
BitmapRenderTarget {
|
||||
native: UnsafeCell::new(native),
|
||||
}
|
||||
}
|
||||
|
||||
pub unsafe fn as_ptr(&self) -> *mut winapi::IDWriteBitmapRenderTarget {
|
||||
(*self.native.get()).as_ptr()
|
||||
}
|
||||
|
||||
// A dip is 1/96th of an inch, so this value is the number of pixels per inch divided by 96.
|
||||
pub fn set_pixels_per_dip(&self, ppd: f32) {
|
||||
unsafe {
|
||||
(*self.native.get()).SetPixelsPerDip(ppd);
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_memory_dc(&self) -> winapi::HDC {
|
||||
unsafe {
|
||||
(*self.native.get()).GetMemoryDC()
|
||||
}
|
||||
}
|
||||
|
||||
pub fn draw_glyph_run(&self,
|
||||
baseline_origin_x: f32,
|
||||
baseline_origin_y: f32,
|
||||
measuring_mode: winapi::DWRITE_MEASURING_MODE,
|
||||
font_face: &FontFace,
|
||||
em_size: f32,
|
||||
glyph_indices: &[u16],
|
||||
glyph_advances: &[f32],
|
||||
glyph_offsets: &[winapi::DWRITE_GLYPH_OFFSET],
|
||||
rendering_params: &RenderingParams,
|
||||
color: &(f32, f32, f32))
|
||||
-> winapi::RECT
|
||||
{
|
||||
unsafe {
|
||||
assert!(glyph_indices.len() == glyph_advances.len());
|
||||
assert!(glyph_indices.len() == glyph_offsets.len());
|
||||
|
||||
let r = (color.0 * 255.0) as u8;
|
||||
let g = (color.1 * 255.0) as u8;
|
||||
let b = (color.2 * 255.0) as u8;
|
||||
|
||||
let mut glyph_run: winapi::DWRITE_GLYPH_RUN = zeroed();
|
||||
glyph_run.fontFace = font_face.as_ptr();
|
||||
glyph_run.fontEmSize = em_size;
|
||||
glyph_run.glyphCount = glyph_indices.len() as u32;
|
||||
glyph_run.glyphIndices = glyph_indices.as_ptr();
|
||||
glyph_run.glyphAdvances = glyph_advances.as_ptr();
|
||||
glyph_run.glyphOffsets = glyph_offsets.as_ptr();
|
||||
glyph_run.isSideways = 0;
|
||||
glyph_run.bidiLevel = 0;
|
||||
|
||||
let mut rect: winapi::RECT = zeroed();
|
||||
let hr = (*self.native.get()).DrawGlyphRun(baseline_origin_x,
|
||||
baseline_origin_y,
|
||||
measuring_mode,
|
||||
&glyph_run,
|
||||
rendering_params.as_ptr(),
|
||||
winapi::RGB(r,g,b),
|
||||
&mut rect);
|
||||
assert!(hr == 0);
|
||||
rect
|
||||
}
|
||||
}
|
||||
|
||||
// This function expects to have glyphs rendered in WHITE,
|
||||
// and pulls out a u8 vector of width*height*4 size with
|
||||
// the coverage value (we pull out R) broadcast to the alpha
|
||||
// channel, with the color white. That is, it performs:
|
||||
// RGBX -> xxxR, where xxx = 0xff
|
||||
pub fn get_opaque_values_as_mask(&self) -> Vec<u8> {
|
||||
// Now grossness to pull out the pixels
|
||||
unsafe {
|
||||
let memory_dc = self.get_memory_dc();
|
||||
let mut bitmap: winapi::BITMAP = zeroed();
|
||||
let ret = gdi32::GetObjectW(gdi32::GetCurrentObject(memory_dc, winapi::OBJ_BITMAP),
|
||||
size_of::<winapi::BITMAP>() as i32,
|
||||
&mut bitmap as *mut _ as *mut winapi::c_void);
|
||||
assert!(ret == size_of::<winapi::BITMAP>() as i32);
|
||||
assert!(bitmap.bmBitsPixel == 32);
|
||||
|
||||
let width = bitmap.bmWidth as usize;
|
||||
let stride = bitmap.bmWidthBytes as usize;
|
||||
let height = bitmap.bmHeight as usize;
|
||||
|
||||
let mut out_bytes: Vec<u8> = vec![0; width * height * 4];
|
||||
let mut out_u32 = slice::from_raw_parts_mut(out_bytes.as_mut_ptr() as *mut u32,
|
||||
width * height);
|
||||
|
||||
for row in 0..height {
|
||||
let in_offset = (row * stride) as isize;
|
||||
let in_u32 = slice::from_raw_parts(bitmap.bmBits.offset(in_offset) as *const u32,
|
||||
width);
|
||||
for col in 0..width {
|
||||
let r = in_u32[col] & 0xff;
|
||||
out_u32[width*row + col] = (r << 24) | (0x00ffffffu32);
|
||||
}
|
||||
}
|
||||
|
||||
out_bytes
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,87 +1,87 @@
|
|||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use std::cell::UnsafeCell;
|
||||
|
||||
use comptr::ComPtr;
|
||||
use winapi;
|
||||
use std::mem;
|
||||
|
||||
use super::*;
|
||||
use helpers::*;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct Font {
|
||||
native: UnsafeCell<ComPtr<winapi::IDWriteFont>>,
|
||||
}
|
||||
|
||||
impl Font {
|
||||
pub fn take(native: ComPtr<winapi::IDWriteFont>) -> Font {
|
||||
Font {
|
||||
native: UnsafeCell::new(native),
|
||||
}
|
||||
}
|
||||
|
||||
pub unsafe fn as_ptr(&self) -> *mut winapi::IDWriteFont {
|
||||
(*self.native.get()).as_ptr()
|
||||
}
|
||||
|
||||
pub fn to_descriptor(&self) -> FontDescriptor {
|
||||
FontDescriptor {
|
||||
family_name: self.family_name(),
|
||||
stretch: self.stretch(),
|
||||
style: self.style(),
|
||||
weight: self.weight(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn stretch(&self) -> FontStretch {
|
||||
unsafe {
|
||||
mem::transmute::<u32, FontStretch>((*self.native.get()).GetStretch().0)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn style(&self) -> FontStyle {
|
||||
unsafe {
|
||||
mem::transmute::<u32, FontStyle>((*self.native.get()).GetStyle().0)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn weight(&self) -> FontWeight {
|
||||
unsafe {
|
||||
mem::transmute::<u32, FontWeight>((*self.native.get()).GetWeight().0)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn family_name(&self) -> String {
|
||||
unsafe {
|
||||
let mut family: ComPtr<winapi::IDWriteFontFamily> = ComPtr::new();
|
||||
let hr = (*self.native.get()).GetFontFamily(family.getter_addrefs());
|
||||
assert!(hr == 0);
|
||||
|
||||
FontFamily::take(family).name()
|
||||
}
|
||||
}
|
||||
|
||||
pub fn face_name(&self) -> String {
|
||||
unsafe {
|
||||
let mut names: ComPtr<winapi::IDWriteLocalizedStrings> = ComPtr::new();
|
||||
let hr = (*self.native.get()).GetFaceNames(names.getter_addrefs());
|
||||
assert!(hr == 0);
|
||||
|
||||
get_locale_string(&mut names)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn create_font_face(&self) -> FontFace {
|
||||
// FIXME create_font_face should cache the FontFace and return it,
|
||||
// there's a 1:1 relationship
|
||||
unsafe {
|
||||
let mut face: ComPtr<winapi::IDWriteFontFace> = ComPtr::new();
|
||||
let hr = (*self.native.get()).CreateFontFace(face.getter_addrefs());
|
||||
assert!(hr == 0);
|
||||
FontFace::take(face)
|
||||
}
|
||||
}
|
||||
}
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use std::cell::UnsafeCell;
|
||||
|
||||
use comptr::ComPtr;
|
||||
use winapi;
|
||||
use std::mem;
|
||||
|
||||
use super::*;
|
||||
use helpers::*;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct Font {
|
||||
native: UnsafeCell<ComPtr<winapi::IDWriteFont>>,
|
||||
}
|
||||
|
||||
impl Font {
|
||||
pub fn take(native: ComPtr<winapi::IDWriteFont>) -> Font {
|
||||
Font {
|
||||
native: UnsafeCell::new(native),
|
||||
}
|
||||
}
|
||||
|
||||
pub unsafe fn as_ptr(&self) -> *mut winapi::IDWriteFont {
|
||||
(*self.native.get()).as_ptr()
|
||||
}
|
||||
|
||||
pub fn to_descriptor(&self) -> FontDescriptor {
|
||||
FontDescriptor {
|
||||
family_name: self.family_name(),
|
||||
stretch: self.stretch(),
|
||||
style: self.style(),
|
||||
weight: self.weight(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn stretch(&self) -> FontStretch {
|
||||
unsafe {
|
||||
mem::transmute::<u32, FontStretch>((*self.native.get()).GetStretch().0)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn style(&self) -> FontStyle {
|
||||
unsafe {
|
||||
mem::transmute::<u32, FontStyle>((*self.native.get()).GetStyle().0)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn weight(&self) -> FontWeight {
|
||||
unsafe {
|
||||
mem::transmute::<u32, FontWeight>((*self.native.get()).GetWeight().0)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn family_name(&self) -> String {
|
||||
unsafe {
|
||||
let mut family: ComPtr<winapi::IDWriteFontFamily> = ComPtr::new();
|
||||
let hr = (*self.native.get()).GetFontFamily(family.getter_addrefs());
|
||||
assert!(hr == 0);
|
||||
|
||||
FontFamily::take(family).name()
|
||||
}
|
||||
}
|
||||
|
||||
pub fn face_name(&self) -> String {
|
||||
unsafe {
|
||||
let mut names: ComPtr<winapi::IDWriteLocalizedStrings> = ComPtr::new();
|
||||
let hr = (*self.native.get()).GetFaceNames(names.getter_addrefs());
|
||||
assert!(hr == 0);
|
||||
|
||||
get_locale_string(&mut names)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn create_font_face(&self) -> FontFace {
|
||||
// FIXME create_font_face should cache the FontFace and return it,
|
||||
// there's a 1:1 relationship
|
||||
unsafe {
|
||||
let mut face: ComPtr<winapi::IDWriteFontFace> = ComPtr::new();
|
||||
let hr = (*self.native.get()).CreateFontFace(face.getter_addrefs());
|
||||
assert!(hr == 0);
|
||||
FontFace::take(face)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,137 +1,137 @@
|
|||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use std::slice;
|
||||
use std::ptr;
|
||||
use std::cell::UnsafeCell;
|
||||
use std::mem::zeroed;
|
||||
|
||||
use comptr::ComPtr;
|
||||
use super::{FontMetrics, FontFile};
|
||||
|
||||
use winapi;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct FontFace {
|
||||
native: UnsafeCell<ComPtr<winapi::IDWriteFontFace>>,
|
||||
metrics: FontMetrics,
|
||||
}
|
||||
|
||||
impl FontFace {
|
||||
pub fn take(native: ComPtr<winapi::IDWriteFontFace>) -> FontFace {
|
||||
unsafe {
|
||||
let mut metrics: FontMetrics = zeroed();
|
||||
let cell = UnsafeCell::new(native);
|
||||
(*cell.get()).GetMetrics(&mut metrics);
|
||||
FontFace {
|
||||
native: cell,
|
||||
metrics: metrics,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub unsafe fn as_ptr(&self) -> *mut winapi::IDWriteFontFace {
|
||||
(*self.native.get()).as_ptr()
|
||||
}
|
||||
|
||||
pub fn get_files(&self) -> Vec<FontFile> {
|
||||
unsafe {
|
||||
let mut number_of_files: u32 = 0;
|
||||
let hr = (*self.native.get()).GetFiles(&mut number_of_files, ptr::null_mut());
|
||||
assert!(hr == 0);
|
||||
|
||||
let mut file_ptrs: Vec<*mut winapi::IDWriteFontFile> =
|
||||
vec![ptr::null_mut(); number_of_files as usize];
|
||||
let hr = (*self.native.get()).GetFiles(&mut number_of_files, file_ptrs.as_mut_ptr());
|
||||
assert!(hr == 0);
|
||||
|
||||
file_ptrs.iter().map(|p| FontFile::take(ComPtr::already_addrefed(*p))).collect()
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_glyph_count(&self) -> u16 {
|
||||
unsafe {
|
||||
(*self.native.get()).GetGlyphCount()
|
||||
}
|
||||
}
|
||||
|
||||
pub fn metrics(&self) -> &FontMetrics {
|
||||
&self.metrics
|
||||
}
|
||||
|
||||
pub fn get_metrics(&self) -> FontMetrics {
|
||||
unsafe {
|
||||
let mut metrics: winapi::DWRITE_FONT_METRICS = zeroed();
|
||||
(*self.native.get()).GetMetrics(&mut metrics);
|
||||
metrics
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_glyph_indices(&self, code_points: &[u32]) -> Vec<u16> {
|
||||
unsafe {
|
||||
let mut glyph_indices: Vec<u16> = vec![0; code_points.len()];
|
||||
let hr = (*self.native.get()).GetGlyphIndices(code_points.as_ptr(),
|
||||
code_points.len() as u32,
|
||||
glyph_indices.as_mut_ptr());
|
||||
assert!(hr == 0);
|
||||
glyph_indices
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_design_glyph_metrics(&self, glyph_indices: &[u16], is_sideways: bool) -> Vec<winapi::DWRITE_GLYPH_METRICS> {
|
||||
unsafe {
|
||||
let mut metrics: Vec<winapi::DWRITE_GLYPH_METRICS> = vec![zeroed(); glyph_indices.len()];
|
||||
let hr = (*self.native.get()).GetDesignGlyphMetrics(glyph_indices.as_ptr(),
|
||||
glyph_indices.len() as u32,
|
||||
metrics.as_mut_ptr(),
|
||||
is_sideways as winapi::BOOL);
|
||||
assert!(hr == 0);
|
||||
metrics
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_gdi_compatible_glyph_metrics(&self, em_size: f32, pixels_per_dip: f32, transform: *const winapi::DWRITE_MATRIX,
|
||||
use_gdi_natural: bool, glyph_indices: &[u16], is_sideways: bool)
|
||||
-> Vec<winapi::DWRITE_GLYPH_METRICS>
|
||||
{
|
||||
unsafe {
|
||||
let mut metrics: Vec<winapi::DWRITE_GLYPH_METRICS> = vec![zeroed(); glyph_indices.len()];
|
||||
let hr = (*self.native.get()).GetGdiCompatibleGlyphMetrics(em_size, pixels_per_dip,
|
||||
transform,
|
||||
use_gdi_natural as winapi::BOOL,
|
||||
glyph_indices.as_ptr(),
|
||||
glyph_indices.len() as u32,
|
||||
metrics.as_mut_ptr(),
|
||||
is_sideways as winapi::BOOL);
|
||||
assert!(hr == 0);
|
||||
metrics
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_font_table(&self, opentype_table_tag: u32) -> Option<Vec<u8>> {
|
||||
unsafe {
|
||||
let mut table_data_ptr: *const u8 = ptr::null_mut();
|
||||
let mut table_size: u32 = 0;
|
||||
let mut table_context: *mut winapi::c_void = ptr::null_mut();
|
||||
let mut exists: winapi::BOOL = winapi::FALSE;
|
||||
|
||||
let hr = (*self.native.get()).TryGetFontTable(opentype_table_tag,
|
||||
&mut table_data_ptr as *mut *const _ as *mut *const winapi::c_void,
|
||||
&mut table_size,
|
||||
&mut table_context,
|
||||
&mut exists);
|
||||
assert!(hr == 0);
|
||||
|
||||
if exists == winapi::FALSE {
|
||||
return None;
|
||||
}
|
||||
|
||||
let table_bytes = slice::from_raw_parts(table_data_ptr, table_size as usize).to_vec();
|
||||
|
||||
(*self.native.get()).ReleaseFontTable(table_context);
|
||||
|
||||
Some(table_bytes)
|
||||
}
|
||||
}
|
||||
}
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use std::slice;
|
||||
use std::ptr;
|
||||
use std::cell::UnsafeCell;
|
||||
use std::mem::zeroed;
|
||||
|
||||
use comptr::ComPtr;
|
||||
use super::{FontMetrics, FontFile};
|
||||
|
||||
use winapi;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct FontFace {
|
||||
native: UnsafeCell<ComPtr<winapi::IDWriteFontFace>>,
|
||||
metrics: FontMetrics,
|
||||
}
|
||||
|
||||
impl FontFace {
|
||||
pub fn take(native: ComPtr<winapi::IDWriteFontFace>) -> FontFace {
|
||||
unsafe {
|
||||
let mut metrics: FontMetrics = zeroed();
|
||||
let cell = UnsafeCell::new(native);
|
||||
(*cell.get()).GetMetrics(&mut metrics);
|
||||
FontFace {
|
||||
native: cell,
|
||||
metrics: metrics,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub unsafe fn as_ptr(&self) -> *mut winapi::IDWriteFontFace {
|
||||
(*self.native.get()).as_ptr()
|
||||
}
|
||||
|
||||
pub fn get_files(&self) -> Vec<FontFile> {
|
||||
unsafe {
|
||||
let mut number_of_files: u32 = 0;
|
||||
let hr = (*self.native.get()).GetFiles(&mut number_of_files, ptr::null_mut());
|
||||
assert!(hr == 0);
|
||||
|
||||
let mut file_ptrs: Vec<*mut winapi::IDWriteFontFile> =
|
||||
vec![ptr::null_mut(); number_of_files as usize];
|
||||
let hr = (*self.native.get()).GetFiles(&mut number_of_files, file_ptrs.as_mut_ptr());
|
||||
assert!(hr == 0);
|
||||
|
||||
file_ptrs.iter().map(|p| FontFile::take(ComPtr::already_addrefed(*p))).collect()
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_glyph_count(&self) -> u16 {
|
||||
unsafe {
|
||||
(*self.native.get()).GetGlyphCount()
|
||||
}
|
||||
}
|
||||
|
||||
pub fn metrics(&self) -> &FontMetrics {
|
||||
&self.metrics
|
||||
}
|
||||
|
||||
pub fn get_metrics(&self) -> FontMetrics {
|
||||
unsafe {
|
||||
let mut metrics: winapi::DWRITE_FONT_METRICS = zeroed();
|
||||
(*self.native.get()).GetMetrics(&mut metrics);
|
||||
metrics
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_glyph_indices(&self, code_points: &[u32]) -> Vec<u16> {
|
||||
unsafe {
|
||||
let mut glyph_indices: Vec<u16> = vec![0; code_points.len()];
|
||||
let hr = (*self.native.get()).GetGlyphIndices(code_points.as_ptr(),
|
||||
code_points.len() as u32,
|
||||
glyph_indices.as_mut_ptr());
|
||||
assert!(hr == 0);
|
||||
glyph_indices
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_design_glyph_metrics(&self, glyph_indices: &[u16], is_sideways: bool) -> Vec<winapi::DWRITE_GLYPH_METRICS> {
|
||||
unsafe {
|
||||
let mut metrics: Vec<winapi::DWRITE_GLYPH_METRICS> = vec![zeroed(); glyph_indices.len()];
|
||||
let hr = (*self.native.get()).GetDesignGlyphMetrics(glyph_indices.as_ptr(),
|
||||
glyph_indices.len() as u32,
|
||||
metrics.as_mut_ptr(),
|
||||
is_sideways as winapi::BOOL);
|
||||
assert!(hr == 0);
|
||||
metrics
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_gdi_compatible_glyph_metrics(&self, em_size: f32, pixels_per_dip: f32, transform: *const winapi::DWRITE_MATRIX,
|
||||
use_gdi_natural: bool, glyph_indices: &[u16], is_sideways: bool)
|
||||
-> Vec<winapi::DWRITE_GLYPH_METRICS>
|
||||
{
|
||||
unsafe {
|
||||
let mut metrics: Vec<winapi::DWRITE_GLYPH_METRICS> = vec![zeroed(); glyph_indices.len()];
|
||||
let hr = (*self.native.get()).GetGdiCompatibleGlyphMetrics(em_size, pixels_per_dip,
|
||||
transform,
|
||||
use_gdi_natural as winapi::BOOL,
|
||||
glyph_indices.as_ptr(),
|
||||
glyph_indices.len() as u32,
|
||||
metrics.as_mut_ptr(),
|
||||
is_sideways as winapi::BOOL);
|
||||
assert!(hr == 0);
|
||||
metrics
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_font_table(&self, opentype_table_tag: u32) -> Option<Vec<u8>> {
|
||||
unsafe {
|
||||
let mut table_data_ptr: *const u8 = ptr::null_mut();
|
||||
let mut table_size: u32 = 0;
|
||||
let mut table_context: *mut winapi::c_void = ptr::null_mut();
|
||||
let mut exists: winapi::BOOL = winapi::FALSE;
|
||||
|
||||
let hr = (*self.native.get()).TryGetFontTable(opentype_table_tag,
|
||||
&mut table_data_ptr as *mut *const _ as *mut *const winapi::c_void,
|
||||
&mut table_size,
|
||||
&mut table_context,
|
||||
&mut exists);
|
||||
assert!(hr == 0);
|
||||
|
||||
if exists == winapi::FALSE {
|
||||
return None;
|
||||
}
|
||||
|
||||
let table_bytes = slice::from_raw_parts(table_data_ptr, table_size as usize).to_vec();
|
||||
|
||||
(*self.native.get()).ReleaseFontTable(table_context);
|
||||
|
||||
Some(table_bytes)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,43 +1,43 @@
|
|||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use std::ptr;
|
||||
use std::cell::UnsafeCell;
|
||||
|
||||
use comptr::ComPtr;
|
||||
use winapi;
|
||||
use super::{DWriteFactory, BitmapRenderTarget};
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct GdiInterop {
|
||||
native: UnsafeCell<ComPtr<winapi::IDWriteGdiInterop>>,
|
||||
}
|
||||
|
||||
impl GdiInterop {
|
||||
pub fn create() -> GdiInterop {
|
||||
unsafe {
|
||||
let mut native: ComPtr<winapi::IDWriteGdiInterop> = ComPtr::new();
|
||||
let hr = (*DWriteFactory()).GetGdiInterop(native.getter_addrefs());
|
||||
assert!(hr == 0);
|
||||
GdiInterop::take(native)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn take(native: ComPtr<winapi::IDWriteGdiInterop>) -> GdiInterop {
|
||||
GdiInterop {
|
||||
native: UnsafeCell::new(native),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn create_bitmap_render_target(&self, width: u32, height: u32) -> BitmapRenderTarget {
|
||||
unsafe {
|
||||
let mut native: ComPtr<winapi::IDWriteBitmapRenderTarget> = ComPtr::new();
|
||||
let hr = (*self.native.get()).CreateBitmapRenderTarget(ptr::null_mut(),
|
||||
width, height,
|
||||
native.getter_addrefs());
|
||||
assert!(hr == 0);
|
||||
BitmapRenderTarget::take(native)
|
||||
}
|
||||
}
|
||||
}
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use std::ptr;
|
||||
use std::cell::UnsafeCell;
|
||||
|
||||
use comptr::ComPtr;
|
||||
use winapi;
|
||||
use super::{DWriteFactory, BitmapRenderTarget};
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct GdiInterop {
|
||||
native: UnsafeCell<ComPtr<winapi::IDWriteGdiInterop>>,
|
||||
}
|
||||
|
||||
impl GdiInterop {
|
||||
pub fn create() -> GdiInterop {
|
||||
unsafe {
|
||||
let mut native: ComPtr<winapi::IDWriteGdiInterop> = ComPtr::new();
|
||||
let hr = (*DWriteFactory()).GetGdiInterop(native.getter_addrefs());
|
||||
assert!(hr == 0);
|
||||
GdiInterop::take(native)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn take(native: ComPtr<winapi::IDWriteGdiInterop>) -> GdiInterop {
|
||||
GdiInterop {
|
||||
native: UnsafeCell::new(native),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn create_bitmap_render_target(&self, width: u32, height: u32) -> BitmapRenderTarget {
|
||||
unsafe {
|
||||
let mut native: ComPtr<winapi::IDWriteBitmapRenderTarget> = ComPtr::new();
|
||||
let hr = (*self.native.get()).CreateBitmapRenderTarget(ptr::null_mut(),
|
||||
width, height,
|
||||
native.getter_addrefs());
|
||||
assert!(hr == 0);
|
||||
BitmapRenderTarget::take(native)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,72 +1,72 @@
|
|||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use std::ptr;
|
||||
use std::cell::UnsafeCell;
|
||||
|
||||
use comptr::ComPtr;
|
||||
use winapi;
|
||||
use std::mem;
|
||||
use super::DWriteFactory;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct GlyphRunAnalysis {
|
||||
native: UnsafeCell<ComPtr<winapi::IDWriteGlyphRunAnalysis>>,
|
||||
}
|
||||
|
||||
impl GlyphRunAnalysis {
|
||||
pub fn create(glyph_run: &winapi::DWRITE_GLYPH_RUN,
|
||||
pixels_per_dip: f32,
|
||||
transform: Option<winapi::DWRITE_MATRIX>,
|
||||
rendering_mode: winapi::DWRITE_RENDERING_MODE,
|
||||
measuring_mode: winapi::DWRITE_MEASURING_MODE,
|
||||
baseline_x: f32,
|
||||
baseline_y: f32) -> GlyphRunAnalysis
|
||||
{
|
||||
unsafe {
|
||||
let mut native: ComPtr<winapi::IDWriteGlyphRunAnalysis> = ComPtr::new();
|
||||
let hr = (*DWriteFactory()).CreateGlyphRunAnalysis(glyph_run as *const winapi::DWRITE_GLYPH_RUN,
|
||||
pixels_per_dip,
|
||||
transform.as_ref().map(|x| x as *const _).unwrap_or(ptr::null()),
|
||||
rendering_mode, measuring_mode,
|
||||
baseline_x, baseline_y,
|
||||
native.getter_addrefs());
|
||||
assert!(hr == 0);
|
||||
GlyphRunAnalysis::take(native)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn take(native: ComPtr<winapi::IDWriteGlyphRunAnalysis>) -> GlyphRunAnalysis {
|
||||
GlyphRunAnalysis {
|
||||
native: UnsafeCell::new(native),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_alpha_texture_bounds(&self, texture_type: winapi::DWRITE_TEXTURE_TYPE) -> winapi::RECT {
|
||||
unsafe {
|
||||
let mut rect: winapi::RECT = mem::zeroed();
|
||||
rect.left = 1234;
|
||||
rect.top = 1234;
|
||||
let hr = (*self.native.get()).GetAlphaTextureBounds(texture_type, &mut rect);
|
||||
assert!(hr == 0);
|
||||
rect
|
||||
}
|
||||
}
|
||||
|
||||
pub fn create_alpha_texture(&self, texture_type: winapi::DWRITE_TEXTURE_TYPE, rect: winapi::RECT) -> Vec<u8> {
|
||||
unsafe {
|
||||
let rect_pixels = (rect.right - rect.left) * (rect.bottom - rect.top);
|
||||
let rect_bytes = rect_pixels * match texture_type {
|
||||
winapi::DWRITE_TEXTURE_ALIASED_1x1 => 1,
|
||||
winapi::DWRITE_TEXTURE_CLEARTYPE_3x1 => 3,
|
||||
_ => panic!("bad texture type specified"),
|
||||
};
|
||||
|
||||
let mut out_bytes: Vec<u8> = vec![0; rect_bytes as usize];
|
||||
let hr = (*self.native.get()).CreateAlphaTexture(texture_type, &rect, out_bytes.as_mut_ptr(), out_bytes.len() as u32);
|
||||
assert!(hr == 0);
|
||||
out_bytes
|
||||
}
|
||||
}
|
||||
}
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use std::ptr;
|
||||
use std::cell::UnsafeCell;
|
||||
|
||||
use comptr::ComPtr;
|
||||
use winapi;
|
||||
use std::mem;
|
||||
use super::DWriteFactory;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct GlyphRunAnalysis {
|
||||
native: UnsafeCell<ComPtr<winapi::IDWriteGlyphRunAnalysis>>,
|
||||
}
|
||||
|
||||
impl GlyphRunAnalysis {
|
||||
pub fn create(glyph_run: &winapi::DWRITE_GLYPH_RUN,
|
||||
pixels_per_dip: f32,
|
||||
transform: Option<winapi::DWRITE_MATRIX>,
|
||||
rendering_mode: winapi::DWRITE_RENDERING_MODE,
|
||||
measuring_mode: winapi::DWRITE_MEASURING_MODE,
|
||||
baseline_x: f32,
|
||||
baseline_y: f32) -> GlyphRunAnalysis
|
||||
{
|
||||
unsafe {
|
||||
let mut native: ComPtr<winapi::IDWriteGlyphRunAnalysis> = ComPtr::new();
|
||||
let hr = (*DWriteFactory()).CreateGlyphRunAnalysis(glyph_run as *const winapi::DWRITE_GLYPH_RUN,
|
||||
pixels_per_dip,
|
||||
transform.as_ref().map(|x| x as *const _).unwrap_or(ptr::null()),
|
||||
rendering_mode, measuring_mode,
|
||||
baseline_x, baseline_y,
|
||||
native.getter_addrefs());
|
||||
assert!(hr == 0);
|
||||
GlyphRunAnalysis::take(native)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn take(native: ComPtr<winapi::IDWriteGlyphRunAnalysis>) -> GlyphRunAnalysis {
|
||||
GlyphRunAnalysis {
|
||||
native: UnsafeCell::new(native),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_alpha_texture_bounds(&self, texture_type: winapi::DWRITE_TEXTURE_TYPE) -> winapi::RECT {
|
||||
unsafe {
|
||||
let mut rect: winapi::RECT = mem::zeroed();
|
||||
rect.left = 1234;
|
||||
rect.top = 1234;
|
||||
let hr = (*self.native.get()).GetAlphaTextureBounds(texture_type, &mut rect);
|
||||
assert!(hr == 0);
|
||||
rect
|
||||
}
|
||||
}
|
||||
|
||||
pub fn create_alpha_texture(&self, texture_type: winapi::DWRITE_TEXTURE_TYPE, rect: winapi::RECT) -> Vec<u8> {
|
||||
unsafe {
|
||||
let rect_pixels = (rect.right - rect.left) * (rect.bottom - rect.top);
|
||||
let rect_bytes = rect_pixels * match texture_type {
|
||||
winapi::DWRITE_TEXTURE_ALIASED_1x1 => 1,
|
||||
winapi::DWRITE_TEXTURE_CLEARTYPE_3x1 => 3,
|
||||
_ => panic!("bad texture type specified"),
|
||||
};
|
||||
|
||||
let mut out_bytes: Vec<u8> = vec![0; rect_bytes as usize];
|
||||
let hr = (*self.native.get()).CreateAlphaTexture(texture_type, &rect, out_bytes.as_mut_ptr(), out_bytes.len() as u32);
|
||||
assert!(hr == 0);
|
||||
out_bytes
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -62,6 +62,9 @@ pub use winapi::{DWRITE_FONT_SIMULATIONS_NONE,
|
|||
DWRITE_FONT_SIMULATIONS_BOLD,
|
||||
DWRITE_FONT_SIMULATIONS_OBLIQUE};
|
||||
pub use winapi::{DWRITE_TEXTURE_ALIASED_1x1, DWRITE_TEXTURE_CLEARTYPE_3x1};
|
||||
pub use winapi::{DWRITE_RENDERING_MODE};
|
||||
pub use winapi::{DWRITE_MEASURING_MODE};
|
||||
pub use winapi::{DWRITE_TEXTURE_TYPE};
|
||||
|
||||
#[macro_use] mod com_helpers;
|
||||
|
||||
|
|
|
@ -1,35 +1,35 @@
|
|||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use std::cell::UnsafeCell;
|
||||
|
||||
use comptr::ComPtr;
|
||||
use winapi;
|
||||
use super::DWriteFactory;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct RenderingParams {
|
||||
native: UnsafeCell<ComPtr<winapi::IDWriteRenderingParams>>,
|
||||
}
|
||||
|
||||
impl RenderingParams {
|
||||
pub fn create_for_primary_monitor() -> RenderingParams {
|
||||
unsafe {
|
||||
let mut native: ComPtr<winapi::IDWriteRenderingParams> = ComPtr::new();
|
||||
let hr = (*DWriteFactory()).CreateRenderingParams(native.getter_addrefs());
|
||||
assert!(hr == 0);
|
||||
RenderingParams::take(native)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn take(native: ComPtr<winapi::IDWriteRenderingParams>) -> RenderingParams {
|
||||
RenderingParams {
|
||||
native: UnsafeCell::new(native),
|
||||
}
|
||||
}
|
||||
|
||||
pub unsafe fn as_ptr(&self) -> *mut winapi::IDWriteRenderingParams {
|
||||
(*self.native.get()).as_ptr()
|
||||
}
|
||||
}
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use std::cell::UnsafeCell;
|
||||
|
||||
use comptr::ComPtr;
|
||||
use winapi;
|
||||
use super::DWriteFactory;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct RenderingParams {
|
||||
native: UnsafeCell<ComPtr<winapi::IDWriteRenderingParams>>,
|
||||
}
|
||||
|
||||
impl RenderingParams {
|
||||
pub fn create_for_primary_monitor() -> RenderingParams {
|
||||
unsafe {
|
||||
let mut native: ComPtr<winapi::IDWriteRenderingParams> = ComPtr::new();
|
||||
let hr = (*DWriteFactory()).CreateRenderingParams(native.getter_addrefs());
|
||||
assert!(hr == 0);
|
||||
RenderingParams::take(native)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn take(native: ComPtr<winapi::IDWriteRenderingParams>) -> RenderingParams {
|
||||
RenderingParams {
|
||||
native: UnsafeCell::new(native),
|
||||
}
|
||||
}
|
||||
|
||||
pub unsafe fn as_ptr(&self) -> *mut winapi::IDWriteRenderingParams {
|
||||
(*self.native.get()).as_ptr()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,80 +1,80 @@
|
|||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
/* this is include!()'d in lib.rs */
|
||||
use std::mem;
|
||||
|
||||
// mirrors DWRITE_FONT_WEIGHT
|
||||
#[repr(u32)]
|
||||
#[derive(Deserialize, Serialize, PartialEq, Debug, Clone, Copy)]
|
||||
pub enum FontWeight {
|
||||
Thin = 100,
|
||||
ExtraLight = 200,
|
||||
Light = 300,
|
||||
SemiLight = 350,
|
||||
Regular = 400,
|
||||
Medium = 500,
|
||||
SemiBold = 600,
|
||||
Bold = 700,
|
||||
ExtraBold = 800,
|
||||
Black = 900,
|
||||
ExtraBlack = 950,
|
||||
}
|
||||
|
||||
impl FontWeight {
|
||||
fn t(&self) -> winapi::DWRITE_FONT_WEIGHT {
|
||||
unsafe { mem::transmute::<FontWeight, winapi::DWRITE_FONT_WEIGHT>(*self) }
|
||||
}
|
||||
pub fn to_u32(&self) -> u32 { unsafe { mem::transmute::<FontWeight, u32>(*self) } }
|
||||
pub fn from_u32(v: u32) -> FontWeight { unsafe { mem::transmute::<u32, FontWeight>(v) } }
|
||||
}
|
||||
|
||||
// mirrors DWRITE_FONT_STRETCH
|
||||
#[repr(u32)]
|
||||
#[derive(Deserialize, Serialize, PartialEq, Debug, Clone, Copy)]
|
||||
pub enum FontStretch {
|
||||
Undefined = 0,
|
||||
UltraCondensed = 1,
|
||||
ExtraCondensed = 2,
|
||||
Condensed = 3,
|
||||
SemiCondensed = 4,
|
||||
Normal = 5,
|
||||
SemiExpanded = 6,
|
||||
Expanded = 7,
|
||||
ExtraExpanded = 8,
|
||||
UltraExpanded = 9,
|
||||
}
|
||||
|
||||
impl FontStretch {
|
||||
fn t(&self) -> winapi::DWRITE_FONT_STRETCH {
|
||||
unsafe { mem::transmute::<FontStretch, winapi::DWRITE_FONT_STRETCH>(*self) }
|
||||
}
|
||||
pub fn to_u32(&self) -> u32 { unsafe { mem::transmute::<FontStretch, u32>(*self) } }
|
||||
pub fn from_u32(v: u32) -> FontStretch { unsafe { mem::transmute::<u32, FontStretch>(v) } }
|
||||
}
|
||||
|
||||
// mirrors DWRITE_FONT_STYLE
|
||||
#[repr(u32)]
|
||||
#[derive(Deserialize, Serialize, PartialEq, Debug, Clone, Copy)]
|
||||
pub enum FontStyle {
|
||||
Normal = 0,
|
||||
Oblique = 1,
|
||||
Italic = 2,
|
||||
}
|
||||
|
||||
impl FontStyle {
|
||||
fn t(&self) -> winapi::DWRITE_FONT_STYLE {
|
||||
unsafe { mem::transmute::<FontStyle, winapi::DWRITE_FONT_STYLE>(*self) }
|
||||
}
|
||||
pub fn to_u32(&self) -> u32 { unsafe { mem::transmute::<FontStyle, u32>(*self) } }
|
||||
pub fn from_u32(v: u32) -> FontStyle { unsafe { mem::transmute::<u32, FontStyle>(v) } }
|
||||
}
|
||||
|
||||
#[derive(Deserialize, Serialize, PartialEq, Debug, Clone)]
|
||||
pub struct FontDescriptor {
|
||||
pub family_name: String,
|
||||
pub weight: FontWeight,
|
||||
pub stretch: FontStretch,
|
||||
pub style: FontStyle,
|
||||
}
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
/* this is include!()'d in lib.rs */
|
||||
use std::mem;
|
||||
|
||||
// mirrors DWRITE_FONT_WEIGHT
|
||||
#[repr(u32)]
|
||||
#[derive(Deserialize, Serialize, PartialEq, Debug, Clone, Copy)]
|
||||
pub enum FontWeight {
|
||||
Thin = 100,
|
||||
ExtraLight = 200,
|
||||
Light = 300,
|
||||
SemiLight = 350,
|
||||
Regular = 400,
|
||||
Medium = 500,
|
||||
SemiBold = 600,
|
||||
Bold = 700,
|
||||
ExtraBold = 800,
|
||||
Black = 900,
|
||||
ExtraBlack = 950,
|
||||
}
|
||||
|
||||
impl FontWeight {
|
||||
fn t(&self) -> winapi::DWRITE_FONT_WEIGHT {
|
||||
unsafe { mem::transmute::<FontWeight, winapi::DWRITE_FONT_WEIGHT>(*self) }
|
||||
}
|
||||
pub fn to_u32(&self) -> u32 { unsafe { mem::transmute::<FontWeight, u32>(*self) } }
|
||||
pub fn from_u32(v: u32) -> FontWeight { unsafe { mem::transmute::<u32, FontWeight>(v) } }
|
||||
}
|
||||
|
||||
// mirrors DWRITE_FONT_STRETCH
|
||||
#[repr(u32)]
|
||||
#[derive(Deserialize, Serialize, PartialEq, Debug, Clone, Copy)]
|
||||
pub enum FontStretch {
|
||||
Undefined = 0,
|
||||
UltraCondensed = 1,
|
||||
ExtraCondensed = 2,
|
||||
Condensed = 3,
|
||||
SemiCondensed = 4,
|
||||
Normal = 5,
|
||||
SemiExpanded = 6,
|
||||
Expanded = 7,
|
||||
ExtraExpanded = 8,
|
||||
UltraExpanded = 9,
|
||||
}
|
||||
|
||||
impl FontStretch {
|
||||
fn t(&self) -> winapi::DWRITE_FONT_STRETCH {
|
||||
unsafe { mem::transmute::<FontStretch, winapi::DWRITE_FONT_STRETCH>(*self) }
|
||||
}
|
||||
pub fn to_u32(&self) -> u32 { unsafe { mem::transmute::<FontStretch, u32>(*self) } }
|
||||
pub fn from_u32(v: u32) -> FontStretch { unsafe { mem::transmute::<u32, FontStretch>(v) } }
|
||||
}
|
||||
|
||||
// mirrors DWRITE_FONT_STYLE
|
||||
#[repr(u32)]
|
||||
#[derive(Deserialize, Serialize, PartialEq, Debug, Clone, Copy)]
|
||||
pub enum FontStyle {
|
||||
Normal = 0,
|
||||
Oblique = 1,
|
||||
Italic = 2,
|
||||
}
|
||||
|
||||
impl FontStyle {
|
||||
fn t(&self) -> winapi::DWRITE_FONT_STYLE {
|
||||
unsafe { mem::transmute::<FontStyle, winapi::DWRITE_FONT_STYLE>(*self) }
|
||||
}
|
||||
pub fn to_u32(&self) -> u32 { unsafe { mem::transmute::<FontStyle, u32>(*self) } }
|
||||
pub fn from_u32(v: u32) -> FontStyle { unsafe { mem::transmute::<u32, FontStyle>(v) } }
|
||||
}
|
||||
|
||||
#[derive(Deserialize, Serialize, PartialEq, Debug, Clone)]
|
||||
pub struct FontDescriptor {
|
||||
pub family_name: String,
|
||||
pub weight: FontWeight,
|
||||
pub stretch: FontStretch,
|
||||
pub style: FontStyle,
|
||||
}
|
||||
|
|
|
@ -1 +1 @@
|
|||
{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"c1e953ee360e77de57f7b02f1b7880bd6a3dc22d1a69e953c2ac2c52cc52d247",".travis.yml":"46f5e5da873985b56fc97643a27f610feec18724aad8e899379f3b8c84c329ae","COPYING":"ec82b96487e9e778ee610c7ab245162464782cfa1f555c2299333f8dbe5c036a","Cargo.toml":"49e1649ba705e4297e28c1880205c6486524eedfdce4f94c7b395506e973eef0","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"62065228e42caebca7e7d7db1204cbb867033de5982ca4009928915e4095f3a3","README.md":"2de24b7458d6b88f20324303a48acf64a4f2bbfb83d2ec4d6ff2b4f4a1fd2275","build.rs":"5b2abf3e2b85f4d0bdbbaa5778c8fd7480eb151db3bd699ec63b77fa3afdfd7b","src/gl.rs":"712e1bf9b9e75e409920937cc98b0f405f43c809721e1156f6ee5a32cb1ba167","src/lib.rs":"ad33ebcb3f4a0edc36e95c837cda6f01a0be8a6ab1bcf485565fb03f70831324"},"package":"6af023107aa969ccf8868a0304fead4b2f813c19aa9a6a243fddc041f3e51da5"}
|
||||
{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"c1e953ee360e77de57f7b02f1b7880bd6a3dc22d1a69e953c2ac2c52cc52d247",".travis.yml":"46f5e5da873985b56fc97643a27f610feec18724aad8e899379f3b8c84c329ae","COPYING":"ec82b96487e9e778ee610c7ab245162464782cfa1f555c2299333f8dbe5c036a","Cargo.toml":"08c1304ddded710af219247d613a1f5ea16ded3641dfd70a3a8823e131e1e8d5","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"62065228e42caebca7e7d7db1204cbb867033de5982ca4009928915e4095f3a3","README.md":"2de24b7458d6b88f20324303a48acf64a4f2bbfb83d2ec4d6ff2b4f4a1fd2275","build.rs":"5b2abf3e2b85f4d0bdbbaa5778c8fd7480eb151db3bd699ec63b77fa3afdfd7b","src/gl.rs":"feb6da4fc27e8ed2661c5327875323cf129b6709eb7558dde03741af28d60802","src/lib.rs":"ad33ebcb3f4a0edc36e95c837cda6f01a0be8a6ab1bcf485565fb03f70831324"},"package":"7a3023edde169b7767a71d2e5dd8e8903ac3b1436ff659225310928db87d6a8a"}
|
|
@ -1,6 +1,6 @@
|
|||
[package]
|
||||
name = "gleam"
|
||||
version = "0.2.30"
|
||||
version = "0.2.31"
|
||||
license = "Apache-2.0/MIT"
|
||||
authors = ["The Servo Project Developers"]
|
||||
build = "build.rs"
|
||||
|
|
|
@ -924,6 +924,27 @@ pub fn is_texture(texture: GLenum) -> GLboolean {
|
|||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn is_framebuffer(framebuffer: GLenum) -> GLboolean {
|
||||
unsafe {
|
||||
ffi::IsFramebuffer(framebuffer)
|
||||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn is_renderbuffer(renderbuffer: GLenum) -> GLboolean {
|
||||
unsafe {
|
||||
ffi::IsRenderbuffer(renderbuffer)
|
||||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn check_frame_buffer_status(target: GLenum) -> GLenum {
|
||||
unsafe {
|
||||
ffi::CheckFramebufferStatus(target)
|
||||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn enable_vertex_attrib_array(index: GLuint) {
|
||||
unsafe {
|
||||
|
|
|
@ -1 +1 @@
|
|||
{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"7150ee9391a955b2ef7e0762fc61c0c1aab167620ca36d88d78062d93b8334ba",".travis.yml":"9b8376fc479996f32f8a690e6009fc2f7e9f6dc1b1224e0180a92ad65b0b2183","Cargo.toml":"dc0cd165e159c1c8a3300fde9ee2b19a61e0c9f6ec8fc3cf96eede9724bad910","Makefile":"85b6d903eecac170ac97f10d9d89b8366cd91f5ea2f7c6212704bc590b64cf50","README.md":"614cf0c6242be3e62e45a3d60ce9a2a1581bdc46b28b25d5f40caba558e4d615","build.rs":"86776b47fac1d9368e3c3c5d57c62731729ed859bb1c4e4db0fe219251812cab","src/draw_buffer.rs":"7619ea2889c1e49ea387c3952a8cea5821526cf68e81ad02f918a373e71ef9ed","src/gl_context.rs":"18ccf931fb9a19bc3e0b7ddec8a5bfc2557357d8874e3e0e5c72a3073bc4d053","src/gl_context_attributes.rs":"c76ef02996d0daac313b666d1991878bbf7812932a0f9feac9e62c89ba7bf669","src/gl_context_capabilities.rs":"9f665ad04d42d47d15ecbd430639d95da526ec5951f0b7abe2434adc1415c85d","src/gl_feature.rs":"b826884900c0e8d6317a41ebb6c30bdb468601bf1c030c376749bdb2ecd2f15a","src/gl_formats.rs":"99087345b4e9a12c86605c0d091bfaf1b4ed4b2475a3b6f91d2127a2bb85fe1b","src/gl_limits.rs":"02e41619518daae5895929db00d073b5ad0d9daf9319a61abb7012c2e59fb6c7","src/lib.rs":"daaf4e26504dbb97f3803de4337f601d616adf0633e5c4415c2c172fb257ebd6","src/platform/mod.rs":"f6ec310e5b8fb519607b8e4d5ca71a0c07c83737a83c3785b5b44e7902498c8a","src/platform/not_implemented/mod.rs":"d576e9fc3164f9e2a8ff9460a60eaa8ecada44c600de1a4d1bb5513ab93569af","src/platform/not_implemented/native_gl_context.rs":"fe018722b8bebbd59b6fae759dd78b0175d10bf110205b113ff155fd06d0f75d","src/platform/with_cgl/mod.rs":"b05dc146c9ba82d62410d9b0566a8aa70c77e7ec583ad4881c531d7118454543","src/platform/with_cgl/native_gl_context.rs":"c6271cfa96836d8f833f5efbc90352852557d582db41d2c513cc36c3f966ae88","src/platform/with_egl/mod.rs":"c52ac147eb051733070c36b2c62be8c57427f80999507f62a9ce801f4aac284c","src/platform/with_egl/native_gl_context.rs":"3a8342d53de9525a5478cc96b323dbad2b3628aa6655fe5f092834cc72256116","src/platform/with_egl/utils.rs":"508521e2bf3809ffe0dfea4fa4a358903f49c77a33aa42cc6c0e7458d992a2a7","src/platform/with_glx/mod.rs":"0e497f38b2071ed189995c91b27b0b199d31bfcc10836e2d26b55023d7aff503","src/platform/with_glx/native_gl_context.rs":"2c648ae18baac14290b2eca3581d474adfea00a29a7ad47a1100e564e74b9152","src/platform/with_glx/utils.rs":"eb81e0a4c62947fa5099c241cfe2e4dd075376d30b22864e042c0f536ac6be58","src/platform/with_osmesa/mod.rs":"9f6d69878125185f16740f52ba5cdd8a45e8812af1a3561482c9b43edaf4514a","src/platform/with_wgl/mod.rs":"38f9b44b54c8a1bd4d25ae77a4ea6a2e5454a00b816764d7d74152c1f3c1b126","src/platform/with_wgl/native_gl_context.rs":"4aecd40a811cf38607b17db9724f79bb934e056f85c90c987b2aa82d637b7bb4","src/platform/with_wgl/utils.rs":"d9640c000dcb513cf0a13c4a0d35c423366b7d0894deff299affe0202bdeb770","src/platform/with_wgl/wgl_attributes.rs":"73b75da18519e048011e9c303e402cf7961e3652aa8f4d4ebf507b4ab83d06a3","src/tests.rs":"780d4211a02c09abebb2b8be85a87ed98bee374999bd333c29efb3a8c7d2b281"},"package":"2fe2fe54ba2b6ea8f43a17b16c13168c5bbf008e0fc91b34122a11f637e2728a"}
|
||||
{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"7150ee9391a955b2ef7e0762fc61c0c1aab167620ca36d88d78062d93b8334ba",".travis.yml":"9b8376fc479996f32f8a690e6009fc2f7e9f6dc1b1224e0180a92ad65b0b2183","Cargo.toml":"a2aacf8d637addcb13f6f04e21c65ae4bde00bb589de00b8c97746224a97499c","Makefile":"85b6d903eecac170ac97f10d9d89b8366cd91f5ea2f7c6212704bc590b64cf50","README.md":"614cf0c6242be3e62e45a3d60ce9a2a1581bdc46b28b25d5f40caba558e4d615","build.rs":"86776b47fac1d9368e3c3c5d57c62731729ed859bb1c4e4db0fe219251812cab","src/draw_buffer.rs":"52bef86972f40e0dd13a6e81f3aa76d4d0c28ea0b63f5f9da9650a34d75488c0","src/gl_context.rs":"28953e3752ea7fd2b19327f98c06fe53f7618efc4d3f0cb2262eba403756df2a","src/gl_context_attributes.rs":"c76ef02996d0daac313b666d1991878bbf7812932a0f9feac9e62c89ba7bf669","src/gl_context_capabilities.rs":"9f665ad04d42d47d15ecbd430639d95da526ec5951f0b7abe2434adc1415c85d","src/gl_feature.rs":"b826884900c0e8d6317a41ebb6c30bdb468601bf1c030c376749bdb2ecd2f15a","src/gl_formats.rs":"99087345b4e9a12c86605c0d091bfaf1b4ed4b2475a3b6f91d2127a2bb85fe1b","src/gl_limits.rs":"02e41619518daae5895929db00d073b5ad0d9daf9319a61abb7012c2e59fb6c7","src/lib.rs":"daaf4e26504dbb97f3803de4337f601d616adf0633e5c4415c2c172fb257ebd6","src/platform/mod.rs":"f6ec310e5b8fb519607b8e4d5ca71a0c07c83737a83c3785b5b44e7902498c8a","src/platform/not_implemented/mod.rs":"d576e9fc3164f9e2a8ff9460a60eaa8ecada44c600de1a4d1bb5513ab93569af","src/platform/not_implemented/native_gl_context.rs":"fe018722b8bebbd59b6fae759dd78b0175d10bf110205b113ff155fd06d0f75d","src/platform/with_cgl/mod.rs":"b05dc146c9ba82d62410d9b0566a8aa70c77e7ec583ad4881c531d7118454543","src/platform/with_cgl/native_gl_context.rs":"c6271cfa96836d8f833f5efbc90352852557d582db41d2c513cc36c3f966ae88","src/platform/with_egl/mod.rs":"c52ac147eb051733070c36b2c62be8c57427f80999507f62a9ce801f4aac284c","src/platform/with_egl/native_gl_context.rs":"3a8342d53de9525a5478cc96b323dbad2b3628aa6655fe5f092834cc72256116","src/platform/with_egl/utils.rs":"508521e2bf3809ffe0dfea4fa4a358903f49c77a33aa42cc6c0e7458d992a2a7","src/platform/with_glx/mod.rs":"0e497f38b2071ed189995c91b27b0b199d31bfcc10836e2d26b55023d7aff503","src/platform/with_glx/native_gl_context.rs":"2c648ae18baac14290b2eca3581d474adfea00a29a7ad47a1100e564e74b9152","src/platform/with_glx/utils.rs":"eb81e0a4c62947fa5099c241cfe2e4dd075376d30b22864e042c0f536ac6be58","src/platform/with_osmesa/mod.rs":"9f6d69878125185f16740f52ba5cdd8a45e8812af1a3561482c9b43edaf4514a","src/platform/with_wgl/mod.rs":"38f9b44b54c8a1bd4d25ae77a4ea6a2e5454a00b816764d7d74152c1f3c1b126","src/platform/with_wgl/native_gl_context.rs":"4aecd40a811cf38607b17db9724f79bb934e056f85c90c987b2aa82d637b7bb4","src/platform/with_wgl/utils.rs":"d9640c000dcb513cf0a13c4a0d35c423366b7d0894deff299affe0202bdeb770","src/platform/with_wgl/wgl_attributes.rs":"73b75da18519e048011e9c303e402cf7961e3652aa8f4d4ebf507b4ab83d06a3","src/tests.rs":"780d4211a02c09abebb2b8be85a87ed98bee374999bd333c29efb3a8c7d2b281"},"package":"2092c6bb5550536a097c5b413a2c36e141bc63c85c0a40944a182c1912d69397"}
|
|
@ -1,7 +1,7 @@
|
|||
[package]
|
||||
name = "offscreen_gl_context"
|
||||
license = "MIT / Apache-2.0"
|
||||
version = "0.5.1"
|
||||
version = "0.5.3"
|
||||
authors = ["Emilio Cobos Álvarez <ecoal95@gmail.com>", "The Servo Project Developers"]
|
||||
description = "Creation and manipulation of HW accelerated offscreen rendering contexts in multiple platforms. Originally intended for the Servo project's WebGL implementation."
|
||||
repository = "https://github.com/emilio/rust-offscreen-rendering-context"
|
||||
|
|
|
@ -5,8 +5,6 @@ use gleam::gl::types::{GLuint, GLenum, GLint};
|
|||
use GLContext;
|
||||
use NativeGLContextMethods;
|
||||
|
||||
use std::ptr;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum ColorAttachmentType {
|
||||
Texture,
|
||||
|
@ -41,11 +39,9 @@ impl ColorAttachment {
|
|||
|
||||
impl Drop for ColorAttachment {
|
||||
fn drop(&mut self) {
|
||||
unsafe {
|
||||
match *self {
|
||||
ColorAttachment::Renderbuffer(mut id) => gl::DeleteRenderbuffers(1, &mut id),
|
||||
ColorAttachment::Texture(mut tex_id) => gl::DeleteTextures(1, &mut tex_id),
|
||||
}
|
||||
match *self {
|
||||
ColorAttachment::Renderbuffer(id) => gl::delete_renderbuffers(&[id]),
|
||||
ColorAttachment::Texture(tex_id) => gl::delete_textures(&[tex_id]),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -69,14 +65,10 @@ pub struct DrawBuffer {
|
|||
/// `glRenderbufferStorageMultisample` when we support antialising
|
||||
fn create_renderbuffer(format: GLenum,
|
||||
size: &Size2D<i32>) -> GLuint {
|
||||
let mut ret: GLuint = 0;
|
||||
|
||||
unsafe {
|
||||
gl::GenRenderbuffers(1, &mut ret);
|
||||
gl::BindRenderbuffer(gl::RENDERBUFFER, ret);
|
||||
gl::RenderbufferStorage(gl::RENDERBUFFER, format, size.width, size.height);
|
||||
gl::BindRenderbuffer(gl::RENDERBUFFER, 0);
|
||||
}
|
||||
let ret = gl::gen_renderbuffers(1)[0];
|
||||
gl::bind_renderbuffer(gl::RENDERBUFFER, ret);
|
||||
gl::renderbuffer_storage(gl::RENDERBUFFER, format, size.width, size.height);
|
||||
gl::bind_renderbuffer(gl::RENDERBUFFER, 0);
|
||||
|
||||
ret
|
||||
}
|
||||
|
@ -121,10 +113,8 @@ impl DrawBuffer {
|
|||
|
||||
try!(draw_buffer.init(context, color_attachment_type));
|
||||
|
||||
unsafe {
|
||||
debug_assert!(gl::CheckFramebufferStatus(gl::FRAMEBUFFER) == gl::FRAMEBUFFER_COMPLETE);
|
||||
debug_assert!(gl::get_error() == gl::NO_ERROR);
|
||||
}
|
||||
debug_assert!(gl::check_frame_buffer_status(gl::FRAMEBUFFER) == gl::FRAMEBUFFER_COMPLETE);
|
||||
debug_assert!(gl::get_error() == gl::NO_ERROR);
|
||||
|
||||
Ok(draw_buffer)
|
||||
}
|
||||
|
@ -167,18 +157,11 @@ impl DrawBuffer {
|
|||
// parent with Rc<GLContext> and call make_current()
|
||||
impl Drop for DrawBuffer {
|
||||
fn drop(&mut self) {
|
||||
unsafe {
|
||||
gl::DeleteFramebuffers(1, &mut self.framebuffer);
|
||||
gl::delete_framebuffers(&[self.framebuffer]);
|
||||
|
||||
// NOTE: Color renderbuffer is destroyed on drop of
|
||||
// ColorAttachment
|
||||
let mut renderbuffers = [
|
||||
self.stencil_renderbuffer,
|
||||
self.depth_renderbuffer
|
||||
];
|
||||
|
||||
gl::DeleteRenderbuffers(2, renderbuffers.as_mut_ptr());
|
||||
}
|
||||
// NOTE: Color renderbuffer is destroyed on drop of
|
||||
// ColorAttachment
|
||||
gl::delete_renderbuffers(&[self.stencil_renderbuffer, self.depth_renderbuffer]);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -209,31 +192,26 @@ impl DrawBufferHelpers for DrawBuffer {
|
|||
|
||||
// TODO(ecoal95): Allow more customization of textures
|
||||
ColorAttachmentType::Texture => {
|
||||
let mut texture = 0;
|
||||
let texture = gl::gen_textures(1)[0];
|
||||
debug_assert!(texture != 0);
|
||||
|
||||
// TODO(ecoal95): Check gleam safe wrappers for these functions
|
||||
unsafe {
|
||||
gl::GenTextures(1, &mut texture);
|
||||
debug_assert!(texture != 0);
|
||||
gl::bind_texture(gl::TEXTURE_2D, texture);
|
||||
gl::tex_image_2d(gl::TEXTURE_2D, 0,
|
||||
formats.texture_internal as GLint, self.size.width, self.size.height, 0, formats.texture, formats.texture_type, None);
|
||||
|
||||
gl::BindTexture(gl::TEXTURE_2D, texture);
|
||||
gl::TexImage2D(gl::TEXTURE_2D, 0,
|
||||
formats.texture_internal as GLint, self.size.width, self.size.height, 0, formats.texture, formats.texture_type, ptr::null_mut());
|
||||
// Low filtering to allow rendering
|
||||
gl::tex_parameter_i(gl::TEXTURE_2D, gl::TEXTURE_MAG_FILTER, gl::NEAREST as GLint);
|
||||
gl::tex_parameter_i(gl::TEXTURE_2D, gl::TEXTURE_MIN_FILTER, gl::NEAREST as GLint);
|
||||
|
||||
// Low filtering to allow rendering
|
||||
gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_MAG_FILTER, gl::NEAREST as GLint);
|
||||
gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_MIN_FILTER, gl::NEAREST as GLint);
|
||||
// TODO(ecoal95): Check if these two are neccessary, probably not
|
||||
gl::tex_parameter_i(gl::TEXTURE_2D, gl::TEXTURE_WRAP_S, gl::CLAMP_TO_EDGE as GLint);
|
||||
gl::tex_parameter_i(gl::TEXTURE_2D, gl::TEXTURE_WRAP_T, gl::CLAMP_TO_EDGE as GLint);
|
||||
|
||||
// TODO(ecoal95): Check if these two are neccessary, probably not
|
||||
gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_WRAP_S, gl::CLAMP_TO_EDGE as GLint);
|
||||
gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_WRAP_T, gl::CLAMP_TO_EDGE as GLint);
|
||||
gl::bind_texture(gl::TEXTURE_2D, 0);
|
||||
|
||||
gl::BindTexture(gl::TEXTURE_2D, 0);
|
||||
debug_assert!(gl::get_error() == gl::NO_ERROR);
|
||||
|
||||
debug_assert!(gl::get_error() == gl::NO_ERROR);
|
||||
|
||||
Some(ColorAttachment::Texture(texture))
|
||||
}
|
||||
Some(ColorAttachment::Texture(texture))
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -248,52 +226,48 @@ impl DrawBufferHelpers for DrawBuffer {
|
|||
debug_assert!(self.stencil_renderbuffer != 0);
|
||||
}
|
||||
|
||||
unsafe {
|
||||
gl::GenFramebuffers(1, &mut self.framebuffer);
|
||||
debug_assert!(self.framebuffer != 0);
|
||||
}
|
||||
self.framebuffer = gl::gen_framebuffers(1)[0];
|
||||
debug_assert!(self.framebuffer != 0);
|
||||
|
||||
// Finally we attach them to the framebuffer
|
||||
self.attach_to_framebuffer()
|
||||
}
|
||||
|
||||
fn attach_to_framebuffer(&mut self) -> Result<(), &'static str> {
|
||||
unsafe {
|
||||
gl::BindFramebuffer(gl::FRAMEBUFFER, self.framebuffer);
|
||||
// NOTE: The assertion fails if the framebuffer is not bound
|
||||
debug_assert!(gl::IsFramebuffer(self.framebuffer) == gl::TRUE);
|
||||
gl::bind_framebuffer(gl::FRAMEBUFFER, self.framebuffer);
|
||||
// NOTE: The assertion fails if the framebuffer is not bound
|
||||
debug_assert!(gl::is_framebuffer(self.framebuffer) == gl::TRUE);
|
||||
|
||||
match *self.color_attachment.as_ref().unwrap() {
|
||||
ColorAttachment::Renderbuffer(color_renderbuffer) => {
|
||||
gl::FramebufferRenderbuffer(gl::FRAMEBUFFER,
|
||||
gl::COLOR_ATTACHMENT0,
|
||||
gl::RENDERBUFFER,
|
||||
color_renderbuffer);
|
||||
debug_assert!(gl::IsRenderbuffer(color_renderbuffer) == gl::TRUE);
|
||||
},
|
||||
ColorAttachment::Texture(texture_id) => {
|
||||
gl::FramebufferTexture2D(gl::FRAMEBUFFER,
|
||||
match *self.color_attachment.as_ref().unwrap() {
|
||||
ColorAttachment::Renderbuffer(color_renderbuffer) => {
|
||||
gl::framebuffer_renderbuffer(gl::FRAMEBUFFER,
|
||||
gl::COLOR_ATTACHMENT0,
|
||||
gl::TEXTURE_2D,
|
||||
texture_id, 0);
|
||||
},
|
||||
}
|
||||
gl::RENDERBUFFER,
|
||||
color_renderbuffer);
|
||||
debug_assert!(gl::is_renderbuffer(color_renderbuffer) == gl::TRUE);
|
||||
},
|
||||
ColorAttachment::Texture(texture_id) => {
|
||||
gl::framebuffer_texture_2d(gl::FRAMEBUFFER,
|
||||
gl::COLOR_ATTACHMENT0,
|
||||
gl::TEXTURE_2D,
|
||||
texture_id, 0);
|
||||
},
|
||||
}
|
||||
|
||||
if self.depth_renderbuffer != 0 {
|
||||
gl::FramebufferRenderbuffer(gl::FRAMEBUFFER,
|
||||
gl::DEPTH_ATTACHMENT,
|
||||
gl::RENDERBUFFER,
|
||||
self.depth_renderbuffer);
|
||||
debug_assert!(gl::IsRenderbuffer(self.depth_renderbuffer) == gl::TRUE);
|
||||
}
|
||||
if self.depth_renderbuffer != 0 {
|
||||
gl::framebuffer_renderbuffer(gl::FRAMEBUFFER,
|
||||
gl::DEPTH_ATTACHMENT,
|
||||
gl::RENDERBUFFER,
|
||||
self.depth_renderbuffer);
|
||||
debug_assert!(gl::is_renderbuffer(self.depth_renderbuffer) == gl::TRUE);
|
||||
}
|
||||
|
||||
if self.stencil_renderbuffer != 0 {
|
||||
gl::FramebufferRenderbuffer(gl::FRAMEBUFFER,
|
||||
gl::STENCIL_ATTACHMENT,
|
||||
gl::RENDERBUFFER,
|
||||
self.stencil_renderbuffer);
|
||||
debug_assert!(gl::IsRenderbuffer(self.stencil_renderbuffer) == gl::TRUE);
|
||||
}
|
||||
if self.stencil_renderbuffer != 0 {
|
||||
gl::framebuffer_renderbuffer(gl::FRAMEBUFFER,
|
||||
gl::STENCIL_ATTACHMENT,
|
||||
gl::RENDERBUFFER,
|
||||
self.stencil_renderbuffer);
|
||||
debug_assert!(gl::is_renderbuffer(self.stencil_renderbuffer) == gl::TRUE);
|
||||
}
|
||||
|
||||
Ok(())
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
use euclid::Size2D;
|
||||
use gleam::gl;
|
||||
use gleam::gl::types::{GLint, GLuint};
|
||||
use gleam::gl::types::{GLuint};
|
||||
|
||||
use NativeGLContextMethods;
|
||||
use GLContextAttributes;
|
||||
|
@ -141,11 +141,8 @@ impl<Native> GLContext<Native>
|
|||
return db.get_framebuffer();
|
||||
}
|
||||
|
||||
unsafe {
|
||||
let mut ret : GLint = 0;
|
||||
gl::GetIntegerv(gl::FRAMEBUFFER_BINDING, &mut ret);
|
||||
ret as GLuint
|
||||
}
|
||||
let ret = gl::get_integer_v(gl::FRAMEBUFFER_BINDING);
|
||||
ret as GLuint
|
||||
}
|
||||
|
||||
pub fn draw_buffer_size(&self) -> Option<Size2D<i32>> {
|
||||
|
@ -183,12 +180,10 @@ impl<T: NativeGLContextMethods> GLContextPrivateMethods for GLContext<T> {
|
|||
|
||||
debug_assert!(self.is_current());
|
||||
|
||||
unsafe {
|
||||
gl::ClearColor(0.0, 0.0, 0.0, 0.0);
|
||||
gl::Clear(gl::COLOR_BUFFER_BIT | gl::DEPTH_BUFFER_BIT | gl::STENCIL_BUFFER_BIT);
|
||||
gl::Scissor(0, 0, size.width, size.height);
|
||||
gl::Viewport(0, 0, size.width, size.height);
|
||||
}
|
||||
gl::clear_color(0.0, 0.0, 0.0, 0.0);
|
||||
gl::clear(gl::COLOR_BUFFER_BIT | gl::DEPTH_BUFFER_BIT | gl::STENCIL_BUFFER_BIT);
|
||||
gl::scissor(0, 0, size.width, size.height);
|
||||
gl::viewport(0, 0, size.width, size.height);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
|
|
@ -1 +1 @@
|
|||
{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"c1e953ee360e77de57f7b02f1b7880bd6a3dc22d1a69e953c2ac2c52cc52d247",".travis.yml":"8d7877933bd1dbc8e7d45491cfeffb596e99f007b87d1704fbcbb1e2907aa55d","Cargo.toml":"6b8bd4b975acf4a3b8fca56990bafcb7e30fea391a754e0ed79a2eab61891c32","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"24788a22c94dd50f248fb7baa1520acf5a02f000600a9b5a8bb9ab5bde5c35a8","src/lib.rs":"1b110ac5e75501837db190de3a39b3d2f202dd71289a1087483d61f1f7d31359","tests/foo.pc":"f77712847e77ea81ac6362de5861dc0eddf14b9c07dce1853b3e3e587ffcac5e","tests/framework.pc":"4d02091799252777afb0547321cc04e7df1e017226a6b05630fed5eaf37e0125","tests/test.rs":"1a842822fc56bac88efa9d604061b5d88e03faa8efb23cdfbdd86f6a6c2ca2c9"},"package":"8cee804ecc7eaf201a4a207241472cc870e825206f6c031e3ee2a72fa425f2fa"}
|
||||
{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"c1e953ee360e77de57f7b02f1b7880bd6a3dc22d1a69e953c2ac2c52cc52d247",".travis.yml":"f2b3b481e61dee9f83649f2079c7637fef1f3e4c181926bf77d39128f3ea82c7","Cargo.toml":"425339eef4a01cf8773dc69444115e5771c84194f68f1748a22b0c0f200dd475","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"6259efd2a3ba18ea50579f0af2ef3d4e797231522e18bad915ca25901fb31de2","src/lib.rs":"163a48484a96ab21529b42bfe3448753c898a42f4b204aa352bf0f87ff49f30e","tests/foo.pc":"f77712847e77ea81ac6362de5861dc0eddf14b9c07dce1853b3e3e587ffcac5e","tests/framework.pc":"4d02091799252777afb0547321cc04e7df1e017226a6b05630fed5eaf37e0125","tests/test.rs":"09bf2811e3d58432080a76b0d297131e43d215253894a2919626e71b30924b0b"},"package":"3a8b4c6b8165cd1a1cd4b9b120978131389f64bdaf456435caa41e630edba903"}
|
|
@ -4,22 +4,20 @@ rust:
|
|||
- beta
|
||||
- nightly
|
||||
sudo: false
|
||||
before_script:
|
||||
- pip install 'travis-cargo<0.2' --user && export PATH=$HOME/.local/bin:$PATH
|
||||
script:
|
||||
- cargo build --verbose
|
||||
- |
|
||||
[ $TRAVIS_RUST_VERSION != nightly ] || cargo test --verbose
|
||||
- cargo doc
|
||||
after_success: |
|
||||
[ $TRAVIS_BRANCH = master ] &&
|
||||
[ $TRAVIS_PULL_REQUEST = false ] &&
|
||||
[ $TRAVIS_RUST_VERSION = nightly ] &&
|
||||
echo '<meta http-equiv=refresh content=0;url=pkg_config/index.html>' > target/doc/index.html &&
|
||||
pip install ghp-import --user $USER &&
|
||||
$HOME/.local/bin/ghp-import -n target/doc &&
|
||||
git push -qf https://${TOKEN}@github.com/${TRAVIS_REPO_SLUG}.git gh-pages
|
||||
- cargo test --verbose
|
||||
- cargo doc --no-deps
|
||||
after_success:
|
||||
- travis-cargo --only nightly doc-upload
|
||||
env:
|
||||
global:
|
||||
secure: XlfwiQ+fPgRWqFwHbyPTma2FAVtgN+IXFpkiIdh1sKxWEeHMqABrTtOKf/NugDYCGsOJfr2vb5qFL6teBV2lTXOffUIWj+1hMd0N/FbVKWzABBV02XdxQi8w2ptPez5LPRTEfXJRRHmJpc8ww2aCTIrdT3AQE2oqZM/jHJTi/1U=
|
||||
secure: "D/GKEEBQarjXTZ6NWzwQq39nQ892XJ9m3C9219K/6Us8jyjE5DBhosDPvg6pvRJtTLaghDxuhxqkHunayNL18IOvkNbfMjYsnkP8/yMftQUfRdNub6C1kXAi8guXjPd8rUwW0Oy8Nar61WAwWQgHkXfuSJ2em7u/Xk0tICPSwlA="
|
||||
|
||||
|
||||
|
||||
notifications:
|
||||
email:
|
||||
on_success: never
|
||||
|
|
|
@ -1,13 +1,16 @@
|
|||
[package]
|
||||
|
||||
name = "pkg-config"
|
||||
version = "0.3.8"
|
||||
version = "0.3.9"
|
||||
authors = ["Alex Crichton <alex@alexcrichton.com>"]
|
||||
license = "MIT/Apache-2.0"
|
||||
repository = "https://github.com/alexcrichton/pkg-config-rs"
|
||||
documentation = "http://alexcrichton.com/pkg-config-rs"
|
||||
documentation = "https://docs.rs/pkg-config"
|
||||
description = """
|
||||
A library to run the pkg-config system tool at build time in order to be used in
|
||||
Cargo build scripts.
|
||||
"""
|
||||
keywords = ["build-dependencies"]
|
||||
|
||||
[dev-dependencies]
|
||||
lazy_static = "0.2"
|
||||
|
|
|
@ -2,17 +2,36 @@
|
|||
|
||||
[![Build Status](https://travis-ci.org/alexcrichton/pkg-config-rs.svg?branch=master)](https://travis-ci.org/alexcrichton/pkg-config-rs)
|
||||
|
||||
[Documentation](http://alexcrichton.com/pkg-config-rs)
|
||||
[Documentation](https://docs.rs/pkg-config)
|
||||
|
||||
A simple library meant to be used as a build dependency with Cargo packages in
|
||||
order to use the system `pkg-config` tool (if available) to determine where a
|
||||
library is located.
|
||||
|
||||
You can use this crate directly to probe for specific libraries, or use
|
||||
[metadeps](https://github.com/joshtriplett/metadeps) to declare all your
|
||||
`pkg-config` dependencies in `Cargo.toml`.
|
||||
|
||||
# Example
|
||||
|
||||
Find the system library named `foo`, with minimum version 1.2.3:
|
||||
|
||||
```rust
|
||||
extern crate pkg_config;
|
||||
|
||||
fn main() {
|
||||
pkg_config::find_library("foo").unwrap();
|
||||
pkg_config::Config::new().atleast_version("1.2.3").probe("foo").unwrap();
|
||||
}
|
||||
```
|
||||
|
||||
Find the system library named `foo`, with no version requirement (not
|
||||
recommended):
|
||||
|
||||
```rust
|
||||
extern crate pkg_config;
|
||||
|
||||
fn main() {
|
||||
pkg_config::probe_library("foo").unwrap();
|
||||
}
|
||||
```
|
||||
|
||||
|
|
|
@ -30,7 +30,18 @@
|
|||
//!
|
||||
//! # Example
|
||||
//!
|
||||
//! Find the system library named `foo`.
|
||||
//! Find the system library named `foo`, with minimum version 1.2.3:
|
||||
//!
|
||||
//! ```no_run
|
||||
//! extern crate pkg_config;
|
||||
//!
|
||||
//! fn main() {
|
||||
//! pkg_config::Config::new().atleast_version("1.2.3").probe("foo").unwrap();
|
||||
//! }
|
||||
//! ```
|
||||
//!
|
||||
//! Find the system library named `foo`, with no version requirement (not
|
||||
//! recommended):
|
||||
//!
|
||||
//! ```no_run
|
||||
//! extern crate pkg_config;
|
||||
|
@ -46,11 +57,11 @@
|
|||
//! extern crate pkg_config;
|
||||
//!
|
||||
//! fn main() {
|
||||
//! pkg_config::Config::new().statik(true).probe("foo").unwrap();
|
||||
//! pkg_config::Config::new().atleast_version("1.2.3").statik(true).probe("foo").unwrap();
|
||||
//! }
|
||||
//! ```
|
||||
|
||||
#![doc(html_root_url = "http://alexcrichton.com/pkg-config-rs")]
|
||||
#![doc(html_root_url = "https://docs.rs/pkg-config/0.3")]
|
||||
#![cfg_attr(test, deny(warnings))]
|
||||
|
||||
use std::ascii::AsciiExt;
|
||||
|
@ -82,6 +93,7 @@ pub struct Config {
|
|||
atleast_version: Option<String>,
|
||||
extra_args: Vec<OsString>,
|
||||
cargo_metadata: bool,
|
||||
print_system_libs: bool,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
|
@ -107,6 +119,9 @@ pub enum Error {
|
|||
/// Override with `PKG_CONFIG_ALLOW_CROSS=1`.
|
||||
CrossCompilation,
|
||||
|
||||
/// Attempted to compile using the MSVC ABI build
|
||||
MSVC,
|
||||
|
||||
/// Failed to run `pkg-config`.
|
||||
///
|
||||
/// Contains the command and the cause.
|
||||
|
@ -130,6 +145,7 @@ impl error::Error for Error {
|
|||
"pkg-config doesn't handle cross compilation. \
|
||||
Use PKG_CONFIG_ALLOW_CROSS=1 to override"
|
||||
}
|
||||
Error::MSVC => "pkg-config is incompatible with the MSVC ABI build.",
|
||||
Error::Command { .. } => "failed to run pkg-config",
|
||||
Error::Failure { .. } => "pkg-config did not exit sucessfully",
|
||||
Error::__Nonexhaustive => panic!(),
|
||||
|
@ -180,6 +196,7 @@ impl fmt::Debug for Error {
|
|||
.finish()
|
||||
}
|
||||
Error::CrossCompilation => write!(f, "CrossCompilation"),
|
||||
Error::MSVC => write!(f, "MSVC"),
|
||||
Error::Command { ref command, ref cause } => {
|
||||
f.debug_struct("Command")
|
||||
.field("command", command)
|
||||
|
@ -207,6 +224,10 @@ impl fmt::Display for Error {
|
|||
write!(f, "Cross compilation detected. \
|
||||
Use PKG_CONFIG_ALLOW_CROSS=1 to override")
|
||||
}
|
||||
Error::MSVC => {
|
||||
write!(f, "MSVC target detected. If you are using the MSVC ABI \
|
||||
rust build, please use the GNU ABI build instead.")
|
||||
}
|
||||
Error::Command { ref command, ref cause } => {
|
||||
write!(f, "Failed to run `{}`: {}", command, cause)
|
||||
}
|
||||
|
@ -218,7 +239,7 @@ impl fmt::Display for Error {
|
|||
try!(write!(f, "\n--- stdout\n{}", stdout));
|
||||
}
|
||||
if !stderr.is_empty() {
|
||||
try!(write!(f, "\n--- stdout\n{}", stderr));
|
||||
try!(write!(f, "\n--- stderr\n{}", stderr));
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
@ -254,6 +275,7 @@ impl Config {
|
|||
statik: None,
|
||||
atleast_version: None,
|
||||
extra_args: vec![],
|
||||
print_system_libs: true,
|
||||
cargo_metadata: true,
|
||||
}
|
||||
}
|
||||
|
@ -288,6 +310,15 @@ impl Config {
|
|||
self
|
||||
}
|
||||
|
||||
/// Enable or disable the `PKG_CONFIG_ALLOW_SYSTEM_LIBS` environment
|
||||
/// variable.
|
||||
///
|
||||
/// This env var is enabled by default.
|
||||
pub fn print_system_libs(&mut self, print: bool) -> &mut Config {
|
||||
self.print_system_libs = print;
|
||||
self
|
||||
}
|
||||
|
||||
/// Deprecated in favor fo the `probe` function
|
||||
#[doc(hidden)]
|
||||
pub fn find(&self, name: &str) -> Result<Library, String> {
|
||||
|
@ -303,7 +334,12 @@ impl Config {
|
|||
if env::var_os(&abort_var_name).is_some() {
|
||||
return Err(Error::EnvNoPkgConfig(abort_var_name))
|
||||
} else if !target_supported() {
|
||||
return Err(Error::CrossCompilation);
|
||||
if env::var("TARGET").unwrap_or(String::new()).contains("msvc") {
|
||||
return Err(Error::MSVC);
|
||||
}
|
||||
else {
|
||||
return Err(Error::CrossCompilation);
|
||||
}
|
||||
}
|
||||
|
||||
let mut library = Library::new();
|
||||
|
@ -334,8 +370,11 @@ impl Config {
|
|||
cmd.arg("--static");
|
||||
}
|
||||
cmd.args(args)
|
||||
.args(&self.extra_args)
|
||||
.env("PKG_CONFIG_ALLOW_SYSTEM_LIBS", "1");
|
||||
.args(&self.extra_args);
|
||||
|
||||
if self.print_system_libs {
|
||||
cmd.env("PKG_CONFIG_ALLOW_SYSTEM_LIBS", "1");
|
||||
}
|
||||
if let Some(ref version) = self.atleast_version {
|
||||
cmd.arg(&format!("{} >= {}", name, version));
|
||||
} else {
|
||||
|
|
|
@ -1,13 +1,15 @@
|
|||
#![feature(static_mutex)]
|
||||
|
||||
extern crate pkg_config;
|
||||
#[macro_use]
|
||||
extern crate lazy_static;
|
||||
|
||||
use pkg_config::Error;
|
||||
use std::env;
|
||||
use std::sync::{StaticMutex, MUTEX_INIT};
|
||||
use std::sync::Mutex;
|
||||
use std::path::PathBuf;
|
||||
|
||||
static LOCK: StaticMutex = MUTEX_INIT;
|
||||
lazy_static! {
|
||||
static ref LOCK: Mutex<()> = Mutex::new(());
|
||||
}
|
||||
|
||||
fn reset() {
|
||||
for (k, _) in env::vars() {
|
||||
|
|
|
@ -1 +1 @@
|
|||
{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"ea9f9bb37492e62dbd04d7a38da935c4ca54b7cc74fb46ed7f99e07116a6966b","src/ident.rs":"830077b64dce8c8ede1fb6ab664cae72f5496f4ab6be21a5b4e3b5e4e57ec425","src/lib.rs":"f799c898057a4e8e1620b32c70e13d3fee7af3a0352a5a4a1da6393942d21cc7","src/to_tokens.rs":"9443c192caa28f1e7d9de80a2d37c87fedd1d8664915513db9ca02a1ee8abfdc","src/tokens.rs":"a559a56905debae32a0e7852114812cca7173341a62b277894517264a759dfa6"},"package":"48f961356de2df29263e751df9e2e2493bd765e57fce250cc8b8dcef53ed33c0"}
|
||||
{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"a5da41e07bf2d8af3fda684c7adb912e98047e9fe12a8288be3d9e3a494388ca","src/ident.rs":"830077b64dce8c8ede1fb6ab664cae72f5496f4ab6be21a5b4e3b5e4e57ec425","src/lib.rs":"f799c898057a4e8e1620b32c70e13d3fee7af3a0352a5a4a1da6393942d21cc7","src/to_tokens.rs":"a871cb84506fa9e0783ac29617d686327ce5d05a9711a3a10833430b00345ccc","src/tokens.rs":"a559a56905debae32a0e7852114812cca7173341a62b277894517264a759dfa6"},"package":"e7b44fd83db28b83c1c58187159934906e5e955c812e211df413b76b03c909a5"}
|
|
@ -1,6 +1,6 @@
|
|||
[package]
|
||||
name = "quote"
|
||||
version = "0.3.11" # don't forget to update version in readme for breaking changes
|
||||
version = "0.3.12" # don't forget to update version in readme for breaking changes
|
||||
authors = ["David Tolnay <dtolnay@gmail.com>"]
|
||||
license = "MIT/Apache-2.0"
|
||||
description = "Quasi-quoting macro quote!(...)"
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
use super::Tokens;
|
||||
|
||||
use std::borrow::Cow;
|
||||
|
||||
/// Types that can be interpolated inside a `quote!(...)` invocation.
|
||||
pub trait ToTokens {
|
||||
/// Write `self` to the given `Tokens`.
|
||||
|
@ -33,6 +35,12 @@ impl<'a, T: ?Sized + ToTokens> ToTokens for &'a T {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a, T: ?Sized + ToOwned + ToTokens> ToTokens for Cow<'a, T> {
|
||||
fn to_tokens(&self, tokens: &mut Tokens) {
|
||||
(**self).to_tokens(tokens);
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: ?Sized + ToTokens> ToTokens for Box<T> {
|
||||
fn to_tokens(&self, tokens: &mut Tokens) {
|
||||
(**self).to_tokens(tokens);
|
||||
|
|
|
@ -1 +1 @@
|
|||
{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"3044d8bcb7afe720659ce9a00f0c1eb6affbd6d5134da7cf41e02b8a6976fd64","src/bytes.rs":"ec2fb40df6a1e1233462d85145a57eb33a1df0140ed921e9fe0a0ca35c7c1064","src/de/from_primitive.rs":"b1bd165e343a4380965551709119ef9ed895e4b025045a810dabd671511ba3ab","src/de/impls.rs":"3e27049398fc000ae0ec89f0358e5cd8fe55d6ddf0bc5a0a9ae9de936ce0935b","src/de/mod.rs":"62291b6b7c29d411b9ff212cab480982e535e7aee21c1729b4bb592d681ab807","src/de/value.rs":"6dd878ce762799048c0ebc8f834932871e1bdf24953ea69415a2b2148e0d3dbc","src/error.rs":"da31d3881930f0e787d75191984f71fe2e1419d9331c68baa0fc0ce2d561766b","src/iter.rs":"30090fe6ab49bb1d8c7fec362cace52981b2c4e1a1a8e3fad4117eab558cdde6","src/lib.rs":"67f62df097e3b55a90a566af56d6e3c641f719300db8bfd5603ed5a2bff1aa8e","src/macros.rs":"e81e421815fac10d6a7bfb727bbe7b4f24e99b03cd8739efc806e4b704ac7b4e","src/ser/impls.rs":"36d372af1dae11444f85e497eefb98449bae70260348cdfb098c508439be7952","src/ser/mod.rs":"626e8ef5b1ddaf00fe84905e936046c40217e31609d5a56ca658f4eb23983fd5","src/utils.rs":"b0d1a54af90e3620abd66479d757a2eb442449788c4ece93161916da0838affa"},"package":"f1e4aab5b62fb90ac9c99d5a55caa7c37e06a15d1b189ccc2b117782655fd11f"}
|
||||
{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"37cf6256c6eb377c59bac3c48ca9ac70b100173c1114de357084edf2a5381044","src/bytes.rs":"ec2fb40df6a1e1233462d85145a57eb33a1df0140ed921e9fe0a0ca35c7c1064","src/de/from_primitive.rs":"b1bd165e343a4380965551709119ef9ed895e4b025045a810dabd671511ba3ab","src/de/impls.rs":"3e27049398fc000ae0ec89f0358e5cd8fe55d6ddf0bc5a0a9ae9de936ce0935b","src/de/mod.rs":"62291b6b7c29d411b9ff212cab480982e535e7aee21c1729b4bb592d681ab807","src/de/value.rs":"6dd878ce762799048c0ebc8f834932871e1bdf24953ea69415a2b2148e0d3dbc","src/error.rs":"da31d3881930f0e787d75191984f71fe2e1419d9331c68baa0fc0ce2d561766b","src/iter.rs":"30090fe6ab49bb1d8c7fec362cace52981b2c4e1a1a8e3fad4117eab558cdde6","src/lib.rs":"67f62df097e3b55a90a566af56d6e3c641f719300db8bfd5603ed5a2bff1aa8e","src/macros.rs":"e81e421815fac10d6a7bfb727bbe7b4f24e99b03cd8739efc806e4b704ac7b4e","src/ser/impls.rs":"36d372af1dae11444f85e497eefb98449bae70260348cdfb098c508439be7952","src/ser/mod.rs":"626e8ef5b1ddaf00fe84905e936046c40217e31609d5a56ca658f4eb23983fd5","src/utils.rs":"b0d1a54af90e3620abd66479d757a2eb442449788c4ece93161916da0838affa"},"package":"9dad3f759919b92c3068c696c15c3d17238234498bbdcc80f2c469606f948ac8"}
|
|
@ -1,6 +1,6 @@
|
|||
[package]
|
||||
name = "serde"
|
||||
version = "0.8.22"
|
||||
version = "0.8.23"
|
||||
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>"]
|
||||
license = "MIT/Apache-2.0"
|
||||
description = "A generic serialization/deserialization framework"
|
||||
|
@ -9,6 +9,7 @@ repository = "https://github.com/serde-rs/serde"
|
|||
documentation = "https://docs.serde.rs/serde/"
|
||||
readme = "../README.md"
|
||||
keywords = ["serde", "serialization"]
|
||||
categories = ["encoding"]
|
||||
include = ["Cargo.toml", "src/**/*.rs"]
|
||||
|
||||
[features]
|
||||
|
|
|
@ -1 +1 @@
|
|||
{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"bfe45d3c81652b67353686fcf8c93d85f32f025d0f379d74b43abd50fe1688ca","src/bound.rs":"d1f94299052acaeeae0c011c2304b072dec76c7c32469d2b8881c2e380346496","src/de.rs":"a16c27918c973463427faaa98a7e7bd156c828bac4b96d605c30f82dad347476","src/lib.rs":"3ce6c8c8445b9f0987472477586c26281dd129f7dd9af4fd0a99d51bdfb65782","src/ser.rs":"5b86cf6b0b7941d3d82f3ed32cd26b845c821558f086fe9d7237f0ff1e066e61"},"package":"200c97dd86298518356c694869a7a51af1de398bd6c6dcce89fa21a512fdea44"}
|
||||
{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"b16e3c93d139c09eb72a661a4201661c3c57ccca250a928a2ebc29f587d92540","src/bound.rs":"d1f94299052acaeeae0c011c2304b072dec76c7c32469d2b8881c2e380346496","src/de.rs":"a16c27918c973463427faaa98a7e7bd156c828bac4b96d605c30f82dad347476","src/lib.rs":"3ce6c8c8445b9f0987472477586c26281dd129f7dd9af4fd0a99d51bdfb65782","src/ser.rs":"5b86cf6b0b7941d3d82f3ed32cd26b845c821558f086fe9d7237f0ff1e066e61"},"package":"a4c5d8a33087d8984f9535daa62a6498a08f6476050b00ab9339dd847e4c25cc"}
|
|
@ -1,6 +1,6 @@
|
|||
[package]
|
||||
name = "serde_codegen"
|
||||
version = "0.8.22"
|
||||
version = "0.8.23"
|
||||
authors = ["Erick Tryzelaar <erick.tryzelaar@gmail.com>"]
|
||||
license = "MIT/Apache-2.0"
|
||||
description = "Macros to auto-generate implementations for the serde framework"
|
||||
|
|
|
@ -1 +1 @@
|
|||
{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"a65b38a99a6385032b3f2d35684fcffe4bb54fb4e402e9aa7aa002c0cff29a59","src/aster/generics.rs":"77eb19443af0dff5debb18d064733cc8721a42ad7e993a33352cdeff2b5f9f85","src/aster/ident.rs":"e9d082664f008a56bd854011310b4258ab072740ba82e57495b6e8a868a5f36b","src/aster/invoke.rs":"2b1b993973ab4f5c8fa6d6a286576b2542edce21fe9904f5133c470c072e6d3f","src/aster/lifetime.rs":"d83f4c1a48e3580caa028cfabde6ace232efc95d70af6dc9cfcca48317db9ad7","src/aster/mod.rs":"12220f73b0021e72b4c50f6a513cff174b9c7267209aa23f183043d96ccc9ab7","src/aster/path.rs":"60865b0f952077307c1a66810a4b6dafde43e76a417a433a8343960e7de474e4","src/aster/qpath.rs":"885c94b29ab8ee45c72a682221e241d1f0dd09c659809fe77279b5dd8a4bc645","src/aster/ty.rs":"90649aad98617c09ffc43a38aeb823a3298c41bf5e10f0ef3500b71c81021c2f","src/aster/ty_param.rs":"7ced1e6ca0c98ef468d507d3f07bfcb1171395cd66ff5c3e1b091fe7e8b9a562","src/aster/where_predicate.rs":"5fb8ec3fcb67bcc1d9bb7b64cf2f5beb601aac6502d6db30c0cdf8641fa248d1","src/attr.rs":"2ba436bdd439511be10baf9ad45226ade678176a7fd45a087367e1ad2b43e07a","src/constant.rs":"90535a2320e0dc8ab623a9bffa770bdf697baef2884a7d9224b31daf422ea5a0","src/data.rs":"0119c67821f846e67d792bea638ae7f7f5d7e2f5e5a0c145d8ba8766d6ddb0f9","src/escape.rs":"e035b1f6ce3255e868fddb62ee90a95a2f3caf2db73786a2b179b92e9e337539","src/expr.rs":"02e8d346bef099974d06d74945be92fe6391111b94154df4981d44f1594d5579","src/generics.rs":"a300acff4c6e61d2fe9344db23f5e176e7abb02529bc348d9180f41ad0a4caf6","src/helper.rs":"9693d5c78f2d627a90d689a5d4bee1061eddcb646ae6dff3b2e4fd7cfbb33845","src/ident.rs":"83142b0107baba3137aad3b7d5c7b468ab53bf837bd9544d117d6644080d2705","src/item.rs":"63f2cd9a01c279405196d90a7d1cc530896157352163fb44f6b2a713657058b8","src/krate.rs":"324073a42389eb1c26a9d0f325b4f1cdd37d00a9bcaf07fdee77af54909a452d","src/lib.rs":"ef584db9ac9b7308224798d3983cbf201df7f0da1735fe5ce408f20fb3df763e","src/lit.rs":"2615fc6041f11b67a7cd62012f36eb215fd1fdf6649b6b64d728625148f53c7b","src/mac.rs":"45c44bd7abcbdaea6572bb4721bdc57b02b967ea9865172fe10e029e51e51a42","src/macro_input.rs":"93b999877879076e1f47502d96aa18aad82117d072044ca9de825c8a9bfa60b8","src/nom.rs":"642149bf322b762e02183ac1fed641df7f03ac53334c869a64707de4e9c5e68c","src/op.rs":"232f84ba605ed50e70ee02169dd551548872135cf56f155637917ec3bf810ce1","src/registry.rs":"b709f2a0f372efd8dec8fd46d6d71fb3b56a0261789e6de048a41a5e70144421","src/space.rs":"de9cb71e831c1d66f0bf2f3f219c3455d1979ca89f89b198d3b324e0cd50faf8","src/ty.rs":"97cfcb904a5fd68a42ebd2e5f86466d92e0785b1491d80c2a8d396ccec1b742a","src/visit.rs":"d7dcf429cc1a05821a66a4b38e7856eec45a9b2215f625d95030c3688eda26ca"},"package":"17134635792e6a2361f53efbee798701796d8b5842c1c21b7cdb875e2950c8fc"}
|
||||
{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","Cargo.toml":"c1650ed29ad7cb01e5da2e0efd299062cd38272d0dc971f8f8f5979a0aaadd4c","src/aster/generics.rs":"77eb19443af0dff5debb18d064733cc8721a42ad7e993a33352cdeff2b5f9f85","src/aster/ident.rs":"e9d082664f008a56bd854011310b4258ab072740ba82e57495b6e8a868a5f36b","src/aster/invoke.rs":"2b1b993973ab4f5c8fa6d6a286576b2542edce21fe9904f5133c470c072e6d3f","src/aster/lifetime.rs":"d83f4c1a48e3580caa028cfabde6ace232efc95d70af6dc9cfcca48317db9ad7","src/aster/mod.rs":"12220f73b0021e72b4c50f6a513cff174b9c7267209aa23f183043d96ccc9ab7","src/aster/path.rs":"60865b0f952077307c1a66810a4b6dafde43e76a417a433a8343960e7de474e4","src/aster/qpath.rs":"885c94b29ab8ee45c72a682221e241d1f0dd09c659809fe77279b5dd8a4bc645","src/aster/ty.rs":"90649aad98617c09ffc43a38aeb823a3298c41bf5e10f0ef3500b71c81021c2f","src/aster/ty_param.rs":"7ced1e6ca0c98ef468d507d3f07bfcb1171395cd66ff5c3e1b091fe7e8b9a562","src/aster/where_predicate.rs":"5fb8ec3fcb67bcc1d9bb7b64cf2f5beb601aac6502d6db30c0cdf8641fa248d1","src/attr.rs":"2ba436bdd439511be10baf9ad45226ade678176a7fd45a087367e1ad2b43e07a","src/constant.rs":"90535a2320e0dc8ab623a9bffa770bdf697baef2884a7d9224b31daf422ea5a0","src/data.rs":"0119c67821f846e67d792bea638ae7f7f5d7e2f5e5a0c145d8ba8766d6ddb0f9","src/escape.rs":"e035b1f6ce3255e868fddb62ee90a95a2f3caf2db73786a2b179b92e9e337539","src/expr.rs":"1e8b194f213e3279c0cb414f450ebab78c657951b8c2abf97378e745467ca8f5","src/generics.rs":"a300acff4c6e61d2fe9344db23f5e176e7abb02529bc348d9180f41ad0a4caf6","src/helper.rs":"9693d5c78f2d627a90d689a5d4bee1061eddcb646ae6dff3b2e4fd7cfbb33845","src/ident.rs":"83142b0107baba3137aad3b7d5c7b468ab53bf837bd9544d117d6644080d2705","src/item.rs":"5f7ba91d7642612ddaba9e862695234f4fdda88009f83ad5dee8ac6180a4f08d","src/krate.rs":"324073a42389eb1c26a9d0f325b4f1cdd37d00a9bcaf07fdee77af54909a452d","src/lib.rs":"2e1c12a937ed5c0f80620f4166463fed8119f0620c2b984ccd484b30ed3ee71c","src/lit.rs":"2615fc6041f11b67a7cd62012f36eb215fd1fdf6649b6b64d728625148f53c7b","src/mac.rs":"b7f7f67f6e7830b9dc2fd7fb4996c6821937687c44d2fbdc34ecc89e43815eff","src/macro_input.rs":"93b999877879076e1f47502d96aa18aad82117d072044ca9de825c8a9bfa60b8","src/nom.rs":"e877f3492633186e6499775c9bfa58c2554c25d8a6467ee1567d13706386b4c3","src/op.rs":"232f84ba605ed50e70ee02169dd551548872135cf56f155637917ec3bf810ce1","src/registry.rs":"b709f2a0f372efd8dec8fd46d6d71fb3b56a0261789e6de048a41a5e70144421","src/space.rs":"de9cb71e831c1d66f0bf2f3f219c3455d1979ca89f89b198d3b324e0cd50faf8","src/ty.rs":"d5562321530c739d7b25324463a94f685837824333ec7d604aefbd782f9ec2fb","src/visit.rs":"d3133ff25aa9cc8e6ec15f579bfa753a264518b0a7de2f2be4586d49632a9aac"},"package":"e5aaf7e4a0f90d7285445c881dcc28f1a510e4962b4ffcdde17f5775b2960df6"}
|
|
@ -1,6 +1,6 @@
|
|||
[package]
|
||||
name = "syn"
|
||||
version = "0.10.6" # don't forget to update version in readme for breaking changes
|
||||
version = "0.10.7" # don't forget to update version in readme for breaking changes
|
||||
authors = ["David Tolnay <dtolnay@gmail.com>"]
|
||||
license = "MIT/Apache-2.0"
|
||||
description = "Nom parser for Rust source code"
|
||||
|
@ -12,21 +12,22 @@ include = ["Cargo.toml", "src/**/*.rs"]
|
|||
default = ["parsing", "printing"]
|
||||
aster = []
|
||||
expand = ["full", "parsing", "printing"]
|
||||
full = []
|
||||
full = ["type-macros"]
|
||||
parsing = ["unicode-xid"]
|
||||
pretty = ["syntex_syntax"]
|
||||
printing = ["quote"]
|
||||
type-macros = []
|
||||
visit = []
|
||||
|
||||
[dependencies]
|
||||
clippy = { version = "0.*", optional = true }
|
||||
quote = { version = "0.3.0", optional = true }
|
||||
syntex_syntax = { version = "0.50.0", optional = true }
|
||||
unicode-xid = { version = "0.0.3", optional = true }
|
||||
syntex_syntax = { version = "0.52.0", optional = true }
|
||||
unicode-xid = { version = "0.0.4", optional = true }
|
||||
|
||||
[dev-dependencies]
|
||||
syntex_pos = "0.50.0"
|
||||
syntex_syntax = "0.50.0"
|
||||
syntex_pos = "0.52.0"
|
||||
syntex_syntax = "0.52.0"
|
||||
tempdir = "0.3.5"
|
||||
time = "0.1.35"
|
||||
walkdir = "1.0.1"
|
||||
|
|
|
@ -85,10 +85,10 @@ pub enum ExprKind {
|
|||
Loop(Block, Option<Ident>),
|
||||
/// A `match` block.
|
||||
Match(Box<Expr>, Vec<Arm>),
|
||||
/// A closure (for example, `move |a, b, c| {a + b + c}`)
|
||||
Closure(CaptureBy, Box<FnDecl>, Block),
|
||||
/// A closure (for example, `move |a, b, c| a + b + c`)
|
||||
Closure(CaptureBy, Box<FnDecl>, Box<Expr>),
|
||||
/// A block (`{ ... }` or `unsafe { ... }`)
|
||||
Block(BlockCheckMode, Block),
|
||||
Block(Unsafety, Block),
|
||||
|
||||
/// An assignment (`a = foo()`)
|
||||
Assign(Box<Expr>, Box<Expr>),
|
||||
|
@ -116,8 +116,8 @@ pub enum ExprKind {
|
|||
|
||||
/// A referencing operation (`&a` or `&mut a`)
|
||||
AddrOf(Mutability, Box<Expr>),
|
||||
/// A `break`, with an optional label to break
|
||||
Break(Option<Ident>),
|
||||
/// A `break`, with an optional label to break, and an optional expression
|
||||
Break(Option<Ident>, Option<Box<Expr>>),
|
||||
/// A `continue`, with an optional label
|
||||
Continue(Option<Ident>),
|
||||
/// A `return`, with an optional value to be returned
|
||||
|
@ -161,12 +161,6 @@ pub struct Block {
|
|||
pub stmts: Vec<Stmt>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
|
||||
pub enum BlockCheckMode {
|
||||
Default,
|
||||
Unsafe,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Eq, PartialEq, Hash)]
|
||||
pub enum Stmt {
|
||||
/// A local (let) binding.
|
||||
|
@ -312,7 +306,7 @@ pub enum BindingMode {
|
|||
pub mod parsing {
|
||||
use super::*;
|
||||
use {BinOp, Delimited, DelimToken, FnArg, FnDecl, FunctionRetTy, Ident, Lifetime, Mac,
|
||||
TokenTree, Ty, UnOp};
|
||||
TokenTree, Ty, UnOp, Unsafety};
|
||||
use attr::parsing::outer_attr;
|
||||
use generics::parsing::lifetime;
|
||||
use ident::parsing::{ident, wordlike};
|
||||
|
@ -321,7 +315,7 @@ pub mod parsing {
|
|||
use mac::parsing::{mac, token_trees};
|
||||
use nom::IResult::{self, Error};
|
||||
use op::parsing::{assign_op, binop, unop};
|
||||
use ty::parsing::{mutability, path, qpath, ty};
|
||||
use ty::parsing::{mutability, path, qpath, ty, unsafety};
|
||||
|
||||
// Struct literals are ambiguous in certain positions
|
||||
// https://github.com/rust-lang/rfcs/pull/92
|
||||
|
@ -355,7 +349,7 @@ pub mod parsing {
|
|||
|
|
||||
expr_mac // must be before expr_path
|
||||
|
|
||||
expr_break // must be before expr_path
|
||||
call!(expr_break, allow_struct) // must be before expr_path
|
||||
|
|
||||
expr_continue // must be before expr_path
|
||||
|
|
||||
|
@ -474,7 +468,7 @@ pub mod parsing {
|
|||
punct!("}") >>
|
||||
(ExprKind::InPlace(
|
||||
Box::new(place),
|
||||
Box::new(ExprKind::Block(BlockCheckMode::Default, Block {
|
||||
Box::new(ExprKind::Block(Unsafety::Normal, Block {
|
||||
stmts: value,
|
||||
}).into()),
|
||||
))
|
||||
|
@ -571,7 +565,7 @@ pub mod parsing {
|
|||
punct!("{") >>
|
||||
else_block: within_block >>
|
||||
punct!("}") >>
|
||||
(ExprKind::Block(BlockCheckMode::Default, Block {
|
||||
(ExprKind::Block(Unsafety::Normal, Block {
|
||||
stmts: else_block,
|
||||
}).into())
|
||||
)
|
||||
|
@ -632,7 +626,7 @@ pub mod parsing {
|
|||
));
|
||||
|
||||
fn arm_requires_comma(arm: &Arm) -> bool {
|
||||
if let ExprKind::Block(BlockCheckMode::Default, _) = arm.body.node {
|
||||
if let ExprKind::Block(Unsafety::Normal, _) = arm.body.node {
|
||||
false
|
||||
} else {
|
||||
true
|
||||
|
@ -645,7 +639,7 @@ pub mod parsing {
|
|||
guard: option!(preceded!(keyword!("if"), expr)) >>
|
||||
punct!("=>") >>
|
||||
body: alt!(
|
||||
map!(block, |blk| ExprKind::Block(BlockCheckMode::Default, blk).into())
|
||||
map!(block, |blk| ExprKind::Block(Unsafety::Normal, blk).into())
|
||||
|
|
||||
expr
|
||||
) >>
|
||||
|
@ -667,15 +661,10 @@ pub mod parsing {
|
|||
punct!("->") >>
|
||||
ty: ty >>
|
||||
body: block >>
|
||||
((FunctionRetTy::Ty(ty), body))
|
||||
(FunctionRetTy::Ty(ty), ExprKind::Block(Unsafety::Normal, body).into())
|
||||
)
|
||||
|
|
||||
map!(ambiguous_expr!(allow_struct), |e| (
|
||||
FunctionRetTy::Default,
|
||||
Block {
|
||||
stmts: vec![Stmt::Expr(Box::new(e))],
|
||||
},
|
||||
))
|
||||
map!(ambiguous_expr!(allow_struct), |e| (FunctionRetTy::Default, e))
|
||||
) >>
|
||||
(ExprKind::Closure(
|
||||
capture,
|
||||
|
@ -684,7 +673,7 @@ pub mod parsing {
|
|||
output: ret_and_body.0,
|
||||
variadic: false,
|
||||
}),
|
||||
ret_and_body.1,
|
||||
Box::new(ret_and_body.1),
|
||||
))
|
||||
));
|
||||
|
||||
|
@ -720,10 +709,11 @@ pub mod parsing {
|
|||
(ExprKind::Continue(lbl))
|
||||
));
|
||||
|
||||
named!(expr_break -> ExprKind, do_parse!(
|
||||
named_ambiguous_expr!(expr_break -> ExprKind, allow_struct, do_parse!(
|
||||
keyword!("break") >>
|
||||
lbl: option!(label) >>
|
||||
(ExprKind::Break(lbl))
|
||||
val: option!(call!(ambiguous_expr, allow_struct, false)) >>
|
||||
(ExprKind::Break(lbl, val.map(Box::new)))
|
||||
));
|
||||
|
||||
named_ambiguous_expr!(expr_ret -> ExprKind, allow_struct, do_parse!(
|
||||
|
@ -776,7 +766,7 @@ pub mod parsing {
|
|||
));
|
||||
|
||||
named!(expr_block -> ExprKind, do_parse!(
|
||||
rules: block_check_mode >>
|
||||
rules: unsafety >>
|
||||
b: block >>
|
||||
(ExprKind::Block(rules, Block {
|
||||
stmts: b.stmts,
|
||||
|
@ -834,12 +824,6 @@ pub mod parsing {
|
|||
})
|
||||
));
|
||||
|
||||
named!(block_check_mode -> BlockCheckMode, alt!(
|
||||
keyword!("unsafe") => { |_| BlockCheckMode::Unsafe }
|
||||
|
|
||||
epsilon!() => { |_| BlockCheckMode::Default }
|
||||
));
|
||||
|
||||
named!(pub within_block -> Vec<Stmt>, do_parse!(
|
||||
many0!(punct!(";")) >>
|
||||
mut standalone: many0!(terminated!(standalone_stmt, many0!(punct!(";")))) >>
|
||||
|
@ -865,7 +849,7 @@ pub mod parsing {
|
|||
|
||||
named!(stmt_mac -> Stmt, do_parse!(
|
||||
attrs: many0!(outer_attr) >>
|
||||
name: ident >>
|
||||
what: path >>
|
||||
punct!("!") >>
|
||||
// Only parse braces here; paren and bracket will get parsed as
|
||||
// expression statements
|
||||
|
@ -875,7 +859,7 @@ pub mod parsing {
|
|||
semi: option!(punct!(";")) >>
|
||||
(Stmt::Mac(Box::new((
|
||||
Mac {
|
||||
path: name.into(),
|
||||
path: what,
|
||||
tts: vec![TokenTree::Delimited(Delimited {
|
||||
delim: DelimToken::Brace,
|
||||
tts: tts,
|
||||
|
@ -1159,7 +1143,7 @@ pub mod parsing {
|
|||
#[cfg(feature = "printing")]
|
||||
mod printing {
|
||||
use super::*;
|
||||
use {FnArg, FunctionRetTy, Mutability, Ty};
|
||||
use {FnArg, FunctionRetTy, Mutability, Ty, Unsafety};
|
||||
use attr::FilterAttrs;
|
||||
use quote::{Tokens, ToTokens};
|
||||
|
||||
|
@ -1297,7 +1281,7 @@ mod printing {
|
|||
tokens.append_all(arms);
|
||||
tokens.append("}");
|
||||
}
|
||||
ExprKind::Closure(capture, ref decl, ref body) => {
|
||||
ExprKind::Closure(capture, ref decl, ref expr) => {
|
||||
capture.to_tokens(tokens);
|
||||
tokens.append("|");
|
||||
for (i, input) in decl.inputs.iter().enumerate() {
|
||||
|
@ -1313,23 +1297,13 @@ mod printing {
|
|||
}
|
||||
tokens.append("|");
|
||||
match decl.output {
|
||||
FunctionRetTy::Default => {
|
||||
if body.stmts.len() == 1 {
|
||||
if let Stmt::Expr(ref expr) = body.stmts[0] {
|
||||
expr.to_tokens(tokens);
|
||||
} else {
|
||||
body.to_tokens(tokens);
|
||||
}
|
||||
} else {
|
||||
body.to_tokens(tokens);
|
||||
}
|
||||
}
|
||||
FunctionRetTy::Default => { /* nothing */ }
|
||||
FunctionRetTy::Ty(ref ty) => {
|
||||
tokens.append("->");
|
||||
ty.to_tokens(tokens);
|
||||
body.to_tokens(tokens);
|
||||
}
|
||||
}
|
||||
expr.to_tokens(tokens);
|
||||
}
|
||||
ExprKind::Block(rules, ref block) => {
|
||||
rules.to_tokens(tokens);
|
||||
|
@ -1396,9 +1370,10 @@ mod printing {
|
|||
mutability.to_tokens(tokens);
|
||||
expr.to_tokens(tokens);
|
||||
}
|
||||
ExprKind::Break(ref opt_label) => {
|
||||
ExprKind::Break(ref opt_label, ref opt_val) => {
|
||||
tokens.append("break");
|
||||
opt_label.to_tokens(tokens);
|
||||
opt_val.to_tokens(tokens);
|
||||
}
|
||||
ExprKind::Continue(ref opt_label) => {
|
||||
tokens.append("continue");
|
||||
|
@ -1465,7 +1440,7 @@ mod printing {
|
|||
tokens.append("=>");
|
||||
self.body.to_tokens(tokens);
|
||||
match self.body.node {
|
||||
ExprKind::Block(BlockCheckMode::Default, _) => {
|
||||
ExprKind::Block(Unsafety::Normal, _) => {
|
||||
// no comma
|
||||
}
|
||||
_ => tokens.append(","),
|
||||
|
@ -1646,17 +1621,6 @@ mod printing {
|
|||
}
|
||||
}
|
||||
|
||||
impl ToTokens for BlockCheckMode {
|
||||
fn to_tokens(&self, tokens: &mut Tokens) {
|
||||
match *self {
|
||||
BlockCheckMode::Default => {
|
||||
// nothing
|
||||
}
|
||||
BlockCheckMode::Unsafe => tokens.append("unsafe"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl ToTokens for Stmt {
|
||||
fn to_tokens(&self, tokens: &mut Tokens) {
|
||||
match *self {
|
||||
|
|
|
@ -280,7 +280,7 @@ pub mod parsing {
|
|||
|
||||
named!(item_mac -> Item, do_parse!(
|
||||
attrs: many0!(outer_attr) >>
|
||||
path: ident >>
|
||||
what: path >>
|
||||
punct!("!") >>
|
||||
name: option!(ident) >>
|
||||
body: delimited >>
|
||||
|
@ -293,7 +293,7 @@ pub mod parsing {
|
|||
vis: Visibility::Inherited,
|
||||
attrs: attrs,
|
||||
node: ItemKind::Mac(Mac {
|
||||
path: path.into(),
|
||||
path: what,
|
||||
tts: vec![TokenTree::Delimited(body)],
|
||||
}),
|
||||
})
|
||||
|
@ -821,7 +821,7 @@ pub mod parsing {
|
|||
|
||||
named!(trait_item_mac -> TraitItem, do_parse!(
|
||||
attrs: many0!(outer_attr) >>
|
||||
id: ident >>
|
||||
what: path >>
|
||||
punct!("!") >>
|
||||
body: delimited >>
|
||||
cond!(match body.delim {
|
||||
|
@ -829,10 +829,10 @@ pub mod parsing {
|
|||
DelimToken::Brace => false,
|
||||
}, punct!(";")) >>
|
||||
(TraitItem {
|
||||
ident: id.clone(),
|
||||
ident: Ident::new(""),
|
||||
attrs: attrs,
|
||||
node: TraitItemKind::Macro(Mac {
|
||||
path: id.into(),
|
||||
path: what,
|
||||
tts: vec![TokenTree::Delimited(body)],
|
||||
}),
|
||||
})
|
||||
|
@ -976,7 +976,7 @@ pub mod parsing {
|
|||
|
||||
named!(impl_item_macro -> ImplItem, do_parse!(
|
||||
attrs: many0!(outer_attr) >>
|
||||
id: ident >>
|
||||
what: path >>
|
||||
punct!("!") >>
|
||||
body: delimited >>
|
||||
cond!(match body.delim {
|
||||
|
@ -984,12 +984,12 @@ pub mod parsing {
|
|||
DelimToken::Brace => false,
|
||||
}, punct!(";")) >>
|
||||
(ImplItem {
|
||||
ident: id.clone(),
|
||||
ident: Ident::new(""),
|
||||
vis: Visibility::Inherited,
|
||||
defaultness: Defaultness::Final,
|
||||
attrs: attrs,
|
||||
node: ImplItemKind::Macro(Mac {
|
||||
path: id.into(),
|
||||
path: what,
|
||||
tts: vec![TokenTree::Delimited(body)],
|
||||
}),
|
||||
})
|
||||
|
|
|
@ -37,8 +37,8 @@ mod escape;
|
|||
#[cfg(feature = "full")]
|
||||
mod expr;
|
||||
#[cfg(feature = "full")]
|
||||
pub use expr::{Arm, BindingMode, Block, BlockCheckMode, CaptureBy, Expr, ExprKind, FieldPat,
|
||||
FieldValue, Local, MacStmtStyle, Pat, RangeLimits, Stmt};
|
||||
pub use expr::{Arm, BindingMode, Block, CaptureBy, Expr, ExprKind, FieldPat, FieldValue,
|
||||
Local, MacStmtStyle, Pat, RangeLimits, Stmt};
|
||||
|
||||
mod generics;
|
||||
pub use generics::{Generics, Lifetime, LifetimeDef, TraitBoundModifier, TyParam, TyParamBound,
|
||||
|
@ -64,9 +64,9 @@ pub use krate::Crate;
|
|||
mod lit;
|
||||
pub use lit::{FloatTy, IntTy, Lit, StrStyle};
|
||||
|
||||
#[cfg(feature = "full")]
|
||||
#[cfg(feature = "type-macros")]
|
||||
mod mac;
|
||||
#[cfg(feature = "full")]
|
||||
#[cfg(feature = "type-macros")]
|
||||
pub use mac::{BinOpToken, DelimToken, Delimited, Mac, Token, TokenTree};
|
||||
|
||||
mod macro_input;
|
||||
|
|
|
@ -114,16 +114,17 @@ pub mod parsing {
|
|||
use super::*;
|
||||
use Lifetime;
|
||||
use generics::parsing::lifetime;
|
||||
use ident::parsing::{ident, word};
|
||||
use ident::parsing::word;
|
||||
use lit::parsing::lit;
|
||||
use space::{block_comment, whitespace};
|
||||
use ty::parsing::path;
|
||||
|
||||
named!(pub mac -> Mac, do_parse!(
|
||||
name: ident >>
|
||||
what: path >>
|
||||
punct!("!") >>
|
||||
body: delimited >>
|
||||
(Mac {
|
||||
path: name.into(),
|
||||
path: what,
|
||||
tts: vec![TokenTree::Delimited(body)],
|
||||
})
|
||||
));
|
||||
|
|
|
@ -232,22 +232,12 @@ macro_rules! take_while1 {
|
|||
};
|
||||
}
|
||||
|
||||
pub fn str_chars(s: &str) -> Vec<char> {
|
||||
// Can't do `s.chars().collect()` because it triggers a compiler bug in 1.12.0
|
||||
// https://github.com/dtolnay/syn/issues/20
|
||||
let mut result = Vec::new();
|
||||
for ch in s.chars() {
|
||||
result.push(ch);
|
||||
}
|
||||
result
|
||||
}
|
||||
|
||||
macro_rules! take_until {
|
||||
($input:expr, $substr:expr) => {{
|
||||
if $substr.len() > $input.len() {
|
||||
$crate::nom::IResult::Error
|
||||
} else {
|
||||
let substr_vec: Vec<char> = $crate::nom::str_chars($substr);
|
||||
let substr_vec: Vec<char> = $substr.chars().collect();
|
||||
let mut window: Vec<char> = vec![];
|
||||
let mut offset = $input.len();
|
||||
let mut parsed = false;
|
||||
|
|
|
@ -33,6 +33,14 @@ pub enum Ty {
|
|||
/// TyKind::Infer means the type should be inferred instead of it having been
|
||||
/// specified. This can appear anywhere in a type.
|
||||
Infer,
|
||||
/// A macro in the type position.
|
||||
Mac(Mac),
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "type-macros"))]
|
||||
#[derive(Debug, Clone, Eq, PartialEq, Hash)]
|
||||
pub struct Mac {
|
||||
_private: (),
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Eq, PartialEq, Hash)]
|
||||
|
@ -55,7 +63,10 @@ pub enum Mutability {
|
|||
/// E.g. `std::cmp::PartialEq`
|
||||
#[derive(Debug, Clone, Eq, PartialEq, Hash)]
|
||||
pub struct Path {
|
||||
/// A `::foo` path, is relative to the crate root rather than current
|
||||
/// module (like paths in an import).
|
||||
pub global: bool,
|
||||
/// The segments in the path: the things separated by `::`.
|
||||
pub segments: Vec<PathSegment>,
|
||||
}
|
||||
|
||||
|
@ -75,7 +86,13 @@ impl<T> From<T> for Path
|
|||
/// E.g. `std`, `String` or `Box<T>`
|
||||
#[derive(Debug, Clone, Eq, PartialEq, Hash)]
|
||||
pub struct PathSegment {
|
||||
/// The identifier portion of this path segment.
|
||||
pub ident: Ident,
|
||||
/// Type/lifetime parameters attached to this path. They come in
|
||||
/// two flavors: `Path<A,B,C>` and `Path(A,B) -> C`. Note that
|
||||
/// this is more than just simple syntactic sugar; the use of
|
||||
/// parens affects the region binding rules, so we preserve the
|
||||
/// distinction.
|
||||
pub parameters: PathParameters,
|
||||
}
|
||||
|
||||
|
@ -228,11 +245,17 @@ pub mod parsing {
|
|||
use generics::parsing::{lifetime, lifetime_def, ty_param_bound, bound_lifetimes};
|
||||
use ident::parsing::ident;
|
||||
use lit::parsing::quoted_string;
|
||||
#[cfg(feature = "type-macros")]
|
||||
use mac::parsing::mac;
|
||||
#[cfg(not(feature = "type-macros"))]
|
||||
use nom::IResult;
|
||||
use std::str;
|
||||
|
||||
named!(pub ty -> Ty, alt!(
|
||||
ty_paren // must be before ty_tup
|
||||
|
|
||||
ty_mac // must be before ty_path
|
||||
|
|
||||
ty_path // must be before ty_poly_trait_ref
|
||||
|
|
||||
ty_vec
|
||||
|
@ -254,6 +277,14 @@ pub mod parsing {
|
|||
ty_impl_trait
|
||||
));
|
||||
|
||||
#[cfg(feature = "type-macros")]
|
||||
named!(ty_mac -> Ty, map!(mac, Ty::Mac));
|
||||
|
||||
#[cfg(not(feature = "type-macros"))]
|
||||
fn ty_mac(_: &str) -> IResult<&str, Ty> {
|
||||
IResult::Error
|
||||
}
|
||||
|
||||
named!(ty_vec -> Ty, do_parse!(
|
||||
punct!("[") >>
|
||||
elem: ty >>
|
||||
|
@ -648,6 +679,7 @@ mod printing {
|
|||
Ty::Infer => {
|
||||
tokens.append("_");
|
||||
}
|
||||
Ty::Mac(ref mac) => mac.to_tokens(tokens),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -823,4 +855,11 @@ mod printing {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "type-macros"))]
|
||||
impl ToTokens for Mac {
|
||||
fn to_tokens(&self, _tokens: &mut Tokens) {
|
||||
unreachable!()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -171,6 +171,7 @@ pub fn walk_ty<V: Visitor>(visitor: &mut V, ty: &Ty) {
|
|||
Ty::ImplTrait(ref bounds) => {
|
||||
walk_list!(visitor, visit_ty_param_bound, bounds);
|
||||
}
|
||||
Ty::Mac(_) => {}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".gitignore":"84fa18694c3dbe743dea94e2d82b8fcafe4bf2184fedac42ecef09959a4fa726",".travis.yml":"2b8ad9e064f35fd10d4d25f42642ee5b908c63c1007dca6f4ad1e968865a98e2","COPYRIGHT":"23860c2a7b5d96b21569afedf033469bab9fe14a1b24a35068b8641c578ce24d","Cargo.toml":"a3a1eebfe55b7891d6417f12b8eb4b0f60d84c50b4b2059505ec7252fe5ca224","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"7b63ecd5f1902af1b63729947373683c32745c16a10e8e6292e2e2dcd7e90ae0","README.md":"d63c6bb1e9b9d65cccde3fe373f056ea16a439239f37f49977b9a3bee23ee465","scripts/unicode.py":"c18a8aab222162dcd92424dfdf0b8514f35bcf4a3fe88c469572abc969f814a1","src/lib.rs":"a389b616bc392b4c1fdad8571635f1f3e0279c6500d9abd645d058e1b690e61f","src/tables.rs":"91c7395f29b36c5736773845b5ce170f6083e3abbb258f27c61e15409e409314","src/tests.rs":"63ec5d241492102ad42e76b4d94ddfedd4468997a5627abb2090b9b872aaab31"},"package":"36dff09cafb4ec7c8cf0023eb0b686cb6ce65499116a12201c9e11840ca01beb"}
|
|
@ -1,3 +0,0 @@
|
|||
target
|
||||
Cargo.lock
|
||||
scripts/tmp
|
|
@ -1,25 +0,0 @@
|
|||
language: rust
|
||||
rust: 'nightly'
|
||||
sudo: false
|
||||
script:
|
||||
- cargo build --verbose --features no_std
|
||||
- cargo test --verbose --features no_std
|
||||
- cargo clean
|
||||
- cargo build --verbose --features default
|
||||
- cargo test --verbose --features default
|
||||
- cargo bench --verbose --features default
|
||||
- rustdoc --test README.md -L target/debug -L target/debug/deps
|
||||
- cargo doc
|
||||
after_success: |
|
||||
[ $TRAVIS_BRANCH = master ] &&
|
||||
[ $TRAVIS_PULL_REQUEST = false ] &&
|
||||
echo '<meta http-equiv=refresh content=0;url=unicode_xid/index.html>' > target/doc/index.html &&
|
||||
pip install ghp-import --user $USER &&
|
||||
$HOME/.local/bin/ghp-import -n target/doc &&
|
||||
git push -qf https://${TOKEN}@github.com/${TRAVIS_REPO_SLUG}.git gh-pages
|
||||
env:
|
||||
global:
|
||||
secure: gTlge+/OQlVkV0R+RThWXeN0aknmS7iUTPBMYKJyRdLz7T2vubw3w80a2CVE87JlpV87A5cVGD+LgR+AhYrhKtvqHb1brMDd99gylBBi2DfV7YapDSwSCuFgVR+FjZfJRcXBtI8po5urUZ84V0WLzRX8SyWqWgoD3oCkSL3Wp3w=
|
||||
notifications:
|
||||
email:
|
||||
on_success: never
|
|
@ -1,7 +0,0 @@
|
|||
Licensed under the Apache License, Version 2.0
|
||||
<LICENSE-APACHE or
|
||||
http://www.apache.org/licenses/LICENSE-2.0> or the MIT
|
||||
license <LICENSE-MIT or http://opensource.org/licenses/MIT>,
|
||||
at your option. All files in the project carrying such
|
||||
notice may not be copied, modified, or distributed except
|
||||
according to those terms.
|
|
@ -1,25 +0,0 @@
|
|||
[package]
|
||||
|
||||
name = "unicode-xid"
|
||||
version = "0.0.3"
|
||||
authors = ["erick.tryzelaar <erick.tryzelaar@gmail.com>",
|
||||
"kwantam <kwantam@gmail.com>",
|
||||
]
|
||||
|
||||
homepage = "https://github.com/unicode-rs/unicode-xid"
|
||||
repository = "https://github.com/unicode-rs/unicode-xid"
|
||||
documentation = "https://unicode-rs.github.io/unicode-xid"
|
||||
license = "MIT/Apache-2.0"
|
||||
keywords = ["text", "unicode", "xid"]
|
||||
readme = "README.md"
|
||||
description = """
|
||||
Determine whether characters have the XID_Start
|
||||
or XID_Continue properties according to
|
||||
Unicode Standard Annex #31.
|
||||
"""
|
||||
|
||||
exclude = [ "target/*", "Cargo.lock" ]
|
||||
|
||||
[features]
|
||||
default = []
|
||||
no_std = []
|
|
@ -1,201 +0,0 @@
|
|||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
|
@ -1,25 +0,0 @@
|
|||
Copyright (c) 2015 The Rust Project Developers
|
||||
|
||||
Permission is hereby granted, free of charge, to any
|
||||
person obtaining a copy of this software and associated
|
||||
documentation files (the "Software"), to deal in the
|
||||
Software without restriction, including without
|
||||
limitation the rights to use, copy, modify, merge,
|
||||
publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software
|
||||
is furnished to do so, subject to the following
|
||||
conditions:
|
||||
|
||||
The above copyright notice and this permission notice
|
||||
shall be included in all copies or substantial portions
|
||||
of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
|
||||
ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
|
||||
TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
||||
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
|
||||
IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
|
@ -1,34 +0,0 @@
|
|||
# unicode-xid
|
||||
|
||||
Determine if a `char` is a valid identifier for a parser and/or lexer according to
|
||||
[Unicode Standard Annex #31](http://www.unicode.org/reports/tr31/) rules.
|
||||
|
||||
[![Build Status](https://travis-ci.org/unicode-rs/unicode-xid.svg)](https://travis-ci.org/unicode-rs/unicode-xid)
|
||||
|
||||
[Documentation](https://unicode-rs.github.io/unicode-xid/unicode_xid/index.html)
|
||||
|
||||
```rust
|
||||
extern crate unicode_xid;
|
||||
|
||||
use unicode_xid::UnicodeXID;
|
||||
|
||||
fn main() {
|
||||
let ch = 'a';
|
||||
println!("Is {} a valid start of an identifier? {}", ch, UnicodeXID::is_xid_start(ch));
|
||||
}
|
||||
```
|
||||
|
||||
# features
|
||||
|
||||
unicode-xid supports a `no_std` feature. This eliminates dependence
|
||||
on std, and instead uses equivalent functions from core.
|
||||
|
||||
# crates.io
|
||||
|
||||
You can use this package in your project by adding the following
|
||||
to your `Cargo.toml`:
|
||||
|
||||
```toml
|
||||
[dependencies]
|
||||
unicode-derived_property = "0.0.3"
|
||||
```
|
|
@ -1,194 +0,0 @@
|
|||
#!/usr/bin/env python
|
||||
#
|
||||
# Copyright 2011-2015 The Rust Project Developers. See the COPYRIGHT
|
||||
# file at the top-level directory of this distribution and at
|
||||
# http://rust-lang.org/COPYRIGHT.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
# http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
# <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
# option. This file may not be copied, modified, or distributed
|
||||
# except according to those terms.
|
||||
|
||||
# This script uses the following Unicode tables:
|
||||
# - DerivedCoreProperties.txt
|
||||
# - ReadMe.txt
|
||||
#
|
||||
# Since this should not require frequent updates, we just store this
|
||||
# out-of-line and check the unicode.rs file into git.
|
||||
|
||||
import fileinput, re, os, sys
|
||||
|
||||
preamble = '''// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
// NOTE: The following code was generated by "scripts/unicode.py", do not edit directly
|
||||
|
||||
#![allow(missing_docs, non_upper_case_globals, non_snake_case)]
|
||||
'''
|
||||
|
||||
def fetch(f):
|
||||
if not os.path.exists(os.path.basename(f)):
|
||||
os.system("curl -O http://www.unicode.org/Public/UNIDATA/%s"
|
||||
% f)
|
||||
|
||||
if not os.path.exists(os.path.basename(f)):
|
||||
sys.stderr.write("cannot load %s" % f)
|
||||
exit(1)
|
||||
|
||||
def group_cat(cat):
|
||||
cat_out = []
|
||||
letters = sorted(set(cat))
|
||||
cur_start = letters.pop(0)
|
||||
cur_end = cur_start
|
||||
for letter in letters:
|
||||
assert letter > cur_end, \
|
||||
"cur_end: %s, letter: %s" % (hex(cur_end), hex(letter))
|
||||
if letter == cur_end + 1:
|
||||
cur_end = letter
|
||||
else:
|
||||
cat_out.append((cur_start, cur_end))
|
||||
cur_start = cur_end = letter
|
||||
cat_out.append((cur_start, cur_end))
|
||||
return cat_out
|
||||
|
||||
def ungroup_cat(cat):
|
||||
cat_out = []
|
||||
for (lo, hi) in cat:
|
||||
while lo <= hi:
|
||||
cat_out.append(lo)
|
||||
lo += 1
|
||||
return cat_out
|
||||
|
||||
def format_table_content(f, content, indent):
|
||||
line = " "*indent
|
||||
first = True
|
||||
for chunk in content.split(","):
|
||||
if len(line) + len(chunk) < 98:
|
||||
if first:
|
||||
line += chunk
|
||||
else:
|
||||
line += ", " + chunk
|
||||
first = False
|
||||
else:
|
||||
f.write(line + ",\n")
|
||||
line = " "*indent + chunk
|
||||
f.write(line)
|
||||
|
||||
def load_properties(f, interestingprops):
|
||||
fetch(f)
|
||||
props = {}
|
||||
re1 = re.compile("^ *([0-9A-F]+) *; *(\w+)")
|
||||
re2 = re.compile("^ *([0-9A-F]+)\.\.([0-9A-F]+) *; *(\w+)")
|
||||
|
||||
for line in fileinput.input(os.path.basename(f)):
|
||||
prop = None
|
||||
d_lo = 0
|
||||
d_hi = 0
|
||||
m = re1.match(line)
|
||||
if m:
|
||||
d_lo = m.group(1)
|
||||
d_hi = m.group(1)
|
||||
prop = m.group(2)
|
||||
else:
|
||||
m = re2.match(line)
|
||||
if m:
|
||||
d_lo = m.group(1)
|
||||
d_hi = m.group(2)
|
||||
prop = m.group(3)
|
||||
else:
|
||||
continue
|
||||
if interestingprops and prop not in interestingprops:
|
||||
continue
|
||||
d_lo = int(d_lo, 16)
|
||||
d_hi = int(d_hi, 16)
|
||||
if prop not in props:
|
||||
props[prop] = []
|
||||
props[prop].append((d_lo, d_hi))
|
||||
|
||||
# optimize if possible
|
||||
for prop in props:
|
||||
props[prop] = group_cat(ungroup_cat(props[prop]))
|
||||
|
||||
return props
|
||||
|
||||
def escape_char(c):
|
||||
return "'\\u{%x}'" % c
|
||||
|
||||
def emit_bsearch_range_table(f):
|
||||
f.write("""
|
||||
fn bsearch_range_table(c: char, r: &'static [(char,char)]) -> bool {
|
||||
#[cfg(feature = "no_std")]
|
||||
use core::cmp::Ordering::{Equal, Less, Greater};
|
||||
|
||||
#[cfg(feature = "no_std")]
|
||||
use core::slice::SliceExt;
|
||||
|
||||
#[cfg(not(feature = "no_std"))]
|
||||
use std::cmp::Ordering::{Equal, Less, Greater};
|
||||
|
||||
r.binary_search_by(|&(lo,hi)| {
|
||||
if lo <= c && c <= hi { Equal }
|
||||
else if hi < c { Less }
|
||||
else { Greater }
|
||||
}).is_ok()
|
||||
}\n
|
||||
""")
|
||||
|
||||
def emit_table(f, name, t_data, t_type = "&'static [(char, char)]", is_pub=True,
|
||||
pfun=lambda x: "(%s,%s)" % (escape_char(x[0]), escape_char(x[1])), is_const=True):
|
||||
pub_string = "const"
|
||||
if not is_const:
|
||||
pub_string = "let"
|
||||
if is_pub:
|
||||
pub_string = "pub " + pub_string
|
||||
f.write(" %s %s: %s = &[\n" % (pub_string, name, t_type))
|
||||
data = ""
|
||||
first = True
|
||||
for dat in t_data:
|
||||
if not first:
|
||||
data += ","
|
||||
first = False
|
||||
data += pfun(dat)
|
||||
format_table_content(f, data, 8)
|
||||
f.write("\n ];\n\n")
|
||||
|
||||
def emit_property_module(f, mod, tbl, emit):
|
||||
f.write("pub mod %s {\n" % mod)
|
||||
for cat in sorted(emit):
|
||||
emit_table(f, "%s_table" % cat, tbl[cat])
|
||||
f.write(" pub fn %s(c: char) -> bool {\n" % cat)
|
||||
f.write(" super::bsearch_range_table(c, %s_table)\n" % cat)
|
||||
f.write(" }\n\n")
|
||||
f.write("}\n\n")
|
||||
|
||||
if __name__ == "__main__":
|
||||
r = "tables.rs"
|
||||
if os.path.exists(r):
|
||||
os.remove(r)
|
||||
with open(r, "w") as rf:
|
||||
# write the file's preamble
|
||||
rf.write(preamble)
|
||||
|
||||
# download and parse all the data
|
||||
fetch("ReadMe.txt")
|
||||
with open("ReadMe.txt") as readme:
|
||||
pattern = "for Version (\d+)\.(\d+)\.(\d+) of the Unicode"
|
||||
unicode_version = re.search(pattern, readme.read()).groups()
|
||||
rf.write("""
|
||||
/// The version of [Unicode](http://www.unicode.org/)
|
||||
/// that this version of unicode-derived-property is based on.
|
||||
pub const UNICODE_VERSION: (u64, u64, u64) = (%s, %s, %s);
|
||||
""" % unicode_version)
|
||||
emit_bsearch_range_table(rf)
|
||||
|
||||
want_derived = ["XID_Start", "XID_Continue"]
|
||||
derived = load_properties("DerivedCoreProperties.txt", want_derived)
|
||||
emit_property_module(rf, "derived_property", derived, want_derived)
|
|
@ -1,89 +0,0 @@
|
|||
// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
//! Determine if a `char` is a valid identifier for a parser and/or lexer according to
|
||||
//! [Unicode Standard Annex #31](http://www.unicode.org/reports/tr31/) rules.
|
||||
//!
|
||||
//! ```rust
|
||||
//! extern crate unicode_xid;
|
||||
//!
|
||||
//! use unicode_xid::UnicodeXID;
|
||||
//!
|
||||
//! fn main() {
|
||||
//! let ch = 'a';
|
||||
//! println!("Is {} a valid start of an identifier? {}", ch, UnicodeXID::is_xid_start(ch));
|
||||
//! }
|
||||
//! ```
|
||||
//!
|
||||
//! # features
|
||||
//!
|
||||
//! unicode-width supports a `no_std` feature. This eliminates dependence
|
||||
//! on std, and instead uses equivalent functions from core.
|
||||
//!
|
||||
//! # crates.io
|
||||
//!
|
||||
//! You can use this package in your project by adding the following
|
||||
//! to your `Cargo.toml`:
|
||||
//!
|
||||
//! ```toml
|
||||
//! [dependencies]
|
||||
//! unicode-derived_property = "0.0.1"
|
||||
//! ```
|
||||
|
||||
#![deny(missing_docs, unsafe_code)]
|
||||
#![doc(html_logo_url = "https://unicode-rs.github.io/unicode-rs_sm.png",
|
||||
html_favicon_url = "https://unicode-rs.github.io/unicode-rs_sm.png")]
|
||||
|
||||
#![cfg_attr(feature = "no_std", no_std)]
|
||||
#![cfg_attr(feature = "no_std", feature(no_std, core_slice_ext))]
|
||||
|
||||
#![cfg_attr(test, feature(test, unicode))]
|
||||
|
||||
#[cfg(all(test, feature = "no_std"))]
|
||||
#[macro_use]
|
||||
extern crate std;
|
||||
|
||||
#[cfg(test)]
|
||||
extern crate test;
|
||||
|
||||
use tables::derived_property;
|
||||
pub use tables::UNICODE_VERSION;
|
||||
|
||||
mod tables;
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests;
|
||||
|
||||
/// Methods for determining if a character is a valid identifier character.
|
||||
pub trait UnicodeXID {
|
||||
/// Returns whether the specified character satisfies the 'XID_Start'
|
||||
/// Unicode property.
|
||||
///
|
||||
/// 'XID_Start' is a Unicode Derived Property specified in
|
||||
/// [UAX #31](http://unicode.org/reports/tr31/#NFKC_Modifications),
|
||||
/// mostly similar to ID_Start but modified for closure under NFKx.
|
||||
fn is_xid_start(self) -> bool;
|
||||
|
||||
/// Returns whether the specified `char` satisfies the 'XID_Continue'
|
||||
/// Unicode property.
|
||||
///
|
||||
/// 'XID_Continue' is a Unicode Derived Property specified in
|
||||
/// [UAX #31](http://unicode.org/reports/tr31/#NFKC_Modifications),
|
||||
/// mostly similar to 'ID_Continue' but modified for closure under NFKx.
|
||||
fn is_xid_continue(self) -> bool;
|
||||
}
|
||||
|
||||
impl UnicodeXID for char {
|
||||
#[inline]
|
||||
fn is_xid_start(self) -> bool { derived_property::XID_Start(self) }
|
||||
|
||||
#[inline]
|
||||
fn is_xid_continue(self) -> bool { derived_property::XID_Continue(self) }
|
||||
}
|
|
@ -1,419 +0,0 @@
|
|||
// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
// NOTE: The following code was generated by "scripts/unicode.py", do not edit directly
|
||||
|
||||
#![allow(missing_docs, non_upper_case_globals, non_snake_case)]
|
||||
|
||||
/// The version of [Unicode](http://www.unicode.org/)
|
||||
/// that this version of unicode-derived-property is based on.
|
||||
pub const UNICODE_VERSION: (u64, u64, u64) = (8, 0, 0);
|
||||
|
||||
fn bsearch_range_table(c: char, r: &'static [(char,char)]) -> bool {
|
||||
#[cfg(feature = "no_std")]
|
||||
use core::cmp::Ordering::{Equal, Less, Greater};
|
||||
|
||||
#[cfg(feature = "no_std")]
|
||||
use core::slice::SliceExt;
|
||||
|
||||
#[cfg(not(feature = "no_std"))]
|
||||
use std::cmp::Ordering::{Equal, Less, Greater};
|
||||
|
||||
r.binary_search_by(|&(lo,hi)| {
|
||||
if lo <= c && c <= hi { Equal }
|
||||
else if hi < c { Less }
|
||||
else { Greater }
|
||||
}).is_ok()
|
||||
}
|
||||
|
||||
pub mod derived_property {
|
||||
pub const XID_Continue_table: &'static [(char, char)] = &[
|
||||
('\u{30}', '\u{39}'), ('\u{41}', '\u{5a}'), ('\u{5f}', '\u{5f}'), ('\u{61}', '\u{7a}'),
|
||||
('\u{aa}', '\u{aa}'), ('\u{b5}', '\u{b5}'), ('\u{b7}', '\u{b7}'), ('\u{ba}', '\u{ba}'),
|
||||
('\u{c0}', '\u{d6}'), ('\u{d8}', '\u{f6}'), ('\u{f8}', '\u{2c1}'), ('\u{2c6}', '\u{2d1}'),
|
||||
('\u{2e0}', '\u{2e4}'), ('\u{2ec}', '\u{2ec}'), ('\u{2ee}', '\u{2ee}'), ('\u{300}',
|
||||
'\u{374}'), ('\u{376}', '\u{377}'), ('\u{37b}', '\u{37d}'), ('\u{37f}', '\u{37f}'),
|
||||
('\u{386}', '\u{38a}'), ('\u{38c}', '\u{38c}'), ('\u{38e}', '\u{3a1}'), ('\u{3a3}',
|
||||
'\u{3f5}'), ('\u{3f7}', '\u{481}'), ('\u{483}', '\u{487}'), ('\u{48a}', '\u{52f}'),
|
||||
('\u{531}', '\u{556}'), ('\u{559}', '\u{559}'), ('\u{561}', '\u{587}'), ('\u{591}',
|
||||
'\u{5bd}'), ('\u{5bf}', '\u{5bf}'), ('\u{5c1}', '\u{5c2}'), ('\u{5c4}', '\u{5c5}'),
|
||||
('\u{5c7}', '\u{5c7}'), ('\u{5d0}', '\u{5ea}'), ('\u{5f0}', '\u{5f2}'), ('\u{610}',
|
||||
'\u{61a}'), ('\u{620}', '\u{669}'), ('\u{66e}', '\u{6d3}'), ('\u{6d5}', '\u{6dc}'),
|
||||
('\u{6df}', '\u{6e8}'), ('\u{6ea}', '\u{6fc}'), ('\u{6ff}', '\u{6ff}'), ('\u{710}',
|
||||
'\u{74a}'), ('\u{74d}', '\u{7b1}'), ('\u{7c0}', '\u{7f5}'), ('\u{7fa}', '\u{7fa}'),
|
||||
('\u{800}', '\u{82d}'), ('\u{840}', '\u{85b}'), ('\u{8a0}', '\u{8b4}'), ('\u{8e3}',
|
||||
'\u{963}'), ('\u{966}', '\u{96f}'), ('\u{971}', '\u{983}'), ('\u{985}', '\u{98c}'),
|
||||
('\u{98f}', '\u{990}'), ('\u{993}', '\u{9a8}'), ('\u{9aa}', '\u{9b0}'), ('\u{9b2}',
|
||||
'\u{9b2}'), ('\u{9b6}', '\u{9b9}'), ('\u{9bc}', '\u{9c4}'), ('\u{9c7}', '\u{9c8}'),
|
||||
('\u{9cb}', '\u{9ce}'), ('\u{9d7}', '\u{9d7}'), ('\u{9dc}', '\u{9dd}'), ('\u{9df}',
|
||||
'\u{9e3}'), ('\u{9e6}', '\u{9f1}'), ('\u{a01}', '\u{a03}'), ('\u{a05}', '\u{a0a}'),
|
||||
('\u{a0f}', '\u{a10}'), ('\u{a13}', '\u{a28}'), ('\u{a2a}', '\u{a30}'), ('\u{a32}',
|
||||
'\u{a33}'), ('\u{a35}', '\u{a36}'), ('\u{a38}', '\u{a39}'), ('\u{a3c}', '\u{a3c}'),
|
||||
('\u{a3e}', '\u{a42}'), ('\u{a47}', '\u{a48}'), ('\u{a4b}', '\u{a4d}'), ('\u{a51}',
|
||||
'\u{a51}'), ('\u{a59}', '\u{a5c}'), ('\u{a5e}', '\u{a5e}'), ('\u{a66}', '\u{a75}'),
|
||||
('\u{a81}', '\u{a83}'), ('\u{a85}', '\u{a8d}'), ('\u{a8f}', '\u{a91}'), ('\u{a93}',
|
||||
'\u{aa8}'), ('\u{aaa}', '\u{ab0}'), ('\u{ab2}', '\u{ab3}'), ('\u{ab5}', '\u{ab9}'),
|
||||
('\u{abc}', '\u{ac5}'), ('\u{ac7}', '\u{ac9}'), ('\u{acb}', '\u{acd}'), ('\u{ad0}',
|
||||
'\u{ad0}'), ('\u{ae0}', '\u{ae3}'), ('\u{ae6}', '\u{aef}'), ('\u{af9}', '\u{af9}'),
|
||||
('\u{b01}', '\u{b03}'), ('\u{b05}', '\u{b0c}'), ('\u{b0f}', '\u{b10}'), ('\u{b13}',
|
||||
'\u{b28}'), ('\u{b2a}', '\u{b30}'), ('\u{b32}', '\u{b33}'), ('\u{b35}', '\u{b39}'),
|
||||
('\u{b3c}', '\u{b44}'), ('\u{b47}', '\u{b48}'), ('\u{b4b}', '\u{b4d}'), ('\u{b56}',
|
||||
'\u{b57}'), ('\u{b5c}', '\u{b5d}'), ('\u{b5f}', '\u{b63}'), ('\u{b66}', '\u{b6f}'),
|
||||
('\u{b71}', '\u{b71}'), ('\u{b82}', '\u{b83}'), ('\u{b85}', '\u{b8a}'), ('\u{b8e}',
|
||||
'\u{b90}'), ('\u{b92}', '\u{b95}'), ('\u{b99}', '\u{b9a}'), ('\u{b9c}', '\u{b9c}'),
|
||||
('\u{b9e}', '\u{b9f}'), ('\u{ba3}', '\u{ba4}'), ('\u{ba8}', '\u{baa}'), ('\u{bae}',
|
||||
'\u{bb9}'), ('\u{bbe}', '\u{bc2}'), ('\u{bc6}', '\u{bc8}'), ('\u{bca}', '\u{bcd}'),
|
||||
('\u{bd0}', '\u{bd0}'), ('\u{bd7}', '\u{bd7}'), ('\u{be6}', '\u{bef}'), ('\u{c00}',
|
||||
'\u{c03}'), ('\u{c05}', '\u{c0c}'), ('\u{c0e}', '\u{c10}'), ('\u{c12}', '\u{c28}'),
|
||||
('\u{c2a}', '\u{c39}'), ('\u{c3d}', '\u{c44}'), ('\u{c46}', '\u{c48}'), ('\u{c4a}',
|
||||
'\u{c4d}'), ('\u{c55}', '\u{c56}'), ('\u{c58}', '\u{c5a}'), ('\u{c60}', '\u{c63}'),
|
||||
('\u{c66}', '\u{c6f}'), ('\u{c81}', '\u{c83}'), ('\u{c85}', '\u{c8c}'), ('\u{c8e}',
|
||||
'\u{c90}'), ('\u{c92}', '\u{ca8}'), ('\u{caa}', '\u{cb3}'), ('\u{cb5}', '\u{cb9}'),
|
||||
('\u{cbc}', '\u{cc4}'), ('\u{cc6}', '\u{cc8}'), ('\u{cca}', '\u{ccd}'), ('\u{cd5}',
|
||||
'\u{cd6}'), ('\u{cde}', '\u{cde}'), ('\u{ce0}', '\u{ce3}'), ('\u{ce6}', '\u{cef}'),
|
||||
('\u{cf1}', '\u{cf2}'), ('\u{d01}', '\u{d03}'), ('\u{d05}', '\u{d0c}'), ('\u{d0e}',
|
||||
'\u{d10}'), ('\u{d12}', '\u{d3a}'), ('\u{d3d}', '\u{d44}'), ('\u{d46}', '\u{d48}'),
|
||||
('\u{d4a}', '\u{d4e}'), ('\u{d57}', '\u{d57}'), ('\u{d5f}', '\u{d63}'), ('\u{d66}',
|
||||
'\u{d6f}'), ('\u{d7a}', '\u{d7f}'), ('\u{d82}', '\u{d83}'), ('\u{d85}', '\u{d96}'),
|
||||
('\u{d9a}', '\u{db1}'), ('\u{db3}', '\u{dbb}'), ('\u{dbd}', '\u{dbd}'), ('\u{dc0}',
|
||||
'\u{dc6}'), ('\u{dca}', '\u{dca}'), ('\u{dcf}', '\u{dd4}'), ('\u{dd6}', '\u{dd6}'),
|
||||
('\u{dd8}', '\u{ddf}'), ('\u{de6}', '\u{def}'), ('\u{df2}', '\u{df3}'), ('\u{e01}',
|
||||
'\u{e3a}'), ('\u{e40}', '\u{e4e}'), ('\u{e50}', '\u{e59}'), ('\u{e81}', '\u{e82}'),
|
||||
('\u{e84}', '\u{e84}'), ('\u{e87}', '\u{e88}'), ('\u{e8a}', '\u{e8a}'), ('\u{e8d}',
|
||||
'\u{e8d}'), ('\u{e94}', '\u{e97}'), ('\u{e99}', '\u{e9f}'), ('\u{ea1}', '\u{ea3}'),
|
||||
('\u{ea5}', '\u{ea5}'), ('\u{ea7}', '\u{ea7}'), ('\u{eaa}', '\u{eab}'), ('\u{ead}',
|
||||
'\u{eb9}'), ('\u{ebb}', '\u{ebd}'), ('\u{ec0}', '\u{ec4}'), ('\u{ec6}', '\u{ec6}'),
|
||||
('\u{ec8}', '\u{ecd}'), ('\u{ed0}', '\u{ed9}'), ('\u{edc}', '\u{edf}'), ('\u{f00}',
|
||||
'\u{f00}'), ('\u{f18}', '\u{f19}'), ('\u{f20}', '\u{f29}'), ('\u{f35}', '\u{f35}'),
|
||||
('\u{f37}', '\u{f37}'), ('\u{f39}', '\u{f39}'), ('\u{f3e}', '\u{f47}'), ('\u{f49}',
|
||||
'\u{f6c}'), ('\u{f71}', '\u{f84}'), ('\u{f86}', '\u{f97}'), ('\u{f99}', '\u{fbc}'),
|
||||
('\u{fc6}', '\u{fc6}'), ('\u{1000}', '\u{1049}'), ('\u{1050}', '\u{109d}'), ('\u{10a0}',
|
||||
'\u{10c5}'), ('\u{10c7}', '\u{10c7}'), ('\u{10cd}', '\u{10cd}'), ('\u{10d0}', '\u{10fa}'),
|
||||
('\u{10fc}', '\u{1248}'), ('\u{124a}', '\u{124d}'), ('\u{1250}', '\u{1256}'), ('\u{1258}',
|
||||
'\u{1258}'), ('\u{125a}', '\u{125d}'), ('\u{1260}', '\u{1288}'), ('\u{128a}', '\u{128d}'),
|
||||
('\u{1290}', '\u{12b0}'), ('\u{12b2}', '\u{12b5}'), ('\u{12b8}', '\u{12be}'), ('\u{12c0}',
|
||||
'\u{12c0}'), ('\u{12c2}', '\u{12c5}'), ('\u{12c8}', '\u{12d6}'), ('\u{12d8}', '\u{1310}'),
|
||||
('\u{1312}', '\u{1315}'), ('\u{1318}', '\u{135a}'), ('\u{135d}', '\u{135f}'), ('\u{1369}',
|
||||
'\u{1371}'), ('\u{1380}', '\u{138f}'), ('\u{13a0}', '\u{13f5}'), ('\u{13f8}', '\u{13fd}'),
|
||||
('\u{1401}', '\u{166c}'), ('\u{166f}', '\u{167f}'), ('\u{1681}', '\u{169a}'), ('\u{16a0}',
|
||||
'\u{16ea}'), ('\u{16ee}', '\u{16f8}'), ('\u{1700}', '\u{170c}'), ('\u{170e}', '\u{1714}'),
|
||||
('\u{1720}', '\u{1734}'), ('\u{1740}', '\u{1753}'), ('\u{1760}', '\u{176c}'), ('\u{176e}',
|
||||
'\u{1770}'), ('\u{1772}', '\u{1773}'), ('\u{1780}', '\u{17d3}'), ('\u{17d7}', '\u{17d7}'),
|
||||
('\u{17dc}', '\u{17dd}'), ('\u{17e0}', '\u{17e9}'), ('\u{180b}', '\u{180d}'), ('\u{1810}',
|
||||
'\u{1819}'), ('\u{1820}', '\u{1877}'), ('\u{1880}', '\u{18aa}'), ('\u{18b0}', '\u{18f5}'),
|
||||
('\u{1900}', '\u{191e}'), ('\u{1920}', '\u{192b}'), ('\u{1930}', '\u{193b}'), ('\u{1946}',
|
||||
'\u{196d}'), ('\u{1970}', '\u{1974}'), ('\u{1980}', '\u{19ab}'), ('\u{19b0}', '\u{19c9}'),
|
||||
('\u{19d0}', '\u{19da}'), ('\u{1a00}', '\u{1a1b}'), ('\u{1a20}', '\u{1a5e}'), ('\u{1a60}',
|
||||
'\u{1a7c}'), ('\u{1a7f}', '\u{1a89}'), ('\u{1a90}', '\u{1a99}'), ('\u{1aa7}', '\u{1aa7}'),
|
||||
('\u{1ab0}', '\u{1abd}'), ('\u{1b00}', '\u{1b4b}'), ('\u{1b50}', '\u{1b59}'), ('\u{1b6b}',
|
||||
'\u{1b73}'), ('\u{1b80}', '\u{1bf3}'), ('\u{1c00}', '\u{1c37}'), ('\u{1c40}', '\u{1c49}'),
|
||||
('\u{1c4d}', '\u{1c7d}'), ('\u{1cd0}', '\u{1cd2}'), ('\u{1cd4}', '\u{1cf6}'), ('\u{1cf8}',
|
||||
'\u{1cf9}'), ('\u{1d00}', '\u{1df5}'), ('\u{1dfc}', '\u{1f15}'), ('\u{1f18}', '\u{1f1d}'),
|
||||
('\u{1f20}', '\u{1f45}'), ('\u{1f48}', '\u{1f4d}'), ('\u{1f50}', '\u{1f57}'), ('\u{1f59}',
|
||||
'\u{1f59}'), ('\u{1f5b}', '\u{1f5b}'), ('\u{1f5d}', '\u{1f5d}'), ('\u{1f5f}', '\u{1f7d}'),
|
||||
('\u{1f80}', '\u{1fb4}'), ('\u{1fb6}', '\u{1fbc}'), ('\u{1fbe}', '\u{1fbe}'), ('\u{1fc2}',
|
||||
'\u{1fc4}'), ('\u{1fc6}', '\u{1fcc}'), ('\u{1fd0}', '\u{1fd3}'), ('\u{1fd6}', '\u{1fdb}'),
|
||||
('\u{1fe0}', '\u{1fec}'), ('\u{1ff2}', '\u{1ff4}'), ('\u{1ff6}', '\u{1ffc}'), ('\u{203f}',
|
||||
'\u{2040}'), ('\u{2054}', '\u{2054}'), ('\u{2071}', '\u{2071}'), ('\u{207f}', '\u{207f}'),
|
||||
('\u{2090}', '\u{209c}'), ('\u{20d0}', '\u{20dc}'), ('\u{20e1}', '\u{20e1}'), ('\u{20e5}',
|
||||
'\u{20f0}'), ('\u{2102}', '\u{2102}'), ('\u{2107}', '\u{2107}'), ('\u{210a}', '\u{2113}'),
|
||||
('\u{2115}', '\u{2115}'), ('\u{2118}', '\u{211d}'), ('\u{2124}', '\u{2124}'), ('\u{2126}',
|
||||
'\u{2126}'), ('\u{2128}', '\u{2128}'), ('\u{212a}', '\u{2139}'), ('\u{213c}', '\u{213f}'),
|
||||
('\u{2145}', '\u{2149}'), ('\u{214e}', '\u{214e}'), ('\u{2160}', '\u{2188}'), ('\u{2c00}',
|
||||
'\u{2c2e}'), ('\u{2c30}', '\u{2c5e}'), ('\u{2c60}', '\u{2ce4}'), ('\u{2ceb}', '\u{2cf3}'),
|
||||
('\u{2d00}', '\u{2d25}'), ('\u{2d27}', '\u{2d27}'), ('\u{2d2d}', '\u{2d2d}'), ('\u{2d30}',
|
||||
'\u{2d67}'), ('\u{2d6f}', '\u{2d6f}'), ('\u{2d7f}', '\u{2d96}'), ('\u{2da0}', '\u{2da6}'),
|
||||
('\u{2da8}', '\u{2dae}'), ('\u{2db0}', '\u{2db6}'), ('\u{2db8}', '\u{2dbe}'), ('\u{2dc0}',
|
||||
'\u{2dc6}'), ('\u{2dc8}', '\u{2dce}'), ('\u{2dd0}', '\u{2dd6}'), ('\u{2dd8}', '\u{2dde}'),
|
||||
('\u{2de0}', '\u{2dff}'), ('\u{3005}', '\u{3007}'), ('\u{3021}', '\u{302f}'), ('\u{3031}',
|
||||
'\u{3035}'), ('\u{3038}', '\u{303c}'), ('\u{3041}', '\u{3096}'), ('\u{3099}', '\u{309a}'),
|
||||
('\u{309d}', '\u{309f}'), ('\u{30a1}', '\u{30fa}'), ('\u{30fc}', '\u{30ff}'), ('\u{3105}',
|
||||
'\u{312d}'), ('\u{3131}', '\u{318e}'), ('\u{31a0}', '\u{31ba}'), ('\u{31f0}', '\u{31ff}'),
|
||||
('\u{3400}', '\u{4db5}'), ('\u{4e00}', '\u{9fd5}'), ('\u{a000}', '\u{a48c}'), ('\u{a4d0}',
|
||||
'\u{a4fd}'), ('\u{a500}', '\u{a60c}'), ('\u{a610}', '\u{a62b}'), ('\u{a640}', '\u{a66f}'),
|
||||
('\u{a674}', '\u{a67d}'), ('\u{a67f}', '\u{a6f1}'), ('\u{a717}', '\u{a71f}'), ('\u{a722}',
|
||||
'\u{a788}'), ('\u{a78b}', '\u{a7ad}'), ('\u{a7b0}', '\u{a7b7}'), ('\u{a7f7}', '\u{a827}'),
|
||||
('\u{a840}', '\u{a873}'), ('\u{a880}', '\u{a8c4}'), ('\u{a8d0}', '\u{a8d9}'), ('\u{a8e0}',
|
||||
'\u{a8f7}'), ('\u{a8fb}', '\u{a8fb}'), ('\u{a8fd}', '\u{a8fd}'), ('\u{a900}', '\u{a92d}'),
|
||||
('\u{a930}', '\u{a953}'), ('\u{a960}', '\u{a97c}'), ('\u{a980}', '\u{a9c0}'), ('\u{a9cf}',
|
||||
'\u{a9d9}'), ('\u{a9e0}', '\u{a9fe}'), ('\u{aa00}', '\u{aa36}'), ('\u{aa40}', '\u{aa4d}'),
|
||||
('\u{aa50}', '\u{aa59}'), ('\u{aa60}', '\u{aa76}'), ('\u{aa7a}', '\u{aac2}'), ('\u{aadb}',
|
||||
'\u{aadd}'), ('\u{aae0}', '\u{aaef}'), ('\u{aaf2}', '\u{aaf6}'), ('\u{ab01}', '\u{ab06}'),
|
||||
('\u{ab09}', '\u{ab0e}'), ('\u{ab11}', '\u{ab16}'), ('\u{ab20}', '\u{ab26}'), ('\u{ab28}',
|
||||
'\u{ab2e}'), ('\u{ab30}', '\u{ab5a}'), ('\u{ab5c}', '\u{ab65}'), ('\u{ab70}', '\u{abea}'),
|
||||
('\u{abec}', '\u{abed}'), ('\u{abf0}', '\u{abf9}'), ('\u{ac00}', '\u{d7a3}'), ('\u{d7b0}',
|
||||
'\u{d7c6}'), ('\u{d7cb}', '\u{d7fb}'), ('\u{f900}', '\u{fa6d}'), ('\u{fa70}', '\u{fad9}'),
|
||||
('\u{fb00}', '\u{fb06}'), ('\u{fb13}', '\u{fb17}'), ('\u{fb1d}', '\u{fb28}'), ('\u{fb2a}',
|
||||
'\u{fb36}'), ('\u{fb38}', '\u{fb3c}'), ('\u{fb3e}', '\u{fb3e}'), ('\u{fb40}', '\u{fb41}'),
|
||||
('\u{fb43}', '\u{fb44}'), ('\u{fb46}', '\u{fbb1}'), ('\u{fbd3}', '\u{fc5d}'), ('\u{fc64}',
|
||||
'\u{fd3d}'), ('\u{fd50}', '\u{fd8f}'), ('\u{fd92}', '\u{fdc7}'), ('\u{fdf0}', '\u{fdf9}'),
|
||||
('\u{fe00}', '\u{fe0f}'), ('\u{fe20}', '\u{fe2f}'), ('\u{fe33}', '\u{fe34}'), ('\u{fe4d}',
|
||||
'\u{fe4f}'), ('\u{fe71}', '\u{fe71}'), ('\u{fe73}', '\u{fe73}'), ('\u{fe77}', '\u{fe77}'),
|
||||
('\u{fe79}', '\u{fe79}'), ('\u{fe7b}', '\u{fe7b}'), ('\u{fe7d}', '\u{fe7d}'), ('\u{fe7f}',
|
||||
'\u{fefc}'), ('\u{ff10}', '\u{ff19}'), ('\u{ff21}', '\u{ff3a}'), ('\u{ff3f}', '\u{ff3f}'),
|
||||
('\u{ff41}', '\u{ff5a}'), ('\u{ff66}', '\u{ffbe}'), ('\u{ffc2}', '\u{ffc7}'), ('\u{ffca}',
|
||||
'\u{ffcf}'), ('\u{ffd2}', '\u{ffd7}'), ('\u{ffda}', '\u{ffdc}'), ('\u{10000}', '\u{1000b}'),
|
||||
('\u{1000d}', '\u{10026}'), ('\u{10028}', '\u{1003a}'), ('\u{1003c}', '\u{1003d}'),
|
||||
('\u{1003f}', '\u{1004d}'), ('\u{10050}', '\u{1005d}'), ('\u{10080}', '\u{100fa}'),
|
||||
('\u{10140}', '\u{10174}'), ('\u{101fd}', '\u{101fd}'), ('\u{10280}', '\u{1029c}'),
|
||||
('\u{102a0}', '\u{102d0}'), ('\u{102e0}', '\u{102e0}'), ('\u{10300}', '\u{1031f}'),
|
||||
('\u{10330}', '\u{1034a}'), ('\u{10350}', '\u{1037a}'), ('\u{10380}', '\u{1039d}'),
|
||||
('\u{103a0}', '\u{103c3}'), ('\u{103c8}', '\u{103cf}'), ('\u{103d1}', '\u{103d5}'),
|
||||
('\u{10400}', '\u{1049d}'), ('\u{104a0}', '\u{104a9}'), ('\u{10500}', '\u{10527}'),
|
||||
('\u{10530}', '\u{10563}'), ('\u{10600}', '\u{10736}'), ('\u{10740}', '\u{10755}'),
|
||||
('\u{10760}', '\u{10767}'), ('\u{10800}', '\u{10805}'), ('\u{10808}', '\u{10808}'),
|
||||
('\u{1080a}', '\u{10835}'), ('\u{10837}', '\u{10838}'), ('\u{1083c}', '\u{1083c}'),
|
||||
('\u{1083f}', '\u{10855}'), ('\u{10860}', '\u{10876}'), ('\u{10880}', '\u{1089e}'),
|
||||
('\u{108e0}', '\u{108f2}'), ('\u{108f4}', '\u{108f5}'), ('\u{10900}', '\u{10915}'),
|
||||
('\u{10920}', '\u{10939}'), ('\u{10980}', '\u{109b7}'), ('\u{109be}', '\u{109bf}'),
|
||||
('\u{10a00}', '\u{10a03}'), ('\u{10a05}', '\u{10a06}'), ('\u{10a0c}', '\u{10a13}'),
|
||||
('\u{10a15}', '\u{10a17}'), ('\u{10a19}', '\u{10a33}'), ('\u{10a38}', '\u{10a3a}'),
|
||||
('\u{10a3f}', '\u{10a3f}'), ('\u{10a60}', '\u{10a7c}'), ('\u{10a80}', '\u{10a9c}'),
|
||||
('\u{10ac0}', '\u{10ac7}'), ('\u{10ac9}', '\u{10ae6}'), ('\u{10b00}', '\u{10b35}'),
|
||||
('\u{10b40}', '\u{10b55}'), ('\u{10b60}', '\u{10b72}'), ('\u{10b80}', '\u{10b91}'),
|
||||
('\u{10c00}', '\u{10c48}'), ('\u{10c80}', '\u{10cb2}'), ('\u{10cc0}', '\u{10cf2}'),
|
||||
('\u{11000}', '\u{11046}'), ('\u{11066}', '\u{1106f}'), ('\u{1107f}', '\u{110ba}'),
|
||||
('\u{110d0}', '\u{110e8}'), ('\u{110f0}', '\u{110f9}'), ('\u{11100}', '\u{11134}'),
|
||||
('\u{11136}', '\u{1113f}'), ('\u{11150}', '\u{11173}'), ('\u{11176}', '\u{11176}'),
|
||||
('\u{11180}', '\u{111c4}'), ('\u{111ca}', '\u{111cc}'), ('\u{111d0}', '\u{111da}'),
|
||||
('\u{111dc}', '\u{111dc}'), ('\u{11200}', '\u{11211}'), ('\u{11213}', '\u{11237}'),
|
||||
('\u{11280}', '\u{11286}'), ('\u{11288}', '\u{11288}'), ('\u{1128a}', '\u{1128d}'),
|
||||
('\u{1128f}', '\u{1129d}'), ('\u{1129f}', '\u{112a8}'), ('\u{112b0}', '\u{112ea}'),
|
||||
('\u{112f0}', '\u{112f9}'), ('\u{11300}', '\u{11303}'), ('\u{11305}', '\u{1130c}'),
|
||||
('\u{1130f}', '\u{11310}'), ('\u{11313}', '\u{11328}'), ('\u{1132a}', '\u{11330}'),
|
||||
('\u{11332}', '\u{11333}'), ('\u{11335}', '\u{11339}'), ('\u{1133c}', '\u{11344}'),
|
||||
('\u{11347}', '\u{11348}'), ('\u{1134b}', '\u{1134d}'), ('\u{11350}', '\u{11350}'),
|
||||
('\u{11357}', '\u{11357}'), ('\u{1135d}', '\u{11363}'), ('\u{11366}', '\u{1136c}'),
|
||||
('\u{11370}', '\u{11374}'), ('\u{11480}', '\u{114c5}'), ('\u{114c7}', '\u{114c7}'),
|
||||
('\u{114d0}', '\u{114d9}'), ('\u{11580}', '\u{115b5}'), ('\u{115b8}', '\u{115c0}'),
|
||||
('\u{115d8}', '\u{115dd}'), ('\u{11600}', '\u{11640}'), ('\u{11644}', '\u{11644}'),
|
||||
('\u{11650}', '\u{11659}'), ('\u{11680}', '\u{116b7}'), ('\u{116c0}', '\u{116c9}'),
|
||||
('\u{11700}', '\u{11719}'), ('\u{1171d}', '\u{1172b}'), ('\u{11730}', '\u{11739}'),
|
||||
('\u{118a0}', '\u{118e9}'), ('\u{118ff}', '\u{118ff}'), ('\u{11ac0}', '\u{11af8}'),
|
||||
('\u{12000}', '\u{12399}'), ('\u{12400}', '\u{1246e}'), ('\u{12480}', '\u{12543}'),
|
||||
('\u{13000}', '\u{1342e}'), ('\u{14400}', '\u{14646}'), ('\u{16800}', '\u{16a38}'),
|
||||
('\u{16a40}', '\u{16a5e}'), ('\u{16a60}', '\u{16a69}'), ('\u{16ad0}', '\u{16aed}'),
|
||||
('\u{16af0}', '\u{16af4}'), ('\u{16b00}', '\u{16b36}'), ('\u{16b40}', '\u{16b43}'),
|
||||
('\u{16b50}', '\u{16b59}'), ('\u{16b63}', '\u{16b77}'), ('\u{16b7d}', '\u{16b8f}'),
|
||||
('\u{16f00}', '\u{16f44}'), ('\u{16f50}', '\u{16f7e}'), ('\u{16f8f}', '\u{16f9f}'),
|
||||
('\u{1b000}', '\u{1b001}'), ('\u{1bc00}', '\u{1bc6a}'), ('\u{1bc70}', '\u{1bc7c}'),
|
||||
('\u{1bc80}', '\u{1bc88}'), ('\u{1bc90}', '\u{1bc99}'), ('\u{1bc9d}', '\u{1bc9e}'),
|
||||
('\u{1d165}', '\u{1d169}'), ('\u{1d16d}', '\u{1d172}'), ('\u{1d17b}', '\u{1d182}'),
|
||||
('\u{1d185}', '\u{1d18b}'), ('\u{1d1aa}', '\u{1d1ad}'), ('\u{1d242}', '\u{1d244}'),
|
||||
('\u{1d400}', '\u{1d454}'), ('\u{1d456}', '\u{1d49c}'), ('\u{1d49e}', '\u{1d49f}'),
|
||||
('\u{1d4a2}', '\u{1d4a2}'), ('\u{1d4a5}', '\u{1d4a6}'), ('\u{1d4a9}', '\u{1d4ac}'),
|
||||
('\u{1d4ae}', '\u{1d4b9}'), ('\u{1d4bb}', '\u{1d4bb}'), ('\u{1d4bd}', '\u{1d4c3}'),
|
||||
('\u{1d4c5}', '\u{1d505}'), ('\u{1d507}', '\u{1d50a}'), ('\u{1d50d}', '\u{1d514}'),
|
||||
('\u{1d516}', '\u{1d51c}'), ('\u{1d51e}', '\u{1d539}'), ('\u{1d53b}', '\u{1d53e}'),
|
||||
('\u{1d540}', '\u{1d544}'), ('\u{1d546}', '\u{1d546}'), ('\u{1d54a}', '\u{1d550}'),
|
||||
('\u{1d552}', '\u{1d6a5}'), ('\u{1d6a8}', '\u{1d6c0}'), ('\u{1d6c2}', '\u{1d6da}'),
|
||||
('\u{1d6dc}', '\u{1d6fa}'), ('\u{1d6fc}', '\u{1d714}'), ('\u{1d716}', '\u{1d734}'),
|
||||
('\u{1d736}', '\u{1d74e}'), ('\u{1d750}', '\u{1d76e}'), ('\u{1d770}', '\u{1d788}'),
|
||||
('\u{1d78a}', '\u{1d7a8}'), ('\u{1d7aa}', '\u{1d7c2}'), ('\u{1d7c4}', '\u{1d7cb}'),
|
||||
('\u{1d7ce}', '\u{1d7ff}'), ('\u{1da00}', '\u{1da36}'), ('\u{1da3b}', '\u{1da6c}'),
|
||||
('\u{1da75}', '\u{1da75}'), ('\u{1da84}', '\u{1da84}'), ('\u{1da9b}', '\u{1da9f}'),
|
||||
('\u{1daa1}', '\u{1daaf}'), ('\u{1e800}', '\u{1e8c4}'), ('\u{1e8d0}', '\u{1e8d6}'),
|
||||
('\u{1ee00}', '\u{1ee03}'), ('\u{1ee05}', '\u{1ee1f}'), ('\u{1ee21}', '\u{1ee22}'),
|
||||
('\u{1ee24}', '\u{1ee24}'), ('\u{1ee27}', '\u{1ee27}'), ('\u{1ee29}', '\u{1ee32}'),
|
||||
('\u{1ee34}', '\u{1ee37}'), ('\u{1ee39}', '\u{1ee39}'), ('\u{1ee3b}', '\u{1ee3b}'),
|
||||
('\u{1ee42}', '\u{1ee42}'), ('\u{1ee47}', '\u{1ee47}'), ('\u{1ee49}', '\u{1ee49}'),
|
||||
('\u{1ee4b}', '\u{1ee4b}'), ('\u{1ee4d}', '\u{1ee4f}'), ('\u{1ee51}', '\u{1ee52}'),
|
||||
('\u{1ee54}', '\u{1ee54}'), ('\u{1ee57}', '\u{1ee57}'), ('\u{1ee59}', '\u{1ee59}'),
|
||||
('\u{1ee5b}', '\u{1ee5b}'), ('\u{1ee5d}', '\u{1ee5d}'), ('\u{1ee5f}', '\u{1ee5f}'),
|
||||
('\u{1ee61}', '\u{1ee62}'), ('\u{1ee64}', '\u{1ee64}'), ('\u{1ee67}', '\u{1ee6a}'),
|
||||
('\u{1ee6c}', '\u{1ee72}'), ('\u{1ee74}', '\u{1ee77}'), ('\u{1ee79}', '\u{1ee7c}'),
|
||||
('\u{1ee7e}', '\u{1ee7e}'), ('\u{1ee80}', '\u{1ee89}'), ('\u{1ee8b}', '\u{1ee9b}'),
|
||||
('\u{1eea1}', '\u{1eea3}'), ('\u{1eea5}', '\u{1eea9}'), ('\u{1eeab}', '\u{1eebb}'),
|
||||
('\u{20000}', '\u{2a6d6}'), ('\u{2a700}', '\u{2b734}'), ('\u{2b740}', '\u{2b81d}'),
|
||||
('\u{2b820}', '\u{2cea1}'), ('\u{2f800}', '\u{2fa1d}'), ('\u{e0100}', '\u{e01ef}')
|
||||
];
|
||||
|
||||
pub fn XID_Continue(c: char) -> bool {
|
||||
super::bsearch_range_table(c, XID_Continue_table)
|
||||
}
|
||||
|
||||
pub const XID_Start_table: &'static [(char, char)] = &[
|
||||
('\u{41}', '\u{5a}'), ('\u{61}', '\u{7a}'), ('\u{aa}', '\u{aa}'), ('\u{b5}', '\u{b5}'),
|
||||
('\u{ba}', '\u{ba}'), ('\u{c0}', '\u{d6}'), ('\u{d8}', '\u{f6}'), ('\u{f8}', '\u{2c1}'),
|
||||
('\u{2c6}', '\u{2d1}'), ('\u{2e0}', '\u{2e4}'), ('\u{2ec}', '\u{2ec}'), ('\u{2ee}',
|
||||
'\u{2ee}'), ('\u{370}', '\u{374}'), ('\u{376}', '\u{377}'), ('\u{37b}', '\u{37d}'),
|
||||
('\u{37f}', '\u{37f}'), ('\u{386}', '\u{386}'), ('\u{388}', '\u{38a}'), ('\u{38c}',
|
||||
'\u{38c}'), ('\u{38e}', '\u{3a1}'), ('\u{3a3}', '\u{3f5}'), ('\u{3f7}', '\u{481}'),
|
||||
('\u{48a}', '\u{52f}'), ('\u{531}', '\u{556}'), ('\u{559}', '\u{559}'), ('\u{561}',
|
||||
'\u{587}'), ('\u{5d0}', '\u{5ea}'), ('\u{5f0}', '\u{5f2}'), ('\u{620}', '\u{64a}'),
|
||||
('\u{66e}', '\u{66f}'), ('\u{671}', '\u{6d3}'), ('\u{6d5}', '\u{6d5}'), ('\u{6e5}',
|
||||
'\u{6e6}'), ('\u{6ee}', '\u{6ef}'), ('\u{6fa}', '\u{6fc}'), ('\u{6ff}', '\u{6ff}'),
|
||||
('\u{710}', '\u{710}'), ('\u{712}', '\u{72f}'), ('\u{74d}', '\u{7a5}'), ('\u{7b1}',
|
||||
'\u{7b1}'), ('\u{7ca}', '\u{7ea}'), ('\u{7f4}', '\u{7f5}'), ('\u{7fa}', '\u{7fa}'),
|
||||
('\u{800}', '\u{815}'), ('\u{81a}', '\u{81a}'), ('\u{824}', '\u{824}'), ('\u{828}',
|
||||
'\u{828}'), ('\u{840}', '\u{858}'), ('\u{8a0}', '\u{8b4}'), ('\u{904}', '\u{939}'),
|
||||
('\u{93d}', '\u{93d}'), ('\u{950}', '\u{950}'), ('\u{958}', '\u{961}'), ('\u{971}',
|
||||
'\u{980}'), ('\u{985}', '\u{98c}'), ('\u{98f}', '\u{990}'), ('\u{993}', '\u{9a8}'),
|
||||
('\u{9aa}', '\u{9b0}'), ('\u{9b2}', '\u{9b2}'), ('\u{9b6}', '\u{9b9}'), ('\u{9bd}',
|
||||
'\u{9bd}'), ('\u{9ce}', '\u{9ce}'), ('\u{9dc}', '\u{9dd}'), ('\u{9df}', '\u{9e1}'),
|
||||
('\u{9f0}', '\u{9f1}'), ('\u{a05}', '\u{a0a}'), ('\u{a0f}', '\u{a10}'), ('\u{a13}',
|
||||
'\u{a28}'), ('\u{a2a}', '\u{a30}'), ('\u{a32}', '\u{a33}'), ('\u{a35}', '\u{a36}'),
|
||||
('\u{a38}', '\u{a39}'), ('\u{a59}', '\u{a5c}'), ('\u{a5e}', '\u{a5e}'), ('\u{a72}',
|
||||
'\u{a74}'), ('\u{a85}', '\u{a8d}'), ('\u{a8f}', '\u{a91}'), ('\u{a93}', '\u{aa8}'),
|
||||
('\u{aaa}', '\u{ab0}'), ('\u{ab2}', '\u{ab3}'), ('\u{ab5}', '\u{ab9}'), ('\u{abd}',
|
||||
'\u{abd}'), ('\u{ad0}', '\u{ad0}'), ('\u{ae0}', '\u{ae1}'), ('\u{af9}', '\u{af9}'),
|
||||
('\u{b05}', '\u{b0c}'), ('\u{b0f}', '\u{b10}'), ('\u{b13}', '\u{b28}'), ('\u{b2a}',
|
||||
'\u{b30}'), ('\u{b32}', '\u{b33}'), ('\u{b35}', '\u{b39}'), ('\u{b3d}', '\u{b3d}'),
|
||||
('\u{b5c}', '\u{b5d}'), ('\u{b5f}', '\u{b61}'), ('\u{b71}', '\u{b71}'), ('\u{b83}',
|
||||
'\u{b83}'), ('\u{b85}', '\u{b8a}'), ('\u{b8e}', '\u{b90}'), ('\u{b92}', '\u{b95}'),
|
||||
('\u{b99}', '\u{b9a}'), ('\u{b9c}', '\u{b9c}'), ('\u{b9e}', '\u{b9f}'), ('\u{ba3}',
|
||||
'\u{ba4}'), ('\u{ba8}', '\u{baa}'), ('\u{bae}', '\u{bb9}'), ('\u{bd0}', '\u{bd0}'),
|
||||
('\u{c05}', '\u{c0c}'), ('\u{c0e}', '\u{c10}'), ('\u{c12}', '\u{c28}'), ('\u{c2a}',
|
||||
'\u{c39}'), ('\u{c3d}', '\u{c3d}'), ('\u{c58}', '\u{c5a}'), ('\u{c60}', '\u{c61}'),
|
||||
('\u{c85}', '\u{c8c}'), ('\u{c8e}', '\u{c90}'), ('\u{c92}', '\u{ca8}'), ('\u{caa}',
|
||||
'\u{cb3}'), ('\u{cb5}', '\u{cb9}'), ('\u{cbd}', '\u{cbd}'), ('\u{cde}', '\u{cde}'),
|
||||
('\u{ce0}', '\u{ce1}'), ('\u{cf1}', '\u{cf2}'), ('\u{d05}', '\u{d0c}'), ('\u{d0e}',
|
||||
'\u{d10}'), ('\u{d12}', '\u{d3a}'), ('\u{d3d}', '\u{d3d}'), ('\u{d4e}', '\u{d4e}'),
|
||||
('\u{d5f}', '\u{d61}'), ('\u{d7a}', '\u{d7f}'), ('\u{d85}', '\u{d96}'), ('\u{d9a}',
|
||||
'\u{db1}'), ('\u{db3}', '\u{dbb}'), ('\u{dbd}', '\u{dbd}'), ('\u{dc0}', '\u{dc6}'),
|
||||
('\u{e01}', '\u{e30}'), ('\u{e32}', '\u{e32}'), ('\u{e40}', '\u{e46}'), ('\u{e81}',
|
||||
'\u{e82}'), ('\u{e84}', '\u{e84}'), ('\u{e87}', '\u{e88}'), ('\u{e8a}', '\u{e8a}'),
|
||||
('\u{e8d}', '\u{e8d}'), ('\u{e94}', '\u{e97}'), ('\u{e99}', '\u{e9f}'), ('\u{ea1}',
|
||||
'\u{ea3}'), ('\u{ea5}', '\u{ea5}'), ('\u{ea7}', '\u{ea7}'), ('\u{eaa}', '\u{eab}'),
|
||||
('\u{ead}', '\u{eb0}'), ('\u{eb2}', '\u{eb2}'), ('\u{ebd}', '\u{ebd}'), ('\u{ec0}',
|
||||
'\u{ec4}'), ('\u{ec6}', '\u{ec6}'), ('\u{edc}', '\u{edf}'), ('\u{f00}', '\u{f00}'),
|
||||
('\u{f40}', '\u{f47}'), ('\u{f49}', '\u{f6c}'), ('\u{f88}', '\u{f8c}'), ('\u{1000}',
|
||||
'\u{102a}'), ('\u{103f}', '\u{103f}'), ('\u{1050}', '\u{1055}'), ('\u{105a}', '\u{105d}'),
|
||||
('\u{1061}', '\u{1061}'), ('\u{1065}', '\u{1066}'), ('\u{106e}', '\u{1070}'), ('\u{1075}',
|
||||
'\u{1081}'), ('\u{108e}', '\u{108e}'), ('\u{10a0}', '\u{10c5}'), ('\u{10c7}', '\u{10c7}'),
|
||||
('\u{10cd}', '\u{10cd}'), ('\u{10d0}', '\u{10fa}'), ('\u{10fc}', '\u{1248}'), ('\u{124a}',
|
||||
'\u{124d}'), ('\u{1250}', '\u{1256}'), ('\u{1258}', '\u{1258}'), ('\u{125a}', '\u{125d}'),
|
||||
('\u{1260}', '\u{1288}'), ('\u{128a}', '\u{128d}'), ('\u{1290}', '\u{12b0}'), ('\u{12b2}',
|
||||
'\u{12b5}'), ('\u{12b8}', '\u{12be}'), ('\u{12c0}', '\u{12c0}'), ('\u{12c2}', '\u{12c5}'),
|
||||
('\u{12c8}', '\u{12d6}'), ('\u{12d8}', '\u{1310}'), ('\u{1312}', '\u{1315}'), ('\u{1318}',
|
||||
'\u{135a}'), ('\u{1380}', '\u{138f}'), ('\u{13a0}', '\u{13f5}'), ('\u{13f8}', '\u{13fd}'),
|
||||
('\u{1401}', '\u{166c}'), ('\u{166f}', '\u{167f}'), ('\u{1681}', '\u{169a}'), ('\u{16a0}',
|
||||
'\u{16ea}'), ('\u{16ee}', '\u{16f8}'), ('\u{1700}', '\u{170c}'), ('\u{170e}', '\u{1711}'),
|
||||
('\u{1720}', '\u{1731}'), ('\u{1740}', '\u{1751}'), ('\u{1760}', '\u{176c}'), ('\u{176e}',
|
||||
'\u{1770}'), ('\u{1780}', '\u{17b3}'), ('\u{17d7}', '\u{17d7}'), ('\u{17dc}', '\u{17dc}'),
|
||||
('\u{1820}', '\u{1877}'), ('\u{1880}', '\u{18a8}'), ('\u{18aa}', '\u{18aa}'), ('\u{18b0}',
|
||||
'\u{18f5}'), ('\u{1900}', '\u{191e}'), ('\u{1950}', '\u{196d}'), ('\u{1970}', '\u{1974}'),
|
||||
('\u{1980}', '\u{19ab}'), ('\u{19b0}', '\u{19c9}'), ('\u{1a00}', '\u{1a16}'), ('\u{1a20}',
|
||||
'\u{1a54}'), ('\u{1aa7}', '\u{1aa7}'), ('\u{1b05}', '\u{1b33}'), ('\u{1b45}', '\u{1b4b}'),
|
||||
('\u{1b83}', '\u{1ba0}'), ('\u{1bae}', '\u{1baf}'), ('\u{1bba}', '\u{1be5}'), ('\u{1c00}',
|
||||
'\u{1c23}'), ('\u{1c4d}', '\u{1c4f}'), ('\u{1c5a}', '\u{1c7d}'), ('\u{1ce9}', '\u{1cec}'),
|
||||
('\u{1cee}', '\u{1cf1}'), ('\u{1cf5}', '\u{1cf6}'), ('\u{1d00}', '\u{1dbf}'), ('\u{1e00}',
|
||||
'\u{1f15}'), ('\u{1f18}', '\u{1f1d}'), ('\u{1f20}', '\u{1f45}'), ('\u{1f48}', '\u{1f4d}'),
|
||||
('\u{1f50}', '\u{1f57}'), ('\u{1f59}', '\u{1f59}'), ('\u{1f5b}', '\u{1f5b}'), ('\u{1f5d}',
|
||||
'\u{1f5d}'), ('\u{1f5f}', '\u{1f7d}'), ('\u{1f80}', '\u{1fb4}'), ('\u{1fb6}', '\u{1fbc}'),
|
||||
('\u{1fbe}', '\u{1fbe}'), ('\u{1fc2}', '\u{1fc4}'), ('\u{1fc6}', '\u{1fcc}'), ('\u{1fd0}',
|
||||
'\u{1fd3}'), ('\u{1fd6}', '\u{1fdb}'), ('\u{1fe0}', '\u{1fec}'), ('\u{1ff2}', '\u{1ff4}'),
|
||||
('\u{1ff6}', '\u{1ffc}'), ('\u{2071}', '\u{2071}'), ('\u{207f}', '\u{207f}'), ('\u{2090}',
|
||||
'\u{209c}'), ('\u{2102}', '\u{2102}'), ('\u{2107}', '\u{2107}'), ('\u{210a}', '\u{2113}'),
|
||||
('\u{2115}', '\u{2115}'), ('\u{2118}', '\u{211d}'), ('\u{2124}', '\u{2124}'), ('\u{2126}',
|
||||
'\u{2126}'), ('\u{2128}', '\u{2128}'), ('\u{212a}', '\u{2139}'), ('\u{213c}', '\u{213f}'),
|
||||
('\u{2145}', '\u{2149}'), ('\u{214e}', '\u{214e}'), ('\u{2160}', '\u{2188}'), ('\u{2c00}',
|
||||
'\u{2c2e}'), ('\u{2c30}', '\u{2c5e}'), ('\u{2c60}', '\u{2ce4}'), ('\u{2ceb}', '\u{2cee}'),
|
||||
('\u{2cf2}', '\u{2cf3}'), ('\u{2d00}', '\u{2d25}'), ('\u{2d27}', '\u{2d27}'), ('\u{2d2d}',
|
||||
'\u{2d2d}'), ('\u{2d30}', '\u{2d67}'), ('\u{2d6f}', '\u{2d6f}'), ('\u{2d80}', '\u{2d96}'),
|
||||
('\u{2da0}', '\u{2da6}'), ('\u{2da8}', '\u{2dae}'), ('\u{2db0}', '\u{2db6}'), ('\u{2db8}',
|
||||
'\u{2dbe}'), ('\u{2dc0}', '\u{2dc6}'), ('\u{2dc8}', '\u{2dce}'), ('\u{2dd0}', '\u{2dd6}'),
|
||||
('\u{2dd8}', '\u{2dde}'), ('\u{3005}', '\u{3007}'), ('\u{3021}', '\u{3029}'), ('\u{3031}',
|
||||
'\u{3035}'), ('\u{3038}', '\u{303c}'), ('\u{3041}', '\u{3096}'), ('\u{309d}', '\u{309f}'),
|
||||
('\u{30a1}', '\u{30fa}'), ('\u{30fc}', '\u{30ff}'), ('\u{3105}', '\u{312d}'), ('\u{3131}',
|
||||
'\u{318e}'), ('\u{31a0}', '\u{31ba}'), ('\u{31f0}', '\u{31ff}'), ('\u{3400}', '\u{4db5}'),
|
||||
('\u{4e00}', '\u{9fd5}'), ('\u{a000}', '\u{a48c}'), ('\u{a4d0}', '\u{a4fd}'), ('\u{a500}',
|
||||
'\u{a60c}'), ('\u{a610}', '\u{a61f}'), ('\u{a62a}', '\u{a62b}'), ('\u{a640}', '\u{a66e}'),
|
||||
('\u{a67f}', '\u{a69d}'), ('\u{a6a0}', '\u{a6ef}'), ('\u{a717}', '\u{a71f}'), ('\u{a722}',
|
||||
'\u{a788}'), ('\u{a78b}', '\u{a7ad}'), ('\u{a7b0}', '\u{a7b7}'), ('\u{a7f7}', '\u{a801}'),
|
||||
('\u{a803}', '\u{a805}'), ('\u{a807}', '\u{a80a}'), ('\u{a80c}', '\u{a822}'), ('\u{a840}',
|
||||
'\u{a873}'), ('\u{a882}', '\u{a8b3}'), ('\u{a8f2}', '\u{a8f7}'), ('\u{a8fb}', '\u{a8fb}'),
|
||||
('\u{a8fd}', '\u{a8fd}'), ('\u{a90a}', '\u{a925}'), ('\u{a930}', '\u{a946}'), ('\u{a960}',
|
||||
'\u{a97c}'), ('\u{a984}', '\u{a9b2}'), ('\u{a9cf}', '\u{a9cf}'), ('\u{a9e0}', '\u{a9e4}'),
|
||||
('\u{a9e6}', '\u{a9ef}'), ('\u{a9fa}', '\u{a9fe}'), ('\u{aa00}', '\u{aa28}'), ('\u{aa40}',
|
||||
'\u{aa42}'), ('\u{aa44}', '\u{aa4b}'), ('\u{aa60}', '\u{aa76}'), ('\u{aa7a}', '\u{aa7a}'),
|
||||
('\u{aa7e}', '\u{aaaf}'), ('\u{aab1}', '\u{aab1}'), ('\u{aab5}', '\u{aab6}'), ('\u{aab9}',
|
||||
'\u{aabd}'), ('\u{aac0}', '\u{aac0}'), ('\u{aac2}', '\u{aac2}'), ('\u{aadb}', '\u{aadd}'),
|
||||
('\u{aae0}', '\u{aaea}'), ('\u{aaf2}', '\u{aaf4}'), ('\u{ab01}', '\u{ab06}'), ('\u{ab09}',
|
||||
'\u{ab0e}'), ('\u{ab11}', '\u{ab16}'), ('\u{ab20}', '\u{ab26}'), ('\u{ab28}', '\u{ab2e}'),
|
||||
('\u{ab30}', '\u{ab5a}'), ('\u{ab5c}', '\u{ab65}'), ('\u{ab70}', '\u{abe2}'), ('\u{ac00}',
|
||||
'\u{d7a3}'), ('\u{d7b0}', '\u{d7c6}'), ('\u{d7cb}', '\u{d7fb}'), ('\u{f900}', '\u{fa6d}'),
|
||||
('\u{fa70}', '\u{fad9}'), ('\u{fb00}', '\u{fb06}'), ('\u{fb13}', '\u{fb17}'), ('\u{fb1d}',
|
||||
'\u{fb1d}'), ('\u{fb1f}', '\u{fb28}'), ('\u{fb2a}', '\u{fb36}'), ('\u{fb38}', '\u{fb3c}'),
|
||||
('\u{fb3e}', '\u{fb3e}'), ('\u{fb40}', '\u{fb41}'), ('\u{fb43}', '\u{fb44}'), ('\u{fb46}',
|
||||
'\u{fbb1}'), ('\u{fbd3}', '\u{fc5d}'), ('\u{fc64}', '\u{fd3d}'), ('\u{fd50}', '\u{fd8f}'),
|
||||
('\u{fd92}', '\u{fdc7}'), ('\u{fdf0}', '\u{fdf9}'), ('\u{fe71}', '\u{fe71}'), ('\u{fe73}',
|
||||
'\u{fe73}'), ('\u{fe77}', '\u{fe77}'), ('\u{fe79}', '\u{fe79}'), ('\u{fe7b}', '\u{fe7b}'),
|
||||
('\u{fe7d}', '\u{fe7d}'), ('\u{fe7f}', '\u{fefc}'), ('\u{ff21}', '\u{ff3a}'), ('\u{ff41}',
|
||||
'\u{ff5a}'), ('\u{ff66}', '\u{ff9d}'), ('\u{ffa0}', '\u{ffbe}'), ('\u{ffc2}', '\u{ffc7}'),
|
||||
('\u{ffca}', '\u{ffcf}'), ('\u{ffd2}', '\u{ffd7}'), ('\u{ffda}', '\u{ffdc}'), ('\u{10000}',
|
||||
'\u{1000b}'), ('\u{1000d}', '\u{10026}'), ('\u{10028}', '\u{1003a}'), ('\u{1003c}',
|
||||
'\u{1003d}'), ('\u{1003f}', '\u{1004d}'), ('\u{10050}', '\u{1005d}'), ('\u{10080}',
|
||||
'\u{100fa}'), ('\u{10140}', '\u{10174}'), ('\u{10280}', '\u{1029c}'), ('\u{102a0}',
|
||||
'\u{102d0}'), ('\u{10300}', '\u{1031f}'), ('\u{10330}', '\u{1034a}'), ('\u{10350}',
|
||||
'\u{10375}'), ('\u{10380}', '\u{1039d}'), ('\u{103a0}', '\u{103c3}'), ('\u{103c8}',
|
||||
'\u{103cf}'), ('\u{103d1}', '\u{103d5}'), ('\u{10400}', '\u{1049d}'), ('\u{10500}',
|
||||
'\u{10527}'), ('\u{10530}', '\u{10563}'), ('\u{10600}', '\u{10736}'), ('\u{10740}',
|
||||
'\u{10755}'), ('\u{10760}', '\u{10767}'), ('\u{10800}', '\u{10805}'), ('\u{10808}',
|
||||
'\u{10808}'), ('\u{1080a}', '\u{10835}'), ('\u{10837}', '\u{10838}'), ('\u{1083c}',
|
||||
'\u{1083c}'), ('\u{1083f}', '\u{10855}'), ('\u{10860}', '\u{10876}'), ('\u{10880}',
|
||||
'\u{1089e}'), ('\u{108e0}', '\u{108f2}'), ('\u{108f4}', '\u{108f5}'), ('\u{10900}',
|
||||
'\u{10915}'), ('\u{10920}', '\u{10939}'), ('\u{10980}', '\u{109b7}'), ('\u{109be}',
|
||||
'\u{109bf}'), ('\u{10a00}', '\u{10a00}'), ('\u{10a10}', '\u{10a13}'), ('\u{10a15}',
|
||||
'\u{10a17}'), ('\u{10a19}', '\u{10a33}'), ('\u{10a60}', '\u{10a7c}'), ('\u{10a80}',
|
||||
'\u{10a9c}'), ('\u{10ac0}', '\u{10ac7}'), ('\u{10ac9}', '\u{10ae4}'), ('\u{10b00}',
|
||||
'\u{10b35}'), ('\u{10b40}', '\u{10b55}'), ('\u{10b60}', '\u{10b72}'), ('\u{10b80}',
|
||||
'\u{10b91}'), ('\u{10c00}', '\u{10c48}'), ('\u{10c80}', '\u{10cb2}'), ('\u{10cc0}',
|
||||
'\u{10cf2}'), ('\u{11003}', '\u{11037}'), ('\u{11083}', '\u{110af}'), ('\u{110d0}',
|
||||
'\u{110e8}'), ('\u{11103}', '\u{11126}'), ('\u{11150}', '\u{11172}'), ('\u{11176}',
|
||||
'\u{11176}'), ('\u{11183}', '\u{111b2}'), ('\u{111c1}', '\u{111c4}'), ('\u{111da}',
|
||||
'\u{111da}'), ('\u{111dc}', '\u{111dc}'), ('\u{11200}', '\u{11211}'), ('\u{11213}',
|
||||
'\u{1122b}'), ('\u{11280}', '\u{11286}'), ('\u{11288}', '\u{11288}'), ('\u{1128a}',
|
||||
'\u{1128d}'), ('\u{1128f}', '\u{1129d}'), ('\u{1129f}', '\u{112a8}'), ('\u{112b0}',
|
||||
'\u{112de}'), ('\u{11305}', '\u{1130c}'), ('\u{1130f}', '\u{11310}'), ('\u{11313}',
|
||||
'\u{11328}'), ('\u{1132a}', '\u{11330}'), ('\u{11332}', '\u{11333}'), ('\u{11335}',
|
||||
'\u{11339}'), ('\u{1133d}', '\u{1133d}'), ('\u{11350}', '\u{11350}'), ('\u{1135d}',
|
||||
'\u{11361}'), ('\u{11480}', '\u{114af}'), ('\u{114c4}', '\u{114c5}'), ('\u{114c7}',
|
||||
'\u{114c7}'), ('\u{11580}', '\u{115ae}'), ('\u{115d8}', '\u{115db}'), ('\u{11600}',
|
||||
'\u{1162f}'), ('\u{11644}', '\u{11644}'), ('\u{11680}', '\u{116aa}'), ('\u{11700}',
|
||||
'\u{11719}'), ('\u{118a0}', '\u{118df}'), ('\u{118ff}', '\u{118ff}'), ('\u{11ac0}',
|
||||
'\u{11af8}'), ('\u{12000}', '\u{12399}'), ('\u{12400}', '\u{1246e}'), ('\u{12480}',
|
||||
'\u{12543}'), ('\u{13000}', '\u{1342e}'), ('\u{14400}', '\u{14646}'), ('\u{16800}',
|
||||
'\u{16a38}'), ('\u{16a40}', '\u{16a5e}'), ('\u{16ad0}', '\u{16aed}'), ('\u{16b00}',
|
||||
'\u{16b2f}'), ('\u{16b40}', '\u{16b43}'), ('\u{16b63}', '\u{16b77}'), ('\u{16b7d}',
|
||||
'\u{16b8f}'), ('\u{16f00}', '\u{16f44}'), ('\u{16f50}', '\u{16f50}'), ('\u{16f93}',
|
||||
'\u{16f9f}'), ('\u{1b000}', '\u{1b001}'), ('\u{1bc00}', '\u{1bc6a}'), ('\u{1bc70}',
|
||||
'\u{1bc7c}'), ('\u{1bc80}', '\u{1bc88}'), ('\u{1bc90}', '\u{1bc99}'), ('\u{1d400}',
|
||||
'\u{1d454}'), ('\u{1d456}', '\u{1d49c}'), ('\u{1d49e}', '\u{1d49f}'), ('\u{1d4a2}',
|
||||
'\u{1d4a2}'), ('\u{1d4a5}', '\u{1d4a6}'), ('\u{1d4a9}', '\u{1d4ac}'), ('\u{1d4ae}',
|
||||
'\u{1d4b9}'), ('\u{1d4bb}', '\u{1d4bb}'), ('\u{1d4bd}', '\u{1d4c3}'), ('\u{1d4c5}',
|
||||
'\u{1d505}'), ('\u{1d507}', '\u{1d50a}'), ('\u{1d50d}', '\u{1d514}'), ('\u{1d516}',
|
||||
'\u{1d51c}'), ('\u{1d51e}', '\u{1d539}'), ('\u{1d53b}', '\u{1d53e}'), ('\u{1d540}',
|
||||
'\u{1d544}'), ('\u{1d546}', '\u{1d546}'), ('\u{1d54a}', '\u{1d550}'), ('\u{1d552}',
|
||||
'\u{1d6a5}'), ('\u{1d6a8}', '\u{1d6c0}'), ('\u{1d6c2}', '\u{1d6da}'), ('\u{1d6dc}',
|
||||
'\u{1d6fa}'), ('\u{1d6fc}', '\u{1d714}'), ('\u{1d716}', '\u{1d734}'), ('\u{1d736}',
|
||||
'\u{1d74e}'), ('\u{1d750}', '\u{1d76e}'), ('\u{1d770}', '\u{1d788}'), ('\u{1d78a}',
|
||||
'\u{1d7a8}'), ('\u{1d7aa}', '\u{1d7c2}'), ('\u{1d7c4}', '\u{1d7cb}'), ('\u{1e800}',
|
||||
'\u{1e8c4}'), ('\u{1ee00}', '\u{1ee03}'), ('\u{1ee05}', '\u{1ee1f}'), ('\u{1ee21}',
|
||||
'\u{1ee22}'), ('\u{1ee24}', '\u{1ee24}'), ('\u{1ee27}', '\u{1ee27}'), ('\u{1ee29}',
|
||||
'\u{1ee32}'), ('\u{1ee34}', '\u{1ee37}'), ('\u{1ee39}', '\u{1ee39}'), ('\u{1ee3b}',
|
||||
'\u{1ee3b}'), ('\u{1ee42}', '\u{1ee42}'), ('\u{1ee47}', '\u{1ee47}'), ('\u{1ee49}',
|
||||
'\u{1ee49}'), ('\u{1ee4b}', '\u{1ee4b}'), ('\u{1ee4d}', '\u{1ee4f}'), ('\u{1ee51}',
|
||||
'\u{1ee52}'), ('\u{1ee54}', '\u{1ee54}'), ('\u{1ee57}', '\u{1ee57}'), ('\u{1ee59}',
|
||||
'\u{1ee59}'), ('\u{1ee5b}', '\u{1ee5b}'), ('\u{1ee5d}', '\u{1ee5d}'), ('\u{1ee5f}',
|
||||
'\u{1ee5f}'), ('\u{1ee61}', '\u{1ee62}'), ('\u{1ee64}', '\u{1ee64}'), ('\u{1ee67}',
|
||||
'\u{1ee6a}'), ('\u{1ee6c}', '\u{1ee72}'), ('\u{1ee74}', '\u{1ee77}'), ('\u{1ee79}',
|
||||
'\u{1ee7c}'), ('\u{1ee7e}', '\u{1ee7e}'), ('\u{1ee80}', '\u{1ee89}'), ('\u{1ee8b}',
|
||||
'\u{1ee9b}'), ('\u{1eea1}', '\u{1eea3}'), ('\u{1eea5}', '\u{1eea9}'), ('\u{1eeab}',
|
||||
'\u{1eebb}'), ('\u{20000}', '\u{2a6d6}'), ('\u{2a700}', '\u{2b734}'), ('\u{2b740}',
|
||||
'\u{2b81d}'), ('\u{2b820}', '\u{2cea1}'), ('\u{2f800}', '\u{2fa1d}')
|
||||
];
|
||||
|
||||
pub fn XID_Start(c: char) -> bool {
|
||||
super::bsearch_range_table(c, XID_Start_table)
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,108 +0,0 @@
|
|||
// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
use std::iter;
|
||||
use test::Bencher;
|
||||
|
||||
use super::UnicodeXID;
|
||||
|
||||
#[cfg(feature = "no_std")]
|
||||
use std::prelude::v1::*;
|
||||
|
||||
#[bench]
|
||||
fn cargo_is_xid_start(b: &mut Bencher) {
|
||||
let string = iter::repeat('a').take(4096).collect::<String>();
|
||||
|
||||
b.bytes = string.len() as u64;
|
||||
b.iter(|| {
|
||||
string.chars().all(UnicodeXID::is_xid_start)
|
||||
});
|
||||
}
|
||||
|
||||
#[bench]
|
||||
fn stdlib_is_xid_start(b: &mut Bencher) {
|
||||
let string = iter::repeat('a').take(4096).collect::<String>();
|
||||
|
||||
b.bytes = string.len() as u64;
|
||||
b.iter(|| {
|
||||
string.chars().all(char::is_xid_start)
|
||||
});
|
||||
}
|
||||
|
||||
#[bench]
|
||||
fn cargo_xid_continue(b: &mut Bencher) {
|
||||
let string = iter::repeat('a').take(4096).collect::<String>();
|
||||
|
||||
b.bytes = string.len() as u64;
|
||||
b.iter(|| {
|
||||
string.chars().all(UnicodeXID::is_xid_continue)
|
||||
});
|
||||
}
|
||||
|
||||
#[bench]
|
||||
fn stdlib_xid_continue(b: &mut Bencher) {
|
||||
let string = iter::repeat('a').take(4096).collect::<String>();
|
||||
|
||||
b.bytes = string.len() as u64;
|
||||
b.iter(|| {
|
||||
string.chars().all(char::is_xid_continue)
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_is_xid_start() {
|
||||
let chars = [
|
||||
'A', 'Z', 'a', 'z',
|
||||
'\u{1000d}', '\u{10026}',
|
||||
];
|
||||
|
||||
for ch in &chars {
|
||||
assert!(UnicodeXID::is_xid_start(*ch), "{}", ch);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_is_not_xid_start() {
|
||||
let chars = [
|
||||
'\x00', '\x01',
|
||||
'0', '9',
|
||||
' ', '[', '<', '{', '(',
|
||||
'\u{02c2}', '\u{ffff}',
|
||||
];
|
||||
|
||||
for ch in &chars {
|
||||
assert!(!UnicodeXID::is_xid_start(*ch), "{}", ch);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_is_xid_continue() {
|
||||
let chars = [
|
||||
'0', '9', 'A', 'Z', 'a', 'z', '_',
|
||||
'\u{1000d}', '\u{10026}',
|
||||
];
|
||||
|
||||
for ch in &chars {
|
||||
assert!(UnicodeXID::is_xid_continue(*ch), "{}", ch);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_is_not_xid_continue() {
|
||||
let chars = [
|
||||
'\x00', '\x01',
|
||||
' ', '[', '<', '{', '(',
|
||||
'\u{02c2}', '\u{ffff}',
|
||||
];
|
||||
|
||||
for &ch in &chars {
|
||||
assert!(!UnicodeXID::is_xid_continue(ch), "{}", ch);
|
||||
}
|
||||
}
|
|
@ -15,7 +15,7 @@ dependencies = [
|
|||
"heapsize 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num-traits 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.8.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -26,7 +26,7 @@ dependencies = [
|
|||
"byteorder 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num-traits 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.8.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -67,7 +67,7 @@ name = "cgl"
|
|||
version = "0.1.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"gleam 0.2.30 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"gleam 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
|
@ -95,7 +95,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
dependencies = [
|
||||
"core-foundation 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.8.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -110,15 +110,15 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "dwrote"
|
||||
version = "0.1.5"
|
||||
version = "0.1.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"gdi32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"lazy_static 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.8.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_codegen 0.8.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_codegen 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
|
@ -136,7 +136,7 @@ dependencies = [
|
|||
"log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num-traits 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.8.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -188,11 +188,11 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gleam"
|
||||
version = "0.2.30"
|
||||
version = "0.2.31"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"gl_generator 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"pkg-config 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -253,7 +253,7 @@ version = "1.1.1"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"error-chain 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"pkg-config 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"toml 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
|
@ -295,7 +295,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
|
||||
[[package]]
|
||||
name = "offscreen_gl_context"
|
||||
version = "0.5.1"
|
||||
version = "0.5.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"cgl 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -303,12 +303,12 @@ dependencies = [
|
|||
"euclid 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"gdi32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"gl_generator 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"gleam 0.2.30 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"gleam 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"lazy_static 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"osmesa-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.8.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"user32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"x11 2.12.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -324,12 +324,12 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "pkg-config"
|
||||
version = "0.3.8"
|
||||
version = "0.3.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "0.3.11"
|
||||
version = "0.3.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
|
@ -353,17 +353,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
|
||||
[[package]]
|
||||
name = "serde"
|
||||
version = "0.8.22"
|
||||
version = "0.8.23"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "serde_codegen"
|
||||
version = "0.8.22"
|
||||
version = "0.8.23"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"quote 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"quote 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_codegen_internals 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syn 0.10.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syn 0.10.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syntex 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syntex_syntax 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
@ -373,7 +373,7 @@ name = "serde_codegen_internals"
|
|||
version = "0.11.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"syn 0.10.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syn 0.10.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -387,11 +387,11 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "0.10.6"
|
||||
version = "0.10.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"quote 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"unicode-xid 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"quote 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -482,11 +482,6 @@ name = "unicode-normalization"
|
|||
version = "0.1.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-xid"
|
||||
version = "0.0.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-xid"
|
||||
version = "0.0.4"
|
||||
|
@ -521,15 +516,15 @@ dependencies = [
|
|||
"byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"core-graphics 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"core-text 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"dwrote 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"dwrote 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"euclid 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"fnv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"freetype 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"gleam 0.2.30 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"gleam 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"lazy_static 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num-traits 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"offscreen_gl_context 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"offscreen_gl_context 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"threadpool 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"time 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"webrender_traits 0.11.0",
|
||||
|
@ -543,7 +538,7 @@ dependencies = [
|
|||
"core-foundation 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"euclid 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"fnv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"gleam 0.2.30 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"gleam 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"webrender 0.11.1",
|
||||
"webrender_traits 0.11.0",
|
||||
|
@ -557,13 +552,13 @@ dependencies = [
|
|||
"app_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"core-graphics 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"dwrote 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"dwrote 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"euclid 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"gleam 0.2.30 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"gleam 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"offscreen_gl_context 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.8.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_codegen 0.8.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"offscreen_gl_context 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_codegen 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -607,14 +602,14 @@ dependencies = [
|
|||
"checksum core-foundation-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "065a5d7ffdcbc8fa145d6f0746f3555025b9097a9e9cda59f7467abae670c78d"
|
||||
"checksum core-graphics 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8bd94d0f0b2bbcbfeeb670fc48654afde7a13c2c551ca9d2b9a6cfafdafe1a64"
|
||||
"checksum core-text 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "642fa40165b6c53bbd3f636951ffc3e1a3fd3c47e7d00598523c3e8c9321ed0c"
|
||||
"checksum dwrote 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "570707c940fc7b7fc627011fe2c8abedaea562b03bde715e3ee2dd3d6857a03c"
|
||||
"checksum dwrote 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "b5c3d72c5042f43ee02587b5f3256efc6252c2194fbbb0dfa0bd0b6da2491501"
|
||||
"checksum error-chain 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "318cb3c71ee4cdea69fdc9e15c173b245ed6063e1709029e8fd32525a881120f"
|
||||
"checksum euclid 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0c274f13773ec277a48408d0c7a8dc935ad4bfe190f4cfccd0126d203afc3c83"
|
||||
"checksum fnv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6cc484842f1e2884faf56f529f960cc12ad8c71ce96cc7abba0a067c98fee344"
|
||||
"checksum freetype 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fde23272c687e4570aefec06cb71174ec0f5284b725deac4e77ba2665d635faf"
|
||||
"checksum gdi32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0912515a8ff24ba900422ecda800b52f4016a56251922d397c576bf92c690518"
|
||||
"checksum gl_generator 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f1d8edc81c5ae84605a62f5dac661a2313003b26d59839f81d47d46cf0f16a55"
|
||||
"checksum gleam 0.2.30 (registry+https://github.com/rust-lang/crates.io-index)" = "6af023107aa969ccf8868a0304fead4b2f813c19aa9a6a243fddc041f3e51da5"
|
||||
"checksum gleam 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)" = "7a3023edde169b7767a71d2e5dd8e8903ac3b1436ff659225310928db87d6a8a"
|
||||
"checksum heapsize 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "5a376f7402b85be6e0ba504243ecbc0709c48019ecc6286d0540c2e359050c88"
|
||||
"checksum idna 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1053236e00ce4f668aeca4a769a09b3bf5a682d802abd6f3cb39374f6b162c11"
|
||||
"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
|
||||
|
@ -625,17 +620,17 @@ dependencies = [
|
|||
"checksum matches 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "efd7622e3022e1a6eaa602c4cea8912254e5582c9c692e9167714182244801b1"
|
||||
"checksum metadeps 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "829fffe7ea1d747e23f64be972991bc516b2f1ac2ae4a3b33d8bea150c410151"
|
||||
"checksum num-traits 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)" = "a16a42856a256b39c6d3484f097f6713e14feacd9bfb02290917904fae46c81c"
|
||||
"checksum offscreen_gl_context 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2fe2fe54ba2b6ea8f43a17b16c13168c5bbf008e0fc91b34122a11f637e2728a"
|
||||
"checksum offscreen_gl_context 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2092c6bb5550536a097c5b413a2c36e141bc63c85c0a40944a182c1912d69397"
|
||||
"checksum osmesa-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "88cfece6e95d2e717e0872a7f53a8684712ad13822a7979bc760b9c77ec0013b"
|
||||
"checksum pkg-config 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8cee804ecc7eaf201a4a207241472cc870e825206f6c031e3ee2a72fa425f2fa"
|
||||
"checksum quote 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)" = "48f961356de2df29263e751df9e2e2493bd765e57fce250cc8b8dcef53ed33c0"
|
||||
"checksum pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "3a8b4c6b8165cd1a1cd4b9b120978131389f64bdaf456435caa41e630edba903"
|
||||
"checksum quote 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)" = "e7b44fd83db28b83c1c58187159934906e5e955c812e211df413b76b03c909a5"
|
||||
"checksum redox_syscall 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "8dd35cc9a8bdec562c757e3d43c1526b5c6d2653e23e2315065bc25556550753"
|
||||
"checksum rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "237546c689f20bb44980270c73c3b9edd0891c1be49cc1274406134a66d3957b"
|
||||
"checksum serde 0.8.22 (registry+https://github.com/rust-lang/crates.io-index)" = "f1e4aab5b62fb90ac9c99d5a55caa7c37e06a15d1b189ccc2b117782655fd11f"
|
||||
"checksum serde_codegen 0.8.22 (registry+https://github.com/rust-lang/crates.io-index)" = "200c97dd86298518356c694869a7a51af1de398bd6c6dcce89fa21a512fdea44"
|
||||
"checksum serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)" = "9dad3f759919b92c3068c696c15c3d17238234498bbdcc80f2c469606f948ac8"
|
||||
"checksum serde_codegen 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)" = "a4c5d8a33087d8984f9535daa62a6498a08f6476050b00ab9339dd847e4c25cc"
|
||||
"checksum serde_codegen_internals 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "afad7924a009f859f380e4a2e3a509a845c2ac66435fcead74a4d983b21ae806"
|
||||
"checksum shared_library 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fb04126b6fcfd2710fb5b6d18f4207b6c535f2850a7e1a43bcd526d44f30a79a"
|
||||
"checksum syn 0.10.6 (registry+https://github.com/rust-lang/crates.io-index)" = "17134635792e6a2361f53efbee798701796d8b5842c1c21b7cdb875e2950c8fc"
|
||||
"checksum syn 0.10.7 (registry+https://github.com/rust-lang/crates.io-index)" = "e5aaf7e4a0f90d7285445c881dcc28f1a510e4962b4ffcdde17f5775b2960df6"
|
||||
"checksum syntex 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb3f52553a966675982404dc34028291b347e0c9a9c0b0b34f2da6be8a0443f8"
|
||||
"checksum syntex_errors 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dee2f6e49c075f71332bb775219d5982bee6732d26227fa1ae1b53cdb12f5cc5"
|
||||
"checksum syntex_pos 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8df3921c7945dfb9ffc53aa35adb2cf4313b5ab5f079c3619b3d4eb82a0efc2b"
|
||||
|
@ -646,7 +641,6 @@ dependencies = [
|
|||
"checksum toml 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "736b60249cb25337bc196faa43ee12c705e426f3d55c214d73a4e7be06f92cb4"
|
||||
"checksum unicode-bidi 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c1f7ceb96afdfeedee42bade65a0d585a6a0106f681b6749c8ff4daa8df30b3f"
|
||||
"checksum unicode-normalization 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "26643a2f83bac55f1976fb716c10234485f9202dcd65cfbdf9da49867b271172"
|
||||
"checksum unicode-xid 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "36dff09cafb4ec7c8cf0023eb0b686cb6ce65499116a12201c9e11840ca01beb"
|
||||
"checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc"
|
||||
"checksum url 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f024e241a55f5c88401595adc1d4af0c9649e91da82d0e190fe55950231ae575"
|
||||
"checksum user32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4ef4711d107b21b410a3a974b1204d9accc8b10dad75d8324b5d755de1617d47"
|
||||
|
|
|
@ -13,7 +13,7 @@ dependencies = [
|
|||
"heapsize 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num-traits 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.8.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -24,7 +24,7 @@ dependencies = [
|
|||
"byteorder 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num-traits 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.8.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -65,7 +65,7 @@ name = "cgl"
|
|||
version = "0.1.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"gleam 0.2.30 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"gleam 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
|
@ -93,7 +93,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
dependencies = [
|
||||
"core-foundation 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.8.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -108,15 +108,15 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "dwrote"
|
||||
version = "0.1.5"
|
||||
version = "0.1.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"gdi32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"lazy_static 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.8.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_codegen 0.8.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_codegen 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
|
@ -134,7 +134,7 @@ dependencies = [
|
|||
"log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num-traits 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.8.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -186,11 +186,11 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gleam"
|
||||
version = "0.2.30"
|
||||
version = "0.2.31"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"gl_generator 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"pkg-config 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -251,7 +251,7 @@ version = "1.1.1"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"error-chain 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"pkg-config 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"toml 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
|
@ -282,7 +282,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
|
||||
[[package]]
|
||||
name = "offscreen_gl_context"
|
||||
version = "0.5.1"
|
||||
version = "0.5.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"cgl 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -290,12 +290,12 @@ dependencies = [
|
|||
"euclid 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"gdi32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"gl_generator 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"gleam 0.2.30 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"gleam 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"lazy_static 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"osmesa-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.8.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"user32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"x11 2.12.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -311,12 +311,12 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "pkg-config"
|
||||
version = "0.3.8"
|
||||
version = "0.3.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "0.3.11"
|
||||
version = "0.3.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
|
@ -340,17 +340,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
|
||||
[[package]]
|
||||
name = "serde"
|
||||
version = "0.8.22"
|
||||
version = "0.8.23"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "serde_codegen"
|
||||
version = "0.8.22"
|
||||
version = "0.8.23"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"quote 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"quote 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_codegen_internals 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syn 0.10.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syn 0.10.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syntex 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syntex_syntax 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
@ -360,7 +360,7 @@ name = "serde_codegen_internals"
|
|||
version = "0.11.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"syn 0.10.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syn 0.10.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -374,11 +374,11 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "0.10.6"
|
||||
version = "0.10.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"quote 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"unicode-xid 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"quote 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -469,11 +469,6 @@ name = "unicode-normalization"
|
|||
version = "0.1.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-xid"
|
||||
version = "0.0.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-xid"
|
||||
version = "0.0.4"
|
||||
|
@ -508,15 +503,15 @@ dependencies = [
|
|||
"byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"core-graphics 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"core-text 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"dwrote 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"dwrote 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"euclid 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"fnv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"freetype 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"gleam 0.2.30 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"gleam 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"lazy_static 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num-traits 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"offscreen_gl_context 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"offscreen_gl_context 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"threadpool 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"time 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"webrender_traits 0.11.0",
|
||||
|
@ -530,7 +525,7 @@ dependencies = [
|
|||
"core-foundation 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"euclid 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"fnv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"gleam 0.2.30 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"gleam 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"webrender 0.11.1",
|
||||
"webrender_traits 0.11.0",
|
||||
|
@ -544,13 +539,13 @@ dependencies = [
|
|||
"app_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"core-graphics 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"dwrote 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"dwrote 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"euclid 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"gleam 0.2.30 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"gleam 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"offscreen_gl_context 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.8.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_codegen 0.8.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"offscreen_gl_context 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_codegen 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -594,14 +589,14 @@ dependencies = [
|
|||
"checksum core-foundation-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "065a5d7ffdcbc8fa145d6f0746f3555025b9097a9e9cda59f7467abae670c78d"
|
||||
"checksum core-graphics 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8bd94d0f0b2bbcbfeeb670fc48654afde7a13c2c551ca9d2b9a6cfafdafe1a64"
|
||||
"checksum core-text 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "642fa40165b6c53bbd3f636951ffc3e1a3fd3c47e7d00598523c3e8c9321ed0c"
|
||||
"checksum dwrote 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "570707c940fc7b7fc627011fe2c8abedaea562b03bde715e3ee2dd3d6857a03c"
|
||||
"checksum dwrote 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "b5c3d72c5042f43ee02587b5f3256efc6252c2194fbbb0dfa0bd0b6da2491501"
|
||||
"checksum error-chain 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "318cb3c71ee4cdea69fdc9e15c173b245ed6063e1709029e8fd32525a881120f"
|
||||
"checksum euclid 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0c274f13773ec277a48408d0c7a8dc935ad4bfe190f4cfccd0126d203afc3c83"
|
||||
"checksum fnv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6cc484842f1e2884faf56f529f960cc12ad8c71ce96cc7abba0a067c98fee344"
|
||||
"checksum freetype 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fde23272c687e4570aefec06cb71174ec0f5284b725deac4e77ba2665d635faf"
|
||||
"checksum gdi32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0912515a8ff24ba900422ecda800b52f4016a56251922d397c576bf92c690518"
|
||||
"checksum gl_generator 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f1d8edc81c5ae84605a62f5dac661a2313003b26d59839f81d47d46cf0f16a55"
|
||||
"checksum gleam 0.2.30 (registry+https://github.com/rust-lang/crates.io-index)" = "6af023107aa969ccf8868a0304fead4b2f813c19aa9a6a243fddc041f3e51da5"
|
||||
"checksum gleam 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)" = "7a3023edde169b7767a71d2e5dd8e8903ac3b1436ff659225310928db87d6a8a"
|
||||
"checksum heapsize 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "5a376f7402b85be6e0ba504243ecbc0709c48019ecc6286d0540c2e359050c88"
|
||||
"checksum idna 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1053236e00ce4f668aeca4a769a09b3bf5a682d802abd6f3cb39374f6b162c11"
|
||||
"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
|
||||
|
@ -612,17 +607,17 @@ dependencies = [
|
|||
"checksum matches 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "efd7622e3022e1a6eaa602c4cea8912254e5582c9c692e9167714182244801b1"
|
||||
"checksum metadeps 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "829fffe7ea1d747e23f64be972991bc516b2f1ac2ae4a3b33d8bea150c410151"
|
||||
"checksum num-traits 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)" = "a16a42856a256b39c6d3484f097f6713e14feacd9bfb02290917904fae46c81c"
|
||||
"checksum offscreen_gl_context 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2fe2fe54ba2b6ea8f43a17b16c13168c5bbf008e0fc91b34122a11f637e2728a"
|
||||
"checksum offscreen_gl_context 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2092c6bb5550536a097c5b413a2c36e141bc63c85c0a40944a182c1912d69397"
|
||||
"checksum osmesa-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "88cfece6e95d2e717e0872a7f53a8684712ad13822a7979bc760b9c77ec0013b"
|
||||
"checksum pkg-config 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8cee804ecc7eaf201a4a207241472cc870e825206f6c031e3ee2a72fa425f2fa"
|
||||
"checksum quote 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)" = "48f961356de2df29263e751df9e2e2493bd765e57fce250cc8b8dcef53ed33c0"
|
||||
"checksum pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "3a8b4c6b8165cd1a1cd4b9b120978131389f64bdaf456435caa41e630edba903"
|
||||
"checksum quote 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)" = "e7b44fd83db28b83c1c58187159934906e5e955c812e211df413b76b03c909a5"
|
||||
"checksum redox_syscall 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "8dd35cc9a8bdec562c757e3d43c1526b5c6d2653e23e2315065bc25556550753"
|
||||
"checksum rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "237546c689f20bb44980270c73c3b9edd0891c1be49cc1274406134a66d3957b"
|
||||
"checksum serde 0.8.22 (registry+https://github.com/rust-lang/crates.io-index)" = "f1e4aab5b62fb90ac9c99d5a55caa7c37e06a15d1b189ccc2b117782655fd11f"
|
||||
"checksum serde_codegen 0.8.22 (registry+https://github.com/rust-lang/crates.io-index)" = "200c97dd86298518356c694869a7a51af1de398bd6c6dcce89fa21a512fdea44"
|
||||
"checksum serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)" = "9dad3f759919b92c3068c696c15c3d17238234498bbdcc80f2c469606f948ac8"
|
||||
"checksum serde_codegen 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)" = "a4c5d8a33087d8984f9535daa62a6498a08f6476050b00ab9339dd847e4c25cc"
|
||||
"checksum serde_codegen_internals 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "afad7924a009f859f380e4a2e3a509a845c2ac66435fcead74a4d983b21ae806"
|
||||
"checksum shared_library 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fb04126b6fcfd2710fb5b6d18f4207b6c535f2850a7e1a43bcd526d44f30a79a"
|
||||
"checksum syn 0.10.6 (registry+https://github.com/rust-lang/crates.io-index)" = "17134635792e6a2361f53efbee798701796d8b5842c1c21b7cdb875e2950c8fc"
|
||||
"checksum syn 0.10.7 (registry+https://github.com/rust-lang/crates.io-index)" = "e5aaf7e4a0f90d7285445c881dcc28f1a510e4962b4ffcdde17f5775b2960df6"
|
||||
"checksum syntex 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb3f52553a966675982404dc34028291b347e0c9a9c0b0b34f2da6be8a0443f8"
|
||||
"checksum syntex_errors 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dee2f6e49c075f71332bb775219d5982bee6732d26227fa1ae1b53cdb12f5cc5"
|
||||
"checksum syntex_pos 0.54.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8df3921c7945dfb9ffc53aa35adb2cf4313b5ab5f079c3619b3d4eb82a0efc2b"
|
||||
|
@ -633,7 +628,6 @@ dependencies = [
|
|||
"checksum toml 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "736b60249cb25337bc196faa43ee12c705e426f3d55c214d73a4e7be06f92cb4"
|
||||
"checksum unicode-bidi 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c1f7ceb96afdfeedee42bade65a0d585a6a0106f681b6749c8ff4daa8df30b3f"
|
||||
"checksum unicode-normalization 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "26643a2f83bac55f1976fb716c10234485f9202dcd65cfbdf9da49867b271172"
|
||||
"checksum unicode-xid 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "36dff09cafb4ec7c8cf0023eb0b686cb6ce65499116a12201c9e11840ca01beb"
|
||||
"checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc"
|
||||
"checksum url 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f024e241a55f5c88401595adc1d4af0c9649e91da82d0e190fe55950231ae575"
|
||||
"checksum user32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4ef4711d107b21b410a3a974b1204d9accc8b10dad75d8324b5d755de1617d47"
|
||||
|
|
Загрузка…
Ссылка в новой задаче