text:
Why Do Takfiris Destroy Historic Sites? – Mubaraz Ahmed
The Temple of Bel in Palmyra, considered to be one of the most well-preserved structures in the ancient city, has joined the growing list of historic sites to be razed by ISIS. In 2015, satellite images released by the UN showing before and after the demolition reveal the sheer scale of the devestation. The city is one of the ancient world's most important cultural centres and has stood for 2000 years. But ISIS' actions are not just acts of extreme vandalism. The destruction is part of an overall strategy and ISIS makes clear that, in its eyes, it is religiously justifiable. In a similar act, another Takfiri movement, Taliban in Afghanistan, had destroyed the historic Buddha statues.
Salafi Ideology
The Salafi ideology espoused by ISIS centres on returning Islam to what the group believes it was like during the time of the Prophet Mohammad. This means two main applications: emphasising monotheism (Tawhid) and eradicating any form of association with God (Shirk or polytheism).
ISIS believes the presence of cultural sites violates these creeds. They used the notion of eradicating shirk in their justification for destroying the shrine of the prophet Jonah in Mosul in July 2014 as well as the shrine of Imam Nawawi in Syria in January 2015. ISIS views shrines like these as an affront to monotheism. The demolition of shrines by ISIS runs opposite to the thought of many Sunni, Shia, and Sufi Muslims around the world who have venerated shrines for centuries. ISIS' extremist activities are indeed an attack on the world's heritage, but this heritage includes many historic sites that hold great importance in popular Islam, and as a result highlight the distance between the group and mainstream Muslims.
The justification for these acts is often linked to the time of the Prophet Mohammad in which, according to hadith literature, he destroyed idols and images depicting pagan deities in the Kaba after the conquest of Mecca. However, according to early Islamic historians, images of Jesus, Mary, and Abraham inside the Kaba were kept on the orders of the prophet himself.
There is scant regard for the example of the early Muslims.
Furthermore, when the companions of the prophet and earlier generations of Muslims conquered lands containing historic sites like Petra, Nimrud, the Pyramids of Giza, the Bamiyan Buddhas and Palmyra, they did not feel compelled to destroy the historical monuments. In actuality it is a Salafi-jihadi interpretation that considers any historical artefact that is culturally or religiously alien to be an invitation to polytheism, even if no one has worshiped it for millennia – if ever. In this case there is scant regard for the example of the early Muslims that are so highly regarded by ISIS in their propaganda.
Historic sites are being targeted by ISIS because of the cultural and religious significance they have to certain communities. Sites belonging to Shia, Sufi Sunni, Kurdish (Sunni), Yezidi and Christian communities have been subjected to destruction and looting. The clear message is that they are now irrelevant; the cultural and ethnic legacies of these people have no place in the 'caliphate.'
Historically, Islamic caliphates such as the Ottomans and the Abbasids accommodated religious and ethnic diversity among their subjects. This is further evidence, if it was needed, that ISIS' claim of an Islamic caliphate is entirely out of line with Islamic tradition
Revered historic buildings and monuments that point to the glories of past civilisations are an ideological threat to the caliphate that ISIS believes surpasses them all. In ISIS' view there should be nothing that can challenge its legitimacy, whether Christian, Shia, Sufi or anything else. With a clean slate, ISIS seeks to present to future generations a new version of history, in which its binary narrative of ISIS heroes fighting evil will be able to flourish. Obliterating historic sites is an attempt to create a blank canvas for ISIS to build on: a new beginning.
Grabbing Headlines
As the reaction of the world has shown, ISIS has again captured our attention. The loss of human life has become such a regular feature in the coverage of conflict that it often takes something beyond the ordinary to draw attention. The international condemnation following the destruction at Nimrud and the museum in Mosul showed the depth of feeling this action deliberately intended to stir up.
This attention-grabbing strategy mirrors the way that ISIS publicises its violence. While the objective of execution can be achieved through more conventional means, ISIS employs methods that will provoke outrage among the international community, thus attracting the attention they seek.
While the scale of destruction has been extensive, ISIS has also utilised the antiquities to finance its operations. Iraqi security officials discovered that ISIS, prior to seizing Mosul, had taken 36 million dollars from an area called al-Nabuk, famous for its 8,000 years old antiquities. UNESCO estimates that the international trade in conflict antiquities could be worth over 2 billion dollars.
In February 2015 the United Nations Security Council prohibited the trade in artefacts looted from Syria since 2011 and Iraq since 1990, but this has not stopped the smuggling. Despite its ideological framework, when potential funding avenues for ISIS emerge, it is just business.
Unless efforts are made to uproot ISIS' ideology and to dismantle its claims of religious legitimacy, such destruction will continue. The group's actions are not in keeping with Islamic tradition and instead demonstrate a deviation from the rich, historic legacy of previous generations of Muslims. The destruction wreaked by ISIS is an attack on the shared history of human civilisation, and as such is just as much an affront to Muslims as it is to the rest of the world.
May 3, 2020 May 4, 2020 AdminHistory, Salafi Wahhabi, Sectarian Diversity, Takfiris
Previous Previous post: ISIS Magazine Targets Sunni 'Apostates'
Next Next post: How Takfiri Islamist Extremists Target Civilians


One-of-a-kind jewelry, charcoal, watercolor, custom gift baskets, Sacred Embers cremation jewelry.
Interpretation of local and country history -- military & civilian, and a 4-building museum.
Experience a self-guided tour through this 10-acre garden estate. Highlights include rare and native plants, statuary and Thomas Church architecture.
Live theatre performances year around. For more information on what's playing or to try out for a production, please call us!
Aviation museum, war relics with pieces from US Civil War, Indian War, WWI & WWII, Korea & Vietnam eras. Also displaying Babylonian, Roman, Greek & Egyptian antiquities.
A popular sports bar for locals serving sandwiches, burgers, nachos and seafood. Weekend entertainment ranges from DJ's to comedians. Full service bar.
Header photography by Andrea Kay Vangor.


text:
Q: Consumir vários WebServices com PHP ao mesmo tempo (SOAP e REST) Basicamente, eu preciso consumir vários Web Services e, em seguida, fazer um merge dos resultados.
Eu estava usando cURL com PHP pra fazer as requisições, mas conforme o número de Web Services aumentou, o meu serviço ficou mais lento, já que era necessário esperar por uma resposta e, só depois, fazer o pedido para o próximo Web Service.
Eu resolvi esse problema usando curl_multi e tudo estava funcionando corretamente.
O que acontece é que eu tenho novos Web Services para adicionar ao meu serviço, mas esses novos usam o protocolo SOAP e eu não estou conseguindo mais fazer requests simultâneos, porque pra consultar Web Services SOAP eu uso SoapClient e não cURL.
Eu sei que eu posso fazer o XML do SOAP "na mão" e depois enviá-lo junto com os outros usando cURL, mas isso me parece uma má prática.
Resumindo, há alguma maneira de consumir Web Services REST e SOAP simultaneamente com PHP?
Fiz esta mesma pergunta no SO_en, mas não obtive nenhuma resposta.

redpajama_set_name: RedPajamaStackExchange


