 All right. Good afternoon, everyone. Let's do things set here. Let's do that. I could not get the YouTube chat to show up in OBS for whatever reason, so unfortunately we don't have the YouTube chat on the screen today, but I can see it once I shuffle my windows back around a bit here. It's just not in OBS, and I guess what I'll do is just make the Discord one a bit bigger, make up the space, and yeah I don't know. What's up with the YouTube one? I'll have to try messing with it next time. It just doesn't show up in the list of sources. Side OBS, which is odd. Yeah, there's a whole bunch of stuff in there. Just not that for some reason. All right, let's get this a little bit. Good afternoon, DJ Devin. How's it going? Thanks for dropping that link in the chat. Appreciate it. Okay, yeah, there it is. How's it going, Tyeth and Viada over in the YouTube? So yeah, I can just as another heads-up reminder for anybody that maybe just tuned in within the last minute or so before I started rambling about it. Normally we put the YouTube chat on the screen. It's not there today. It wasn't shown up in OBS for me. I didn't really have time to try and troubleshoot it, so I can see the YouTube chat. If you ask me questions or leave comments in there, I will eventually see them, but they're not on the screen today. The one that's on the screen is the Discord as usual, which you can always find at ADAFRU.IT slash Discord, as it says down below. In the live broadcast chat is where we are at during the live streams, including this one. And speaking of this one, let me do the introduction while we're here. So good afternoon. Welcome. Happy Friday. Thank you to everyone for tuning in. My name is Tim. I go by FOMIGuy on GitHub and Discord. This is the Deep Dive live stream, which is a weekly live stream where it is typically either myself or Scott Shawcroft, the lead developer of Circuit Python. This week, Scott's out, so I'm filling in. And the Deep Dive typically is going to be working on something related to Circuit Python. When Scott's there, being the lead developer inside the core, he tends to be working a little bit lower level than I am. I tend to be working either on libraries or projects. Occasionally, we venture into the core, but definitely not quite as cutting-edge stuff as Scott does most typically. But we're always working on something in the universe of Circuit Python, whether it's projects or libraries or core or infrastructure or just surrounding, you know, utilities or whatever. We're always kind of in the universe of Circuit Python. If you're new and you don't know what Circuit Python is, you can learn more on the main website for the project, which is here, circuitpython.org. This is basically an implementation of Python that can run on tiny computers called microcontrollers. These tiny computers, usually they will plug into your computer with a USB cable. And then when you plug them in, they will show up like a thumb drive, just a little extra storage drive. On that drive will be a code.py file with Python code inside of it. You can edit that code. You can add Python code inside of there. And then when you save it, the computer, these tiny computers on these little external boards, they will, you know, interpret and execute that Python code for you. So that's kind of the like 50,000 foot view of what we're doing. Thanks as always to Adafruit. This is their website, Adafruit.com. Adafruit is the company who is primarily sponsoring the Circuit Python project. So they pay a couple of folks who work on the project full time like Scott and Jeff and Dan. Adafruit pays them to do so. Adafruit pays some other folks such as myself to work on the project part time. Thank you as always to them for doing that. And if you want to help support Circuit Python and Adafruit, the way you can do that is just head over to their website, Adafruit.com and purchase hardware from them. They manufacture and design hardware out of the sort of Adafruit home base over in New York. You can find not only the microcontroller devices that run Circuit Python, as well as Arduino and all sorts of other kinds of code. You can also find all sorts of peripherals that you can plug into your microcontrollers to add extra capabilities, whether it's screens or LEDs or buttons or buzzers or beepers or lights or sensors or motors or servos or any kind of little electronic widget you could imagine. You can typically hook that up to a microcontroller, interact with it. And if you purchase that kind of stuff over at Adafruit, then thank you to you for helping support the project. How's it going, Tyeth? As well as DJ Devon, I'll be in and out. I have to get some gardening done before sunset. Yep. No worries. Hope you have a nice time with that. I've got some stuff to take care of outside over the weekend. So I can definitely relate to that. How's it going, Sea Grover? Good afternoon, my friend. Mark, we still have a few inches of, oh, a few inches of snow on the ground. My goodness. Yeah, we're luckily where I'm at. We're no snow, knock on wood for a little while. We haven't had any snow, but we are to the point where it's warmed up enough to where we've got the grass growing and got to get out there and get it cut, cut a couple of the other things down. So I'm going to pull up the camera here. What I've got loaded up to work on today is, drum roll please, a very blurry high portal. We will try to make a little bit less blurry. 82 degrees Fahrenheit here. Yeah, I'm like in between you two. I'm probably closer to DJ Devon it sounds like in terms of the weather. It's not quite 82 here. I think it's probably 60 or 64 or something like that today here. We have not had snow for quite a while. I mean, like we got a couple of flurries, like two weeks ago or something. All right. So what I have planned to work on today is something that I actually started a while back and kind of set aside to work on some other stuff and then kind of forgot to go back to it. So we're going back to it now, which is the outlined label. So a while back, probably a month or two or three ago, I was working on this originally. And I ended up needing to make a tweak inside the core, I think, inside of bitmap tools in order to make this work. And then I kind of went and did that tweak and it eventually got merged. I came back and started working on the outlined label class, but never really finished it up and never submitted the PR for it. So outlined label is going to be a version of bitmap label that will allow you to have, as the name suggests, a little outline or a border around the text. And first thing we're going to do is just load it up and see what state it's in, because frankly, it has been a while since I messed with it. I have no idea it's working. If it's broken, anything really, I don't know what state it's in. So we got to figure that out. So we are going to take that new, well, it's not new yet, but that development version of display text. So right here, I've got the real display text, and this is on my Pi portal. I am, I think just going to delete this stuff. I'm pretty sure this would just be real regular display text. But you know what, in case we want to switch back to it in a few minutes, I think what I'm going to do is just pop in here and go display text, real. Then we're going to paste the, what will become the PR one, sort of instead of decide describe to every project I've ever done. Yep, I am with you there, including all the ones that have eventually gotten finished. A lot of them always going to be ended up. I kind of, I'm like a puppy a little bit, right? Like I'm always like, want to play with the new thing. Get my brain gets on to the next thing. After like, usually like three to five sittings on a thing. So if I don't finish it in that, then my brain jumps. And it just depends on what it is. Sometimes I'm quicker about going back to it. Sometimes I'm better about actually just toughen it out and finishing it. Sometimes though, it gets set aside. Okay. So there is an example. So I basically have a branch for this. I don't know if I ever did push the branch. Outline label is what that is. There is an example in that branch. Let me check the name of it is those we're just going to compare that to main display text outline label simple test. I'm going to grab that code. Let's send our code pie on the pie portal, I wonder. Oh, actually, I mean, we don't have to wonder because I pulled up a little bit ago. It's this. I know where this came from, though. progress bar test. I need it. I don't think so. I can't think of any reason why I would need it really. Well, I don't have auto reload on. This is a stroke outline for text. Yep, that's exactly what it is. Love to have the looked for it once couldn't find it. Yep, does not a well didn't really exist. Didn't really exist before. You can like do it with bitmap tools. Like with a lot of graphics and circuit Python really what it boils down to is like if you're willing to do some bitmap manipulation, you can get it done. There's just not a like easy to use wrapper for it. Oh, you know what? I need to paste this. I need to paste this not inside a lib, but actually in the root because the pipe portal has display text frozen in. This one's kind of weird. This one must be much older. It doesn't even have like scrolling label. I wonder how long I've been using this very old display text on here. Okay, I'm gonna. Can I cut? Oh, that's gonna that's trying to like refactor. I shouldn't have done that. I will say this is one of my like, one of the few pet page I have with PyCharm. Whenever you just copy paste a thing, it tries to like go refactor it for you. And I rarely like it's added this like it just broke our code. I could be blunt about what it did. I need to figure out if there's a way you can like paste without that or whatever I want like non smart paste or something, specifically the one you're working on. I'm an outline display style demo do it manually. I got you. Oh, that's right. I remember your I do remember you sharing that now yours has like a galaxy or something. In the background now that you say that I got a picture in my mind from the one that you showed me even had like I think multicolor if I recall correctly you had like some what's the right word for that like another right word for it but like not quite shadow effect but it's like I know like a shadow that gives it 3D embossed maybe that's the word I'm trying to think of I think. Okay, so first place where it's broken is that split. It looks like moved. So one thing bitmap label reset text. Yeah, one thing actually I need to do is probably merge main. Yeah, I think let's delete this again. Let's delete that outlined label I need to merge main into this I'm gonna mean I should be able to just do it right let's let me see that difference again. Our changes no contents are identical. Okay, I don't know why these show us changes. Okay, so I mean, at least here it looks like we didn't actually touch bitmap label or label or knit. So the merge should be pretty painless. Yeah, I want to keep a backup branch just in case I'm kind of like, I mean, I guess I can always just check back out to here. Am I actually pushed let's check that out. Studio but it works. Control shift fee. I'll try it. Yeah, thank you for the for the suggestion thing to test. I'll try it. We'll shift fee. I'll try to remember to try it next time I need to paste a file out line to label you okay. So I can always check back out here. So I don't need to make a backup branch. Okay, so then we're just going to merge main, which main into outline label okay, all of that I do for nothing is it was painless. In that case, I might as well go ahead and push. Can't think of any reason not to and I've already done it now. So okay, now we're going to take this and we're going to drop it on the device. The problems I have with my method is use I have to make five levels for every one text you want. And we go through the roof quickly. Yeah, you figure out a way to avoid that it'll be awesome. Yeah, the good news I will save on that front is this way does avoid that it's going to use a little bit more memory than a regular label but it's not that bad. It's not as bad as four labels it shouldn't be, because it's basically just adding pixels around the outside using blit. Okay, we're inside we are actually inside an outlined label. So I think there's a there's a change we're gonna have to make inside of there so it's weird that this is going back to here though but I guess it's just since the parent I suppose add outline that's going to be 108. Okay, yeah, so that is a tool split. Why would that not exist? Maybe I'm on a too old. Is that too old? It's kind of old, I guess doesn't feel like it's that old though. You can definitely do an update. I have a pie portal, Titanium 210. I mean, we're not that I do think we need nine dot x though, I guess, because I think I don't know the exact timeline one of the problems I will say with like, always working on new stuff. I never really know when stuff is in the stable one, necessarily, I tend to think of the absolute newest as the current even though that's not actually the truth. Oh, that sounds awesome. I want it. Yeah, this should work for you. I mean, it's broken right now. But hopefully by the time I am done with the stream, it will be usable and pushed into a PR. So you'll be able to try it out if you want. It basically does like I will one thing I will say is it's not going to be probably very fast. One thing about my way is I do think it's slow because pretty much what it's doing is for every pixel in the bitmap that represents your text, it's like blitting, like three by three pixels around it or five by five pixels around it, you can set the size in order to determine your outline. So yeah, it's kind of just like looping over pixels, which is not the fastest thing in the world. But it depends on how big your text is, if he is relatively small font. And I think it's still instant, basically. But if you have huge font and you change it a lot, I do not know. You don't know how slow it might look. There's a possibility it may look kind of slow. But it should not use very much memory, because the memory is down to just one bitmap. The same bitmap that it would use. If it was a regular bitmap label, just like maybe a couple of pixels bigger, so that there's enough room to actually put the border depends on what size you set the border, because it already leaves itself a little bit of room. But okay, now we're on RC one show is removed group group equals that's one that's something we should update. Let me put that in the repo. Probably all the rest of those should be updated to treat for them guessing. Maybe they already were. Whoops. Yeah. Okay, hasn't crashed. Did it actually work? Yes. Okay, so it's probably, yeah, it's kind of difficult to see here. We have the age old problem that we're pretty much always going to have of glare. So like if I turn the light on, then it will focus better. But then there will be glare. So see if we can point it away. But all right, one thing we could do, we should be able to just make it bigger still. Yeah, I mean, it's already at scale to we could put up to scale for. I mean, that's still pretty fast. I didn't, that still looked instant. So we will need to move it further inward now since we made it bigger. Should use anchor point and anchor position. So this is why I tend to always use those anyway. But I'm a zero zero fan, just say 1010. Okay, let me take the changes we've made so far. I'll line label, let's drop those back in the repo. Did nothing actually change? I guess only in here something changed. How did we fix the blit? Just installing a different circuit Python, I guess. So let's saying blit was not found. I guess that must have been a 9.0 change where it moved blit from bitmap tool from bitmap class over to bitmap tools. I think actually happened in the PR when I added the skip index, which I use for this. I was going to Alabama Cajun over on YouTube, a post it note or a white bit of tape hanging off the side of the board might work for focusing without light in the future. That's a good tip. Try that stick a little stick a little post it on there for it to kind of focus on. Yeah, my screen was very dirty today. Okay, so that's working. We're set to purple and green on this one. And that's working out all right. So surprisingly, this is not just like completely wrecked, which is nice. Let's take a look in the actual code, try to see like where we're at as far as what else would it need to be ready to kind of submit PR. Okay, so we need comments for this. Well, it's a setter, I guess. We should have comment for this one, I think. Let's do in this one. We're missing some arguments here. I guess those do I guess those get passed through though. Yeah, maybe we're not. Those aren't actually missing because those come from those come from the parent class, I'm pretty sure read the docs will include them. I mean, maybe we should put them here too. I don't know. I kind of like the idea of keeping it on the parent though, personally. So I'm going to go with that unless we come across a different reason. Why is this plus two? Oh, I think that's just the default way the padding works on the bottom. What is that for stamp source? Oh, that's the okay, yeah, yeah, that's the right, right, right, right. Yeah. So the way this works basically is like if you imagine every single pixel of the bitmap that represents our text, if we went around to every single pixel and we added a three by three of a different color, but skipping the original color. So the original font in this one is pink. So for each of those pink pixels, we're going to go and put like paste on top of it a three by three green, but our paste algorithm will ignore any pink. So it won't cover up the pinks, but it will add green around the outside. And then the stamp source is that three by three bitmap that were, you know, in my mind stamping, but it doesn't have to be three by three. You can actually set it to other things by changing the outline size. Theoretically, you could also actually change it to other shapes like right now, it's just a square. Theoretically, you could make it a rectangle or you could even make it like a circle with kind of rounded edges if you wanted to. But for now, I'm going to keep it simple on just the square. Okay. So if we have a stamp source, then we're going to loop over the height, we're going to loop over the width, we are going to, if the current pixel is the foreground color, which is pink in our case, then we are going to try to blit into the bitmap from our stamp source at the location of X, Y in our loop minus outline size to scoot it back so that we're centered on that pixel skipping the destination index of one, which again is our pink pixels. Value error, padding must be big enough to fit outline size all the way around the text. Try using a larger padding size or a smaller outline size. This looks like old code that could be cut. Okay. Yeah, this is the same logic. This is the same kind of algorithm as this. This must have been before I dived into the core and added it in there. So the skip desk index, that skip desk index is basically this if statement right here, but now it's an argument on blit. Okay. So this is going to blit the outline into, let the outline into the labels bitmap will stamp self dot stamp source for each pixel of the foreground color, but skip the foreground color. It does not return anything place text. Why would this be different? Oh, just because it's doing add outline. Realistically, I mean place text, I think is internal, right? Doesn't this exist elsewhere? Does exist here, but it's not commented anyway. So place text, what it does is basically take your string and loop over it and then copy in your glyphs one at a time. Place text, I think would probably, or I mean bitmap would probably just be self honestly. I'm going to copy skip index. I don't really understand this comment. I don't think I've ever tried to use a slanted font though. So Mizzier zero on the left side of the screen. Otherwise, I'll change the anchor point working with ATEC crypto. I've seen you've been doing a lot of work on that ATEC thing. I've got one of those things, but I did not manage to get nearly as much interesting stuff out of it as you did. I learned a lot about setters and getters of the properties. Things get complicated quick. I'll definitely agree with you there. That's how you're doing. I'm surprised it performs as fast as it does than impressive. Yeah, I agree. Actually, I was kind of surprised how fast it went. I found squares work the best. That's the method I use for the five level outline. I tried too many variations. I tried many variations. Square sounds basic, but works the best. Do we have anti aliasing? So skip index. It's basically a color that will get skipped. I don't really know why you would ever use it here, but this actually, I don't think it doesn't return anything. Oh, it says tuple. So x, y with height returns a, so I mean it's basically bounding box, tuple, bounding box, tuple with x, y with height values of the bitmap. I don't know, why does that get returned? I guess can it make a new bitmap inside of there? I think it can make a new one inside of there, in which case it would need to update the size somewhere else potentially. It doesn't say self.bitmap, which is a bit odd. Blit bitmap. It doesn't look like it creates a new one. Anyway, yeah, I don't know why it's returning that, but it's a bitmap label thing, not an outlines label thing. Place text, okay, that's looking good. Outline color, the color of the outline to draw, stroke size of the outline to draw. That looks all good. Bitmap label subclass that includes argument properties for specifying an outline size and outline color. Get drawn as a stroke around the text. Let me, oh, I've actually been in the repo this whole time, so let me copy this to the device. Didn't really change the functionality. Oh, should have done, control should be, I think in this case it wouldn't have mattered actually though, because it's not like renaming something this time, it was overwriting it. All right, quick sanity chess, quick sanity check. Let's make sure that still works. Yeah, okay, very good. We might be there, honestly. I guess I got this a little further than I thought. There were some fixes to do in the example, but I mean, there was a couple other documentation things, but then we're pretty much there now. I guess I shouldn't maybe talk before I run pre-commit. Maybe there's a lot of pre-commit issues. Pre-commit run A, we'll run it again too, since black just ran. How will it scale with the font of, how well will it scale with the font of scale two? How's it going to Shippu over on YouTube? Nice to see you my friend. It should scale fine. Right now we're on scale four, in fact. I scale it up to four to make it a bit bigger, and it should work fine with scale. As far as I know, scaling should be no problem. We could scale it up to eight. That's probably too big for the screen, I'm guessing. It's still pretty much instant, though, which is again kind of impressive. Yeah, should be, I believe we'll scale one, mess it up, I don't think so. I'm pretty sure any scale should work. This one's going to be too small to see on the camera, but yeah, any scale should work fine. Any integer scale, of course. Can we try larger text and larger border, double width, border, border three? Yeah, try anything we want. Let's see, so there's that outline. Right now, outline size. One thing I will say, the bigger your outline size, you start to lose these indentions or whatever. I don't know the proper term, but where this goes in, the bigger your outline size, the more closer to a rectangle around your text it's going to look, if that makes any sense. So like this was outline size, what was it, one? So let's do two. All right, see here how we don't have inside the H's anymore, that part? Like this one survived and we got a little cut out here and a cut out here and we have a little tiny cut out in between the L's, but you know, if that makes sense, like you lose you lose the the tight fitting shapes around your letters, the bigger your outline size is. So like this one's probably going to be almost a full rectangle. Yeah, almost. There's a couple little differences, a couple little cutouts, but once you get bigger, you're like full on just a big rectangle. Guesses you'd have to increase supporter size are outline size independent of font size. Yes, yeah, so you can declare the scale separately from the outside outline size. Yeah, so like right now we're on scale six, outline size four, but if we wanted to drop it all the way back to like super small, we can totally do scale two, but outline size four. Like we still have that same effect of it's, you know, the bigger outline size basically is going to make it into a rectangle, but you can change them independently and they should both like do the thing that makes sense as far as what makes sense in my head at least. Scale one on a big font size doesn't look that good. Not sure if there's a way to make it smaller because the text gets blocky the bigger it gets. Well, so if you have a custom font, then you can have a bigger font where it won't get as blocky. I mean the thing that gets the thing that gets blocky in my mind is the the stock font, but that's because the stock font is literally like a pixel font that's seven pixels by five pixels or something. It's very small for each glyph, so they just are blocky by their nature. If you scale them up, then that blockiness becomes like easier to see kind of, if that makes sense, but if you find, if you go and get a fancier font like, let's use a, let's do a custom font. Bitmap, no, what is it? Bitmap font, bitmap font, circuit Python. If you use a custom font, it can be curvier. I mean, our stamp source is a square right now as well, so it's, the outline is still going to be kind of square, but I don't know if I have these fonts. I tend to delete fonts because they're kind of big. Actually, I have quite a few. He says, as he's talking about deleting fonts, League Spartan, I'm pretty sure this one is kind of blocky anyway, but we'll see. I'm going to comment. I'm not going to keep this. Said size 16. Let's do scale one to start with an outline size one to start with. Doesn't restart automatically, of course. Didn't work. Get descendant. Get glyph. No, eight. Object. String object. Get ascent. Descent. String object has no get glyph. 311. I don't even think, I'm going to go back and try this, I guess, with the stock one. I don't even think this is an outlined label problem, though. Feels like this would be broken for the normal labels. 311 is on that get glyph. Ordinal char. And that says string. I am being so silly, aren't I? I totally set the font to the file. I need to load the font, obviously. Let us load the font. So yeah, we passed it a string, which obviously doesn't have get glyph. It's not a font. There we go. 40 pixel font. Times regular. All right, one thing I will say is I got to run to the restroom real quick. I will be right back. Okay, did this... All right, we didn't actually restart, though. Taste mode. Okay, so we did get that error this time. A reminder, removed everything, except Alpha and America on that one. Since it's for weather display. Same in and running out of light. Got to get some stuff done in the next 30 minutes. Yeah, take it easy. Scale one on the big... Oh yeah, this is blocky. Okay, yeah. Okay, that did work. Eventually got there. This font is still fairly blocky, though, as far as fonts go. This font is actually not all that dissimilar from the built-in font. It's bigger, I will say, but it's not that different as far as a style or anything. Um, let's try... Do we have... Well, if... I mean, if this is... Let me just regular 40. If it's got Alpha numeric, I mean, that's all we're using right now. So that should be fine. I don't want Scale 2, I guess. It might be a missing space, so it didn't render a space, but that's fine. If you thought space, maybe I'm thinking a regular label instead of bitmap label. I don't know. But yeah, that one works out as well. And so we could still... And that one is a much bigger font. That's size 40. It says in the name there. So what you can see is like the outline relative to text looks like a lot smaller on this one because the font itself is much bigger. That makes any sense. Feels kind of kind of intuitive off the top, but makes sense in my head, at least if you think about it, because that base font is just bigger. It's got more pixels. It's got more dark space in the middle. It's got more everything. This one actually looks pretty cool. There's not enough room for the Scale 2 to fit, though. Do I have Junction? I happen to know Junction is more curvy. I don't have that one. Okay. Is it in the repo? I think it's in the... Well, but it's in the bitmap font repo. 24. We'll do the PCF. There's download in front of my face. 163 kilobytes. My bird that's no large. I don't have enough room, honestly. Looks like we made it. We got hit by the padding again. We are still on outline size one, so we pretty much have to bump up the padding. I wish we could like... That would be a nice improvement, I guess, as if it could somehow pick the smallest padding that would work. I don't really know... I don't really know how it would do that, though. Just truthfully, I don't really understand why it's out of bounds sometimes. Yeah, so this one, the base font is a little bit curvier with things like the L, you know, it's curvy at the bottom. You know, like the D is very circular. The R is very curvy. The O, obviously. The outline still ends up looking blocky, though, due to the fact that it's a square, the stamp source, like we talked about before. What did our pre-commit end up saying? I haven't changed any code again. Have I? Only in the example. Which is fine. We don't really need... I think we really need to put the custom fonts into the example. Maybe we should be setting padding in the example, though, since it does seem like once you start changing fonts, it can affect that not work. Let's do it as like two to start with. We're just going to run that again since black made some changes last time. That's actually passing all the way. Nice, okay. Copy this one and call it test outlined label custom font. Paste the stock one back in, just to double check. I'll scale it up again. Let's go bigger again. Well, we want to make sure that we fit on some smaller screens, too. Let's try scale four. That's too big. Maybe scale three is where it's at. Oh, this one doesn't have the anchor point, actually, as well. I do want to steal that from the other one. Okay. Let me make sure it fits on that size screen also. And if it does, then this is the one I'll roll with. If it doesn't, then I'll take it down to scale two. Let me copy that. That's very old. The price of that's so old. There are S3. We're getting close. RC1 right now for 9.0. So we're getting close on 9.0. I couldn't save. It might be on. Yeah, it's on read only. Set up for web workflow. Whoa, whoa, whoa. Comment that out, restart it. It doesn't really matter, I suppose. We fixed this code. We don't even really need to keep this code. This is what's wrong with it, though. Sure, why was our simple test? This will fail the first time, obviously, because we don't have outlined labels. So we'll also take the library. On this one, we can actually put it in lib because I don't think it's frozen in. I don't know if the feather TFTs have anything frozen in. There we go. And that does fit. So I think we just, yeah, I think we just roll with that. This screen is like 135 by 240 or something like that, maybe. I know there's some screens that are 240 by 240. So the fact that we fit in this means we should fit on the 240 by 240s. I'm sure there are devices with a screen small enough that this might not fit, but the majority of them, this should fit. I don't know about PyGamer. Like 128 by something might be 240, I remember for sure. Anyway, I think we'll call that good. So what else can we commit? What are we looking here? We got some comments, delete that, add a comment. Like that's it. Add the padding, fix the root group, use anchor point and position instead of x, y, and then I bumped the scale to three. All good stuff. 9.x API, anchor, positioning, figure, scale, set paddings in example. Break the space into new line. If the screen width is less than 150. Oh, I see what you're saying. I think at least. So like, to be honest with you, I haven't tested new lines. I guess it should work fine. I'm just going to cheat. Yeah, good idea. Thank you. There's a wrap text inside of label, inside of a display text library that you could use to do that automatically. But this is also a simple test. Or the one thing, which is like supposed to show just the one thing. I do like this though, so it fits on more screens. Kind of a lot of these open. Why are these here? This file is not empty, first of all. Oh, we should try to build the docs. I don't know why those changed. Are they, what are they in main? Weird thing to be different. So RWRWR for all of these. An outlined label. If I check out main, should have updated main earlier probably. Okay, it is. And this again, they're executable in main. But that's just my main? Are they executable in everybody's main? Yeah, it doesn't matter. Honestly, I'm a little, I don't even really understand why Git tracks this for you. They are executable in main when you clone. Okay, so I need to go back to outline label and chmod them back to executable. Love wrapping. Also a phantom trunk eight plus ellipses. Yeah, that'd be cool if we had a helper for that. I don't think we do for the ellipses. We do have wrapping though. Yeah, permissions. I knew what changed. I just don't understand why really that would have happened. Can you do multiple? I'm just going to do them one at a time. I don't know. It doesn't matter. Oh, but it doesn't want to add that either, I think, because it doesn't recognize it as a change. Absolutely like add it manually. I'm pretty sure. Or go inside of here. Like I charm gets a little confused by that. Are you serious? Okay, I don't know why we were getting that pop up, but that pop up was like when you hover on the clickable thing, it was showing a pop up, which then was not clickable. So it was just like preventing you from clicking the thing that spawned the hover. But it stopped doing it. It's nice. Okay, now we're back to only the new stuff. We added outline label. We updated API to add outline label to the docs. We updated examples to add a link to the outlined label. It's all good for a... Oh, it's doing it again. Okay, it's when you come up from down here, and then you can't close because that little thing is underneath your mouse. Come on, GitHub. What are we doing here? Should we... I'll just do it afterwards anyway. I was going to say, should I check if the docs build before we do this? But it doesn't really matter, right? If they don't build, we'll fix it. Looks like it's going all right. Kind of curious to look at it as well, actually, because I want to see if it got those extra arguments. Yeah, that built fine. These are outline label, simple test. That part looks good. API reference. So wrap, there's the wrap I was talking about before. Wrap text to pixels or wrap text to the lines. That one's got a weird name, huh? They both wrap to... I mean, they both wrap to multiple lines. One of them wraps to a certain number of characters, I'm pretty sure, and the other one wraps to a certain number of pixels. So it divides out the width of the characters in order to get to pixels instead. But they both effectively take a string and give you back a list of multiple strings that are cut at certain intervals. The list in here is super weird. What is up with this? Why is it like label and then bitmap label, and then label again, and then label.bibmap, which is like... Not even a thing you should really use necessarily for the regular label, especially. I mean, this is on bitmap label, though, actually, okay. Okay, because that is bitmap label. This is the API reference. Can we clean that up any? I'm not super familiar with how this stuff gets rendered. Yeah, unfortunately, we don't have a lot of stuff going on, do we? I mean, maybe we just shouldn't do this first, right? Or, but then we're gonna lose out on the wrapping. Pretty sure we're not gonna see wrap lines or wrap pixels anymore. Does those come from the base file, I think, the init file? What's weird? I mean, there's a bunch of things that are weird, but one of the things that's weird is why does display text label... It has no capital L label here, but display text bitmap label does have a capital. But then we also just have another capital label Oh, okay. So that one, okay. This one is the non-bitmap. So like, really, this should kind of be up here. And then this should be up here. And then this should be up here. I mean, I guess this is just the order it's supposed to go in. I don't know. Actually, these didn't work. I guess I don't know where those come from. That's weird that it lists parameters here, but not here. This one's like that too. Like they're all like that. Interesting. All right. Well, there's certainly opportunity for improvement in the docs here. Mostly the formatting of the API, I would say. But it does build and it does include the new stuff. And I'm not inclined to go too far. All right. There's our outline label. It does have our new properties. It would be, I mean, it doesn't show you the extents here, which is a bit odd because it would be nice if it would either show you all the parameters that exist because of the parent or at least like show you a link to the parent so that you could click it. I'm actually kind of surprised that doesn't work. It failed anyway here. It failed pylon. But I ran pylon with a different pylon, I guess. But I thought the pre-commit thing, I thought the way this was set up was like it specified all the versions. It must not be 714. But no, that's a hook. That says pre-commit hook versions. Oh wait, it's not pylon. It's black actually changed it. I just ran it. Did I not? I must have made a change after I ran it. Space, did I change that after I ran it? I mean, I guess maybe I changed the whole anchor point. Maybe I changed all of that afterwards. That's interesting. So where is that? That's on the method. So ours is a knit. I don't know, this might not. I don't know, this isn't going to work honestly. Where would it import that from? Where does that come from? Oh, it didn't import it to find it. But that was like a built-in thing. Yes, it extends it. It necessarily shares properties with it. Did we use that? Inherit dock strings? Have no inherit. Would dock inherit? Lock imports? I don't know where it would go. Just here I guess? Anywhere? Does pass this time or still fail again? Just run around crazy time for the cat. Yeah, I don't know. I don't see a difference. I mean it says here. I mean, I guess like if we wanted to get more manual on it, we could... I'm pretty sure you can link. I don't know the syntax. But I guess we could link to it there. I don't know. I don't necessarily want to dive too far into it. If I'm honest, the docks formatting, let's say genre of programming is not one that I particularly enjoy very much. I must rather be tinkering with code that kind of affects a program instead of an HTML page at the end of the day. This thing is cool the way it pulls the docks out of the code, but it's also a little frustrating sometimes when it's like... It becomes difficult sometimes to tell what a given change in the code is going to cause to happen with the HTML that's outputted. This did pass. I think we're good there. So we'll do that. All right, I do apologize, but I am going to have to run to the restroom again. So I will be right back. And then we've got about 30 minutes left. So I think what we'll do is use that on a different device. I will leave you with a teaser for... I must clean off the screen though. This is unacceptable, right? This is grody. All right, BRB. Okay. Okay, so I next want to try to use this fancy label as the overlay or the camera with the overlays. I'm 0.00 beta one. I'll go ahead and update. We might as well just update everything. He said... Yep, that's my ideas like the kind of comic book style fonts being overlaid like that. Exactly right. Yeah, so I did... I was playing with overlays a couple of weeks back, maybe two, three weeks ago. I was doing some overlays with the borders and the stuff like that. And then I've made a few other improvements to the overlays, like the ability to change the position and change the size. But I believe they are all still bitmaps right now. And so one thing I think would be cool is to be able to put a text as your overlay. For some stuff like that, like the kind of cool cartoony sort of font effects, or another one that came to mind for me was like wanted. Like you would see on an old timey wanted poster, like you could put the wanted text at the top or at the bottom, either one, and then like also use a sepia filter or something like that. So your photo would turn out looking like an old school wanted poster. The other thing that I think would be cool, which is less flashy, but kind of cool, I think on a functional level is you could put a timestamp in your image in the corner, like how cameras used to do before we had like metadata on the images and stuff. So it could have just like a little date and time that gets blitted into the bottom corner or whatever of the picture. I don't know if we can actually write the metadata from CircuitPython. That might be interesting to look into as well, but being able to just paste it into the image means we don't, it doesn't have to be in the metadata. Okay, I don't remember, I have no idea which version of the code would be on this right now. Let's see, this is not it. I'm glad this was, okay, this is the repo. Okay, simple camera is what this says. Overlay, no overlays, okay. Let's get to PyCamerRepo and I'll grab the overlay example because I think we start, I think we pretty much start from the overlay example. Ah, it was off by one. Play text, we can, yeah, we can close this one. I will take code simple overlay. Let's start from there. So this one just puts the overlay on the image. Sets the transparency and then after you snap the photo, it blitz it into a copy of the photo. Okay, so, yeah, this will be tricky because that's actually a string. It was doing more inside there than I remembered. Turns out, really foul to be used. I'm gonna try this. I don't know if this is gonna work. So we're gonna say this can now be a union of a string or a bitmap directly about bitmap, but then it shouldn't really be called new overlay file at that point. It should just be new overlay. I mean, maybe we should have, maybe we should have a different property. This one's called overlay. Maybe we should have overlay bitmap or maybe overlay with nothing else should be the bitmap and overlay file should exist for the file. I think I actually like that one the best. That requires a bigger change though. Okay, so here's the thing. We actually don't need to worry about this just yet. We can test whether or not this is even gonna work by just directly modifying overlay bitmap. So let me do that. So I'm gonna, I'm not gonna set either of these and instead what I'm gonna do is create a bitmap label. I'll just use stock. Seems like a fitting thing to start with at least, right? I think let's, should be all we need, I think, honestly. So pycam dot, well, what's the color on that? Let's change the color to ink, but it's hopefully easy to see. Okay, so pycam dot. So we're not gonna set overlay the property instead we're gonna set overlay bitmap and that's gonna be bitmap label dot bitmap. And then I think maybe the rest of this just works. I guess we shall see. I guess you discovered my good times font have no space. There was a bit of a zealous, I was a bit of a zealous about removing characters and font forge I'll fix someday. Yeah, I think it looked cool, honestly. I think optional args could do optional args. Maybe file is none or bitmap is none. File is none or bitmap is none. I'm not sure what you mean by that part. None type object has no attribute width and 12. I guess we need overlay to be something. None bitmap have equals combined bitmap. It says line 40, which doesn't even have code on it. That didn't even actually crash. That worked, but it is like absurdly small because it also gets scaled down for the preview. It's also centered, which I guess is just the default behavior. It's also a black background, I guess makes sense. We would still need to actually set the transparency color, but we also need to know if that's going to work. If it does work, it's going to be really hard to see. Let me also scale it up. Let me also... You could try setting it to literally this. I don't think that's going to be right though. Doesn't seem like the pink is working either. Let me snap a photo and let's actually get a look at it. Doesn't seem like the scale did anything. Well, I would say no, I just jumped. I mean, I didn't really jump back and forth that many times. I just tested on the titano and the feather, and then now I am kind of like moving wholesale to the memento, which I still sometimes call the wrong name, moving to the memento to try to use... Right? I mean, I haven't even gotten to the outline label just yet. I'm on the regular label still, or the bitmap label, I guess, but just trying to use overlays with labels more generally. But I will eventually like, I hope to get to the point of doing the outline label. Though I don't know that we'll make it in 19 minutes, especially since it's already... Well, the transparency is not working. We're about to find out whether the blit worked at all or not. One problem though is that the... Why did that get named that way? I guess this one... Or I still have a wrong version of the library? Why do I have commits in main? I don't want to push those, delete. I'm going to update the library on my device. Is it frozen in? I mean, I have it in lib, I guess. This iron bow. All right, I'm going to take another picture. I know we didn't even look at the last one, but I think I had a old version... Well, not even an old version, but just a partway dev version that had a bug of the library that didn't do the file names right. So I'm going back, get that, make sure we get the right file name after. Uh, didn't it? You get that fancy border working on the Mumento. I have not yet, huh? I mean, I guess it would work without the camera and all the rest of the stuff. Like we could put it on the display the same as we did the other devices. I'm sure it would work fine, but we have not gotten it to work in the camera now. That's what I'm headed towards, but not looking likely to make it in the next 16 minutes. I already have some overlays. It can overlay images right now. That's what I did add before is overlaying images. So like you can have a BMP file. Yeah, there we go. Now we've got our 00 back. Okay, so modified. That's the one with the actual stamp on top. So then what I'm trying to change today is make it to where you can do text instead of an image. Huh. Oh, it's up there in the top left. Interesting. Why do none of these... Okay, I don't know where hello went. I also don't know why. I'm not sure why the position... I'm not sure why the preview is in the middle of the screen, but the way that it came out on the file is... Boy, there is like a really dead angle right there. I guess it's just the camera getting dark actually. Okay. All right. Yeah, that's weird. I don't know why. I mean, we have several things going wrong. One of them is the color. We try to do pink, but we have very, very dark green instead. I tried to do pink. That's one problem. Is the color of the font is wrong? The next problem is the color of the background is wrong. I tried to do green in the background because I'm trying to get it to be transparent ultimately, but that's failing. It's coming out as black, honestly. So I guess if we set this to zero, maybe it will be cut out, but the truth is I'm not really trying to use black. Okay, that actually worked. So black does allow it to cut the text and be like... It doesn't have the black box around it anymore. Yeah, zero, zero. Yeah, that's true. Yeah, that's true. I just don't get why they're different. I'm surprised they're different. It's probably to do with... No, I'm not even going to hazard a guess. I don't really know why they're different. I'm surprised. Let's... I'll put it at... I'm very surprised that they are different. The location between the preview and where it ends up here. I thought they were effectively using more or less the same code. So I'm surprised that they're different. They totally are. I mean, this one is like... This one almost feels like zero, zero, X, Y. Well, no, because it should be pushed over farther still. Yeah, this one has just got a weird location. The color is still wrong. So I think the color is probably wrong because of RGB 565. If we use this, we might be able to get pink. It's also very small, I guess. Yeah, scale would not work because... Yeah, actually, I know why scale won't work. Scale won't work because scale scales the group, not the bitmap. If I were to go to the more advanced overlay example... So I started from overlay simple, but there is an overlay select. If I would have started from overlay select, there are actually some buttons you can press to change the scale now. So I could have tried that. No, we still don't have pink. I think it's a indexed color problem. My next guess, as for why our color is not working, is that the bitmap that is used by bitmap label is indexed, but the bitmap that this thing is wanting to use for its blit into the preview and its blit into the final image, it's wanting it to be RGB. So I'm getting super dark green because in my indexed BMP, the index is just like one or zero or two or something really, really low. We actually kind of would need it to be RGB so that the index stored in that bitmap would be the actual color value, not the just one or two, or else we would have to change code somewhere to access the palette. Yeah, that's going to make it a fair bit trickier. It's going to make it a fair bit trickier. Yeah, we could maybe make a function that will take an indexed bitmap and convert it to RGB by looking up each color in the palette and replacing the index of that color with the color itself inside the bitmap. The problem is the bitmap will have been created initially for only like two or three colors or whatever. So we are almost certainly going to have to make a copy of it instead of just modifying the original. I think the overlay code was doing something similar, color converting. Yeah, it totally is. It's doing, there's like all sorts of conversions going on, honestly. So because the image resolution, the color thing I don't think is because of the resolution. The fact that the hello looks messed up and is partially, potentially cut off, that might be to do with the resolution, but I'm not sure. 20 years ago, digital camera, this resolution been like $1,000. Yeah, that's totally true. Or maybe 30 years ago. 20 years ago isn't as long as it feels like sometimes, huh? You could probably store the index of the color in the image itself as a one by one pixel or something. That's an interesting idea, store extra data in there. Color space stuff is confusing. Agreed, a million percent. I would say I have a much better grasp of it after doing this work on the pie camera that I did a couple of weeks ago, but I still quickly end up in a point where my head is just spinning, truthfully. Which it looks like we're going to have to dive back into it at some point. But I think that's all the more we're going to get to for the evening. I don't think I'm going to have a solution for this because it's going to require something very, very tricky. Basically trying to make an RGB converter function, something that will take an InzX bitmap, convert it to an RGB bitmap, and then we should be able to use the RGB one for this purpose, I think. Might be kind of hard, but might not be. Off the top of my head, I don't think it will be that hard, but I also have that feeling about it. You have sometimes where you're like, yeah, I don't think that'll be that hard, but in the back of your head you're like, but maybe it will, right? Like maybe I'll try it and it just won't do at all what I thought it would or whatever. All right, I think we'll stop there for now. So thanks for hanging out. Let me say I appreciate all the folks who are watching this. I appreciate all the folks who came and said hi and asked questions and gave comments in the chat. I, for those of you that don't know, stream, I stream over on my own channel, FOMIGuy underscore Twitch on Twitch, as well as FOMIGuy on YouTube on Saturday mornings. So that is tomorrow morning at 10 a.m. central time. If you are interested in some more Circuit Python development content, then I would encourage you to come join me then or catch the VODs if you're not available at that time live. Tomorrow morning, I will not be working on this. I think what I have in mind to work on tomorrow morning is actually back over to the card pewter, the messenger server that we're writing on this card pewter device. If you're interested in that little teaser, you can go back over on my channel and there's VODs of the last couple of times I worked on this, but I think that's the plan for the morning tomorrow is I'll be getting back to that. So if you're interested in HTTP, web server, web content, JavaScript, HTML, that kind of stuff as well as display IO on the device itself, that's what I'm gonna be working on tomorrow morning. That's at 10 a.m. central time. I'm pretty sure I believe Scott's back next week for deep dive or if not, I should say, at least we just haven't talked about it yet. So I am working under the assumption that Scott will be doing deep dive next week unless something else comes up. So I will see you tomorrow. Scott will see you next week. If you join in for deep dive, appreciate all of you. Hope everyone has a good rest of your Friday, good weekend and all that stuff. And I will catch you all later. Thanks again for tuning in.