gtsocial-umbx

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

predfunc.go (13006B)


      1 // Copyright 2011 The Go Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style
      3 // license that can be found in the LICENSE file.
      4 
      5 package vp8
      6 
      7 // This file implements the predicition functions, as specified in chapter 12.
      8 //
      9 // For each macroblock (of 1x16x16 luma and 2x8x8 chroma coefficients), the
     10 // luma values are either predicted as one large 16x16 region or 16 separate
     11 // 4x4 regions. The chroma values are always predicted as one 8x8 region.
     12 //
     13 // For 4x4 regions, the target block's predicted values (Xs) are a function of
     14 // its previously-decoded top and left border values, as well as a number of
     15 // pixels from the top-right:
     16 //
     17 //	a b c d e f g h
     18 //	p X X X X
     19 //	q X X X X
     20 //	r X X X X
     21 //	s X X X X
     22 //
     23 // The predictor modes are:
     24 //	- DC: all Xs = (b + c + d + e + p + q + r + s + 4) / 8.
     25 //	- TM: the first X = (b + p - a), the second X = (c + p - a), and so on.
     26 //	- VE: each X = the weighted average of its column's top value and that
     27 //	      value's neighbors, i.e. averages of abc, bcd, cde or def.
     28 //	- HE: similar to VE except rows instead of columns, and the final row is
     29 //	      an average of r, s and s.
     30 //	- RD, VR, LD, VL, HD, HU: these diagonal modes ("Right Down", "Vertical
     31 //	      Right", etc) are more complicated and are described in section 12.3.
     32 // All Xs are clipped to the range [0, 255].
     33 //
     34 // For 8x8 and 16x16 regions, the target block's predicted values are a
     35 // function of the top and left border values without the top-right overhang,
     36 // i.e. without the 8x8 or 16x16 equivalent of f, g and h. Furthermore:
     37 //	- There are no diagonal predictor modes, only DC, TM, VE and HE.
     38 //	- The DC mode has variants for macroblocks in the top row and/or left
     39 //	  column, i.e. for macroblocks with mby == 0 || mbx == 0.
     40 //	- The VE and HE modes take only the column top or row left values; they do
     41 //	  not smooth that top/left value with its neighbors.
     42 
     43 // nPred is the number of predictor modes, not including the Top/Left versions
     44 // of the DC predictor mode.
     45 const nPred = 10
     46 
     47 const (
     48 	predDC = iota
     49 	predTM
     50 	predVE
     51 	predHE
     52 	predRD
     53 	predVR
     54 	predLD
     55 	predVL
     56 	predHD
     57 	predHU
     58 	predDCTop
     59 	predDCLeft
     60 	predDCTopLeft
     61 )
     62 
     63 func checkTopLeftPred(mbx, mby int, p uint8) uint8 {
     64 	if p != predDC {
     65 		return p
     66 	}
     67 	if mbx == 0 {
     68 		if mby == 0 {
     69 			return predDCTopLeft
     70 		}
     71 		return predDCLeft
     72 	}
     73 	if mby == 0 {
     74 		return predDCTop
     75 	}
     76 	return predDC
     77 }
     78 
     79 var predFunc4 = [...]func(*Decoder, int, int){
     80 	predFunc4DC,
     81 	predFunc4TM,
     82 	predFunc4VE,
     83 	predFunc4HE,
     84 	predFunc4RD,
     85 	predFunc4VR,
     86 	predFunc4LD,
     87 	predFunc4VL,
     88 	predFunc4HD,
     89 	predFunc4HU,
     90 	nil,
     91 	nil,
     92 	nil,
     93 }
     94 
     95 var predFunc8 = [...]func(*Decoder, int, int){
     96 	predFunc8DC,
     97 	predFunc8TM,
     98 	predFunc8VE,
     99 	predFunc8HE,
    100 	nil,
    101 	nil,
    102 	nil,
    103 	nil,
    104 	nil,
    105 	nil,
    106 	predFunc8DCTop,
    107 	predFunc8DCLeft,
    108 	predFunc8DCTopLeft,
    109 }
    110 
    111 var predFunc16 = [...]func(*Decoder, int, int){
    112 	predFunc16DC,
    113 	predFunc16TM,
    114 	predFunc16VE,
    115 	predFunc16HE,
    116 	nil,
    117 	nil,
    118 	nil,
    119 	nil,
    120 	nil,
    121 	nil,
    122 	predFunc16DCTop,
    123 	predFunc16DCLeft,
    124 	predFunc16DCTopLeft,
    125 }
    126 
    127 func predFunc4DC(z *Decoder, y, x int) {
    128 	sum := uint32(4)
    129 	for i := 0; i < 4; i++ {
    130 		sum += uint32(z.ybr[y-1][x+i])
    131 	}
    132 	for j := 0; j < 4; j++ {
    133 		sum += uint32(z.ybr[y+j][x-1])
    134 	}
    135 	avg := uint8(sum / 8)
    136 	for j := 0; j < 4; j++ {
    137 		for i := 0; i < 4; i++ {
    138 			z.ybr[y+j][x+i] = avg
    139 		}
    140 	}
    141 }
    142 
    143 func predFunc4TM(z *Decoder, y, x int) {
    144 	delta0 := -int32(z.ybr[y-1][x-1])
    145 	for j := 0; j < 4; j++ {
    146 		delta1 := delta0 + int32(z.ybr[y+j][x-1])
    147 		for i := 0; i < 4; i++ {
    148 			delta2 := delta1 + int32(z.ybr[y-1][x+i])
    149 			z.ybr[y+j][x+i] = uint8(clip(delta2, 0, 255))
    150 		}
    151 	}
    152 }
    153 
    154 func predFunc4VE(z *Decoder, y, x int) {
    155 	a := int32(z.ybr[y-1][x-1])
    156 	b := int32(z.ybr[y-1][x+0])
    157 	c := int32(z.ybr[y-1][x+1])
    158 	d := int32(z.ybr[y-1][x+2])
    159 	e := int32(z.ybr[y-1][x+3])
    160 	f := int32(z.ybr[y-1][x+4])
    161 	abc := uint8((a + 2*b + c + 2) / 4)
    162 	bcd := uint8((b + 2*c + d + 2) / 4)
    163 	cde := uint8((c + 2*d + e + 2) / 4)
    164 	def := uint8((d + 2*e + f + 2) / 4)
    165 	for j := 0; j < 4; j++ {
    166 		z.ybr[y+j][x+0] = abc
    167 		z.ybr[y+j][x+1] = bcd
    168 		z.ybr[y+j][x+2] = cde
    169 		z.ybr[y+j][x+3] = def
    170 	}
    171 }
    172 
    173 func predFunc4HE(z *Decoder, y, x int) {
    174 	s := int32(z.ybr[y+3][x-1])
    175 	r := int32(z.ybr[y+2][x-1])
    176 	q := int32(z.ybr[y+1][x-1])
    177 	p := int32(z.ybr[y+0][x-1])
    178 	a := int32(z.ybr[y-1][x-1])
    179 	ssr := uint8((s + 2*s + r + 2) / 4)
    180 	srq := uint8((s + 2*r + q + 2) / 4)
    181 	rqp := uint8((r + 2*q + p + 2) / 4)
    182 	apq := uint8((a + 2*p + q + 2) / 4)
    183 	for i := 0; i < 4; i++ {
    184 		z.ybr[y+0][x+i] = apq
    185 		z.ybr[y+1][x+i] = rqp
    186 		z.ybr[y+2][x+i] = srq
    187 		z.ybr[y+3][x+i] = ssr
    188 	}
    189 }
    190 
    191 func predFunc4RD(z *Decoder, y, x int) {
    192 	s := int32(z.ybr[y+3][x-1])
    193 	r := int32(z.ybr[y+2][x-1])
    194 	q := int32(z.ybr[y+1][x-1])
    195 	p := int32(z.ybr[y+0][x-1])
    196 	a := int32(z.ybr[y-1][x-1])
    197 	b := int32(z.ybr[y-1][x+0])
    198 	c := int32(z.ybr[y-1][x+1])
    199 	d := int32(z.ybr[y-1][x+2])
    200 	e := int32(z.ybr[y-1][x+3])
    201 	srq := uint8((s + 2*r + q + 2) / 4)
    202 	rqp := uint8((r + 2*q + p + 2) / 4)
    203 	qpa := uint8((q + 2*p + a + 2) / 4)
    204 	pab := uint8((p + 2*a + b + 2) / 4)
    205 	abc := uint8((a + 2*b + c + 2) / 4)
    206 	bcd := uint8((b + 2*c + d + 2) / 4)
    207 	cde := uint8((c + 2*d + e + 2) / 4)
    208 	z.ybr[y+0][x+0] = pab
    209 	z.ybr[y+0][x+1] = abc
    210 	z.ybr[y+0][x+2] = bcd
    211 	z.ybr[y+0][x+3] = cde
    212 	z.ybr[y+1][x+0] = qpa
    213 	z.ybr[y+1][x+1] = pab
    214 	z.ybr[y+1][x+2] = abc
    215 	z.ybr[y+1][x+3] = bcd
    216 	z.ybr[y+2][x+0] = rqp
    217 	z.ybr[y+2][x+1] = qpa
    218 	z.ybr[y+2][x+2] = pab
    219 	z.ybr[y+2][x+3] = abc
    220 	z.ybr[y+3][x+0] = srq
    221 	z.ybr[y+3][x+1] = rqp
    222 	z.ybr[y+3][x+2] = qpa
    223 	z.ybr[y+3][x+3] = pab
    224 }
    225 
    226 func predFunc4VR(z *Decoder, y, x int) {
    227 	r := int32(z.ybr[y+2][x-1])
    228 	q := int32(z.ybr[y+1][x-1])
    229 	p := int32(z.ybr[y+0][x-1])
    230 	a := int32(z.ybr[y-1][x-1])
    231 	b := int32(z.ybr[y-1][x+0])
    232 	c := int32(z.ybr[y-1][x+1])
    233 	d := int32(z.ybr[y-1][x+2])
    234 	e := int32(z.ybr[y-1][x+3])
    235 	ab := uint8((a + b + 1) / 2)
    236 	bc := uint8((b + c + 1) / 2)
    237 	cd := uint8((c + d + 1) / 2)
    238 	de := uint8((d + e + 1) / 2)
    239 	rqp := uint8((r + 2*q + p + 2) / 4)
    240 	qpa := uint8((q + 2*p + a + 2) / 4)
    241 	pab := uint8((p + 2*a + b + 2) / 4)
    242 	abc := uint8((a + 2*b + c + 2) / 4)
    243 	bcd := uint8((b + 2*c + d + 2) / 4)
    244 	cde := uint8((c + 2*d + e + 2) / 4)
    245 	z.ybr[y+0][x+0] = ab
    246 	z.ybr[y+0][x+1] = bc
    247 	z.ybr[y+0][x+2] = cd
    248 	z.ybr[y+0][x+3] = de
    249 	z.ybr[y+1][x+0] = pab
    250 	z.ybr[y+1][x+1] = abc
    251 	z.ybr[y+1][x+2] = bcd
    252 	z.ybr[y+1][x+3] = cde
    253 	z.ybr[y+2][x+0] = qpa
    254 	z.ybr[y+2][x+1] = ab
    255 	z.ybr[y+2][x+2] = bc
    256 	z.ybr[y+2][x+3] = cd
    257 	z.ybr[y+3][x+0] = rqp
    258 	z.ybr[y+3][x+1] = pab
    259 	z.ybr[y+3][x+2] = abc
    260 	z.ybr[y+3][x+3] = bcd
    261 }
    262 
    263 func predFunc4LD(z *Decoder, y, x int) {
    264 	a := int32(z.ybr[y-1][x+0])
    265 	b := int32(z.ybr[y-1][x+1])
    266 	c := int32(z.ybr[y-1][x+2])
    267 	d := int32(z.ybr[y-1][x+3])
    268 	e := int32(z.ybr[y-1][x+4])
    269 	f := int32(z.ybr[y-1][x+5])
    270 	g := int32(z.ybr[y-1][x+6])
    271 	h := int32(z.ybr[y-1][x+7])
    272 	abc := uint8((a + 2*b + c + 2) / 4)
    273 	bcd := uint8((b + 2*c + d + 2) / 4)
    274 	cde := uint8((c + 2*d + e + 2) / 4)
    275 	def := uint8((d + 2*e + f + 2) / 4)
    276 	efg := uint8((e + 2*f + g + 2) / 4)
    277 	fgh := uint8((f + 2*g + h + 2) / 4)
    278 	ghh := uint8((g + 2*h + h + 2) / 4)
    279 	z.ybr[y+0][x+0] = abc
    280 	z.ybr[y+0][x+1] = bcd
    281 	z.ybr[y+0][x+2] = cde
    282 	z.ybr[y+0][x+3] = def
    283 	z.ybr[y+1][x+0] = bcd
    284 	z.ybr[y+1][x+1] = cde
    285 	z.ybr[y+1][x+2] = def
    286 	z.ybr[y+1][x+3] = efg
    287 	z.ybr[y+2][x+0] = cde
    288 	z.ybr[y+2][x+1] = def
    289 	z.ybr[y+2][x+2] = efg
    290 	z.ybr[y+2][x+3] = fgh
    291 	z.ybr[y+3][x+0] = def
    292 	z.ybr[y+3][x+1] = efg
    293 	z.ybr[y+3][x+2] = fgh
    294 	z.ybr[y+3][x+3] = ghh
    295 }
    296 
    297 func predFunc4VL(z *Decoder, y, x int) {
    298 	a := int32(z.ybr[y-1][x+0])
    299 	b := int32(z.ybr[y-1][x+1])
    300 	c := int32(z.ybr[y-1][x+2])
    301 	d := int32(z.ybr[y-1][x+3])
    302 	e := int32(z.ybr[y-1][x+4])
    303 	f := int32(z.ybr[y-1][x+5])
    304 	g := int32(z.ybr[y-1][x+6])
    305 	h := int32(z.ybr[y-1][x+7])
    306 	ab := uint8((a + b + 1) / 2)
    307 	bc := uint8((b + c + 1) / 2)
    308 	cd := uint8((c + d + 1) / 2)
    309 	de := uint8((d + e + 1) / 2)
    310 	abc := uint8((a + 2*b + c + 2) / 4)
    311 	bcd := uint8((b + 2*c + d + 2) / 4)
    312 	cde := uint8((c + 2*d + e + 2) / 4)
    313 	def := uint8((d + 2*e + f + 2) / 4)
    314 	efg := uint8((e + 2*f + g + 2) / 4)
    315 	fgh := uint8((f + 2*g + h + 2) / 4)
    316 	z.ybr[y+0][x+0] = ab
    317 	z.ybr[y+0][x+1] = bc
    318 	z.ybr[y+0][x+2] = cd
    319 	z.ybr[y+0][x+3] = de
    320 	z.ybr[y+1][x+0] = abc
    321 	z.ybr[y+1][x+1] = bcd
    322 	z.ybr[y+1][x+2] = cde
    323 	z.ybr[y+1][x+3] = def
    324 	z.ybr[y+2][x+0] = bc
    325 	z.ybr[y+2][x+1] = cd
    326 	z.ybr[y+2][x+2] = de
    327 	z.ybr[y+2][x+3] = efg
    328 	z.ybr[y+3][x+0] = bcd
    329 	z.ybr[y+3][x+1] = cde
    330 	z.ybr[y+3][x+2] = def
    331 	z.ybr[y+3][x+3] = fgh
    332 }
    333 
    334 func predFunc4HD(z *Decoder, y, x int) {
    335 	s := int32(z.ybr[y+3][x-1])
    336 	r := int32(z.ybr[y+2][x-1])
    337 	q := int32(z.ybr[y+1][x-1])
    338 	p := int32(z.ybr[y+0][x-1])
    339 	a := int32(z.ybr[y-1][x-1])
    340 	b := int32(z.ybr[y-1][x+0])
    341 	c := int32(z.ybr[y-1][x+1])
    342 	d := int32(z.ybr[y-1][x+2])
    343 	sr := uint8((s + r + 1) / 2)
    344 	rq := uint8((r + q + 1) / 2)
    345 	qp := uint8((q + p + 1) / 2)
    346 	pa := uint8((p + a + 1) / 2)
    347 	srq := uint8((s + 2*r + q + 2) / 4)
    348 	rqp := uint8((r + 2*q + p + 2) / 4)
    349 	qpa := uint8((q + 2*p + a + 2) / 4)
    350 	pab := uint8((p + 2*a + b + 2) / 4)
    351 	abc := uint8((a + 2*b + c + 2) / 4)
    352 	bcd := uint8((b + 2*c + d + 2) / 4)
    353 	z.ybr[y+0][x+0] = pa
    354 	z.ybr[y+0][x+1] = pab
    355 	z.ybr[y+0][x+2] = abc
    356 	z.ybr[y+0][x+3] = bcd
    357 	z.ybr[y+1][x+0] = qp
    358 	z.ybr[y+1][x+1] = qpa
    359 	z.ybr[y+1][x+2] = pa
    360 	z.ybr[y+1][x+3] = pab
    361 	z.ybr[y+2][x+0] = rq
    362 	z.ybr[y+2][x+1] = rqp
    363 	z.ybr[y+2][x+2] = qp
    364 	z.ybr[y+2][x+3] = qpa
    365 	z.ybr[y+3][x+0] = sr
    366 	z.ybr[y+3][x+1] = srq
    367 	z.ybr[y+3][x+2] = rq
    368 	z.ybr[y+3][x+3] = rqp
    369 }
    370 
    371 func predFunc4HU(z *Decoder, y, x int) {
    372 	s := int32(z.ybr[y+3][x-1])
    373 	r := int32(z.ybr[y+2][x-1])
    374 	q := int32(z.ybr[y+1][x-1])
    375 	p := int32(z.ybr[y+0][x-1])
    376 	pq := uint8((p + q + 1) / 2)
    377 	qr := uint8((q + r + 1) / 2)
    378 	rs := uint8((r + s + 1) / 2)
    379 	pqr := uint8((p + 2*q + r + 2) / 4)
    380 	qrs := uint8((q + 2*r + s + 2) / 4)
    381 	rss := uint8((r + 2*s + s + 2) / 4)
    382 	sss := uint8(s)
    383 	z.ybr[y+0][x+0] = pq
    384 	z.ybr[y+0][x+1] = pqr
    385 	z.ybr[y+0][x+2] = qr
    386 	z.ybr[y+0][x+3] = qrs
    387 	z.ybr[y+1][x+0] = qr
    388 	z.ybr[y+1][x+1] = qrs
    389 	z.ybr[y+1][x+2] = rs
    390 	z.ybr[y+1][x+3] = rss
    391 	z.ybr[y+2][x+0] = rs
    392 	z.ybr[y+2][x+1] = rss
    393 	z.ybr[y+2][x+2] = sss
    394 	z.ybr[y+2][x+3] = sss
    395 	z.ybr[y+3][x+0] = sss
    396 	z.ybr[y+3][x+1] = sss
    397 	z.ybr[y+3][x+2] = sss
    398 	z.ybr[y+3][x+3] = sss
    399 }
    400 
    401 func predFunc8DC(z *Decoder, y, x int) {
    402 	sum := uint32(8)
    403 	for i := 0; i < 8; i++ {
    404 		sum += uint32(z.ybr[y-1][x+i])
    405 	}
    406 	for j := 0; j < 8; j++ {
    407 		sum += uint32(z.ybr[y+j][x-1])
    408 	}
    409 	avg := uint8(sum / 16)
    410 	for j := 0; j < 8; j++ {
    411 		for i := 0; i < 8; i++ {
    412 			z.ybr[y+j][x+i] = avg
    413 		}
    414 	}
    415 }
    416 
    417 func predFunc8TM(z *Decoder, y, x int) {
    418 	delta0 := -int32(z.ybr[y-1][x-1])
    419 	for j := 0; j < 8; j++ {
    420 		delta1 := delta0 + int32(z.ybr[y+j][x-1])
    421 		for i := 0; i < 8; i++ {
    422 			delta2 := delta1 + int32(z.ybr[y-1][x+i])
    423 			z.ybr[y+j][x+i] = uint8(clip(delta2, 0, 255))
    424 		}
    425 	}
    426 }
    427 
    428 func predFunc8VE(z *Decoder, y, x int) {
    429 	for j := 0; j < 8; j++ {
    430 		for i := 0; i < 8; i++ {
    431 			z.ybr[y+j][x+i] = z.ybr[y-1][x+i]
    432 		}
    433 	}
    434 }
    435 
    436 func predFunc8HE(z *Decoder, y, x int) {
    437 	for j := 0; j < 8; j++ {
    438 		for i := 0; i < 8; i++ {
    439 			z.ybr[y+j][x+i] = z.ybr[y+j][x-1]
    440 		}
    441 	}
    442 }
    443 
    444 func predFunc8DCTop(z *Decoder, y, x int) {
    445 	sum := uint32(4)
    446 	for j := 0; j < 8; j++ {
    447 		sum += uint32(z.ybr[y+j][x-1])
    448 	}
    449 	avg := uint8(sum / 8)
    450 	for j := 0; j < 8; j++ {
    451 		for i := 0; i < 8; i++ {
    452 			z.ybr[y+j][x+i] = avg
    453 		}
    454 	}
    455 }
    456 
    457 func predFunc8DCLeft(z *Decoder, y, x int) {
    458 	sum := uint32(4)
    459 	for i := 0; i < 8; i++ {
    460 		sum += uint32(z.ybr[y-1][x+i])
    461 	}
    462 	avg := uint8(sum / 8)
    463 	for j := 0; j < 8; j++ {
    464 		for i := 0; i < 8; i++ {
    465 			z.ybr[y+j][x+i] = avg
    466 		}
    467 	}
    468 }
    469 
    470 func predFunc8DCTopLeft(z *Decoder, y, x int) {
    471 	for j := 0; j < 8; j++ {
    472 		for i := 0; i < 8; i++ {
    473 			z.ybr[y+j][x+i] = 0x80
    474 		}
    475 	}
    476 }
    477 
    478 func predFunc16DC(z *Decoder, y, x int) {
    479 	sum := uint32(16)
    480 	for i := 0; i < 16; i++ {
    481 		sum += uint32(z.ybr[y-1][x+i])
    482 	}
    483 	for j := 0; j < 16; j++ {
    484 		sum += uint32(z.ybr[y+j][x-1])
    485 	}
    486 	avg := uint8(sum / 32)
    487 	for j := 0; j < 16; j++ {
    488 		for i := 0; i < 16; i++ {
    489 			z.ybr[y+j][x+i] = avg
    490 		}
    491 	}
    492 }
    493 
    494 func predFunc16TM(z *Decoder, y, x int) {
    495 	delta0 := -int32(z.ybr[y-1][x-1])
    496 	for j := 0; j < 16; j++ {
    497 		delta1 := delta0 + int32(z.ybr[y+j][x-1])
    498 		for i := 0; i < 16; i++ {
    499 			delta2 := delta1 + int32(z.ybr[y-1][x+i])
    500 			z.ybr[y+j][x+i] = uint8(clip(delta2, 0, 255))
    501 		}
    502 	}
    503 }
    504 
    505 func predFunc16VE(z *Decoder, y, x int) {
    506 	for j := 0; j < 16; j++ {
    507 		for i := 0; i < 16; i++ {
    508 			z.ybr[y+j][x+i] = z.ybr[y-1][x+i]
    509 		}
    510 	}
    511 }
    512 
    513 func predFunc16HE(z *Decoder, y, x int) {
    514 	for j := 0; j < 16; j++ {
    515 		for i := 0; i < 16; i++ {
    516 			z.ybr[y+j][x+i] = z.ybr[y+j][x-1]
    517 		}
    518 	}
    519 }
    520 
    521 func predFunc16DCTop(z *Decoder, y, x int) {
    522 	sum := uint32(8)
    523 	for j := 0; j < 16; j++ {
    524 		sum += uint32(z.ybr[y+j][x-1])
    525 	}
    526 	avg := uint8(sum / 16)
    527 	for j := 0; j < 16; j++ {
    528 		for i := 0; i < 16; i++ {
    529 			z.ybr[y+j][x+i] = avg
    530 		}
    531 	}
    532 }
    533 
    534 func predFunc16DCLeft(z *Decoder, y, x int) {
    535 	sum := uint32(8)
    536 	for i := 0; i < 16; i++ {
    537 		sum += uint32(z.ybr[y-1][x+i])
    538 	}
    539 	avg := uint8(sum / 16)
    540 	for j := 0; j < 16; j++ {
    541 		for i := 0; i < 16; i++ {
    542 			z.ybr[y+j][x+i] = avg
    543 		}
    544 	}
    545 }
    546 
    547 func predFunc16DCTopLeft(z *Decoder, y, x int) {
    548 	for j := 0; j < 16; j++ {
    549 		for i := 0; i < 16; i++ {
    550 			z.ybr[y+j][x+i] = 0x80
    551 		}
    552 	}
    553 }