text:
Marketing and Consumer Behavior
Poole Podcast
Poole Thought Leadership Newsletter
Poole Home
Poole Podcast Season 2, Episode 1: The Future of Work with Beth Ritter and…
facebook twitter linked in email
Poole Podcast Season 2, Episode 1: The Future of Work with Beth Ritter and Teena Piccione
February 22, 2022 capowel2
We've heard the term "The Great Resignation," and some would argue that it should be called "The Great Reshuffle" because employees aren't leaving the workforce – they're finding the greener grass at another company. So what can employers do to build an attractive corporate culture and retain talent?
Episode Transcription
Teena Piccione: As employers, we're also going to have to pivot and change to ensure we're meeting people where they are. And if we don't, we are going to continue to lose the best talent that I've seen.
Beth Ritter: COVID is just one example that created ambiguity, but in general change, and restructuring in an organization or a new job or any of those things. There's going to be times when you don't know the answers, and you have to sort of get comfortable with that. And what I tell them is, that's often when the most growth occurs that we have to figure your way through it.
Jenny Hammond: Today, we are kicking off our First Episode of Season Two of the Poole Podcast. This season, we're going to continue our conversations about the work our faculty and staff are doing to impact industry and the greater good. I'm looking forward to today's conversation with two very special guests. Our faculty guest, Beth Ritter, is a professor of practice in the Department of Management Innovation and Entrepreneurship here in Poole College. Prior to joining Poole, Beth was the Senior Vice President of Human Resources for Burt's Bees, where she was a part of the management team that sold the business to Clorox. Previously, Beth provided HR leadership and support to the global supply chain for the Campbell Soup Company. While there she also supported their food services business and led the occupational health, safety and wellness strategies. Prior to that role, she provided HR support to food businesses of the Nebraska brands company. A few brands you might recognize that she worked with include Planter's Peanuts, Life Savers Confections, Cream of Wheat, A1 Steak Sauce, and Grey Poupon Mustard. Our industry guest today is Teena Piccione, who is currently the Managing Director, Telco Media Entertainment and gaming at Google Cloud. She has led fortune 100 companies and embracing a digitally enabled world across platforms and products, including rescaling workforces to embrace the changes for the success of the employees in the businesses. She is a strong advocate of creating a culture where employees come to work excited every day and are inspired to do more once they're there. As I seen her female executive in a male dominated industry, Teena is dedicated to breaking through barriers for women in STEM fields. She founded and contributed to the try STEM 2020 initiative to make the Raleigh Durham area a destination for female STEM professionals, and forge new pathways for women and girls. She has also been recognized for work in diversity and inclusion both at AT&T, Fidelity, RTI, international, and Google. And we're lucky because Teena is currently an advisory board member of our executive education, women and technical leadership program here in Poole. Welcome, Beth and Teena. Now let's get started. So, Beth, you are a professor currently in the Poole College of Management, as we've heard in our intro, and HR, and you're a former executive, and HR. So I'd be curious to hear your thoughts on what we're hearing in the news about the great resignation. What is that, and why is it such a big deal?
Beth Ritter: Sure. Thanks, Jenny. So first, let me give credit, a psychologist out of Texas A&M named Anthony Clots is the person who sort of coined that phrase, the great resignation. And what he predicted was sort of an unprecedented increase in voluntary resignations. And that is what we seem to be seeing. But as you can imagine, it looks different across different industries. So I pulled one study, and it said, for example, that the apparel retail industry has incurred a 19% amount of turnover. And you can imagine that's different than say, health systems, which were at 6%. So what I'm beginning to hear now, instead of the great resignation is actually a term called "The Great Reshuffle". Because what's happening is that people really aren't leaving the workforce to stay home. But they're actually changing employers. And so if you picture say, the software industry, which I found was at say, a 13% turnover rate, those are folks that are leaving one software firm and moving to another. And so that's the opportunity for folks, because they can either change firms, or if somebody in their firm leaves and goes to another firm, there's now an opening that they can be considered for inside their own firm. So I think for some industries, again, like software, for example, it feels like a lot of opportunity. Of course for some other industries like fast food restaurants and things that were really impacted by COVID, and have still maybe have some safety issues and concerns, it doesn't feel that way. It doesn't feel like opportunity to them, it feels like a labor shortage, and they're unable to deliver the products and services they need. So it feels different, I think depending on which industry you're in. But that's sort of what's going on with this great resignation or great reshuffle.
Jenny Hammond: So it's interesting, because I know Teena, you talk a lot about or you're a huge advocate for positive work cultures. And so tagging along to what Beth said, it sounds like, most people aren't leaving they're choosing to go to a different culture. So why do people change jobs, if it's not pay? What are some of those key reasons that people say, you know what, I am ready to move on?
Teena Piccione: Thanks, Jenny. And great answer Beth on yours too. So mine is, are you impactful? Are you making a difference? And are you making a difference for you? Are just you feel an overwhelming oppression for where you are? And if you think about it, that's really what's happened across the nation because of COVID. We're all stuck in homes, and we're stuck on videos. And we every now and then when it temps down, we get the excitement and the lore of being able to go back and have a bit of normalcy. And that's where people start saying, am I impactful where I'm at? Can I do something different? Is there somewhere where my purpose is so well defined? That when I look back my legacy, or as I say, my dash, from the moment you're born to the moment you die, what's the in the middle is what matters? And what is your legacy? And if it's something that you look back, and you say, that's not where I want to have my retirement party, people are changing, and people are changing, because they want to be able to say, this is what I did. This is my legacy. This is how I made an impact. This is how I made a difference. And I think that is really causing a lot of change and churn in our industry right now.
Jenny Hammond: And Teena, it's interesting, we did some interviews of employees, students, and I interviewed employees about their COVID experiences. And it's actually very similar to what you described, they said that working from home had some positives and some negatives. The positives were that they had more autonomy over their work, they were even able to reinvent their work, and find a little more meaning in it, and maybe get rid of some of that tedious stuff that they didn't enjoy. The negatives though, that they shared with us was the sense of maybe being out of sight. And what would happen, would they still be called on when there were big decisions to be made, or would they be considered for a promotion if they were working remotely? And maybe a little less seen or a little less top of mind for folks? Are you seeing or hearing anything about that?
Teena Piccione: Oh, absolutely. And I think too, we've lost our boundaries. If you think about it, we used to have to drive into work, we drove home. We'd have listened to podcast in the car, we've lost the boundaries of what work and life balance means, and we're now tethered. And as soon as a ping our text comes in, we feel the urgency to show up an answer because maybe it's the promotion, or maybe they're asking our opinion. And when that doesn't happen, because again, it's not the natural, I pass you in the hallway, and it's a coffee talk, our water break. So because of that people feel that they're hidden, and they have no way of getting that promotion or no way of showing their worth. And I think that's what's really impactful. So I love your insights, because you're absolutely spot on. And when people have resigned that are under me, that's exactly what I keep hearing. I want the promotion, I didn't feel a path. I didn't think there was a place to go. And it's very hard because again, you have large organizations and people get lost.
Jenny Hammond: Would be a bit of advice for people right now be to make sure they're clear with their managers and their sponsors that they are interested in promotional opportunities, or even growth opportunities is the word I sometimes encourage people to use instead of promotion, that they want to keep learning and growing.
Teena Piccione: I would say it two ways. I love that because number one, if you're not talking about it, nobody knows about it. And just because you think it in your head doesn't mean that anybody can hear it. So you have to articulate the fact that I'm looking for a promotion, or if there isn't a path here, where can you help me with the path to my desires? Make it your manager's issue, make it your managers desire to help you grow. And I think that's a big part of it, whether it's do I need additional classes? Do I need to lead a team? Is there a volunteer 20% project I can do on my own, that I'm still leading and growing? What things can I do to enable that? And the other thing, I give advice, and I give it to my own team, and I take it myself, twice a year interview internally and externally. And people always laugh and say why? Well, two reasons. One, where you have to do your performance review, at least once a year, a minimum, sometimes more than once, depending on your company. It gives you a way of writing down everything you've done, and looking at your accomplishments, and you'll probably be surprised at how much you have. Secondarily, it also helps validate your worth. When you're talking to external companies, it does two things, it validates. I think I like where I'm at, I just need to make a few tweaks and changes in order to make it work better for me. And secondarily, you'll find out either your salary is just spot on where it should be, or you're well underpaid, or you're overpaid. Either way you have data, in fact, to be able to go forward. And I think that's what we miss sometimes. And you're able to communicate with people and have the conversation and you're well attuned to practice those questions that you can then turn around and use on your manager, because the first thing you're going to ask in an interview is, is there a promotion path for me and a new job? That's the type of interaction that you need to have with your manager. So if you're not practicing it, we're not good at it. I practice all of these things. So I think it's a matter of how do you practice in such a way that you're going to be well attuned? And then how do you do it and practice to where it becomes effortless when you have the conversations with your manager.
Jenny Hammond: Beth had mentioned to me when we were prepping for this podcast, I thought this concept was so cool that you have a personal advisory board.
Teena Piccione: I do.
Jenny Hammond: What is that? Because it sounds like this could be a great tool to use for some of the conversations that could be had with your manager.
Teena Piccione: Great point. So my personal advisory board, and it's from all industry, and it's male and female, because I think that we sometimes lack perspectives, unless we're asking different perspectives of different people. So one thing that I do is take it to my board and just think about it a Company or University has a board of directors. I went out and ask people, would you be a part of my board? Can I seek advice or opinions? Not every day. But enough that when I have a need, I can call you and ask and seek your opinion. And I do this because I bounce ideas. And sometimes they'll say what do you think about this opportunity? And the board at times will say, absolutely go for it. And then other times to be like you have lost your flipping mind. And I think it's important to understand their perspective. Because I'm always like, why? And they're like, because if you do that you're taking a step back, or you're taking yourself out of where you should be for the role that you're that we see you that you can be more of. And I think getting those opinions matter. And I think we just don't do it enough. And we realistically have to listen, because there are times when I'm like, but, but, but, but, but they're like it too hard No, and here's why. And then I have to take a step back and reflect and say, gosh, you know what, I think they're right. I think that wouldn't be a misstep, I think that would be a bad move. I don't think that's really where I need to be, whether it's the company isn't right, or the culture is different, or the position doesn't set me up for something bigger in the future. And I think having that really enables me to be able to take that moment of reflection to say, okay, what's next? And it also allows me when I'm in a problem spot to say, what would you do in my place? And, look, you have a trusted advisory board, and I keep it between five and seven people, and I keep an odd number for a reason. That way I have to be the tiebreaker.
Beth Ritter: There we go
Teena Piccione: If everybody has a different way. So as you think about it, it just gives you a natural way to ask questions. And it has to be in a trusted advisory group, because you're going to tell them what you're not telling your manager. What you're not telling your co-workers, but you're not telling anyone else and they have to enable and help you and trust that and it also enables like, I have it to where you'll laugh, we can 911 a problem at any point in time, and we drop everything to help, and that has served me well. And I rarely do it. I've done it twice in my career. And I can tell you people were so stunned when I did it that they dropped everything to get on the call. And that gives you that sense of have a way to always have a way out or you have a path to have an answer. So anyway, I know I talked way too long but that was my passion is ensuring everybody starts doing that.
Jenny Hammond: No, I think that's great. And in fact, I wish I just would have known that, when I was graduating college, it was funny when you said, the piece about interviewing, I had a favorite business professor. And I thought he had lost his rocks when he said this, but he said, apply for a job every year, even if you love your job, apply for it. And so I try to give that advice now to when we have interns. And I think it's great. It allows your interview skills to stay sharp, it does continue to advocate for yourself and your worth. So I think all of those are great pieces of advice. I want to pivot just quickly. I don't want to go too far away back from the work from home. And Beth, I'd be curious to know what you're seeing in your research, next month will be two years that we've been living in this pandemic, so much for it being a two-week thing. But what's come out of this, as we talked about is this work from home revolution. And I'm seeing it and just peers and hearing of people that their requirements now if they're going to take a job require some sort of work from home or hybrid type of option, because they've learned that that's something they really want to do. I'd be curious to hear what you're seeing from the research side of what does that mean for the employee? And then how are companies pivoting to adjust to that, knowing that people don't want to come back to the office five days a week? How is that changing company cultures and recruitment moving forward?
Beth Ritter: Well, Jenny, two things come to mind. They're gonna sound very different. So that's why I sort of thought I'd preface it. The first was I have a friend who's been a recruiter forever. And she said, it's the busiest time she's ever had in her 20 plus year career, and that she's now seeing that applicants will say no, if an employer won't offer some type of remote work, and she said, she hadn't seen that before. And when she was sharing it with me, it reminded me of what happened after 9/11. So some of us were at work when 9/11 occurred in our country. And what I saw then, was that people were saying, I won't relocate as much as I used to, I need to be closer to home, family's really important to me, I need to be closer to home. And so asking a candidate to relocate from Canada to the United States or whatever was sort of a no not interested, I won't even talk to the company about it, if that's required. And now I think it's this remote workpiece, that's now going to be really that an employer has to offer that to be competitive in this labor shortage kind of environment, we opened the session with. The other thing that I found another interesting conversation I had with an HR professional, he works in a manufacturing firm. And I talked with him really early in the pandemic. And he said he was already working on his remote work policy. And I'm hearing a lot of people are calling it a dynamic work policy is the language that's coming up. And I was surprised in a manufacturing environment that he was already doing this. And I kind of said, tell me more. And he said, well, I feel like he saw it coming. I guess he thought he knew we were going to be at the two-year mark Jen. And he said, I feel like I've got to get these policies set up and ready to go. It's not going to be just a temporary thing. And I said, but even in manufacturing, and he said, yeah, even in manufacturing, of course, we have some jobs that have to be here all the time. But we all have lots of jobs that don't. And he said we need to begin to think about it, we need to get the applications processes going so that we can be clear with expectations, which I think is really important, when you set up these hybrid work agreements, is that there's clear understanding on both sides about what are the expectations as we go into it. And that's what his policy was set up to do. And so those are two thoughts that came to my mind as you asked that is, I think employers need to they haven't got their policy yet. They definitely need to be pulling on together. They need to as to be able to attract talent and retain it. And I think they also need to then in their policies include ways to be clear about what are the expectations from both sides in the arrangement.
Jenny Hammond: One question I have back, do you in the research and in your talking to people, do you see women impacted more than our male counterparts? And the reason I'm asking is women tend to have to take care of the kids more and they're doing multiple roles because daycare sometimes isn't an option, or their school is gone remote are lots of different reasons. But do you see a bigger impact on the female population than the male population?
Beth Ritter: I don't have any statistics in front of me to sort of speak to, but what I'm reading is that yes, that a lot of women have set their careers aside to stay home, especially when schools were remote is what my sense is. And so I think, another interesting example, although we have an employer in the area, who has what are called returnships, and what those are for people who do have to maybe take a break, or want to take a break from work, and are ready to return. And this is a technology firm. And so what this returnship does is allow somebody to build new skills to return to work in a new career of technology, for example. And so I think creative ideas like that for firms are going to be really important. Because I do you think we're going to find gaps in resumes, if you will. And I actually, I think, just on LinkedIn the other day, I saw somebody say, I finally saw my first resume that said, that had the COVID gap, if you will on it. And I think as employers, we're going to need to be understanding of that.
Jenny Hammond: Now, that's great. I saw one that said, president of household and parentheses, it was the two years during COVID. And I had never seen that before. And I thought and it said, acted as CEO, COO, and CIO of my household. I thought how true, right.
Beth Ritter: Oh, that's a great one. That's great. Very good question
Jenny Hammond: You know a question coming back to culture. So having these work-from-home environments, what does that do to a company culture? What do you think it will do? Good, bad or indifferent? Because I think along the lines of somebody that may have looked like someone starting out in a job, and maybe they've never been in an office environment, they got their job during COVID. They've been hybrid. I mean, they've been virtual during COVID. How do they feel a part of the culture and the community of an organization when it's mostly been a work-from-home organization?
Teena Piccione: Yeah, that's a great question. And I would tell you, I think in the beginning, people enjoyed back to beth's point, they liked being at home. They liked having that autonomy. They liked being able to get their work done. They liked being able to turn off the computer and go home and not have to sit for an hour or two hours, depending on where you live. And I've lived in most major cities, and it can be up to two hours. So they're not having to do that. So they love that. But then as it dragged on, then we started coming up with these crazy ideas of how to bring people together, whether it was happy hour, whether it was let's, one of my teams they're from California, had never seen a farm. So we put a video in North Carolina to a farm I'm like, these are called goats and sheep. So it's just trying to make it to where they felt a part of something that they weren't. So we've done an amazing amount of things to try to make people feel inclusive and belonging. But I'm going to caveat that. It can't replace the team meetings, seeing people face to face. It can't replace the fact that when I first saw some of the people I hired, I was like, oh my gosh, you're six feet tall. I had no idea. Oh, my goodness, one that surprised me. I had an employee and we see from the neck up. She was eight months pregnant when I saw her for the first time. I had no idea. Because again, we're living in a screen and we have no perception and concept. And so, unfortunately, you take the culture from where you came, more so than getting it from where you are a lot of times because we're not together. And there isn't a way of being able to do it any different. We have buddy systems, we have everything in place to try to make it work. But I think the one or two days that you can get people together. It just reframes resets, what they're doing and let some feel what I would call a bit normal. I didn't travel really a lot until December and I went to multiple offices. And it was funny on my LinkedIn, I posted this one picture and I said, Okay, I don't know whether to hug. I don't know whether to fist bump. I don't know whether to shake your hand. I don't know whether to give you a wet one. I don't know whether to spray you with Lysol, literally because it's not our DNA anymore. So how do we flex the muscles that we came so used to which built the cultures of the companies that we work for? And I think that as it's been two years, we've got to figure out a balance to live through COVID and not live with COVID, and I think there's a big difference. It's how to bring back that culture. I mean, in NC State, the stadiums, you're used to being packed kids everywhere, the excitement, the energy, and smoke that's just missing. So how do we keep it up and give it back? So I think it's, I don't have a solution or an answer. I wish I had a magic button pixie dust and everything in between, but it's going to be hard as we get back.
Beth Ritter: And I think what I hear Teena is it's, it really is going to be this, I guess and a world where have forgotten the best of zoom and the best of in person. And as if you're an employer or a university, make sure we're bringing and putting all of that together. I bumped into a student the other day, your thoughts made me think of it. We were both walking from the parking garage into our building. And it wasn't until he spoke and said, Good Morning, that I recognized his voice. Because I had only ever seen him in zoom. That was without, he had his mask on because we were walking on campus. In zoom would be without a mask. And I finally laughed. He goes, yeah. He said, I'm in it. We've been in two or three classes together. We've never seen each other in person. And it was just funny, like, and I had the same thought, you thought you were taller.
Teena Piccione: We just don't know what to do. And I think that it just becomes and it's sad that we're having to figure it out as we go and figure out what to do. But I think that, tears in how do we start navigating back to be able to bring that chair back and put boundaries back up? I think that's another thing that we've lost. So how do we do it in such a way that's going to work? But I actually to your point past somebody on the street in New York, and they turn and they said, aren't you Teena Piccione? Who are you? Because I'd only seen them on this little screen. And I had to listen for their voice before I was like, oh my gosh, I know who you are. So it just the shock of all of it, of seeing people in person, and actually having a conversation or having sharing a meal. And I think we learned so much that ourselves become that transparent aspect that we just haven't had in a while.
Jenny Hammond: I'll end with this topic, I'll just say this as funny as I have a 10-year-old son, and we're teaching him when he meets people to speak up, introduce himself and shake hands. But the shake hands part, so I read a story in Wall Street Journal several months ago, that was like the handshake is dead. And I feel that way. Sometimes I meet people and I'm like, do I get right? And to your point, Teena, there have been people colleagues I haven't seen in a while and I just said I don't care, I'm giving you a hug, and I just gave him a hug. But it is, we're gonna live in this kind of sticky place for a while before we kind of really figure out what everybody feels comfortable with, for sure. I want to spend a little bit of time kind of wrapping things up here. Because I think this is so critical. You know, this podcast, the intention of it when we started was to have an academic and an industry perspective on relevant topics and business. And we try to always ask questions that we feel could benefit everyone, but specifically students. So students that are in this college-age, and bless these children, I call them children, these kids today, that makes me feel old, all of them have lived through a COVID experience. So, Beth, I'd like to start with you. And in the classroom, what are some of the things that are tools and tips and strategies that you're providing students so that when they go into an environment or an organization, whether it's virtual or in-person, what are the some of the things that you're teaching them, so that they're going to be a great team player and an employee and have the best experience?
Beth Ritter: Well, the first thing we talk about is getting comfortable with ambiguity. We all had to figure this out the last couple years, and COVID is just one example that created an ambiguity, but in general change, and restructuring in an organization or a new job, or any of those things, there's going to be times when you don't know the answers, and you have to sort of get comfortable with that. And what I tell them is that's often when the most growth occurs, but we have to figure your way through it. And so of course, to help them be comfortable with figuring their way through it, we encourage them to use analysis and critical thinking, to an examine what are maybe some of their own biases are going into this situation, what other people's bias might be. The other thing I emphasize is that we're sort of lifelong learners that they need to get comfortable continuously growing that, once they get the degree they're not done, that they're always going to be learning.
Teena Piccione: Okay, so I have to jump in. I am such a big proponent of that. I go out and get Nano Degrees every six months because this is my passion. If I'm not learning somebody else is. They're going to level up. I haven't been if I'm not constantly learning and the other thing to do to make you giggle laugh. So I have two college-age girls. One got one year in before COVID. The other has been through her college career in COVID.
Jenny Hammond: Oh my God, wow.
Teena Piccione: It's been a little bit more challenging. But I would tell you, as we talk to the students, a couple things that I'd say that we have to ensure we instill in them is, you have to go back and to your point thrive in ambiguity. It's the number one question I ask, what I'm asking students, when I'm interviewing them is, how do you thrive in ambiguity? And one of them said, what say ambiguity, not wanting to say you're living in it, my friend, but instead I define it. But I think as we go through, it's giving them the tools and the techniques to be able to do it. And one of my daughters called the other day, oh my gosh, mom, I had this interview. And they said, the professor said, make sure I write a thank you note. And she goes, am I actually supposed to write a thank you note? I'm like, it's called an email and just shoot it over to them and, yes. But and the reason this becomes relevant is because we're on COVID, we're doing things totally different. And I think we've somehow lost some of those basic things that we know. But again, because we're all living in an instantaneous world, we're having to do an act different. It's, gosh, I guess I can do that really quick. But it is a matter of ensuring we're instilling in the next generation how to do it. And trust me, I would hire college kiddos more than anything, and I call them kiddos on right with you, just because of the passion and the energy and the excitement they bring. And the ideas that if we listen, they actually have a lot of good ideas, we have to throw them all on a board and see what sticks the best. And I think having that they just bring a wealth of different newness to the conversation. So I love that and keep sharing the ambiguity. Because if we don't, they're not going to thrive in the environments that we're going to throw them in.
Jenny Hammond: There's a good follow up to that, which is, as someone in the C suite, and you make a lot of hires, how do you know someone's going to be a successful hire? What are some, give us a little nugget so we can pass it along? What are some things that you know, or what are some things that you're absolutely looking for? We have had several different guests on. Actually, that episode was Cindy last year, she said one of the things that she looks for when hiring is curiosity.
Teena Piccione: I love that curiosity, and I would say attitude. Because you have got to come in, and whether you know the answer or not. You've got to come in and be able to command that interview to say I don't know the answer, but I can get it for you. You've got to be comfortable and okay with not knowing but going back with that curiosity and getting it. So I'm not as concerned as whether you're going to know the answer as whether you're going to have the ability to tell me how you're going to get the answer. Because you're not going to know every answer to every question I'm going to throw at you. But you are going to be able to say I'm hoping, I don't know but let me get it for you. Do you mind if I follow back up, or do you mind if you explain a little more, so I understand where you're heading? And I think that gives people that sense of, oh my gosh, they know what they're doing, or they can go figure it out. That's what's gonna make him successful, because I can assure you, I am number one not successful, except for the team that surrounds me. And I hire smarter, and I hire better than I am, and I make sure they know it every day. And the thing that I really when I look at it's that attitude, it's the passion, it's the curiosity, it's the excitement, it's the willingness to jump in and do more and the willingness to say, I don't know how to do this. And then we figure it out together. And I think that's the biggest piece of it that people miss sometimes when they're interviewing. They don't come across as somebody that can figure it out, are want to be able to figure it out or ask for help. And those are things that I look for every day. Because it's just, it's not always innate and everyone, because they feel they have to know every answer when they're in an interview. And I can tell you, I do not. I did an interview recently, and they asked me a question that I was so funny. It was the first time I was like this, I have no idea what you're talking about. And I said, but first thing I'm doing is Googling it tomorrow, or tonight when I get off. But it's funny when you're going through that there. You're going to get stumped at times. I mean, interviews have gotten to be arts of science. I mean, I don't know this from your perspective, but these things. They are art of science in the way they go through them. And I think that to be able just to answer those questions in a way that's going to let the interviewer know, I don't know, but I can find out. That's all they're looking for a lot of times.
Beth Ritter: Yeah, I agree. The other bit of advice that I try to convey in the classroom is that development opportunities may not always be convenient. What I mean by that is, you might have to relocate for it, or you and that wasn't in your plan, and that you might have to work extra hours sort of, so that you can work on your regular activities and do this development project, or you might even want to volunteer for the less than glamorous assignment, because they're sort of, I don't know, that's character building sometimes. And it's really skill-building and resume building too. And so that's the other theme that I always try to make sure that I share several times during the semester if you will, is that again, you might have a tight little plan right now. And most of the time development isn't going to have been in that plan.
Teena Piccione: No, I love that. I always say we planned it and God laugh. And a lot of times as you go through it, and it's become so relevant, and I tell people all the time, you have to say yes, more than no, if you're going to want to get to the C suite. It's got to be a yes, more than that no. I have moved from Atlanta to Dallas, open two offices in California went to Toronto, Boston, all the different places to make it to where I've gotten, it was not an easy or effortless journey. And I had to say yes, more than no. So and this is what I do mentoring quite a bit across our great land. And the one thing I tell people is, when you're ready for a change, you have to be ready for a yes. And you're going to be asked, would you relocate or to your point that are, are you willing to take on this role until this one's available? Are you willing to step it step back to take two steps forward? I worked at AT&T for 18 years, I will tell you the grace they gave me is every two and a half years, I had a new job. I did not know at the time how to run every single job they gave me. I said yes, when my resume would have matched maybe 10% of the qualifications. And in my mind, I had 90% to learn, there was no downside. Now you'll find a lot of times women look at job description, and they're like, I don't match 80%. So I can't apply. And I'm like, well, what are you talking about? That gives you an 80% learning opportunity? Go for it. Do you think you can find somebody who can help? And they're like, well, absolutely, like, what's the downside? So I think we have to reframe how we look at jobs and how we look at ourselves. We have one at Google, it's called I am remarkable, every person is remarkable. You have to find the voice, and you have to be able sometimes to help pull it out of people. But every person is remarkable there, they wouldn't be where they are. And they wouldn't be in school wanting to learn or they wouldn't be in passion to be able to find a cure to COVID, or they wouldn't be trying to do what they do. So we have to help pull that out of people and make it to where they're going to be excited and want to be on that journey.
Jenny Hammond: So I have two final questions for you ladies, more holistic for both of them. But I'd be curious to hear what your thoughts are on. What is our workforce look like in the next 18 months to two years? Knowing we're coming towards the end of an endemic, potentially? What were we going to be seeing, what are some of the trends you think are going to be happening?
Beth Ritter: I think training is critical right now. Because we have a lot of if you follow on that people are leaving their organizations. They're either a new hire into your company, and you're training and orienting them, or you're reaching lower into your organization and pulling someone up into a role. So you're training them or whatever. So I think training is going to be a big issue. And the other side of that too is knowledge management. So if you have people that are going to retire or if you're worried about people resigning and taking that knowledge with them, what are the things you're doing inside your firm for knowledge management to make sure there is some kind of retention of it and end or transfer of that knowledge before someone leaves? I'm encouraging folks to make sure they really do that with retirees because you have a longer time span hopefully they can give you more notice than I'm raising nation does. So those are some of the things that I've been talking with people about, I also think there's going to be more outsourcing, because we talked about that labor shortage piece at the beginning. And so if I can't figure out how to recruit these folks, maybe somebody else has that talent already, and I can partner with them and outsource this type of activity to another group. So those are some of the things I anticipate that we're going to see.
Teena Piccione: The other thing I would say is, we have to look at talent differently. We have to say, is there a fuzzy tech out there, and there's a great book out there called the Fuzzy Tech, is there people that are passionate, that want to turn around and do tech degrees, but they don't particularly have everything in their background for it. Is there a way we can retool, retrain on the job and be able to get them into a role that we feel comfortable? There's a company called [inaudible 00:40:54], who does this phenomenally well. They go into small towns, and they pull out amazing talent, whether they're at Walmart, or they're working as teachers, or they're working at all different aspects of life. And they take them on a journey to retool, retrain rescale them, and they put IT departments literally in the middle of Brewton, Alabama, which, by the way, I've never heard of till I have to go there. And it took two planes to train an automobile to get there. So it's been able to revitalize some of the areas in America that we haven't seen revitalized. And it's because we have to look at talent differently, we're going to have to go find the talent now. It's not going to come out. Sometimes the word works because of the great resignation. And I think as we look at it, and doing that reverse mentoring, how do we get super smart people graduating universities and say, this is where I see you, let me help you get there. And I think if we're not doing that now, and looking at innovation and fast pitches, and giving students that opportunity to do that now, then we ourselves in the corporate world are failing at what we're doing. But allowing students and enabling them with funding and enabling them with grants to say, we love your idea, we're going to support it, and helping them that's how we're going to change the workforce. And I think that it's gonna end up stronger in the end. But if you think about it any journey that is hard-fought, takes hits along the way before it becomes even stronger in the end. So I think we're going to have a back and forth for a bit, and then we're going to see it stronger than ever, as we look at our talent from different perspectives. And as employers, we're gonna have to pivot to do different. We're gonna have to say, you don't need to live in New York, you can leave live in South Carolina and fly up two days a week, does that work for you, or you can live wherever you want and we'll figure out how to get you in for a quarterly meeting. So I think as employers, we're also going to have to pivot and change to ensure we're meeting people where they are. And if we don't, we are going to continue to lose the best talent that I've seen.
Jenny Hammond: Great advice. I want to end with something that's a little bit more fun. So on each of our episodes, we ask this question. And it's always fascinating to me to hear the different responses. But as you know, our student population is 18 to 22. And so this one in particular, as women, if you could go back to your 21-year-old self, knowing everything that you kind of know now, what advice would you give to yourself at that stage? What would you tell yourself? I know, for out giving example, for me, I would tell myself to chill out and just know to trust the path that it will all work out. And I would probably take a few more risks at that age. But I'd be curious for both of you who have been so successful in your careers, going back to that time period, what are some of the things that maybe you would tell yourself then?
Beth Ritter: When I look back, I think I got lucky like, what I would say as I took a lot of risks. I moved a lot like Teena did to, I moved five times in 10 years and things like that. But I made sure I always had a good manager. I guess the litmus test I listened for in these opportunities. Was there going to be somebody I could learn from? Did I respect them? Did I like the way they approached work and the way they thought about work and stuff? And so maybe that would be my advice is, as you're considering all these cool new opportunities, make sure you meet your manager, and that it's somebody you think you can learn and grow with and that you like.
Teena Piccione: Yeah, that's great, Beth. I love that. Because a manager makes all the difference. I can tell you that. As a female in Tech, I haven't always had the greatest I'm having the best. And I think you have to live through it and grit and grace goes a long way. And you have to be able to shine above no matter what the situation is. Because I think that being able to have an authenticity. And a legacy means you're above reproach in every aspect of it. I would also say going back, I worked 40 hours a week and went to school, and nights and weekends, because I was First Generation College. It gave me a grit and tenacity that I had a desire to survive. And I don't think a lot of people get that right now. A lot of them, they're on scholarships, or they're graced with their parents paying for things. No, I did not have that. And so I had to learn very early in my career that I had to survive. And I had to keep going, no matter the circumstances, and find avenues and people to help me. And I think if I were to go back, I wish I had started the board of advisors, even as I was leaving college, and to be able to pull on people a lot more. I would say that I would also ask for help more often. I think that at that age, we think we know everything, and that we're either embarrassed or are we think we should know it. So we refuse to ask the questions that we should. So if I give one piece of advice to anyone it is, ask for help, ask questions, and then learn through it. And consider when I look at it, the windshield is really big in our cars, and the rearview mirror is very small. We need to take a glance back while we keep going forward. And I think a lot of times we forget that and you're not going to get your perfect job most of us right when we get out of college, I pivoted from Vice President of Marketing at a large construction firm, which I was like what the heck, I don't even know, there's a difference between concrete and cement. I had no idea. So I had to go learn it. But it gave me the grace and the grit to be able to say I can go and learn it. That's okay. I have to ask the questions. So being able to do that really matters and makes a difference. You also have to be comfortable with you. I am still the only moment on many calls. I have to be comfortable that I have a voice and that they have me to the table something. I'm also asked the question a lot to make you both laugh. Did you get the job because you're a female? And here's my answer. It might have opened the door, but what I know keeps my butt in that seat. And I think that having that confidence, even as we go through a journey is extremely important. So my advice is seasons change. Keep going, ask for help, ask for advice, and then you're able to shine.
Jenny Hammond: Alright. Thank you for listening everyone. For more information on the Poole College of Management and NC State, visit poole.ncsu.edu or follow along on social media where we're @NCStatePoole. And if you liked the show, be sure to subscribe and leave us a rating and review. This podcast is a production of Earfluence. I'm Jenny Hammond, and we'll see you next time on the Poole Podcast.
About the Poole Podcast
The Poole Podcast is a think and do conversation about the relationship between academics and industry. Each episode will share research and ideas from inside the classroom from our incredible NC State faculty and explore how it's being translated into practice. Released every two weeks on Monday.
More From Poole Thought Leadership
Study Outlines One Way Employers Can Head Off 'Quiet Quitting'
The Key to Hiring and Supporting Immigrant Employees
Business and Industry Leaders Discuss Diversity, Equity and Inclusion in the Workplace
About Poole Thought Leadership
SUBSCRIBE TO POOLE THOUGHT LEADERSHIP
About Poole College
Directory and Offices

