void update_brush_rop( dibdrv_physdev *pdev, INT rop ) { pdev->brush_rop = rop; if(pdev->brush_style == BS_SOLID || pdev->brush_style == BS_HATCHED) calc_and_xor_masks(rop, pdev->brush_color, &pdev->brush_and, &pdev->brush_xor); free_pattern_brush_bits( pdev ); }
static BOOL create_pattern_brush_bits(dibdrv_physdev *pdev) { DWORD size = pdev->brush_dib.height * abs(pdev->brush_dib.stride); DWORD *brush_bits = pdev->brush_dib.bits; DWORD *and_bits, *xor_bits; assert(pdev->brush_and_bits == NULL); assert(pdev->brush_xor_bits == NULL); assert(pdev->brush_dib.stride > 0); and_bits = pdev->brush_and_bits = HeapAlloc(GetProcessHeap(), 0, size); xor_bits = pdev->brush_xor_bits = HeapAlloc(GetProcessHeap(), 0, size); if(!and_bits || !xor_bits) { ERR("Failed to create pattern brush bits\n"); free_pattern_brush_bits( pdev ); return FALSE; } while(size) { calc_and_xor_masks(pdev->brush_rop, *brush_bits++, and_bits++, xor_bits++); size -= 4; } return TRUE; }
static BOOL create_hatch_brush_bits(dibdrv_physdev *pdev) { dib_info hatch; rop_mask fg_mask, bg_mask; rop_mask_bits mask_bits; DWORD size; BOOL ret; assert(pdev->brush_and_bits == NULL); assert(pdev->brush_xor_bits == NULL); /* Just initialise brush_dib with the color / sizing info. We don't need the bits as we'll calculate the rop masks straight from the hatch patterns. */ copy_dib_color_info(&pdev->brush_dib, &pdev->dib); pdev->brush_dib.width = 8; pdev->brush_dib.height = 8; pdev->brush_dib.stride = ((pdev->brush_dib.width * pdev->brush_dib.bit_count + 31) >> 3) & ~3; size = pdev->brush_dib.height * pdev->brush_dib.stride; mask_bits.and = pdev->brush_and_bits = HeapAlloc(GetProcessHeap(), 0, size); mask_bits.xor = pdev->brush_xor_bits = HeapAlloc(GetProcessHeap(), 0, size); if(!mask_bits.and || !mask_bits.xor) { ERR("Failed to create pattern brush bits\n"); free_pattern_brush_bits( pdev ); return FALSE; } hatch.bit_count = 1; hatch.height = hatch.width = 8; hatch.stride = 4; hatch.bits = (void *) hatches[pdev->brush_hatch]; fg_mask.and = pdev->brush_and; fg_mask.xor = pdev->brush_xor; get_brush_bkgnd_masks( pdev, &bg_mask.and, &bg_mask.xor ); ret = pdev->brush_dib.funcs->create_rop_masks( &pdev->brush_dib, &hatch, &fg_mask, &bg_mask, &mask_bits ); if(!ret) free_pattern_brush_bits( pdev ); return ret; }
static BOOL create_pattern_brush_bits(dibdrv_physdev *pdev) { DWORD size = pdev->brush_dib.height * abs(pdev->brush_dib.stride); DWORD *brush_bits = pdev->brush_dib.bits; DWORD *and_bits, *xor_bits; assert(pdev->brush_and_bits == NULL); assert(pdev->brush_xor_bits == NULL); and_bits = pdev->brush_and_bits = HeapAlloc(GetProcessHeap(), 0, size); xor_bits = pdev->brush_xor_bits = HeapAlloc(GetProcessHeap(), 0, size); if(!and_bits || !xor_bits) { ERR("Failed to create pattern brush bits\n"); free_pattern_brush_bits( pdev ); return FALSE; } if(pdev->brush_dib.stride < 0) brush_bits = (DWORD*)((BYTE*)brush_bits + (pdev->brush_dib.height - 1) * pdev->brush_dib.stride); while(size) { calc_and_xor_masks(pdev->brush_rop, *brush_bits++, and_bits++, xor_bits++); size -= 4; } if(pdev->brush_dib.stride < 0) { /* Update the bits ptrs if the dib is bottom up. The subtraction is because stride is -ve */ pdev->brush_and_bits = (BYTE*)pdev->brush_and_bits - (pdev->brush_dib.height - 1) * pdev->brush_dib.stride; pdev->brush_xor_bits = (BYTE*)pdev->brush_xor_bits - (pdev->brush_dib.height - 1) * pdev->brush_dib.stride; } return TRUE; }
void free_pattern_brush( dibdrv_physdev *pdev ) { free_pattern_brush_bits( pdev ); free_dib_info( &pdev->brush_dib, TRUE ); }