redpajama_set_name: RedPajamaCommonCrawl


text:
24 results for 'Cancer Genetics and Cytogenetics 179권 2호'
Journal Articles Radiation Oncology
Novel 6p rearrangements and recurrent translocation breakpoints in retinoblastoma cell lines identified by spectral karyotyping and mBAND analyses
2007 Paderova Jana et al. Cancer Genetics and Cytogenetics cited 17 times
Gain of the short arm of chromosome 6, usually through isochromosome 6p formation, is present in approximately 50% of retinoblastoma tumors. The minimal region of gain maps...
Chromosomal rearrangements in lipofibromatosis
2007 Kenney Barton et al. Cancer Genetics and Cytogenetics cited 16 times
Lipofibromatosis is a relatively rare pediatric neoplasm, which usually manifests as an ill-defined soft tissue mass involving the upper and lower distal extremities, the trunk,...
Cytogenetic and molecular cytogenetic findings of intimal sarcoma
2007 Zhang Hongying et al. Cancer Genetics and Cytogenetics cited 13 times
Intimal sarcomas are exceptionally rare tumors that arise from the tunica intima of large vessels. Most intimal sarcomas are high-grade tumors that exhibit fibroblastic or...
DNA methylation patterns of the CDH1, RARB, and SFN genes in choroid plexus tumors
2007 Losi-Guembarovski Roberta et al. Cancer Genetics and Cytogenetics cited 9 times
Genetic and epigenetic alterations in choroid plexus tumors, a rare neuroepithelial neoplasm most frequently detected in children, are poorly characterized. Epigenetic silencing...
Translocation 3;21, trisomy 8, and duplication of the Philadelphia chromosome: a rare but recurrent cytogenetic pathway in the blastic phase of chronic myeloid leukemia
2007 De Braekeleer Étienne et al. Cancer Genetics and Cytogenetics cited 7 times
Adult, Blast Crisis, Chromosomes, Human, Pair 21, Chromosomes, Human, Pair 3, Chromosomes, Human, Pair 8, Humans, Leukemia, Myelogenous, Chronic, BCR-ABL Positive,...
Dedifferentiated liposarcoma of the pleura mimicking a malignant solitary fibrous tumor and associated with dedifferentiated liposarcoma of the mediastinum: Usefulness of...FREE
2007 Benchetritt Maxime et al. Cancer Genetics and Cytogenetics cited 7 times
Dedifferentiated liposarcoma of the pleura is an extremely rare malignancy mimicking a variety of tumors, such as other sarcomas, mesothelioma, and malignant solitary fibrous...
Mesenteric chloroma with t(16;16) followed by acute myelomonocytic leukemia with clonal evolution
2007 Göhring Gudrun et al. Cancer Genetics and Cytogenetics cited 6 times
Adolescent, Chromosome Aberrations, Chromosomes, Human, Pair 8, Disease Progression, Humans, Leukemia, Myelomonocytic, Acute, genetics, Male, Peritoneal Neoplasms, Sarcoma,...
Allelic imbalance at 13q14.2 approximately q14.3 in localized prostate cancer is associated with early biochemical relapse.
2007 Nicola Brookman-Amissah et al. Cancer Genetics and Cytogenetics cited 5 times
Aged, Allelic Imbalance, Chromosomes, Human, Pair 10, Chromosomes, Human, Pair 13, Chromosomes, Human, Pair 8, Humans, Loss of Heterozygosity, Male, Middle Aged, Neoplasm...
A der(1;15)(q10;q10) is a rare nonrandom whole-arm translocation in patients with acute lymphoblastic leukemia
2007 Park Tae Sung et al. Cancer Genetics and Cytogenetics cited 2 times
A rare karyotypic event, der(1;15)(q10;q10), which involves the whole long arms of chromosomes 1 and 15, has been reported in patients with various conditions, including...
연세대학교 의학도서관
Confirmation of a novel recurrent association: BCR-ABL t(9;22) and t(19;21)
2007 Struski Stéphanie et al. Cancer Genetics and Cytogenetics cited 2 times
Association of a t(9;22)(q34;q11), BCR/ABL-positive, with a dic(19;21)(p13;p13) has been described in acute lymphoblastic leukemia in relapse, raising the question of whether...
start page previous page 1 2 3 next page end page
Radiation Oncology 24
Cancer Genetics and Cytogenetics 24
Elsevier 20


text:
#include "include/effects/SkDisplacementMapEffect.h"

#include "include/core/SkBitmap.h"
#include "include/core/SkUnPreMultiply.h"
#include "include/private/SkColorData.h"
#include "src/core/SkImageFilter_Base.h"
#include "src/core/SkReadBuffer.h"
#include "src/core/SkSpecialImage.h"
#include "src/core/SkWriteBuffer.h"
#if SK_SUPPORT_GPU
#include "include/gpu/GrTexture.h"
#include "include/private/GrRecordingContext.h"
#include "src/gpu/GrCaps.h"
#include "src/gpu/GrClip.h"
#include "src/gpu/GrColorSpaceXform.h"
#include "src/gpu/GrCoordTransform.h"
#include "src/gpu/GrRecordingContextPriv.h"
#include "src/gpu/GrRenderTargetContext.h"
#include "src/gpu/GrTextureProxy.h"
#include "src/gpu/SkGr.h"
#include "src/gpu/effects/GrTextureDomain.h"
#include "src/gpu/glsl/GrGLSLFragmentProcessor.h"
#include "src/gpu/glsl/GrGLSLFragmentShaderBuilder.h"
#include "src/gpu/glsl/GrGLSLProgramDataManager.h"
#include "src/gpu/glsl/GrGLSLUniformHandler.h"
#endif

namespace {

class SkDisplacementMapEffectImpl final : public SkImageFilter_Base {
public:
    SkDisplacementMapEffectImpl(SkColorChannel xChannelSelector, SkColorChannel yChannelSelector,
                                SkScalar scale, sk_sp<SkImageFilter> inputs[2],
                                const CropRect* cropRect)
            : INHERITED(inputs, 2, cropRect)
            , fXChannelSelector(xChannelSelector)
            , fYChannelSelector(yChannelSelector)
            , fScale(scale) {}

    SkRect computeFastBounds(const SkRect& src) const override;

    virtual SkIRect onFilterBounds(const SkIRect& src, const SkMatrix& ctm,
                                   MapDirection, const SkIRect* inputRect) const override;
    SkIRect onFilterNodeBounds(const SkIRect&, const SkMatrix& ctm,
                               MapDirection, const SkIRect* inputRect) const override;

protected:
    sk_sp<SkSpecialImage> onFilterImage(const Context&, SkIPoint* offset) const override;

    void flatten(SkWriteBuffer&) const override;

private:
    friend void SkDisplacementMapEffect::RegisterFlattenables();
    SK_FLATTENABLE_HOOKS(SkDisplacementMapEffectImpl)

    SkColorChannel fXChannelSelector;
    SkColorChannel fYChannelSelector;
    SkScalar fScale;

    const SkImageFilter* getDisplacementInput() const { return getInput(0); }
    const SkImageFilter* getColorInput() const { return getInput(1); }

    typedef SkImageFilter_Base INHERITED;
};

// Shift values to extract channels from an SkColor (SkColorGetR, SkColorGetG, etc)
const uint8_t gChannelTypeToShift[] = {
    16,  // R
     8,  // G
     0,  // B
    24,  // A
};
struct Extractor {
    Extractor(SkColorChannel typeX,
              SkColorChannel typeY)
        : fShiftX(gChannelTypeToShift[static_cast<int>(typeX)])
        , fShiftY(gChannelTypeToShift[static_cast<int>(typeY)])
    {}

    unsigned fShiftX, fShiftY;

    unsigned getX(SkColor c) const { return (c >> fShiftX) & 0xFF; }
    unsigned getY(SkColor c) const { return (c >> fShiftY) & 0xFF; }
};

static bool channel_selector_type_is_valid(SkColorChannel cst) {
    switch (cst) {
        case SkColorChannel::kR:
        case SkColorChannel::kG:
        case SkColorChannel::kB:
        case SkColorChannel::kA:
            return true;
        default:
            break;
    }
    return false;
}

static SkColorChannel convert_channel_type(SkDisplacementMapEffect::ChannelSelectorType c) {
    switch(c) {
        case SkDisplacementMapEffect::kR_ChannelSelectorType:
            return SkColorChannel::kR;
        case SkDisplacementMapEffect::kG_ChannelSelectorType:
            return SkColorChannel::kG;
        case SkDisplacementMapEffect::kB_ChannelSelectorType:
            return SkColorChannel::kB;
        case SkDisplacementMapEffect::kA_ChannelSelectorType:
            return SkColorChannel::kA;
        case SkDisplacementMapEffect::kUnknown_ChannelSelectorType:
        default:
            // Raster backend historically treated this as B, GPU backend would fail when generating
            // shader code. Just return B without aborting in debug-builds in order to keep fuzzers
            // happy when they pass in the technically still valid kUnknown_ChannelSelectorType.
            return SkColorChannel::kB;
    }
}

} // end namespace

///////////////////////////////////////////////////////////////////////////////

sk_sp<SkImageFilter> SkDisplacementMapEffect::Make(ChannelSelectorType xChannelSelector,
                                                   ChannelSelectorType yChannelSelector,
                                                   SkScalar scale,
                                                   sk_sp<SkImageFilter> displacement,
                                                   sk_sp<SkImageFilter> color,
                                                   const SkImageFilter::CropRect* cropRect) {
    return Make(convert_channel_type(xChannelSelector), convert_channel_type(yChannelSelector),
                scale, std::move(displacement), std::move(color), cropRect);
}

sk_sp<SkImageFilter> SkDisplacementMapEffect::Make(SkColorChannel xChannelSelector,
                                                   SkColorChannel yChannelSelector,
                                                   SkScalar scale,
                                                   sk_sp<SkImageFilter> displacement,
                                                   sk_sp<SkImageFilter> color,
                                                   const SkImageFilter::CropRect* cropRect) {
    if (!channel_selector_type_is_valid(xChannelSelector) ||
        !channel_selector_type_is_valid(yChannelSelector)) {
        return nullptr;
    }

    sk_sp<SkImageFilter> inputs[2] = { std::move(displacement), std::move(color) };
    return sk_sp<SkImageFilter>(new SkDisplacementMapEffectImpl(xChannelSelector, yChannelSelector,
                                                                scale, inputs, cropRect));
}

void SkDisplacementMapEffect::RegisterFlattenables() {
    SK_REGISTER_FLATTENABLE(SkDisplacementMapEffectImpl);
    // TODO (michaelludwig) - Remove after grace period for SKPs to stop using old name
    SkFlattenable::Register("SkDisplacementMapEffect", SkDisplacementMapEffectImpl::CreateProc);
}

///////////////////////////////////////////////////////////////////////////////

sk_sp<SkFlattenable> SkDisplacementMapEffectImpl::CreateProc(SkReadBuffer& buffer) {
    SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 2);

    SkColorChannel xsel, ysel;
    if (buffer.isVersionLT(SkPicturePriv::kCleanupImageFilterEnums_Version)) {
        xsel = convert_channel_type(buffer.read32LE(
                SkDisplacementMapEffect::kLast_ChannelSelectorType));
        ysel = convert_channel_type(buffer.read32LE(
                SkDisplacementMapEffect::kLast_ChannelSelectorType));
    } else {
        xsel = buffer.read32LE(SkColorChannel::kLastEnum);
        ysel = buffer.read32LE(SkColorChannel::kLastEnum);
    }

    SkScalar scale = buffer.readScalar();

    return SkDisplacementMapEffect::Make(xsel, ysel, scale, common.getInput(0), common.getInput(1),
                                         &common.cropRect());
}

void SkDisplacementMapEffectImpl::flatten(SkWriteBuffer& buffer) const {
    this->INHERITED::flatten(buffer);
    buffer.writeInt((int) fXChannelSelector);
    buffer.writeInt((int) fYChannelSelector);
    buffer.writeScalar(fScale);
}

#if SK_SUPPORT_GPU
class GrDisplacementMapEffect : public GrFragmentProcessor {
public:
    static std::unique_ptr<GrFragmentProcessor> Make(
            SkColorChannel xChannelSelector, SkColorChannel yChannelSelector, SkVector scale,
            sk_sp<GrTextureProxy> displacement, const SkIRect& displSubset,
            const SkMatrix& offsetMatrix, sk_sp<GrTextureProxy> color, const SkIRect& colorSubset) {
        return std::unique_ptr<GrFragmentProcessor>(new GrDisplacementMapEffect(
                xChannelSelector, yChannelSelector, scale, std::move(displacement), displSubset,
                offsetMatrix, std::move(color), colorSubset));
    }

    ~GrDisplacementMapEffect() override;

    SkColorChannel xChannelSelector() const {
        return fXChannelSelector;
    }
    SkColorChannel yChannelSelector() const {
        return fYChannelSelector;
    }
    const SkVector& scale() const { return fScale; }

    const char* name() const override { return "DisplacementMap"; }
    const GrTextureDomain& domain() const { return fDomain; }

    std::unique_ptr<GrFragmentProcessor> clone() const override;

private:
    GrDisplacementMapEffect(const GrDisplacementMapEffect&);

    GrGLSLFragmentProcessor* onCreateGLSLInstance() const override;

    void onGetGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const override;

    bool onIsEqual(const GrFragmentProcessor&) const override;

    GrDisplacementMapEffect(SkColorChannel xChannelSelector,
                            SkColorChannel yChannelSelector,
                            const SkVector& scale, sk_sp<GrTextureProxy> displacement,
                            const SkIRect& displSubset, const SkMatrix& offsetMatrix,
                            sk_sp<GrTextureProxy> color, const SkIRect& colorSubset);

    const TextureSampler& onTextureSampler(int i) const override {
        return IthTextureSampler(i, fDisplacementSampler, fColorSampler);
    }

    GR_DECLARE_FRAGMENT_PROCESSOR_TEST

    GrCoordTransform            fDisplacementTransform;
    TextureSampler              fDisplacementSampler;
    GrCoordTransform            fColorTransform;
    GrTextureDomain             fDomain;
    TextureSampler              fColorSampler;
    SkColorChannel fXChannelSelector;
    SkColorChannel fYChannelSelector;
    SkVector fScale;

    typedef GrFragmentProcessor INHERITED;
};
#endif

static void compute_displacement(Extractor ex, const SkVector& scale, SkBitmap* dst,
                                 const SkBitmap& displ, const SkIPoint& offset,
                                 const SkBitmap& src,
                                 const SkIRect& bounds) {
    static const SkScalar Inv8bit = SkScalarInvert(255);
    const int srcW = src.width();
    const int srcH = src.height();
    const SkVector scaleForColor = SkVector::Make(scale.fX * Inv8bit, scale.fY * Inv8bit);
    const SkVector scaleAdj = SkVector::Make(SK_ScalarHalf - scale.fX * SK_ScalarHalf,
                                             SK_ScalarHalf - scale.fY * SK_ScalarHalf);
    SkPMColor* dstPtr = dst->getAddr32(0, 0);
    for (int y = bounds.top(); y < bounds.bottom(); ++y) {
        const SkPMColor* displPtr = displ.getAddr32(bounds.left() + offset.fX, y + offset.fY);
        for (int x = bounds.left(); x < bounds.right(); ++x, ++displPtr) {
            SkColor c = SkUnPreMultiply::PMColorToColor(*displPtr);

            SkScalar displX = scaleForColor.fX * ex.getX(c) + scaleAdj.fX;
            SkScalar displY = scaleForColor.fY * ex.getY(c) + scaleAdj.fY;
            // Truncate the displacement values
            const int32_t srcX = Sk32_sat_add(x, SkScalarTruncToInt(displX));
            const int32_t srcY = Sk32_sat_add(y, SkScalarTruncToInt(displY));
            *dstPtr++ = ((srcX < 0) || (srcX >= srcW) || (srcY < 0) || (srcY >= srcH)) ?
                      0 : *(src.getAddr32(srcX, srcY));
        }
    }
}

sk_sp<SkSpecialImage> SkDisplacementMapEffectImpl::onFilterImage(const Context& ctx,
                                                                 SkIPoint* offset) const {
    SkIPoint colorOffset = SkIPoint::Make(0, 0);
    sk_sp<SkSpecialImage> color(this->filterInput(1, ctx, &colorOffset));
    if (!color) {
        return nullptr;
    }

    SkIPoint displOffset = SkIPoint::Make(0, 0);
    // Creation of the displacement map should happen in a non-colorspace aware context. This
    // texture is a purely mathematical construct, so we want to just operate on the stored
    // values. Consider:
    // User supplies an sRGB displacement map. If we're rendering to a wider gamut, then we could
    // end up filtering the displacement map into that gamut, which has the effect of reducing
    // the amount of displacement that it represents (as encoded values move away from the
    // primaries).
    // With a more complex DAG attached to this input, it's not clear that working in ANY specific
    // color space makes sense, so we ignore color spaces (and gamma) entirely. This may not be
    // ideal, but it's at least consistent and predictable.
    Context displContext(ctx.mapping(), ctx.desiredOutput(), ctx.cache(),
                         kN32_SkColorType, nullptr, ctx.source());
    sk_sp<SkSpecialImage> displ(this->filterInput(0, displContext, &displOffset));
    if (!displ) {
        return nullptr;
    }

    const SkIRect srcBounds = SkIRect::MakeXYWH(colorOffset.x(), colorOffset.y(),
                                                color->width(), color->height());

    // Both paths do bounds checking on color pixel access, we don't need to
    // pad the color bitmap to bounds here.
    SkIRect bounds;
    if (!this->applyCropRect(ctx, srcBounds, &bounds)) {
        return nullptr;
    }

    SkIRect displBounds;
    displ = this->applyCropRectAndPad(ctx, displ.get(), &displOffset, &displBounds);
    if (!displ) {
        return nullptr;
    }

    if (!bounds.intersect(displBounds)) {
        return nullptr;
    }

    const SkIRect colorBounds = bounds.makeOffset(-colorOffset);
    // If the offset overflowed (saturated) then we have to abort, as we need their
    // dimensions to be equal. See https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=7209
    if (colorBounds.size() != bounds.size()) {
        return nullptr;
    }

    SkVector scale = SkVector::Make(fScale, fScale);
    ctx.ctm().mapVectors(&scale, 1);

#if SK_SUPPORT_GPU
    if (ctx.gpuBacked()) {
        auto context = ctx.getContext();

        sk_sp<GrTextureProxy> colorProxy(color->asTextureProxyRef(context));
        sk_sp<GrTextureProxy> displProxy(displ->asTextureProxyRef(context));
        if (!colorProxy || !displProxy) {
            return nullptr;
        }
        const auto isProtected = colorProxy->isProtected() ? GrProtected::kYes : GrProtected::kNo;

        SkMatrix offsetMatrix = SkMatrix::MakeTrans(SkIntToScalar(colorOffset.fX - displOffset.fX),
                                                    SkIntToScalar(colorOffset.fY - displOffset.fY));

        std::unique_ptr<GrFragmentProcessor> fp =
                GrDisplacementMapEffect::Make(fXChannelSelector,
                                              fYChannelSelector,
                                              scale,
                                              std::move(displProxy),
                                              displ->subset(),
                                              offsetMatrix,
                                              std::move(colorProxy),
                                              color->subset());
        fp = GrColorSpaceXformEffect::Make(std::move(fp), color->getColorSpace(),
                                           color->alphaType(), ctx.colorSpace());

        GrPaint paint;
        paint.addColorFragmentProcessor(std::move(fp));
        paint.setPorterDuffXPFactory(SkBlendMode::kSrc);
        SkMatrix matrix;
        matrix.setTranslate(-SkIntToScalar(colorBounds.x()), -SkIntToScalar(colorBounds.y()));

        auto renderTargetContext =
                context->priv().makeDeferredRenderTargetContext(SkBackingFit::kApprox,
                                                                bounds.width(),
                                                                bounds.height(),
                                                                ctx.grColorType(),
                                                                ctx.refColorSpace(),
                                                                1,
                                                                GrMipMapped::kNo,
                                                                kBottomLeft_GrSurfaceOrigin,
                                                                nullptr,
                                                                SkBudgeted::kYes,
                                                                isProtected);
        if (!renderTargetContext) {
            return nullptr;
        }

        renderTargetContext->drawRect(GrNoClip(), std::move(paint), GrAA::kNo, matrix,
                                      SkRect::Make(colorBounds));

        offset->fX = bounds.left();
        offset->fY = bounds.top();
        return SkSpecialImage::MakeDeferredFromGpu(
                context,
                SkIRect::MakeWH(bounds.width(), bounds.height()),
                kNeedNewImageUniqueID_SpecialImage,
                renderTargetContext->asTextureProxyRef(),
                renderTargetContext->colorInfo().colorType(),
                renderTargetContext->colorInfo().refColorSpace());
    }
#endif

    SkBitmap colorBM, displBM;

    if (!color->getROPixels(&colorBM) || !displ->getROPixels(&displBM)) {
        return nullptr;
    }

    if ((colorBM.colorType() != kN32_SkColorType) ||
        (displBM.colorType() != kN32_SkColorType)) {
        return nullptr;
    }

    if (!colorBM.getPixels() || !displBM.getPixels()) {
        return nullptr;
    }

    SkImageInfo info = SkImageInfo::MakeN32(bounds.width(), bounds.height(),
                                            colorBM.alphaType());

    SkBitmap dst;
    if (!dst.tryAllocPixels(info)) {
        return nullptr;
    }

    compute_displacement(Extractor(fXChannelSelector, fYChannelSelector), scale, &dst,
                         displBM, colorOffset - displOffset, colorBM, colorBounds);

    offset->fX = bounds.left();
    offset->fY = bounds.top();
    return SkSpecialImage::MakeFromRaster(SkIRect::MakeWH(bounds.width(), bounds.height()),
                                          dst);
}

SkRect SkDisplacementMapEffectImpl::computeFastBounds(const SkRect& src) const {
    SkRect bounds = this->getColorInput() ? this->getColorInput()->computeFastBounds(src) : src;
    bounds.outset(SkScalarAbs(fScale) * SK_ScalarHalf, SkScalarAbs(fScale) * SK_ScalarHalf);
    return bounds;
}

SkIRect SkDisplacementMapEffectImpl::onFilterNodeBounds(
        const SkIRect& src, const SkMatrix& ctm, MapDirection, const SkIRect* inputRect) const {
    SkVector scale = SkVector::Make(fScale, fScale);
    ctm.mapVectors(&scale, 1);
    return src.makeOutset(SkScalarCeilToInt(SkScalarAbs(scale.fX) * SK_ScalarHalf),
                          SkScalarCeilToInt(SkScalarAbs(scale.fY) * SK_ScalarHalf));
}

SkIRect SkDisplacementMapEffectImpl::onFilterBounds(
        const SkIRect& src, const SkMatrix& ctm, MapDirection dir, const SkIRect* inputRect) const {
    // Recurse only into color input.
    if (this->getColorInput()) {
        return this->getColorInput()->filterBounds(src, ctm, dir, inputRect);
    }
    return src;
}

///////////////////////////////////////////////////////////////////////////////

#if SK_SUPPORT_GPU
class GrGLDisplacementMapEffect : public GrGLSLFragmentProcessor {
public:
    void emitCode(EmitArgs&) override;

    static inline void GenKey(const GrProcessor&, const GrShaderCaps&, GrProcessorKeyBuilder*);

protected:
    void onSetData(const GrGLSLProgramDataManager&, const GrFragmentProcessor&) override;

private:
    typedef GrGLSLProgramDataManager::UniformHandle UniformHandle;

    UniformHandle fScaleUni;
    GrTextureDomain::GLDomain fGLDomain;

    typedef GrGLSLFragmentProcessor INHERITED;
};

///////////////////////////////////////////////////////////////////////////////

GrGLSLFragmentProcessor* GrDisplacementMapEffect::onCreateGLSLInstance() const {
    return new GrGLDisplacementMapEffect;
}

void GrDisplacementMapEffect::onGetGLSLProcessorKey(const GrShaderCaps& caps,
                                                    GrProcessorKeyBuilder* b) const {
    GrGLDisplacementMapEffect::GenKey(*this, caps, b);
}

GrDisplacementMapEffect::GrDisplacementMapEffect(
        SkColorChannel xChannelSelector,
        SkColorChannel yChannelSelector,
        const SkVector& scale,
        sk_sp<GrTextureProxy> displacement,
        const SkIRect& displSubset,
        const SkMatrix& offsetMatrix,
        sk_sp<GrTextureProxy> color,
        const SkIRect& colorSubset)
        : INHERITED(kGrDisplacementMapEffect_ClassID,
                    GrFragmentProcessor::kNone_OptimizationFlags)
        , fDisplacementTransform(
                SkMatrix::Concat(SkMatrix::MakeTrans(displSubset.x(), displSubset.y()),
                                 offsetMatrix),
                displacement.get())
        , fDisplacementSampler(displacement)
        , fColorTransform(SkMatrix::MakeTrans(colorSubset.x(), colorSubset.y()), color.get())
        , fDomain(color.get(),
                  GrTextureDomain::MakeTexelDomain(colorSubset,
                                                   GrTextureDomain::kDecal_Mode),
                  GrTextureDomain::kDecal_Mode, GrTextureDomain::kDecal_Mode)
        , fColorSampler(color)
        , fXChannelSelector(xChannelSelector)
        , fYChannelSelector(yChannelSelector)
        , fScale(scale) {
    this->addCoordTransform(&fDisplacementTransform);
    this->addCoordTransform(&fColorTransform);
    this->setTextureSamplerCnt(2);
}

GrDisplacementMapEffect::GrDisplacementMapEffect(const GrDisplacementMapEffect& that)
        : INHERITED(kGrDisplacementMapEffect_ClassID, that.optimizationFlags())
        , fDisplacementTransform(that.fDisplacementTransform)
        , fDisplacementSampler(that.fDisplacementSampler)
        , fColorTransform(that.fColorTransform)
        , fDomain(that.fDomain)
        , fColorSampler(that.fColorSampler)
        , fXChannelSelector(that.fXChannelSelector)
        , fYChannelSelector(that.fYChannelSelector)
        , fScale(that.fScale) {
    this->addCoordTransform(&fDisplacementTransform);
    this->addCoordTransform(&fColorTransform);
    this->setTextureSamplerCnt(2);
}

GrDisplacementMapEffect::~GrDisplacementMapEffect() {}

std::unique_ptr<GrFragmentProcessor> GrDisplacementMapEffect::clone() const {
    return std::unique_ptr<GrFragmentProcessor>(new GrDisplacementMapEffect(*this));
}

bool GrDisplacementMapEffect::onIsEqual(const GrFragmentProcessor& sBase) const {
    const GrDisplacementMapEffect& s = sBase.cast<GrDisplacementMapEffect>();
    return fXChannelSelector == s.fXChannelSelector &&
           fYChannelSelector == s.fYChannelSelector &&
           fScale == s.fScale;
}

///////////////////////////////////////////////////////////////////////////////

GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrDisplacementMapEffect);

#if GR_TEST_UTILS
std::unique_ptr<GrFragmentProcessor> GrDisplacementMapEffect::TestCreate(GrProcessorTestData* d) {
    int texIdxDispl = d->fRandom->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx :
                                               GrProcessorUnitTest::kAlphaTextureIdx;
    int texIdxColor = d->fRandom->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx :
                                               GrProcessorUnitTest::kAlphaTextureIdx;
    sk_sp<GrTextureProxy> dispProxy = d->textureProxy(texIdxDispl);
    sk_sp<GrTextureProxy> colorProxy = d->textureProxy(texIdxColor);
    static const int kMaxComponent = static_cast<int>(SkColorChannel::kLastEnum);
    SkColorChannel xChannelSelector =
        static_cast<SkColorChannel>(d->fRandom->nextRangeU(1, kMaxComponent));
    SkColorChannel yChannelSelector =
        static_cast<SkColorChannel>(d->fRandom->nextRangeU(1, kMaxComponent));
    SkVector scale = SkVector::Make(d->fRandom->nextRangeScalar(0, 100.0f),
                                    d->fRandom->nextRangeScalar(0, 100.0f));
    SkISize colorDimensions;
    colorDimensions.fWidth = d->fRandom->nextRangeU(0, colorProxy->width());
    colorDimensions.fHeight = d->fRandom->nextRangeU(0, colorProxy->height());
    SkIRect dispRect = SkIRect::MakeWH(dispProxy->width(), dispProxy->height());
    return GrDisplacementMapEffect::Make(xChannelSelector, yChannelSelector, scale,
                                         std::move(dispProxy),
                                         dispRect,
                                         SkMatrix::I(),
                                         std::move(colorProxy), SkIRect::MakeSize(colorDimensions));
}

#endif

///////////////////////////////////////////////////////////////////////////////

void GrGLDisplacementMapEffect::emitCode(EmitArgs& args) {
    const GrDisplacementMapEffect& displacementMap = args.fFp.cast<GrDisplacementMapEffect>();
    const GrTextureDomain& domain = displacementMap.domain();

    fScaleUni = args.fUniformHandler->addUniform(kFragment_GrShaderFlag, kHalf2_GrSLType, "Scale");
    const char* scaleUni = args.fUniformHandler->getUniformCStr(fScaleUni);
    const char* dColor = "dColor";
    const char* cCoords = "cCoords";
    const char* nearZero = "1e-6"; // Since 6.10352e-5 is the smallest half float, use
                                   // a number smaller than that to approximate 0, but
                                   // leave room for 32-bit float GPU rounding errors.

    GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
    fragBuilder->codeAppendf("\t\thalf4 %s = ", dColor);
    fragBuilder->appendTextureLookup(args.fTexSamplers[0],
                                     args.fTransformedCoords[0].fVaryingPoint.c_str(),
                                     args.fTransformedCoords[0].fVaryingPoint.getType());
    fragBuilder->codeAppend(";\n");

    // Unpremultiply the displacement
    fragBuilder->codeAppendf(
        "\t\t%s.rgb = (%s.a < %s) ? half3(0.0) : saturate(%s.rgb / %s.a);",
        dColor, dColor, nearZero, dColor, dColor);
    SkString coords2D = fragBuilder->ensureCoords2D(args.fTransformedCoords[1].fVaryingPoint);
    fragBuilder->codeAppendf("\t\tfloat2 %s = %s + %s*(%s.",
                             cCoords, coords2D.c_str(), scaleUni, dColor);

    switch (displacementMap.xChannelSelector()) {
      case SkColorChannel::kR:
        fragBuilder->codeAppend("r");
        break;
      case SkColorChannel::kG:
        fragBuilder->codeAppend("g");
        break;
      case SkColorChannel::kB:
        fragBuilder->codeAppend("b");
        break;
      case SkColorChannel::kA:
        fragBuilder->codeAppend("a");
        break;
      default:
        SkDEBUGFAIL("Unknown X channel selector");
    }

    switch (displacementMap.yChannelSelector()) {
      case SkColorChannel::kR:
        fragBuilder->codeAppend("r");
        break;
      case SkColorChannel::kG:
        fragBuilder->codeAppend("g");
        break;
      case SkColorChannel::kB:
        fragBuilder->codeAppend("b");
        break;
      case SkColorChannel::kA:
        fragBuilder->codeAppend("a");
        break;
      default:
        SkDEBUGFAIL("Unknown Y channel selector");
    }
    fragBuilder->codeAppend("-half2(0.5));\t\t");

    fGLDomain.sampleTexture(fragBuilder,
                            args.fUniformHandler,
                            args.fShaderCaps,
                            domain,
                            args.fOutputColor,
                            SkString(cCoords),
                            args.fTexSamplers[1]);
    fragBuilder->codeAppend(";\n");
}

void GrGLDisplacementMapEffect::onSetData(const GrGLSLProgramDataManager& pdman,
                                          const GrFragmentProcessor& proc) {
    const GrDisplacementMapEffect& displacementMap = proc.cast<GrDisplacementMapEffect>();
    GrTextureProxy* proxy = displacementMap.textureSampler(1).proxy();
    GrTexture* colorTex = proxy->peekTexture();

    SkScalar scaleX = displacementMap.scale().fX / colorTex->width();
    SkScalar scaleY = displacementMap.scale().fY / colorTex->height();
    pdman.set2f(fScaleUni, SkScalarToFloat(scaleX),
                proxy->origin() == kTopLeft_GrSurfaceOrigin ?
                SkScalarToFloat(scaleY) : SkScalarToFloat(-scaleY));
    fGLDomain.setData(pdman, displacementMap.domain(), proxy,
                      displacementMap.textureSampler(1).samplerState());
}

void GrGLDisplacementMapEffect::GenKey(const GrProcessor& proc,
                                       const GrShaderCaps&, GrProcessorKeyBuilder* b) {
    const GrDisplacementMapEffect& displacementMap = proc.cast<GrDisplacementMapEffect>();

    static constexpr int kChannelSelectorKeyBits = 2;  // Max value is 3, so 2 bits are required

    uint32_t xKey = static_cast<uint32_t>(displacementMap.xChannelSelector());
    uint32_t yKey = static_cast<uint32_t>(displacementMap.yChannelSelector())
            << kChannelSelectorKeyBits;

    b->add32(xKey | yKey);
}
#endif

redpajama_set_name: RedPajamaGithub


text:
Samaritans of Croydon and Sutton
116 123 free from any phone
0330 094 5717 local call charges apply
2B Kidderminster Road
CR9 2BQ
Schools outreach
We are happy to visit local schools and talk about our work. If you would like to arrange a visit please phone 020 8681 6667 and one of our community outreach team will be in touch to arrange a visit.
Our volunteers offer support by phone, text and email as well as face to face in branch.
Wheelchair access is available to the ground floor only.
Samaritans of Croydon and Sutton is a friendly branch in the heart of Croydon, very active in supporting the local community.
Important Corona Virus Update
Due to Coronavirus, we have temporarily suspended all Face to Face appointments at our branch. You can access 24/7 emotional support from Samaritans as usual by calling 116 123 or emailing [email protected]
About our branch
We are a growing branch located in central Croydon offering support to the local community through our listening services and outreach work.
We are involved with Samaritans partnership with Network Rail through regular awareness raising visits to East Croydon Station. Members of the branch also visit local schools and companies and attend a number of community events.
If you would like us to get involved with a community event that you're organising in Croydon, please calll 020 8681 6667 and leave a message. One of the outreach team will get back to you.
Follow us on Twitter @CroydonSams
At Samaritans, privacy is at the heart of what we do. We are committed to protecting your privacy and the personal information that we hold. Read our privacy statement here.
Volunteer at this branch
Donate to this branch
Samaritans of Croydon and Sutton is part of Samaritans, a charity registered in England and Wales (219432) and in Scotland (SC040604) and incorporated in England and Wales as a company limited by guarantee (757372).